21 #ifndef BEAST_HASH_HASH_APPEND_H_INCLUDED
22 #define BEAST_HASH_HASH_APPEND_H_INCLUDED
24 #include <ripple/beast/hash/endian.h>
25 #include <ripple/beast/hash/meta.h>
26 #include <boost/container/flat_set.hpp>
53 unsigned char* bytes =
static_cast<unsigned char*
>(
55 for (
unsigned i = 0; i <
sizeof(T) / 2; ++i)
56 std::swap(bytes[i], bytes[
sizeof(T) - 1 - i]);
74 template <
class T,
class Hasher>
96 std::is_integral<T>::value || std::is_enum<T>::value ||
97 std::is_pointer<T>::value>
123 template <
class T,
class U>
127 is_uniquely_represented<T>::value &&
128 is_uniquely_represented<U>::value &&
129 sizeof(T) + sizeof(U) == sizeof(std::pair<T, U>)>
136 template <
class... T>
140 static_and<is_uniquely_represented<T>::value...>::value &&
141 static_sum<sizeof(T)...>::value == sizeof(std::tuple<T...>)>
148 template <
class T, std::
size_t N>
156 template <
class T, std::
size_t N>
160 is_uniquely_represented<T>::value &&
161 sizeof(T) * N == sizeof(std::array<T, N>)>
180 template <
class T,
class HashAlgorithm>
184 is_uniquely_represented<T>::value &&
185 (sizeof(T) == 1 || HashAlgorithm::endian == endian::native)>
190 template <
class T, std::
size_t N,
class HashAlgorithm>
194 is_uniquely_represented<T[N]>::value &&
195 (sizeof(T) == 1 || HashAlgorithm::endian == endian::native)>
230 template <
class Hasher,
class T>
237 template <
class Hasher,
class T>
239 !is_contiguously_hashable<T, Hasher>::value &&
248 template <
class Hasher,
class T>
258 template <
class Hasher>
262 void const* p =
nullptr;
269 template <
class Hasher,
class T, std::
size_t N>
273 template <
class Hasher,
class CharT,
class Traits,
class Alloc>
279 template <
class Hasher,
class CharT,
class Traits,
class Alloc>
285 template <
class Hasher,
class T,
class U>
289 template <
class Hasher,
class T,
class Alloc>
293 template <
class Hasher,
class T,
class Alloc>
297 template <
class Hasher,
class T, std::
size_t N>
301 template <
class Hasher,
class... T>
305 template <
class Hasher,
class Key,
class T,
class Hash,
class Pred,
class Alloc>
309 template <
class Hasher,
class Key,
class Hash,
class Pred,
class Alloc>
313 template <
class Hasher,
class Key,
class Compare,
class Alloc>
317 boost::container::flat_set<Key, Compare, Alloc>
const& v) noexcept;
318 template <
class Hasher,
class Key,
class Compare,
class Alloc>
322 boost::container::flat_set<Key, Compare, Alloc>
const& v) noexcept;
323 template <
class Hasher,
class T0,
class T1,
class... T>
325 hash_append(Hasher& h, T0
const& t0, T1
const& t1, T
const&... t) noexcept;
329 template <
class Hasher,
class T, std::
size_t N>
333 for (
auto const& t : a)
339 template <
class Hasher,
class CharT,
class Traits,
class Alloc>
350 template <
class Hasher,
class CharT,
class Traits,
class Alloc>
356 h(s.data(), s.size() *
sizeof(CharT));
362 template <
class Hasher,
class T,
class U>
364 !is_contiguously_hashable<std::pair<T, U>, Hasher>::value>
372 template <
class Hasher,
class T,
class Alloc>
376 for (
auto const& t : v)
381 template <
class Hasher,
class T,
class Alloc>
385 h(v.data(), v.size() *
sizeof(T));
391 template <
class Hasher,
class T, std::
size_t N>
395 for (
auto const& t : a)
399 template <
class Hasher,
class Key,
class Compare,
class Alloc>
403 boost::container::flat_set<Key, Compare, Alloc>
const& v) noexcept
405 for (
auto const& t : v)
408 template <
class Hasher,
class Key,
class Compare,
class Alloc>
412 boost::container::flat_set<Key, Compare, Alloc>
const& v) noexcept
414 h(&(v.begin()), v.size() *
sizeof(Key));
425 template <
class Hasher,
class T>
433 template <
class Hasher,
class... T,
std::size_t... I>
445 template <
class Hasher,
class... T>
447 !is_contiguously_hashable<
std::tuple<T...>, Hasher>::value>
455 template <
class Hasher,
class T>
464 template <
class Hasher,
class Rep,
class Period>
471 template <
class Hasher,
class Clock,
class Duration>
482 template <
class Hasher,
class T0,
class T1,
class... T>
484 hash_append(Hasher& h, T0
const& t0, T1
const& t1, T
const&... t) noexcept
492 template <
class HashAlgorithm>