15 using result_type = std::size_t;
16 static const result_type offset_basis = 14695981039346656037ul;
17 static const result_type prime = 1099511628211ul;
18 result_type value_ = offset_basis;
23 void update(std::byte
byte)
noexcept { value_ = (value_ ^
static_cast<uint_fast8_t
>(byte)) * prime; }
26 void update(
size_t n,
const std::byte* bytes)
noexcept {
27 for (
size_t i = 0; i < n; i++)
update(bytes[i]);
31 auto value() const noexcept {
return value_; }
39 static_assert(
sizeof(std::size_t) ==
sizeof(std::uint64_t));
41 inline static std::size_t
fn(std::size_t h, std::size_t k) {
42 const std::size_t m = (std::size_t(0xc6a4a793) << 32) + 0x5bd1e995;
66 template <
typename T,
typename Enabler =
void>
81 template <
typename T,
typename Enabler =
void>
86 struct hash<T,
std::enable_if_t<meta::has_member_function_hash_v<T>>> {
105 template <
typename T>
106 struct hash<T,
std::enable_if_t<std::is_integral_v<std::decay_t<T>> && sizeof(T) <= sizeof(std::size_t), void>> {
107 auto operator()(T t)
const {
return static_cast<std::size_t
>(t); }
112 template <
typename T>
114 T,
std::enable_if_t<!(std::is_integral_v<std::decay_t<T>> && sizeof(T) <= sizeof(std::size_t)) &&
115 !(meta::has_member_function_hash_v<T>)&&std::has_unique_object_representations_v<T>,
117 auto operator()(
const T& t)
const {
118 detail::FNVhasher hasher;
119 hasher.update(
sizeof(T),
reinterpret_cast<const std::byte*
>(&t));
120 return hasher.value();
125 template <
typename T,
typename Enabler>
127 constexpr static bool NEED_TO_PROVIDE_SPECIALIZATION_OF_TTG_OVERLOAD_HASH_FOR_THIS_TYPE = !std::is_same_v<T, T>;
128 static_assert(NEED_TO_PROVIDE_SPECIALIZATION_OF_TTG_OVERLOAD_HASH_FOR_THIS_TYPE);
138 template <
typename T,
typename Enabler =
void>
140 template <
typename T>
142 T,
ttg::
meta::void_t<decltype(std::declval<ttg::hash<T>>()(std::declval<const T&>()))>> : std::true_type {};
143 template <
typename T>
A complete version of void.
void update(size_t n, const std::byte *bytes) noexcept
Updates the hash with an additional n bytes.
static result_type initial_value()
auto value() const noexcept
void update(std::byte byte) noexcept
place for overloading/instantiating hash and other functionality
top-level TTG namespace contains runtime-neutral functionality
void hash_combine(std::size_t &seed, T const &v)
combines 2 hash values; implementation based on boost::hash_combine_impl<64> from Boost v1....
static std::size_t fn(std::size_t h, std::size_t k)
auto operator()(const ttg::Void &) const
auto operator()(const ttg::Void &) const
Computes hash values for objects of type T.