#include #include #include #include #include #include #include #include #include #include #include #include #include namespace xrpl::detail { template class TestUserTypeMember { private: T t_; public: explicit TestUserTypeMember(T const& t = T()) : t_(t) { } template friend void // NOLINTNEXTLINE(readability-identifier-naming) hash_append(Hasher& h, TestUserTypeMember const& a) noexcept { using beast::hash_append; hash_append(h, a.t_); } }; template class TestUserTypeFree { private: T t_; public: explicit TestUserTypeFree(T const& t = T()) : t_(t) { } template friend void // NOLINTNEXTLINE(readability-identifier-naming) hash_append(Hasher& h, TestUserTypeFree const& a) noexcept { using beast::hash_append; hash_append(h, a.t_); } }; } // namespace xrpl::detail //------------------------------------------------------------------------------ namespace xrpl { namespace detail { template using test_hardened_unordered_set = std::unordered_set>; template using test_hardened_unordered_map = std::unordered_map>; template using test_hardened_unordered_multiset = std::unordered_multiset>; template using test_hardened_unordered_multimap = std::unordered_multimap>; } // namespace detail template class UnsignedInteger { private: static_assert( std::is_integral_v && std::is_unsigned_v, "UInt must be an unsigned integral type"); static_assert(Bits % (8 * sizeof(UInt)) == 0, "Bits must be a multiple of 8*sizeof(UInt)"); static_assert(Bits >= (8 * sizeof(UInt)), "Bits must be at least 8*sizeof(UInt)"); static std::size_t const kSize = Bits / (8 * sizeof(UInt)); std::array vec_; public: using value_type = UInt; static std::size_t const kBits = Bits; static std::size_t const kBytes = kBits / 8; template static UnsignedInteger fronumber(Int v) { UnsignedInteger result; for (std::size_t i(1); i < kSize; ++i) result.vec_[i] = 0; result.vec_[0] = v; return result; } void* data() noexcept { return &vec_[0]; } [[nodiscard]] void const* data() const noexcept { return &vec_[0]; } template friend void hash_append(Hasher& h, UnsignedInteger const& a) noexcept { using beast::hash_append; hash_append(h, a.vec_); } friend std::ostream& operator<<(std::ostream& s, UnsignedInteger const& v) { for (std::size_t i(0); i < kSize; ++i) s << std::hex << std::setfill('0') << std::setw(2 * sizeof(UInt)) << v.vec_[i]; return s; } }; using sha256_t = UnsignedInteger<256, std::size_t>; #ifndef __INTELLISENSE__ static_assert(sha256_t::kBits == 256, "sha256_t must have 256 bits"); #endif } // namespace xrpl //------------------------------------------------------------------------------ namespace xrpl { class hardened_hash_test : public beast::unit_test::Suite { public: template void check() { T t{}; HardenedHash<>()(t); pass(); } template