28 libjmmcg::memcpy_opt(b, value.block);
33 libjmmcg::memcpy_opt(i.value.block, value.block);
36 template<
std::size_t Sz>
39 BOOST_MPL_ASSERT_RELATION(
sizeof(block_t), ==, Sz-1);
40 libjmmcg::memcpy_opt(
reinterpret_cast<block_t
const &>(b), value.block);
45 libjmmcg::memcpy_opt(i.value.block, value.block);
51 return value.block==i.value.block;
56 static_assert(
sizeof(
ISIN_t)<=
sizeof(libjmmcg::uint128_t));
58 static_assert(
sizeof(libjmmcg::uint128_t)>=
sizeof(
ISIN_t));
60 conv_sz=
sizeof(libjmmcg::uint128_t),
62 num_chars_to_mask=(conv_sz-isin_sz)*8
65 libjmmcg::uint128_t conv;
68 explicit constexpr converter(
ISIN_t const &i)
noexcept(
true)
72 static constexpr libjmmcg::uint128_t mask=(~libjmmcg::uint128_t{})>>(converter::num_chars_to_mask);
75 assert(cl.isin==*
this);
79 return cl.conv<cr.conv;
84 return std::string{value.block.begin(), value.block.end()};
87 constexpr inline std::size_t
89 std::uint64_t left_half{};
90 for (std::size_t i=0; i<value.block.max_size()/2; ++i) {
91 left_half|=(
static_cast<std::uint64_t>(value.block[i])<<(i*8));
93 std::uint64_t right_half{};
94 for (std::size_t i=0; i<value.block.max_size()/2; ++i) {
95 right_half|=(
static_cast<std::uint64_t>(value.block[i+value.block.max_size()/2])<<(i*8));
97 auto const hash_value=left_half^right_half;
98 assert(hash_value!=0);
99 if constexpr (
sizeof(
std::uint64_t)<=
sizeof(
std::size_t)) {
100 assert(hash_value<=std::numeric_limits<std::size_t>::max());
101 return static_cast<
std::size_t>(hash_value);
103 assert(
sizeof(std::size_t)==
sizeof(std::uint64_t)/2);
108 explicit constexpr conv(
std::uint64_t i)
noexcept(
true)
111 const conv c(hash_value);
112 return c.sz[0]^c.sz[1];
117 operator<<(
std::ostream &os,
ISIN_t const &i)
noexcept(
false) {
122 inline std::istream &
126 assert(tmp.size()<=
sizeof(ISIN_t));
127 libjmmcg::memcpy_opt(
reinterpret_cast<ISIN_t::block_t
const &>(*tmp.data()), i.value.block);