3#include <boost/container/flat_set.hpp>
4#include <boost/endian/conversion.hpp>
31 for (
unsigned i = 0; i <
sizeof(T) / 2; ++i)
32 std::swap(bytes[i], bytes[
sizeof(T) - 1 - i]);
50template <
class T,
class Hasher>
72 std::is_integral_v<T> || std::is_enum_v<T> || std::is_pointer_v<T>>
97template <
class T,
class U>
101 IsUniquelyRepresented<T>::value && IsUniquelyRepresented<U>::value &&
102 sizeof(T) + sizeof(U) == sizeof(std::pair<T, U>)>
113 std::conjunction_v<IsUniquelyRepresented<T>...> &&
114 sizeof(std::tuple<T...>) == (sizeof(T) + ...)>
121template <
class T, std::
size_t N>
129template <
class T, std::
size_t N>
133 IsUniquelyRepresented<T>::value && sizeof(T) * N == sizeof(std::array<T, N>)>
153template <
class T,
class HashAlgorithm>
157 IsUniquelyRepresented<T>::value &&
158 (sizeof(T) == 1 || HashAlgorithm::kEndian == boost::endian::order::native)>
163template <
class T, std::
size_t N,
class HashAlgorithm>
167 IsUniquelyRepresented<T[N]>::value &&
168 (sizeof(T) == 1 || HashAlgorithm::endian == boost::endian::order::native)>
204template <
class Hasher,
class T>
213template <
class Hasher,
class T>
224template <
class Hasher,
class T>
235template <
class Hasher>
239 void const* p =
nullptr;
246template <
class Hasher,
class T, std::
size_t N>
249 requires(!IsContiguouslyHashable<T, Hasher>::value);
251template <
class Hasher,
class CharT,
class Traits,
class Alloc>
254 requires(!IsContiguouslyHashable<CharT, Hasher>::value);
256template <
class Hasher,
class CharT,
class Traits,
class Alloc>
259 requires(IsContiguouslyHashable<CharT, Hasher>::value);
261template <
class Hasher,
class T,
class U>
264 requires(!IsContiguouslyHashable<std::pair<T, U>, Hasher>::value);
266template <
class Hasher,
class T,
class Alloc>
269 requires(!IsContiguouslyHashable<T, Hasher>::value);
271template <
class Hasher,
class T,
class Alloc>
274 requires(IsContiguouslyHashable<T, Hasher>::value);
276template <
class Hasher,
class T, std::
size_t N>
279 requires(!IsContiguouslyHashable<std::array<T, N>, Hasher>::value);
281template <
class Hasher,
class... T>
284 requires(!IsContiguouslyHashable<
std::tuple<T...>, Hasher>::value);
286template <
class Hasher,
class Key,
class T,
class Hash,
class Pred,
class Alloc>
290template <
class Hasher,
class Key,
class Hash,
class Pred,
class Alloc>
294template <
class Hasher,
class Key,
class Compare,
class Alloc>
296hash_append(Hasher& h, boost::container::flat_set<Key, Compare, Alloc>
const& v)
noexcept
298template <
class Hasher,
class Key,
class Compare,
class Alloc>
300hash_append(Hasher& h, boost::container::flat_set<Key, Compare, Alloc>
const& v)
noexcept
302template <
class Hasher,
class T0,
class T1,
class... T>
304hash_append(Hasher& h, T0
const& t0, T1
const& t1, T
const&... t)
noexcept;
308template <
class Hasher,
class T, std::
size_t N>
313 for (
auto const& t : a)
319template <
class Hasher,
class CharT,
class Traits,
class Alloc>
329template <
class Hasher,
class CharT,
class Traits,
class Alloc>
334 h(s.data(), s.size() *
sizeof(CharT));
340template <
class Hasher,
class T,
class U>
350template <
class Hasher,
class T,
class Alloc>
355 for (
auto const& t : v)
360template <
class Hasher,
class T,
class Alloc>
365 h(v.data(), v.size() *
sizeof(T));
371template <
class Hasher,
class T, std::
size_t N>
376 for (
auto const& t : a)
380template <
class Hasher,
class Key,
class Compare,
class Alloc>
382hash_append(Hasher& h, boost::container::flat_set<Key, Compare, Alloc>
const& v)
noexcept
385 for (
auto const& t : v)
388template <
class Hasher,
class Key,
class Compare,
class Alloc>
390hash_append(Hasher& h, boost::container::flat_set<Key, Compare, Alloc>
const& v)
noexcept
393 h(&(v.begin()), v.size() *
sizeof(Key));
397template <
class Hasher,
class... T>
407template <
class Hasher,
class T>
416template <
class Hasher,
class Rep,
class Period>
423template <
class Hasher,
class Clock,
class Duration>
432template <
class Hasher,
class T0,
class T1,
class... T>
434hash_append(Hasher& h, T0
const& t0, T1
const& t1, T
const&... t)
noexcept
442template <
class HashAlgorithm>
void maybeReverseBytes(T &t, std::false_type)
void hash_append(Hasher &h, T const &t) noexcept
Logically concatenate input data to a Hasher.
IsContiguouslyHashable()=default
Metafunction returning true if the type can be hashed in one call.
IsContiguouslyHashable()=default
IsUniquelyRepresented()=default
IsUniquelyRepresented()=default
IsUniquelyRepresented()=default
IsUniquelyRepresented()=default
IsUniquelyRepresented()=default
IsUniquelyRepresented()=default
IsUniquelyRepresented()=default
IsUniquelyRepresented()=default