14 using result_type = std::size_t;
15 static const result_type offset_basis = 14695981039346656037ul;
16 static const result_type prime = 1099511628211ul;
17 result_type value_ = offset_basis;
22 void update(std::byte
byte)
noexcept { value_ = (value_ ^
static_cast<uint_fast8_t
>(byte)) * prime; }
25 void update(
size_t n,
const std::byte* bytes)
noexcept {
26 for (
size_t i = 0; i < n; i++)
update(bytes[i]);
30 auto value() const noexcept {
return value_; }
38 static_assert(
sizeof(std::size_t) ==
sizeof(std::uint64_t));
40 inline static std::size_t
fn(std::size_t h, std::size_t k) {
41 const std::size_t m = (std::size_t(0xc6a4a793) << 32) + 0x5bd1e995;
65 template <
typename T,
typename Enabler =
void>
80 template <
typename T,
typename Enabler =
void>
85 struct hash<T,
std::enable_if_t<meta::has_member_function_hash_v<T>>> {
104 template <
typename T>
105 struct hash<T,
std::enable_if_t<std::is_integral_v<std::decay_t<T>> && sizeof(T) <= sizeof(std::size_t), void>> {
106 auto operator()(T t)
const {
return static_cast<std::size_t
>(t); }
111 template <
typename T>
113 T,
std::enable_if_t<!(std::is_integral_v<std::decay_t<T>> && sizeof(T) <= sizeof(std::size_t)) &&
114 !(meta::has_member_function_hash_v<T>)&&std::has_unique_object_representations_v<T>,
116 auto operator()(
const T& t)
const {
117 detail::FNVhasher hasher;
118 hasher.update(
sizeof(T),
reinterpret_cast<const std::byte*
>(&t));
119 return hasher.value();
124 template <
typename T,
typename Enabler>
126 constexpr static bool NEED_TO_PROVIDE_SPECIALIZATION_OF_TTG_OVERLOAD_HASH_FOR_THIS_TYPE = !std::is_same_v<T, T>;
127 static_assert(NEED_TO_PROVIDE_SPECIALIZATION_OF_TTG_OVERLOAD_HASH_FOR_THIS_TYPE);
137 template <
typename T,
typename Enabler =
void>
139 template <
typename T>
141 T,
ttg::
meta::void_t<decltype(std::declval<ttg::hash<T>>()(std::declval<const T&>()))>> : std::true_type {};
142 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.