3#include <boost/container/flat_set.hpp>
4#include <boost/endian/conversion.hpp>
29 unsigned char* bytes =
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>)>
152template <
class T,
class HashAlgorithm>
156 IsUniquelyRepresented<T>::value &&
157 (sizeof(T) == 1 || HashAlgorithm::kEndian == boost::endian::order::native)>
162template <
class T, std::
size_t N,
class HashAlgorithm>
166 IsUniquelyRepresented<T[N]>::value &&
167 (sizeof(T) == 1 || HashAlgorithm::endian == boost::endian::order::native)>
202template <
class Hasher,
class T>
210template <
class Hasher,
class T>
212 !IsContiguouslyHashable<T, Hasher>::value &&
220template <
class Hasher,
class T>
230template <
class Hasher>
234 void const* p =
nullptr;
241template <
class Hasher,
class T, std::
size_t N>
245template <
class Hasher,
class CharT,
class Traits,
class Alloc>
249template <
class Hasher,
class CharT,
class Traits,
class Alloc>
253template <
class Hasher,
class T,
class U>
257template <
class Hasher,
class T,
class Alloc>
261template <
class Hasher,
class T,
class Alloc>
265template <
class Hasher,
class T, std::
size_t N>
269template <
class Hasher,
class... T>
273template <
class Hasher,
class Key,
class T,
class Hash,
class Pred,
class Alloc>
277template <
class Hasher,
class Key,
class Hash,
class Pred,
class Alloc>
281template <
class Hasher,
class Key,
class Compare,
class Alloc>
283hash_append(Hasher& h, boost::container::flat_set<Key, Compare, Alloc>
const& v)
noexcept;
284template <
class Hasher,
class Key,
class Compare,
class Alloc>
286hash_append(Hasher& h, boost::container::flat_set<Key, Compare, Alloc>
const& v)
noexcept;
287template <
class Hasher,
class T0,
class T1,
class... T>
289hash_append(Hasher& h, T0
const& t0, T1
const& t1, T
const&... t)
noexcept;
293template <
class Hasher,
class T, std::
size_t N>
297 for (
auto const& t : a)
303template <
class Hasher,
class CharT,
class Traits,
class Alloc>
312template <
class Hasher,
class CharT,
class Traits,
class Alloc>
316 h(s.data(), s.size() *
sizeof(CharT));
322template <
class Hasher,
class T,
class U>
331template <
class Hasher,
class T,
class Alloc>
335 for (
auto const& t : v)
340template <
class Hasher,
class T,
class Alloc>
344 h(v.data(), v.size() *
sizeof(T));
350template <
class Hasher,
class T, std::
size_t N>
354 for (
auto const& t : a)
358template <
class Hasher,
class Key,
class Compare,
class Alloc>
360hash_append(Hasher& h, boost::container::flat_set<Key, Compare, Alloc>
const& v)
noexcept
362 for (
auto const& t : v)
365template <
class Hasher,
class Key,
class Compare,
class Alloc>
367hash_append(Hasher& h, boost::container::flat_set<Key, Compare, Alloc>
const& v)
noexcept
369 h(&(v.begin()), v.size() *
sizeof(Key));
380template <
class Hasher,
class T>
388template <
class Hasher,
class... T,
std::size_t... I>
392 for_each_item(hash_one(h, std::get<I>(t))...);
397template <
class Hasher,
class... T>
406template <
class Hasher,
class T>
415template <
class Hasher,
class Rep,
class Period>
422template <
class Hasher,
class Clock,
class Duration>
431template <
class Hasher,
class T0,
class T1,
class... T>
433hash_append(Hasher& h, T0
const& t0, T1
const& t1, T
const&... t)
noexcept
441template <
class HashAlgorithm>
void forEachItem(...) noexcept
void tuple_hash(Hasher &h, std::tuple< T... > const &t, std::index_sequence< I... >) noexcept
void maybeReverseBytes(T &t, std::false_type)
int hashOne(Hasher &h, T const &t) noexcept
std::enable_if_t< IsContiguouslyHashable< T, Hasher >::value > hash_append(Hasher &h, T const &t) noexcept
Logically concatenate input data to a Hasher.
IsContiguouslyHashable()=default
IsContiguouslyHashable()=default
IsUniquelyRepresented()=default
IsUniquelyRepresented()=default
IsUniquelyRepresented()=default
IsUniquelyRepresented()=default
IsUniquelyRepresented()=default
IsUniquelyRepresented()=default
IsUniquelyRepresented()=default
IsUniquelyRepresented()=default