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>
42 #include <boost/container/flat_set.hpp>
57 for (
unsigned i = 0; i <
sizeof(T)/2; ++i)
58 std::swap(bytes[i], bytes[
sizeof(T)-1-i]);
78 template <
class T,
class Hasher>
100 std::is_enum<T>::value ||
101 std::is_pointer<T>::value>
129 template <
class T,
class U>
132 is_uniquely_represented<U>::value &&
133 sizeof(T) + sizeof(U) == sizeof(std::pair<T, U>)>
140 template <
class ...T>
143 static_and<is_uniquely_represented<T>::value...>::value &&
144 static_sum<sizeof(T)...>::value == sizeof(std::tuple<T...>)>
151 template <
class T, std::
size_t N>
160 template <
class T, std::
size_t N>
163 sizeof(T)*N == sizeof(std::array<T, N>)>
182 template <
class T,
class HashAlgorithm>
186 HashAlgorithm::endian == endian::native)>
191 template <
class T, std::
size_t N,
class HashAlgorithm>
195 HashAlgorithm::endian == endian::native)>
230 template <
class Hasher,
class T>
241 template <
class Hasher,
class T>
245 !is_contiguously_hashable<T, Hasher>::value &&
254 template <
class Hasher,
class T>
268 template <
class Hasher>
273 void const* p =
nullptr;
280 template <
class Hasher,
class T, std::
size_t N>
283 !is_contiguously_hashable<T, Hasher>::value
287 template <
class Hasher,
class CharT,
class Traits,
class Alloc>
290 !is_contiguously_hashable<CharT, Hasher>::value
294 template <
class Hasher,
class CharT,
class Traits,
class Alloc>
297 is_contiguously_hashable<CharT, Hasher>::value
301 template <
class Hasher,
class T,
class U>
304 !is_contiguously_hashable<std::pair<T, U>, Hasher>::value
308 template <
class Hasher,
class T,
class Alloc>
311 !is_contiguously_hashable<T, Hasher>::value
315 template <
class Hasher,
class T,
class Alloc>
318 is_contiguously_hashable<T, Hasher>::value
322 template <
class Hasher,
class T, std::
size_t N>
325 !is_contiguously_hashable<std::array<T, N>, Hasher>::value
329 template <
class Hasher,
class ...T>
332 !is_contiguously_hashable<
std::tuple<T...>, Hasher>::value
336 template <
class Hasher,
class Key,
class T,
class Hash,
class Pred,
class Alloc>
340 template <
class Hasher,
class Key,
class Hash,
class Pred,
class Alloc>
344 template <
class Hasher,
class Key,
class Compare,
class Alloc>
347 !is_contiguously_hashable<Key, Hasher>::value
349 hash_append(Hasher& h, boost::container::flat_set<Key, Compare, Alloc>
const& v) noexcept;
350 template <
class Hasher,
class Key,
class Compare,
class Alloc>
353 is_contiguously_hashable<Key, Hasher>::value
355 hash_append(Hasher& h, boost::container::flat_set<Key, Compare, Alloc>
const& v) noexcept;
356 template <
class Hasher,
class T0,
class T1,
class ...T>
358 hash_append (Hasher& h, T0
const& t0, T1
const& t1, T
const& ...t) noexcept;
362 template <
class Hasher,
class T, std::
size_t N>
365 !is_contiguously_hashable<T, Hasher>::value
369 for (
auto const& t : a)
375 template <
class Hasher,
class CharT,
class Traits,
class Alloc>
379 !is_contiguously_hashable<CharT, Hasher>::value
388 template <
class Hasher,
class CharT,
class Traits,
class Alloc>
392 is_contiguously_hashable<CharT, Hasher>::value
396 h(s.data(), s.size()*
sizeof(CharT));
402 template <
class Hasher,
class T,
class U>
406 !is_contiguously_hashable<std::pair<T, U>, Hasher>::value
415 template <
class Hasher,
class T,
class Alloc>
419 !is_contiguously_hashable<T, Hasher>::value
423 for (
auto const& t : v)
428 template <
class Hasher,
class T,
class Alloc>
432 is_contiguously_hashable<T, Hasher>::value
436 h(v.data(), v.size()*
sizeof(T));
442 template <
class Hasher,
class T, std::
size_t N>
445 !is_contiguously_hashable<std::array<T, N>, Hasher>::value
449 for (
auto const& t : a)
453 template <
class Hasher,
class Key,
class Compare,
class Alloc>
456 !is_contiguously_hashable<Key, Hasher>::value
458 hash_append(Hasher& h, boost::container::flat_set<Key, Compare, Alloc>
const& v) noexcept
460 for (
auto const& t : v)
463 template <
class Hasher,
class Key,
class Compare,
class Alloc>
466 is_contiguously_hashable<Key, Hasher>::value
468 hash_append(Hasher& h, boost::container::flat_set<Key, Compare, Alloc>
const& v) noexcept
470 h(&(v.begin()), v.size()*
sizeof(Key));
483 template <
class Hasher,
class T>
492 template <
class Hasher,
class ...T,
std::size_t ...I>
502 template <
class Hasher,
class ...T>
506 !is_contiguously_hashable<
std::tuple<T...>, Hasher>::value
515 template <
class Hasher,
class T>
525 template <
class Hasher,
class Rep,
class Period>
533 template <
class Hasher,
class Clock,
class Duration>
543 template <
class Hasher,
class T0,
class T1,
class ...T>
546 hash_append (Hasher& h, T0
const& t0, T1
const& t1, T
const& ...t) noexcept
554 template <
class HashAlgorithm>