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>
52 unsigned char* bytes =
static_cast<unsigned char*
>(
54 for (
unsigned i = 0; i <
sizeof(T) / 2; ++i)
55 std::swap(bytes[i], bytes[
sizeof(T) - 1 - i]);
73 template <
class T,
class Hasher>
82 Hasher::endian != boost::endian::order::native>{});
98 std::is_integral<T>::value || std::is_enum<T>::value ||
99 std::is_pointer<T>::value>
125 template <
class T,
class U>
129 is_uniquely_represented<T>::value &&
130 is_uniquely_represented<U>::value &&
131 sizeof(T) + sizeof(U) == sizeof(std::pair<T, U>)>
138 template <
class... T>
142 std::conjunction_v<is_uniquely_represented<T>...> &&
143 sizeof(std::tuple<T...>) == (sizeof(T) + ...)>
150 template <
class T, std::
size_t N>
158 template <
class T, std::
size_t N>
162 is_uniquely_represented<T>::value &&
163 sizeof(T) * N == sizeof(std::array<T, N>)>
182 template <
class T,
class HashAlgorithm>
186 is_uniquely_represented<T>::value &&
188 HashAlgorithm::endian == boost::endian::order::native)>
193 template <
class T, std::
size_t N,
class HashAlgorithm>
197 is_uniquely_represented<T[N]>::value &&
199 HashAlgorithm::endian == boost::endian::order::native)>
234 template <
class Hasher,
class T>
241 template <
class Hasher,
class T>
243 !is_contiguously_hashable<T, Hasher>::value &&
252 template <
class Hasher,
class T>
262 template <
class Hasher>
266 void const* p =
nullptr;
273 template <
class Hasher,
class T, std::
size_t N>
277 template <
class Hasher,
class CharT,
class Traits,
class Alloc>
283 template <
class Hasher,
class CharT,
class Traits,
class Alloc>
289 template <
class Hasher,
class T,
class U>
293 template <
class Hasher,
class T,
class Alloc>
297 template <
class Hasher,
class T,
class Alloc>
301 template <
class Hasher,
class T, std::
size_t N>
305 template <
class Hasher,
class... T>
309 template <
class Hasher,
class Key,
class T,
class Hash,
class Pred,
class Alloc>
313 template <
class Hasher,
class Key,
class Hash,
class Pred,
class Alloc>
317 template <
class Hasher,
class Key,
class Compare,
class Alloc>
321 boost::container::flat_set<Key, Compare, Alloc>
const& v) noexcept;
322 template <
class Hasher,
class Key,
class Compare,
class Alloc>
326 boost::container::flat_set<Key, Compare, Alloc>
const& v) noexcept;
327 template <
class Hasher,
class T0,
class T1,
class... T>
329 hash_append(Hasher& h, T0
const& t0, T1
const& t1, T
const&... t) noexcept;
333 template <
class Hasher,
class T, std::
size_t N>
337 for (
auto const& t : a)
343 template <
class Hasher,
class CharT,
class Traits,
class Alloc>
354 template <
class Hasher,
class CharT,
class Traits,
class Alloc>
360 h(s.data(), s.size() *
sizeof(CharT));
366 template <
class Hasher,
class T,
class U>
368 !is_contiguously_hashable<std::pair<T, U>, Hasher>::value>
376 template <
class Hasher,
class T,
class Alloc>
380 for (
auto const& t : v)
385 template <
class Hasher,
class T,
class Alloc>
389 h(v.data(), v.size() *
sizeof(T));
395 template <
class Hasher,
class T, std::
size_t N>
399 for (
auto const& t : a)
403 template <
class Hasher,
class Key,
class Compare,
class Alloc>
407 boost::container::flat_set<Key, Compare, Alloc>
const& v) noexcept
409 for (
auto const& t : v)
412 template <
class Hasher,
class Key,
class Compare,
class Alloc>
416 boost::container::flat_set<Key, Compare, Alloc>
const& v) noexcept
418 h(&(v.begin()), v.size() *
sizeof(Key));
429 template <
class Hasher,
class T>
437 template <
class Hasher,
class... T,
std::size_t... I>
449 template <
class Hasher,
class... T>
451 !is_contiguously_hashable<
std::tuple<T...>, Hasher>::value>
459 template <
class Hasher,
class T>
468 template <
class Hasher,
class Rep,
class Period>
475 template <
class Hasher,
class Clock,
class Duration>
486 template <
class Hasher,
class T0,
class T1,
class... T>
488 hash_append(Hasher& h, T0
const& t0, T1
const& t1, T
const&... t) noexcept
496 template <
class HashAlgorithm>