13 template <
typename CompT>
17 template <CompositionType CompositionT>
24 auto it = comp.begin();
25 size_t remaining = comp.size();
27 while (remaining >= 4) {
59 while (remaining > 0) {
73 static constexpr uint64_t
kSeed = 0xC04D5EEDBEEFull;
74 static constexpr uint64_t
kPrime1 = 0xa0761d6478bd642fULL;
75 static constexpr uint64_t
kPrime2 = 0xe7037ed1a0b428dbULL;
76 static constexpr uint64_t
kPrime3 = 0x8ebc6af09c88c6e3ULL;
79 static inline uint64_t
mum(
const uint64_t a,
const uint64_t b)
noexcept {
80 const unsigned __int128 r =
static_cast<unsigned __int128
>(a) *
static_cast<unsigned __int128
>(b);
81 return static_cast<uint64_t
>(r) ^
static_cast<uint64_t
>(r >> 64);
84 static inline uint64_t
mix(
const uint64_t h)
noexcept {
90 if (v == 0.0) v = 0.0;
92 return 0x7ff8000000000000ULL;
94 return std::bit_cast<uint64_t>(v);
98 const auto z =
static_cast<uint16_t
>(s.z());
99 const auto a =
static_cast<uint16_t
>(s.a());
100 return (
static_cast<uint32_t
>(z) << 16) |
static_cast<uint32_t
>(a);
106struct std::hash<
fourdst::composition::CompositionAbstract> {
108 return static_cast<std::size_t
>(
114struct std::hash<
fourdst::composition::Composition> {
116 return static_cast<std::size_t
>(
Abstract base class for chemical composition representations.
Manages a collection of chemical species and their abundances.
static constexpr uint64_t kPrime2
static uint64_t normalize_double_bits(double v) noexcept
static constexpr uint64_t kPrime1
static uint32_t pack_species_id(const auto &s) noexcept
static uint64_t mix(const uint64_t h) noexcept
static constexpr uint64_t kPrime3
static constexpr uint64_t kSeed
static uint64_t mum(const uint64_t a, const uint64_t b) noexcept
static uint64_t hash_exact(const CompositionT &comp)
std::size_t operator()(const fourdst::composition::Composition &c) const noexcept
std::size_t operator()(const fourdst::composition::CompositionAbstract &c) const noexcept