From a390b100457771fd9db48ff5bdfe44926c22bc1d Mon Sep 17 00:00:00 2001 From: John Freeman Date: Fri, 6 Dec 2024 16:54:40 -0600 Subject: [PATCH] Enforce levelization in libxrpl with CMake (#5111) Adds two CMake functions: * add_module(library subdirectory): Declares an OBJECT "library" (a CMake abstraction for a collection of object files) with sources from the given subdirectory of the given library, representing a module. Isolates the module's headers by creating a subdirectory in the build directory, e.g. .build/tmp123, that contains just a symlink, e.g. .build/tmp123/basics, to the module's header directory, e.g. include/xrpl/basics, in the source directory, and putting .build/tmp123 (but not include/xrpl) on the include path of the module sources. This prevents the module sources from including headers not explicitly linked to the module in CMake with target_link_libraries. * target_link_modules(library scope modules...): Links the library target to each of the module targets, and removes their sources from its source list (so they are not compiled and linked twice). Uses these functions to separate and explicitly link modules in libxrpl: Level 01: beast Level 02: basics Level 03: json, crypto Level 04: protocol Level 05: resource, server --- Builds/levelization/results/loops.txt | 3 - Builds/levelization/results/ordering.txt | 2 +- cmake/RippledCore.cmake | 78 +++++++++++++++++- cmake/RippledInstall.cmake | 35 +++++--- cmake/add_module.cmake | 37 +++++++++ cmake/create_symbolic_link.cmake | 20 +++++ cmake/isolate_headers.cmake | 48 +++++++++++ cmake/target_link_modules.cmake | 24 ++++++ include/xrpl/basics/Number.h | 17 ---- include/xrpl/basics/SHAMapHash.h | 8 ++ include/xrpl/basics/base_uint.h | 12 +++ .../xrpl/basics/partitioned_unordered_map.h | 18 +++- include/xrpl/protocol/AmountConversions.h | 4 +- include/xrpl/{basics => protocol}/FeeUnits.h | 9 +- include/xrpl/protocol/Fees.h | 2 +- include/xrpl/{basics => protocol}/IOUAmount.h | 0 include/xrpl/protocol/LedgerHeader.h | 2 +- include/xrpl/{basics => protocol}/MPTAmount.h | 15 +++- include/xrpl/protocol/PayChan.h | 2 +- include/xrpl/protocol/Protocol.h | 1 + include/xrpl/protocol/Quality.h | 4 +- include/xrpl/protocol/STAmount.h | 7 +- include/xrpl/protocol/STObject.h | 2 +- include/xrpl/protocol/STValidation.h | 2 +- include/xrpl/protocol/SystemParameters.h | 2 +- include/xrpl/{basics => protocol}/XRPAmount.h | 25 +++--- src/libxrpl/basics/Number.cpp | 10 --- .../basics/partitioned_unordered_map.cpp | 82 ------------------- src/libxrpl/hook/hook.cpp | 2 + .../{basics => protocol}/IOUAmount.cpp | 2 +- .../{basics => protocol}/MPTAmount.cpp | 2 +- src/test/basics/FeeUnits_test.cpp | 2 +- src/test/basics/IOUAmount_test.cpp | 2 +- src/test/basics/Number_test.cpp | 2 +- src/test/basics/XRPAmount_test.cpp | 2 +- src/test/jtx/amount.h | 2 +- src/xrpld/app/misc/AMMHelpers.h | 2 +- src/xrpld/app/misc/LoadFeeTrack.h | 3 +- src/xrpld/app/misc/detail/LoadFeeTrack.cpp | 2 +- src/xrpld/app/paths/Credit.h | 2 +- src/xrpld/app/paths/Flow.cpp | 4 +- src/xrpld/app/paths/detail/AmountSpec.h | 4 +- src/xrpld/app/paths/detail/BookStep.cpp | 4 +- src/xrpld/app/paths/detail/DirectStep.cpp | 2 +- src/xrpld/app/paths/detail/FlowDebugInfo.h | 4 +- src/xrpld/app/paths/detail/PaySteps.cpp | 4 +- src/xrpld/app/paths/detail/StrandFlow.h | 4 +- .../app/paths/detail/XRPEndpointStep.cpp | 4 +- src/xrpld/app/tx/detail/ApplyContext.h | 2 +- src/xrpld/app/tx/detail/Clawback.cpp | 2 +- src/xrpld/app/tx/detail/DeleteAccount.cpp | 2 +- src/xrpld/app/tx/detail/Escrow.cpp | 2 +- src/xrpld/app/tx/detail/InvariantCheck.cpp | 2 +- src/xrpld/app/tx/detail/PayChan.cpp | 2 +- src/xrpld/app/tx/detail/Transactor.cpp | 6 +- src/xrpld/app/tx/detail/Transactor.h | 2 +- src/xrpld/app/tx/detail/XChainBridge.cpp | 2 +- src/xrpld/core/Config.h | 2 +- src/xrpld/ledger/OpenView.h | 2 +- src/xrpld/ledger/ReadView.h | 6 +- src/xrpld/ledger/detail/ApplyStateTable.h | 2 +- src/xrpld/ledger/detail/ApplyViewBase.h | 2 +- src/xrpld/rpc/handlers/Fee1.cpp | 2 +- 63 files changed, 360 insertions(+), 204 deletions(-) create mode 100644 cmake/add_module.cmake create mode 100644 cmake/create_symbolic_link.cmake create mode 100644 cmake/isolate_headers.cmake create mode 100644 cmake/target_link_modules.cmake rename include/xrpl/{basics => protocol}/FeeUnits.h (98%) rename include/xrpl/{basics => protocol}/IOUAmount.h (100%) rename include/xrpl/{basics => protocol}/MPTAmount.h (92%) rename include/xrpl/{basics => protocol}/XRPAmount.h (95%) delete mode 100644 src/libxrpl/basics/partitioned_unordered_map.cpp create mode 100644 src/libxrpl/hook/hook.cpp rename src/libxrpl/{basics => protocol}/IOUAmount.cpp (99%) rename src/libxrpl/{basics => protocol}/MPTAmount.cpp (97%) diff --git a/Builds/levelization/results/loops.txt b/Builds/levelization/results/loops.txt index 6129b5ae0..1e0c59a93 100644 --- a/Builds/levelization/results/loops.txt +++ b/Builds/levelization/results/loops.txt @@ -10,9 +10,6 @@ Loop: test.jtx test.toplevel Loop: test.jtx test.unit_test test.unit_test == test.jtx -Loop: xrpl.basics xrpl.json - xrpl.json == xrpl.basics - Loop: xrpl.protocol xrpld.app xrpld.app > xrpl.protocol diff --git a/Builds/levelization/results/ordering.txt b/Builds/levelization/results/ordering.txt index 6505b7018..a9835cc4b 100644 --- a/Builds/levelization/results/ordering.txt +++ b/Builds/levelization/results/ordering.txt @@ -1,5 +1,4 @@ libxrpl.basics > xrpl.basics -libxrpl.basics > xrpl.protocol libxrpl.crypto > xrpl.basics libxrpl.json > xrpl.basics libxrpl.json > xrpl.json @@ -136,6 +135,7 @@ test.toplevel > test.csf test.toplevel > xrpl.json test.unit_test > xrpl.basics xrpl.hook > xrpl.basics +xrpl.json > xrpl.basics xrpl.protocol > xrpl.basics xrpl.protocol > xrpl.json xrpl.resource > xrpl.basics diff --git a/cmake/RippledCore.cmake b/cmake/RippledCore.cmake index a75633f92..123822558 100644 --- a/cmake/RippledCore.cmake +++ b/cmake/RippledCore.cmake @@ -47,6 +47,61 @@ target_link_libraries(xrpl.libpb gRPC::grpc++ ) +# TODO: Clean up the number of library targets later. +add_library(xrpl.imports.main INTERFACE) +target_link_libraries(xrpl.imports.main INTERFACE + LibArchive::LibArchive + OpenSSL::Crypto + Ripple::boost + Ripple::opts + Ripple::syslibs + absl::random_random + date::date + ed25519::ed25519 + secp256k1::secp256k1 + xxHash::xxhash +) + +include(add_module) +include(target_link_modules) + +# Level 01 +add_module(xrpl beast) +target_link_libraries(xrpl.libxrpl.beast PUBLIC + xrpl.imports.main + xrpl.libpb +) + +# Level 02 +add_module(xrpl basics) +target_link_libraries(xrpl.libxrpl.basics PUBLIC xrpl.libxrpl.beast) + +# Level 03 +add_module(xrpl json) +target_link_libraries(xrpl.libxrpl.json PUBLIC xrpl.libxrpl.basics) + +add_module(xrpl crypto) +target_link_libraries(xrpl.libxrpl.crypto PUBLIC xrpl.libxrpl.basics) + +add_module(xrpl hook) +target_link_libraries(xrpl.libxrpl.hook PUBLIC xrpl.libxrpl.basics) + +# Level 04 +add_module(xrpl protocol) +target_link_libraries(xrpl.libxrpl.protocol PUBLIC + xrpl.libxrpl.crypto + xrpl.libxrpl.hook + xrpl.libxrpl.json +) + +# Level 05 +add_module(xrpl resource) +target_link_libraries(xrpl.libxrpl.resource PUBLIC xrpl.libxrpl.protocol) + +add_module(xrpl server) +target_link_libraries(xrpl.libxrpl.server PUBLIC xrpl.libxrpl.protocol) + + add_library(xrpl.libxrpl) set_target_properties(xrpl.libxrpl PROPERTIES OUTPUT_NAME xrpl) if(unity) @@ -70,10 +125,25 @@ file(GLOB_RECURSE sources CONFIGURE_DEPENDS ) target_sources(xrpl.libxrpl PRIVATE ${sources}) -target_include_directories(xrpl.libxrpl - PUBLIC - $ - $) +target_link_modules(xrpl PUBLIC + basics + beast + crypto + hook + json + protocol + resource + server +) + +# All headers in libxrpl are in modules. +# Uncomment this stanza if you have not yet moved new headers into a module. +# target_include_directories(xrpl.libxrpl +# PRIVATE +# $ +# PUBLIC +# $ +# $) target_compile_definitions(xrpl.libxrpl PUBLIC diff --git a/cmake/RippledInstall.cmake b/cmake/RippledInstall.cmake index 229cc9b1c..80a11e1e3 100644 --- a/cmake/RippledInstall.cmake +++ b/cmake/RippledInstall.cmake @@ -2,13 +2,24 @@ install stuff #]===================================================================] +include(create_symbolic_link) + install ( TARGETS common opts ripple_syslibs ripple_boost + xrpl.imports.main xrpl.libpb + xrpl.libxrpl.basics + xrpl.libxrpl.beast + xrpl.libxrpl.hook + xrpl.libxrpl.crypto + xrpl.libxrpl.json + xrpl.libxrpl.protocol + xrpl.libxrpl.resource + xrpl.libxrpl.server xrpl.libxrpl antithesis-sdk-cpp EXPORT RippleExports @@ -22,12 +33,12 @@ install( DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}" ) -if(NOT WIN32) - install( - CODE "file(CREATE_LINK xrpl \ - \${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_INCLUDEDIR}/ripple SYMBOLIC)" - ) -endif() +install(CODE " + set(CMAKE_MODULE_PATH \"${CMAKE_MODULE_PATH}\") + include(create_symbolic_link) + create_symbolic_link(xrpl \ + \${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_INCLUDEDIR}/ripple) +") install (EXPORT RippleExports FILE RippleTargets.cmake @@ -56,12 +67,12 @@ if (is_root_project AND TARGET rippled) copy_if_not_exists(\"${CMAKE_CURRENT_SOURCE_DIR}/cfg/rippled-example.cfg\" etc rippled.cfg) copy_if_not_exists(\"${CMAKE_CURRENT_SOURCE_DIR}/cfg/validators-example.txt\" etc validators.txt) ") - if(NOT WIN32) - install( - CODE "file(CREATE_LINK rippled${suffix} \ - \${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_BINDIR}/xrpld${suffix} SYMBOLIC)" - ) - endif() + install(CODE " + set(CMAKE_MODULE_PATH \"${CMAKE_MODULE_PATH}\") + include(create_symbolic_link) + create_symbolic_link(rippled${suffix} \ + \${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_BINDIR}/xrpld${suffix}) + ") endif () install ( diff --git a/cmake/add_module.cmake b/cmake/add_module.cmake new file mode 100644 index 000000000..bcfce1bf6 --- /dev/null +++ b/cmake/add_module.cmake @@ -0,0 +1,37 @@ +include(isolate_headers) + +# Create an OBJECT library target named +# +# ${PROJECT_NAME}.lib${parent}.${name} +# +# with sources in src/lib${parent}/${name} +# and headers in include/${parent}/${name} +# that cannot include headers from other directories in include/ +# unless they come through linked libraries. +# +# add_module(parent a) +# add_module(parent b) +# target_link_libraries(project.libparent.b PUBLIC project.libparent.a) +function(add_module parent name) + set(target ${PROJECT_NAME}.lib${parent}.${name}) + add_library(${target} OBJECT) + file(GLOB_RECURSE sources CONFIGURE_DEPENDS + "${CMAKE_CURRENT_SOURCE_DIR}/src/lib${parent}/${name}/*.cpp" + ) + target_sources(${target} PRIVATE ${sources}) + target_include_directories(${target} PUBLIC + "$" + ) + isolate_headers( + ${target} + "${CMAKE_CURRENT_SOURCE_DIR}/include" + "${CMAKE_CURRENT_SOURCE_DIR}/include/${parent}/${name}" + PUBLIC + ) + isolate_headers( + ${target} + "${CMAKE_CURRENT_SOURCE_DIR}/src" + "${CMAKE_CURRENT_SOURCE_DIR}/src/lib${parent}/${name}" + PRIVATE + ) +endfunction() diff --git a/cmake/create_symbolic_link.cmake b/cmake/create_symbolic_link.cmake new file mode 100644 index 000000000..60fcf2e0b --- /dev/null +++ b/cmake/create_symbolic_link.cmake @@ -0,0 +1,20 @@ +# file(CREATE_SYMLINK) only works on Windows with administrator privileges. +# https://stackoverflow.com/a/61244115/618906 +function(create_symbolic_link target link) + if(WIN32) + if(NOT IS_SYMLINK "${link}") + if(NOT IS_ABSOLUTE "${target}") + # Relative links work do not work on Windows. + set(target "${link}/../${target}") + endif() + file(TO_NATIVE_PATH "${target}" target) + file(TO_NATIVE_PATH "${link}" link) + execute_process(COMMAND cmd.exe /c mklink /J "${link}" "${target}") + endif() + else() + file(CREATE_LINK "${target}" "${link}" SYMBOLIC) + endif() + if(NOT IS_SYMLINK "${link}") + message(ERROR "failed to create symlink: <${link}>") + endif() +endfunction() diff --git a/cmake/isolate_headers.cmake b/cmake/isolate_headers.cmake new file mode 100644 index 000000000..0a5a43a6a --- /dev/null +++ b/cmake/isolate_headers.cmake @@ -0,0 +1,48 @@ +include(create_symbolic_link) + +# Consider include directory B nested under prefix A: +# +# /path/to/A/then/to/B/... +# +# Call C the relative path from A to B. +# C is what we want to write in `#include` directives: +# +# #include +# +# Examples, all from the `jobqueue` module: +# +# - Library public headers: +# B = /include/xrpl/jobqueue +# A = /include/ +# C = xrpl/jobqueue +# +# - Library private headers: +# B = /src/libxrpl/jobqueue +# A = /src/ +# C = libxrpl/jobqueue +# +# - Test private headers: +# B = /tests/jobqueue +# A = / +# C = tests/jobqueue +# +# To isolate headers from each other, +# we want to create a symlink Y that points to B, +# within a subdirectory X of the `CMAKE_BINARY_DIR`, +# that has the same relative path C between X and Y, +# and then add X as an include directory of the target, +# sometimes `PUBLIC` and sometimes `PRIVATE`. +# The Cs are all guaranteed to be unique. +# We can guarantee a unique X per target by using +# `${CMAKE_CURRENT_BINARY_DIR}/include/${target}`. +# +# isolate_headers(target A B scope) +function(isolate_headers target A B scope) + file(RELATIVE_PATH C "${A}" "${B}") + set(X "${CMAKE_CURRENT_BINARY_DIR}/modules/${target}") + set(Y "${X}/${C}") + cmake_path(GET Y PARENT_PATH parent) + file(MAKE_DIRECTORY "${parent}") + create_symbolic_link("${B}" "${Y}") + target_include_directories(${target} ${scope} "$") +endfunction() diff --git a/cmake/target_link_modules.cmake b/cmake/target_link_modules.cmake new file mode 100644 index 000000000..acbf67903 --- /dev/null +++ b/cmake/target_link_modules.cmake @@ -0,0 +1,24 @@ +# Link a library to its modules (see: `add_module`) +# and remove the module sources from the library's sources. +# +# add_module(parent a) +# add_module(parent b) +# target_link_libraries(project.libparent.b PUBLIC project.libparent.a) +# add_library(project.libparent) +# target_link_modules(parent PUBLIC a b) +function(target_link_modules parent scope) + set(library ${PROJECT_NAME}.lib${parent}) + foreach(name ${ARGN}) + set(module ${library}.${name}) + get_target_property(sources ${library} SOURCES) + list(LENGTH sources before) + get_target_property(dupes ${module} SOURCES) + list(LENGTH dupes expected) + list(REMOVE_ITEM sources ${dupes}) + list(LENGTH sources after) + math(EXPR actual "${before} - ${after}") + message(STATUS "${module} with ${expected} sources took ${actual} sources from ${library}") + set_target_properties(${library} PROPERTIES SOURCES "${sources}") + target_link_libraries(${library} ${scope} ${module}) + endforeach() +endfunction() diff --git a/include/xrpl/basics/Number.h b/include/xrpl/basics/Number.h index 70baf5d1e..9ee05bfb4 100644 --- a/include/xrpl/basics/Number.h +++ b/include/xrpl/basics/Number.h @@ -20,8 +20,6 @@ #ifndef RIPPLE_BASICS_NUMBER_H_INCLUDED #define RIPPLE_BASICS_NUMBER_H_INCLUDED -#include -#include #include #include #include @@ -60,9 +58,6 @@ public: explicit Number(rep mantissa, int exponent); explicit constexpr Number(rep mantissa, int exponent, unchecked) noexcept; - Number(XRPAmount const& x); - Number(MPTAmount const& x); - constexpr rep mantissa() const noexcept; constexpr int @@ -104,10 +99,6 @@ public: * "mixed mode" more convenient, e.g. MPTAmount + Number. */ explicit - operator XRPAmount() const; // round to nearest, even on tie - explicit - operator MPTAmount() const; // round to nearest, even on tie - explicit operator rep() const; // round to nearest, even on tie friend constexpr bool @@ -217,14 +208,6 @@ inline Number::Number(rep mantissa) : Number{mantissa, 0} { } -inline Number::Number(XRPAmount const& x) : Number{x.drops()} -{ -} - -inline Number::Number(MPTAmount const& x) : Number{x.value()} -{ -} - inline constexpr Number::rep Number::mantissa() const noexcept { diff --git a/include/xrpl/basics/SHAMapHash.h b/include/xrpl/basics/SHAMapHash.h index 7e93ead78..2d2dcdc3e 100644 --- a/include/xrpl/basics/SHAMapHash.h +++ b/include/xrpl/basics/SHAMapHash.h @@ -21,6 +21,7 @@ #define RIPPLE_BASICS_SHAMAP_HASH_H_INCLUDED #include +#include #include @@ -108,6 +109,13 @@ operator!=(SHAMapHash const& x, SHAMapHash const& y) return !(x == y); } +template <> +inline std::size_t +extract(SHAMapHash const& key) +{ + return *reinterpret_cast(key.as_uint256().data()); +} + } // namespace ripple #endif // RIPPLE_BASICS_SHAMAP_HASH_H_INCLUDED diff --git a/include/xrpl/basics/base_uint.h b/include/xrpl/basics/base_uint.h index d1b90a109..907da487c 100644 --- a/include/xrpl/basics/base_uint.h +++ b/include/xrpl/basics/base_uint.h @@ -29,6 +29,7 @@ #include #include #include +#include #include #include #include @@ -662,6 +663,17 @@ operator<<(std::ostream& out, base_uint const& u) return out << to_string(u); } +template <> +inline std::size_t +extract(uint256 const& key) +{ + std::size_t result; + // Use memcpy to avoid unaligned UB + // (will optimize to equivalent code) + std::memcpy(&result, key.data(), sizeof(std::size_t)); + return result; +} + #ifndef __INTELLISENSE__ static_assert(sizeof(uint128) == 128 / 8, "There should be no padding bytes"); static_assert(sizeof(uint160) == 160 / 8, "There should be no padding bytes"); diff --git a/include/xrpl/basics/partitioned_unordered_map.h b/include/xrpl/basics/partitioned_unordered_map.h index c8e31906d..3c33749d6 100644 --- a/include/xrpl/basics/partitioned_unordered_map.h +++ b/include/xrpl/basics/partitioned_unordered_map.h @@ -20,9 +20,11 @@ #ifndef RIPPLE_BASICS_PARTITIONED_UNORDERED_MAP_H #define RIPPLE_BASICS_PARTITIONED_UNORDERED_MAP_H +#include #include #include #include +#include #include #include #include @@ -31,8 +33,18 @@ namespace ripple { template -std::size_t -partitioner(Key const& key, std::size_t const numPartitions); +static std::size_t +extract(Key const& key) +{ + return key; +} + +template <> +inline std::size_t +extract(std::string const& key) +{ + return ::beast::uhash<>{}(key); +} template < typename Key, @@ -211,7 +223,7 @@ private: std::size_t partitioner(Key const& key) const { - return ripple::partitioner(key, partitions_); + return extract(key) % partitions_; } template diff --git a/include/xrpl/protocol/AmountConversions.h b/include/xrpl/protocol/AmountConversions.h index 20a985d11..24270a7b9 100644 --- a/include/xrpl/protocol/AmountConversions.h +++ b/include/xrpl/protocol/AmountConversions.h @@ -20,9 +20,9 @@ #ifndef RIPPLE_PROTOCOL_AMOUNTCONVERSION_H_INCLUDED #define RIPPLE_PROTOCOL_AMOUNTCONVERSION_H_INCLUDED -#include -#include +#include #include +#include #include diff --git a/include/xrpl/basics/FeeUnits.h b/include/xrpl/protocol/FeeUnits.h similarity index 98% rename from include/xrpl/basics/FeeUnits.h rename to include/xrpl/protocol/FeeUnits.h index 70f2fc9fa..0ef07b34e 100644 --- a/include/xrpl/basics/FeeUnits.h +++ b/include/xrpl/protocol/FeeUnits.h @@ -19,14 +19,18 @@ #ifndef BASICS_FEES_H_INCLUDED #define BASICS_FEES_H_INCLUDED -#include +#include +#include #include +#include #include +#include #include #include #include #include +#include #include #include #include @@ -35,6 +39,9 @@ namespace ripple { namespace feeunit { +/** "drops" are the smallest divisible amount of XRP. This is what most + of the code uses. */ +struct dropTag; /** "fee units" calculations are a not-really-unitless value that is used to express the cost of a given transaction vs. a reference transaction. They are primarily used by the Transactor classes. */ diff --git a/include/xrpl/protocol/Fees.h b/include/xrpl/protocol/Fees.h index 7b4671a91..4393f1a1d 100644 --- a/include/xrpl/protocol/Fees.h +++ b/include/xrpl/protocol/Fees.h @@ -20,7 +20,7 @@ #ifndef RIPPLE_PROTOCOL_FEES_H_INCLUDED #define RIPPLE_PROTOCOL_FEES_H_INCLUDED -#include +#include namespace ripple { diff --git a/include/xrpl/basics/IOUAmount.h b/include/xrpl/protocol/IOUAmount.h similarity index 100% rename from include/xrpl/basics/IOUAmount.h rename to include/xrpl/protocol/IOUAmount.h diff --git a/include/xrpl/protocol/LedgerHeader.h b/include/xrpl/protocol/LedgerHeader.h index 663eb709b..0b3597997 100644 --- a/include/xrpl/protocol/LedgerHeader.h +++ b/include/xrpl/protocol/LedgerHeader.h @@ -21,11 +21,11 @@ #define RIPPLE_PROTOCOL_LEDGERHEADER_H_INCLUDED #include -#include #include #include #include #include +#include namespace ripple { diff --git a/include/xrpl/basics/MPTAmount.h b/include/xrpl/protocol/MPTAmount.h similarity index 92% rename from include/xrpl/basics/MPTAmount.h rename to include/xrpl/protocol/MPTAmount.h index 34f747a21..244d68391 100644 --- a/include/xrpl/basics/MPTAmount.h +++ b/include/xrpl/protocol/MPTAmount.h @@ -17,9 +17,10 @@ */ //============================================================================== -#ifndef RIPPLE_BASICS_MPTAMOUNT_H_INCLUDED -#define RIPPLE_BASICS_MPTAMOUNT_H_INCLUDED +#ifndef RIPPLE_PROTOCOL_MPTAMOUNT_H_INCLUDED +#define RIPPLE_PROTOCOL_MPTAMOUNT_H_INCLUDED +#include #include #include #include @@ -52,6 +53,11 @@ public: constexpr MPTAmount& operator=(MPTAmount const& other) = default; + // Round to nearest, even on tie. + explicit MPTAmount(Number const& x) : MPTAmount(static_cast(x)) + { + } + constexpr explicit MPTAmount(value_type value); constexpr MPTAmount& operator=(beast::Zero); @@ -78,6 +84,11 @@ public: explicit constexpr operator bool() const noexcept; + operator Number() const noexcept + { + return value(); + } + /** Return the sign of the amount */ constexpr int signum() const noexcept; diff --git a/include/xrpl/protocol/PayChan.h b/include/xrpl/protocol/PayChan.h index feca15d75..cf5c75e1b 100644 --- a/include/xrpl/protocol/PayChan.h +++ b/include/xrpl/protocol/PayChan.h @@ -20,10 +20,10 @@ #ifndef RIPPLE_PROTOCOL_PAYCHAN_H_INCLUDED #define RIPPLE_PROTOCOL_PAYCHAN_H_INCLUDED -#include #include #include #include +#include namespace ripple { diff --git a/include/xrpl/protocol/Protocol.h b/include/xrpl/protocol/Protocol.h index 49e94de01..f7bf0d1bf 100644 --- a/include/xrpl/protocol/Protocol.h +++ b/include/xrpl/protocol/Protocol.h @@ -22,6 +22,7 @@ #include #include +#include #include namespace ripple { diff --git a/include/xrpl/protocol/Quality.h b/include/xrpl/protocol/Quality.h index fac9dd29a..cc4feaa61 100644 --- a/include/xrpl/protocol/Quality.h +++ b/include/xrpl/protocol/Quality.h @@ -20,10 +20,10 @@ #ifndef RIPPLE_PROTOCOL_QUALITY_H_INCLUDED #define RIPPLE_PROTOCOL_QUALITY_H_INCLUDED -#include -#include #include +#include #include +#include #include #include diff --git a/include/xrpl/protocol/STAmount.h b/include/xrpl/protocol/STAmount.h index 84699cb2d..c4f08f4ec 100644 --- a/include/xrpl/protocol/STAmount.h +++ b/include/xrpl/protocol/STAmount.h @@ -21,16 +21,17 @@ #define RIPPLE_PROTOCOL_STAMOUNT_H_INCLUDED #include -#include #include -#include #include -#include #include #include +#include +#include +#include #include #include #include +#include #include namespace ripple { diff --git a/include/xrpl/protocol/STObject.h b/include/xrpl/protocol/STObject.h index a31058413..63f421636 100644 --- a/include/xrpl/protocol/STObject.h +++ b/include/xrpl/protocol/STObject.h @@ -21,11 +21,11 @@ #define RIPPLE_PROTOCOL_STOBJECT_H_INCLUDED #include -#include #include #include #include #include +#include #include #include #include diff --git a/include/xrpl/protocol/STValidation.h b/include/xrpl/protocol/STValidation.h index 69472f84e..adb8085a4 100644 --- a/include/xrpl/protocol/STValidation.h +++ b/include/xrpl/protocol/STValidation.h @@ -20,9 +20,9 @@ #ifndef RIPPLE_PROTOCOL_STVALIDATION_H_INCLUDED #define RIPPLE_PROTOCOL_STVALIDATION_H_INCLUDED -#include #include #include +#include #include #include #include diff --git a/include/xrpl/protocol/SystemParameters.h b/include/xrpl/protocol/SystemParameters.h index 7a491f902..5fb86d07d 100644 --- a/include/xrpl/protocol/SystemParameters.h +++ b/include/xrpl/protocol/SystemParameters.h @@ -20,8 +20,8 @@ #ifndef RIPPLE_PROTOCOL_SYSTEMPARAMETERS_H_INCLUDED #define RIPPLE_PROTOCOL_SYSTEMPARAMETERS_H_INCLUDED -#include #include +#include #include #include diff --git a/include/xrpl/basics/XRPAmount.h b/include/xrpl/protocol/XRPAmount.h similarity index 95% rename from include/xrpl/basics/XRPAmount.h rename to include/xrpl/protocol/XRPAmount.h index 30b194845..1d6cae9ec 100644 --- a/include/xrpl/basics/XRPAmount.h +++ b/include/xrpl/protocol/XRPAmount.h @@ -17,13 +17,14 @@ */ //============================================================================== -#ifndef RIPPLE_BASICS_XRPAMOUNT_H_INCLUDED -#define RIPPLE_BASICS_XRPAMOUNT_H_INCLUDED +#ifndef RIPPLE_PROTOCOL_XRPAMOUNT_H_INCLUDED +#define RIPPLE_PROTOCOL_XRPAMOUNT_H_INCLUDED +#include #include -#include #include #include +#include #include #include @@ -35,14 +36,6 @@ namespace ripple { -namespace feeunit { - -/** "drops" are the smallest divisible amount of XRP. This is what most - of the code uses. */ -struct dropTag; - -} // namespace feeunit - class XRPAmount : private boost::totally_ordered, private boost::additive, private boost::equality_comparable, @@ -61,6 +54,11 @@ public: constexpr XRPAmount& operator=(XRPAmount const& other) = default; + // Round to nearest, even on tie. + explicit XRPAmount(Number const& x) : XRPAmount(static_cast(x)) + { + } + constexpr XRPAmount(beast::Zero) : drops_(0) { } @@ -162,6 +160,11 @@ public: return drops_ != 0; } + operator Number() const noexcept + { + return drops(); + } + /** Return the sign of the amount */ constexpr int signum() const noexcept diff --git a/src/libxrpl/basics/Number.cpp b/src/libxrpl/basics/Number.cpp index f9d10ec14..15db729e1 100644 --- a/src/libxrpl/basics/Number.cpp +++ b/src/libxrpl/basics/Number.cpp @@ -505,16 +505,6 @@ Number::operator rep() const return drops; } -Number::operator XRPAmount() const -{ - return XRPAmount{static_cast(*this)}; -} - -Number::operator MPTAmount() const -{ - return MPTAmount{static_cast(*this)}; -} - std::string to_string(Number const& amount) { diff --git a/src/libxrpl/basics/partitioned_unordered_map.cpp b/src/libxrpl/basics/partitioned_unordered_map.cpp deleted file mode 100644 index a6d02cd2c..000000000 --- a/src/libxrpl/basics/partitioned_unordered_map.cpp +++ /dev/null @@ -1,82 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of rippled: https://github.com/ripple/rippled - Copyright (c) 2021 Ripple Labs Inc. - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -*/ -//============================================================================== - -#include - -#include -#include -#include -#include -#include -#include - -namespace ripple { - -static std::size_t -extract(uint256 const& key) -{ - std::size_t result; - // Use memcpy to avoid unaligned UB - // (will optimize to equivalent code) - std::memcpy(&result, key.data(), sizeof(std::size_t)); - return result; -} - -static std::size_t -extract(SHAMapHash const& key) -{ - return *reinterpret_cast(key.as_uint256().data()); -} - -static std::size_t -extract(LedgerIndex key) -{ - return static_cast(key); -} - -static std::size_t -extract(std::string const& key) -{ - return ::beast::uhash<>{}(key); -} - -template -std::size_t -partitioner(Key const& key, std::size_t const numPartitions) -{ - return extract(key) % numPartitions; -} - -template std::size_t -partitioner( - LedgerIndex const& key, - std::size_t const numPartitions); - -template std::size_t -partitioner(uint256 const& key, std::size_t const numPartitions); - -template std::size_t -partitioner(SHAMapHash const& key, std::size_t const numPartitions); - -template std::size_t -partitioner( - std::string const& key, - std::size_t const numPartitions); - -} // namespace ripple diff --git a/src/libxrpl/hook/hook.cpp b/src/libxrpl/hook/hook.cpp new file mode 100644 index 000000000..a85100ed9 --- /dev/null +++ b/src/libxrpl/hook/hook.cpp @@ -0,0 +1,2 @@ +// Hook module implementation placeholder +// This file ensures the hook module can be built by CMake diff --git a/src/libxrpl/basics/IOUAmount.cpp b/src/libxrpl/protocol/IOUAmount.cpp similarity index 99% rename from src/libxrpl/basics/IOUAmount.cpp rename to src/libxrpl/protocol/IOUAmount.cpp index a24e1b917..7fc879609 100644 --- a/src/libxrpl/basics/IOUAmount.cpp +++ b/src/libxrpl/protocol/IOUAmount.cpp @@ -17,8 +17,8 @@ */ //============================================================================== -#include #include +#include #include #include #include diff --git a/src/libxrpl/basics/MPTAmount.cpp b/src/libxrpl/protocol/MPTAmount.cpp similarity index 97% rename from src/libxrpl/basics/MPTAmount.cpp rename to src/libxrpl/protocol/MPTAmount.cpp index 0481da677..17bbedea4 100644 --- a/src/libxrpl/basics/MPTAmount.cpp +++ b/src/libxrpl/protocol/MPTAmount.cpp @@ -17,7 +17,7 @@ */ //============================================================================== -#include +#include namespace ripple { diff --git a/src/test/basics/FeeUnits_test.cpp b/src/test/basics/FeeUnits_test.cpp index 6608a0726..c32f98f19 100644 --- a/src/test/basics/FeeUnits_test.cpp +++ b/src/test/basics/FeeUnits_test.cpp @@ -16,8 +16,8 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -#include #include +#include #include #include diff --git a/src/test/basics/IOUAmount_test.cpp b/src/test/basics/IOUAmount_test.cpp index e588a08dc..306953d5a 100644 --- a/src/test/basics/IOUAmount_test.cpp +++ b/src/test/basics/IOUAmount_test.cpp @@ -17,8 +17,8 @@ */ //============================================================================== -#include #include +#include namespace ripple { diff --git a/src/test/basics/Number_test.cpp b/src/test/basics/Number_test.cpp index cf626354e..8a0a6702a 100644 --- a/src/test/basics/Number_test.cpp +++ b/src/test/basics/Number_test.cpp @@ -17,9 +17,9 @@ */ //============================================================================== -#include #include #include +#include #include #include #include diff --git a/src/test/basics/XRPAmount_test.cpp b/src/test/basics/XRPAmount_test.cpp index c57890fcf..08745b61e 100644 --- a/src/test/basics/XRPAmount_test.cpp +++ b/src/test/basics/XRPAmount_test.cpp @@ -17,8 +17,8 @@ */ //============================================================================== -#include #include +#include namespace ripple { diff --git a/src/test/jtx/amount.h b/src/test/jtx/amount.h index 9468b791f..9990c77c3 100644 --- a/src/test/jtx/amount.h +++ b/src/test/jtx/amount.h @@ -23,8 +23,8 @@ #include #include #include -#include #include +#include #include #include #include diff --git a/src/xrpld/app/misc/AMMHelpers.h b/src/xrpld/app/misc/AMMHelpers.h index 7ad0093a2..c6c0c808b 100644 --- a/src/xrpld/app/misc/AMMHelpers.h +++ b/src/xrpld/app/misc/AMMHelpers.h @@ -20,13 +20,13 @@ #ifndef RIPPLE_APP_MISC_AMMHELPERS_H_INCLUDED #define RIPPLE_APP_MISC_AMMHELPERS_H_INCLUDED -#include #include #include #include #include #include #include +#include #include #include #include diff --git a/src/xrpld/app/misc/LoadFeeTrack.h b/src/xrpld/app/misc/LoadFeeTrack.h index 6c37864e2..875a7bb7d 100644 --- a/src/xrpld/app/misc/LoadFeeTrack.h +++ b/src/xrpld/app/misc/LoadFeeTrack.h @@ -20,10 +20,11 @@ #ifndef RIPPLE_CORE_LOADFEETRACK_H_INCLUDED #define RIPPLE_CORE_LOADFEETRACK_H_INCLUDED -#include #include #include #include +#include +#include #include #include #include diff --git a/src/xrpld/app/misc/detail/LoadFeeTrack.cpp b/src/xrpld/app/misc/detail/LoadFeeTrack.cpp index 1267af594..50fb0ac14 100644 --- a/src/xrpld/app/misc/detail/LoadFeeTrack.cpp +++ b/src/xrpld/app/misc/detail/LoadFeeTrack.cpp @@ -20,10 +20,10 @@ #include #include #include -#include #include #include #include +#include #include #include diff --git a/src/xrpld/app/paths/Credit.h b/src/xrpld/app/paths/Credit.h index 1f9d5b04f..b71ec057a 100644 --- a/src/xrpld/app/paths/Credit.h +++ b/src/xrpld/app/paths/Credit.h @@ -21,7 +21,7 @@ #define RIPPLE_APP_PATHS_CREDIT_H_INCLUDED #include -#include +#include #include namespace ripple { diff --git a/src/xrpld/app/paths/Flow.cpp b/src/xrpld/app/paths/Flow.cpp index bda84f481..e524af100 100644 --- a/src/xrpld/app/paths/Flow.cpp +++ b/src/xrpld/app/paths/Flow.cpp @@ -23,9 +23,9 @@ #include #include #include -#include #include -#include +#include +#include #include diff --git a/src/xrpld/app/paths/detail/AmountSpec.h b/src/xrpld/app/paths/detail/AmountSpec.h index 59ca5f5d2..5d8264ed4 100644 --- a/src/xrpld/app/paths/detail/AmountSpec.h +++ b/src/xrpld/app/paths/detail/AmountSpec.h @@ -20,9 +20,9 @@ #ifndef RIPPLE_PATH_IMPL_AMOUNTSPEC_H_INCLUDED #define RIPPLE_PATH_IMPL_AMOUNTSPEC_H_INCLUDED -#include -#include +#include #include +#include #include diff --git a/src/xrpld/app/paths/detail/BookStep.cpp b/src/xrpld/app/paths/detail/BookStep.cpp index e3b90bac2..a837420d2 100644 --- a/src/xrpld/app/paths/detail/BookStep.cpp +++ b/src/xrpld/app/paths/detail/BookStep.cpp @@ -24,14 +24,14 @@ #include #include #include -#include #include -#include #include #include #include #include +#include #include +#include #include diff --git a/src/xrpld/app/paths/detail/DirectStep.cpp b/src/xrpld/app/paths/detail/DirectStep.cpp index 3f38f4166..538fe1dc0 100644 --- a/src/xrpld/app/paths/detail/DirectStep.cpp +++ b/src/xrpld/app/paths/detail/DirectStep.cpp @@ -21,9 +21,9 @@ #include #include #include -#include #include #include +#include #include #include diff --git a/src/xrpld/app/paths/detail/FlowDebugInfo.h b/src/xrpld/app/paths/detail/FlowDebugInfo.h index 38e1a8cff..1151c4285 100644 --- a/src/xrpld/app/paths/detail/FlowDebugInfo.h +++ b/src/xrpld/app/paths/detail/FlowDebugInfo.h @@ -22,8 +22,8 @@ #include #include -#include -#include +#include +#include #include diff --git a/src/xrpld/app/paths/detail/PaySteps.cpp b/src/xrpld/app/paths/detail/PaySteps.cpp index 93a49dee8..f2f650a14 100644 --- a/src/xrpld/app/paths/detail/PaySteps.cpp +++ b/src/xrpld/app/paths/detail/PaySteps.cpp @@ -19,12 +19,12 @@ #include #include -#include -#include #include #include #include #include +#include +#include #include #include diff --git a/src/xrpld/app/paths/detail/StrandFlow.h b/src/xrpld/app/paths/detail/StrandFlow.h index 72ca97a42..070c7901e 100644 --- a/src/xrpld/app/paths/detail/StrandFlow.h +++ b/src/xrpld/app/paths/detail/StrandFlow.h @@ -28,11 +28,11 @@ #include #include #include -#include #include -#include #include #include +#include +#include #include diff --git a/src/xrpld/app/paths/detail/XRPEndpointStep.cpp b/src/xrpld/app/paths/detail/XRPEndpointStep.cpp index 62a1d1fb8..90124972c 100644 --- a/src/xrpld/app/paths/detail/XRPEndpointStep.cpp +++ b/src/xrpld/app/paths/detail/XRPEndpointStep.cpp @@ -22,11 +22,11 @@ #include #include #include -#include #include -#include #include +#include #include +#include #include diff --git a/src/xrpld/app/tx/detail/ApplyContext.h b/src/xrpld/app/tx/detail/ApplyContext.h index 124ef7a8e..560371ff1 100644 --- a/src/xrpld/app/tx/detail/ApplyContext.h +++ b/src/xrpld/app/tx/detail/ApplyContext.h @@ -23,9 +23,9 @@ #include #include #include -#include #include #include +#include #include #include diff --git a/src/xrpld/app/tx/detail/Clawback.cpp b/src/xrpld/app/tx/detail/Clawback.cpp index f1040790a..d60acf9fd 100644 --- a/src/xrpld/app/tx/detail/Clawback.cpp +++ b/src/xrpld/app/tx/detail/Clawback.cpp @@ -19,9 +19,9 @@ #include #include -#include #include #include +#include #include #include #include diff --git a/src/xrpld/app/tx/detail/DeleteAccount.cpp b/src/xrpld/app/tx/detail/DeleteAccount.cpp index 96df7f7ea..fc55cdf5a 100644 --- a/src/xrpld/app/tx/detail/DeleteAccount.cpp +++ b/src/xrpld/app/tx/detail/DeleteAccount.cpp @@ -25,11 +25,11 @@ #include #include #include -#include #include #include #include #include +#include #include #include #include diff --git a/src/xrpld/app/tx/detail/Escrow.cpp b/src/xrpld/app/tx/detail/Escrow.cpp index 8d9b9aee8..d4d2ff652 100644 --- a/src/xrpld/app/tx/detail/Escrow.cpp +++ b/src/xrpld/app/tx/detail/Escrow.cpp @@ -26,13 +26,13 @@ #include #include #include -#include #include #include #include #include #include #include +#include #include #include diff --git a/src/xrpld/app/tx/detail/InvariantCheck.cpp b/src/xrpld/app/tx/detail/InvariantCheck.cpp index c2ce62e22..6bf01ca94 100644 --- a/src/xrpld/app/tx/detail/InvariantCheck.cpp +++ b/src/xrpld/app/tx/detail/InvariantCheck.cpp @@ -23,9 +23,9 @@ #include #include #include -#include #include #include +#include #include #include #include diff --git a/src/xrpld/app/tx/detail/PayChan.cpp b/src/xrpld/app/tx/detail/PayChan.cpp index 30c5a75ea..23ea06b29 100644 --- a/src/xrpld/app/tx/detail/PayChan.cpp +++ b/src/xrpld/app/tx/detail/PayChan.cpp @@ -22,13 +22,13 @@ #include #include #include -#include #include #include #include #include #include #include +#include #include #include diff --git a/src/xrpld/app/tx/detail/Transactor.cpp b/src/xrpld/app/tx/detail/Transactor.cpp index 13c1b4871..273e61817 100644 --- a/src/xrpld/app/tx/detail/Transactor.cpp +++ b/src/xrpld/app/tx/detail/Transactor.cpp @@ -483,9 +483,9 @@ Transactor::checkFee(PreclaimContext const& ctx, XRPAmount baseFee) if (balance < feePaid) { - JLOG(ctx.j.trace()) << "Insufficient balance:" - << " balance=" << to_string(balance) - << " paid=" << to_string(feePaid); + JLOG(ctx.j.trace()) + << "Insufficient balance:" << " balance=" << to_string(balance) + << " paid=" << to_string(feePaid); if ((balance > beast::zero) && !ctx.view.open()) { diff --git a/src/xrpld/app/tx/detail/Transactor.h b/src/xrpld/app/tx/detail/Transactor.h index 2c8e102a5..42b35db80 100644 --- a/src/xrpld/app/tx/detail/Transactor.h +++ b/src/xrpld/app/tx/detail/Transactor.h @@ -25,8 +25,8 @@ #include #include #include -#include #include +#include #include namespace ripple { diff --git a/src/xrpld/app/tx/detail/XChainBridge.cpp b/src/xrpld/app/tx/detail/XChainBridge.cpp index 80e2c4a2f..d4c3ffeba 100644 --- a/src/xrpld/app/tx/detail/XChainBridge.cpp +++ b/src/xrpld/app/tx/detail/XChainBridge.cpp @@ -26,7 +26,6 @@ #include #include #include -#include #include #include #include @@ -41,6 +40,7 @@ #include #include #include +#include #include #include #include diff --git a/src/xrpld/core/Config.h b/src/xrpld/core/Config.h index 0451d2efb..4a7a84d0c 100644 --- a/src/xrpld/core/Config.h +++ b/src/xrpld/core/Config.h @@ -22,10 +22,10 @@ #include #include -#include #include #include #include +#include #include #include // VFALCO Breaks levelization diff --git a/src/xrpld/ledger/OpenView.h b/src/xrpld/ledger/OpenView.h index bd8627a18..c8e1911bf 100644 --- a/src/xrpld/ledger/OpenView.h +++ b/src/xrpld/ledger/OpenView.h @@ -23,7 +23,7 @@ #include #include #include -#include +#include #include #include diff --git a/src/xrpld/ledger/ReadView.h b/src/xrpld/ledger/ReadView.h index efe920805..fb695b9a3 100644 --- a/src/xrpld/ledger/ReadView.h +++ b/src/xrpld/ledger/ReadView.h @@ -21,14 +21,13 @@ #define RIPPLE_LEDGER_READVIEW_H_INCLUDED #include -#include -#include -#include #include #include #include #include +#include #include +#include #include #include #include @@ -36,6 +35,7 @@ #include #include #include +#include #include #include #include diff --git a/src/xrpld/ledger/detail/ApplyStateTable.h b/src/xrpld/ledger/detail/ApplyStateTable.h index 10511111c..990cca74d 100644 --- a/src/xrpld/ledger/detail/ApplyStateTable.h +++ b/src/xrpld/ledger/detail/ApplyStateTable.h @@ -23,10 +23,10 @@ #include #include #include -#include #include #include #include +#include #include #include diff --git a/src/xrpld/ledger/detail/ApplyViewBase.h b/src/xrpld/ledger/detail/ApplyViewBase.h index 2688ed291..5d4bcd931 100644 --- a/src/xrpld/ledger/detail/ApplyViewBase.h +++ b/src/xrpld/ledger/detail/ApplyViewBase.h @@ -24,7 +24,7 @@ #include #include #include -#include +#include namespace ripple { namespace detail { diff --git a/src/xrpld/rpc/handlers/Fee1.cpp b/src/xrpld/rpc/handlers/Fee1.cpp index 90134961b..c33b8db16 100644 --- a/src/xrpld/rpc/handlers/Fee1.cpp +++ b/src/xrpld/rpc/handlers/Fee1.cpp @@ -24,10 +24,10 @@ #include #include #include -#include #include #include #include +#include namespace ripple { inline std::optional