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"
50#pragma clang diagnostic pop
75 unsigned char* bytes =
static_cast<unsigned char*
>(
77 for (
unsigned i = 0; i <
sizeof(T) / 2; ++i)
78 std::swap(bytes[i], bytes[
sizeof(T) - 1 - i]);
96template <
class T,
class Hasher>
105 Hasher::endian != boost::endian::order::native>{});
121 std::is_integral<T>::value || std::is_enum<T>::value ||
122 std::is_pointer<T>::value>
148template <
class T,
class U>
152 is_uniquely_represented<T>::value &&
153 is_uniquely_represented<U>::value &&
154 sizeof(T) + sizeof(U) == sizeof(std::pair<T, U>)>
165 std::conjunction_v<is_uniquely_represented<T>...> &&
166 sizeof(std::tuple<T...>) == (sizeof(T) + ...)>
173template <
class T, std::
size_t N>
181template <
class T, std::
size_t N>
185 is_uniquely_represented<T>::value &&
186 sizeof(T) * N == sizeof(std::array<T, N>)>
205template <
class T,
class HashAlgorithm>
209 is_uniquely_represented<T>::value &&
211 HashAlgorithm::endian == boost::endian::order::native)>
216template <
class T, std::
size_t N,
class HashAlgorithm>
220 is_uniquely_represented<T[N]>::value &&
222 HashAlgorithm::endian == boost::endian::order::native)>
257template <
class Hasher,
class T>
264template <
class Hasher,
class T>
266 !is_contiguously_hashable<T, Hasher>::value &&
275template <
class Hasher,
class T>
285template <
class Hasher>
289 void const* p =
nullptr;
296template <
class Hasher,
class T, std::
size_t N>
300template <
class Hasher,
class CharT,
class Traits,
class Alloc>
306template <
class Hasher,
class CharT,
class Traits,
class Alloc>
312template <
class Hasher,
class T,
class U>
316template <
class Hasher,
class T,
class Alloc>
320template <
class Hasher,
class T,
class Alloc>
324template <
class Hasher,
class T, std::
size_t N>
328template <
class Hasher,
class... T>
332template <
class Hasher,
class Key,
class T,
class Hash,
class Pred,
class Alloc>
336template <
class Hasher,
class Key,
class Hash,
class Pred,
class Alloc>
340template <
class Hasher,
class Key,
class Compare,
class Alloc>
344 boost::container::flat_set<Key, Compare, Alloc>
const& v)
noexcept;
345template <
class Hasher,
class Key,
class Compare,
class Alloc>
349 boost::container::flat_set<Key, Compare, Alloc>
const& v)
noexcept;
350template <
class Hasher,
class T0,
class T1,
class... T>
352hash_append(Hasher& h, T0
const& t0, T1
const& t1, T
const&... t)
noexcept;
356template <
class Hasher,
class T, std::
size_t N>
360 for (
auto const& t : a)
366template <
class Hasher,
class CharT,
class Traits,
class Alloc>
377template <
class Hasher,
class CharT,
class Traits,
class Alloc>
383 h(s.data(), s.size() *
sizeof(CharT));
389template <
class Hasher,
class T,
class U>
391 !is_contiguously_hashable<std::pair<T, U>, Hasher>::value>
399template <
class Hasher,
class T,
class Alloc>
403 for (
auto const& t : v)
408template <
class Hasher,
class T,
class Alloc>
412 h(v.data(), v.size() *
sizeof(T));
418template <
class Hasher,
class T, std::
size_t N>
422 for (
auto const& t : a)
426template <
class Hasher,
class Key,
class Compare,
class Alloc>
430 boost::container::flat_set<Key, Compare, Alloc>
const& v)
noexcept
432 for (
auto const& t : v)
435template <
class Hasher,
class Key,
class Compare,
class Alloc>
439 boost::container::flat_set<Key, Compare, Alloc>
const& v)
noexcept
441 h(&(v.begin()), v.size() *
sizeof(Key));
452template <
class Hasher,
class T>
460template <
class Hasher,
class... T,
std::size_t... I>
472template <
class Hasher,
class... T>
474 !is_contiguously_hashable<
std::tuple<T...>, Hasher>::value>
482template <
class Hasher,
class T>
491template <
class Hasher,
class Rep,
class Period>
498template <
class Hasher,
class Clock,
class Duration>
509template <
class Hasher,
class T0,
class T1,
class... T>
511hash_append(Hasher& h, T0
const& t0, T1
const& t1, T
const&... t)
noexcept
519template <
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