21#ifndef BEAST_HASH_HASH_APPEND_H_INCLUDED
22#define BEAST_HASH_HASH_APPEND_H_INCLUDED
24#include <boost/container/flat_set.hpp>
25#include <boost/endian/conversion.hpp>
42#pragma clang diagnostic push
43#pragma clang diagnostic ignored "-Wdeprecated"
44#pragma clang diagnostic ignored "-Wdeprecated-declarations"
51#pragma clang diagnostic pop
78 unsigned char* bytes =
static_cast<unsigned char*
>(
80 for (
unsigned i = 0; i <
sizeof(T) / 2; ++i)
81 std::swap(bytes[i], bytes[
sizeof(T) - 1 - i]);
99template <
class T,
class Hasher>
108 Hasher::endian != boost::endian::order::native>{});
124 std::is_integral<T>::value || std::is_enum<T>::value ||
125 std::is_pointer<T>::value>
151template <
class T,
class U>
155 is_uniquely_represented<T>::value &&
156 is_uniquely_represented<U>::value &&
157 sizeof(T) + sizeof(U) == sizeof(std::pair<T, U>)>
168 std::conjunction_v<is_uniquely_represented<T>...> &&
169 sizeof(std::tuple<T...>) == (sizeof(T) + ...)>
176template <
class T, std::
size_t N>
184template <
class T, std::
size_t N>
188 is_uniquely_represented<T>::value &&
189 sizeof(T) * N == sizeof(std::array<T, N>)>
208template <
class T,
class HashAlgorithm>
212 is_uniquely_represented<T>::value &&
214 HashAlgorithm::endian == boost::endian::order::native)>
219template <
class T, std::
size_t N,
class HashAlgorithm>
223 is_uniquely_represented<T[N]>::value &&
225 HashAlgorithm::endian == boost::endian::order::native)>
260template <
class Hasher,
class T>
267template <
class Hasher,
class T>
269 !is_contiguously_hashable<T, Hasher>::value &&
278template <
class Hasher,
class T>
288template <
class Hasher>
292 void const* p =
nullptr;
299template <
class Hasher,
class T, std::
size_t N>
303template <
class Hasher,
class CharT,
class Traits,
class Alloc>
309template <
class Hasher,
class CharT,
class Traits,
class Alloc>
315template <
class Hasher,
class T,
class U>
319template <
class Hasher,
class T,
class Alloc>
323template <
class Hasher,
class T,
class Alloc>
327template <
class Hasher,
class T, std::
size_t N>
331template <
class Hasher,
class... T>
335template <
class Hasher,
class Key,
class T,
class Hash,
class Pred,
class Alloc>
339template <
class Hasher,
class Key,
class Hash,
class Pred,
class Alloc>
343template <
class Hasher,
class Key,
class Compare,
class Alloc>
347 boost::container::flat_set<Key, Compare, Alloc>
const& v)
noexcept;
348template <
class Hasher,
class Key,
class Compare,
class Alloc>
352 boost::container::flat_set<Key, Compare, Alloc>
const& v)
noexcept;
353template <
class Hasher,
class T0,
class T1,
class... T>
355hash_append(Hasher& h, T0
const& t0, T1
const& t1, T
const&... t)
noexcept;
359template <
class Hasher,
class T, std::
size_t N>
363 for (
auto const& t : a)
369template <
class Hasher,
class CharT,
class Traits,
class Alloc>
380template <
class Hasher,
class CharT,
class Traits,
class Alloc>
386 h(s.data(), s.size() *
sizeof(CharT));
392template <
class Hasher,
class T,
class U>
394 !is_contiguously_hashable<std::pair<T, U>, Hasher>::value>
402template <
class Hasher,
class T,
class Alloc>
406 for (
auto const& t : v)
411template <
class Hasher,
class T,
class Alloc>
415 h(v.data(), v.size() *
sizeof(T));
421template <
class Hasher,
class T, std::
size_t N>
425 for (
auto const& t : a)
429template <
class Hasher,
class Key,
class Compare,
class Alloc>
433 boost::container::flat_set<Key, Compare, Alloc>
const& v)
noexcept
435 for (
auto const& t : v)
438template <
class Hasher,
class Key,
class Compare,
class Alloc>
442 boost::container::flat_set<Key, Compare, Alloc>
const& v)
noexcept
444 h(&(v.begin()), v.size() *
sizeof(Key));
455template <
class Hasher,
class T>
463template <
class Hasher,
class... T,
std::size_t... I>
475template <
class Hasher,
class... T>
477 !is_contiguously_hashable<
std::tuple<T...>, Hasher>::value>
485template <
class Hasher,
class T>
494template <
class Hasher,
class Rep,
class Period>
501template <
class Hasher,
class Clock,
class Duration>
512template <
class Hasher,
class T0,
class T1,
class... T>
514hash_append(Hasher& h, T0
const& t0, T1
const& t1, T
const&... t)
noexcept
522template <
class HashAlgorithm>
int hash_one(Hasher &h, T const &t) noexcept
void maybe_reverse_bytes(T &t, std::false_type)
void tuple_hash(Hasher &h, std::tuple< T... > const &t, std::index_sequence< I... >) noexcept
void for_each_item(...) noexcept
std::enable_if_t< is_contiguously_hashable< T, Hasher >::value > hash_append(Hasher &h, T const &t) noexcept
Logically concatenate input data to a Hasher.
is_contiguously_hashable()=default
Metafunction returning true if the type can be hashed in one call.
is_contiguously_hashable()=default
is_uniquely_represented()=default
is_uniquely_represented()=default
is_uniquely_represented()=default
is_uniquely_represented()=default
is_uniquely_represented()=default
is_uniquely_represented()=default
is_uniquely_represented()=default
is_uniquely_represented()=default