34template <
typename H,
typename T>
39template <
typename H,
typename T,
typename =
void>
42template <
typename H,
typename T>
45 std::void_t<decltype(PwHashValue(
46 std::declval<H>(), std::declval<const T&>()))>>
47 : std::is_same<decltype(PwHashValue(std::declval<H>(),
48 std::declval<const T&>())),
51template <
typename H,
typename T>
54template <
typename T,
typename =
void>
59 std::void_t<decltype(std::declval<std::hash<T>>()(
60 std::declval<const T&>()))>>
61 : std::is_same<decltype(std::declval<std::hash<T>>()(
62 std::declval<const T&>())),
74template <
typename H,
typename T>
75H hash_value_dispatcher(H h,
const T& val) {
76 if constexpr (kHasPwHashValue<H, T>) {
78 }
else if constexpr (std::is_pointer_v<T> || std::is_null_pointer_v<T>) {
79 return H::mix(std::move(h),
reinterpret_cast<uintptr_t
>(val));
80 }
else if constexpr (std::is_enum_v<T>) {
83 static_cast<size_t>(
static_cast<std::underlying_type_t<T>
>(val)));
85 static_assert(kHasStdHash<T>,
86 "The type must be hashable by either PwHashValue, std::hash, "
87 "or a pointer/enum.");
88 return H::mix(std::move(h), std::hash<T>()(val));
119 h.state_ ^= val + 0x9e3779b9 + (h.state_ << 6) + (h.state_ >> 2);
128 template <
typename T>
130 h = hash_impl::hash_value_dispatcher(std::move(h), val);
152 template <
typename T,
typename... Ts>
154 h =
combine(std::move(h), first);
155 if constexpr (
sizeof...(rest) > 0) {
156 return combine(std::move(h), rest...);
175 template <
typename T>
179 for (
size_t i = 0; i < size; i++) {
180 h =
combine(std::move(h), data[i]);
196 template <
typename InputIt>
202 for (
auto it = first; it != last; ++it) {
219 constexpr explicit Hash(
size_t seed = 17) : seed_(seed) {}
221 template <
typename T>
222 constexpr size_t operator()(
const T& value)
const {
223 return hash_impl::hash_value_dispatcher(
HashState(seed_), value).finalize();
229 template <
typename T,
typename U>
230 constexpr bool operator()(
const T& lhs,
const U& rhs)
const {
Definition: functional.h:100
static HashState combine_contiguous(HashState &&h, const T *data, size_t size)
Definition: functional.h:176
static HashState mix(HashState &&h, size_t val)
Definition: functional.h:118
HashState(size_t seed=17)
Definition: functional.h:104
static HashState combine(HashState &&h, const T &first, const Ts &... rest)
Definition: functional.h:153
static HashState combine(HashState &&h, const T &val)
Definition: functional.h:129
static HashState combine_unordered(HashState &&h, InputIt first, InputIt last)
Definition: functional.h:197
size_t finalize()
Finalizes the hash calculation and returns the result.
Definition: functional.h:211
The Pigweed namespace.
Definition: alignment.h:27
H PwHashValue(H h, const T &val)=delete
Definition: functional.h:228
Definition: functional.h:217
Definition: functional.h:40
Definition: functional.h:55