Zen C++ Libraries
Zero-dependency re-usable components for C++
Loading...
Searching...
No Matches
include
zen
tuple_hash.hpp
1
#ifndef ZEN_TUPLE_HASH_HPP
2
#define ZEN_TUPLE_HASH_HPP
3
4
#include <tuple>
5
#include <functional>
6
7
#include "zen/config.hpp"
8
9
ZEN_NAMESPACE_START
10
11
inline
std::size_t hash_combiner(std::size_t
left
, std::size_t
right
) {
12
return
left
+ 0x9e3779b9 + (
right
<<6) + (
right
>>2);
13
}
14
15
template
<
int
I,
class
...Ts>
16
struct
tuple_hash_impl
{
17
std::size_t operator()(std::size_t a,
const
std::tuple<Ts...>& t)
const
{
18
typedef
typename
std::tuple_element<I, std::tuple<Ts...>>::type NextT;
19
tuple_hash_impl
<I-1, Ts...> next;
20
std::size_t b = std::hash<NextT>()(std::get<I>(t));
21
return
next(hash_combiner(a, b), t);
22
}
23
};
24
25
template
<
class
...Ts>
26
struct
tuple_hash_impl
<0, Ts...> {
27
std::size_t operator()(std::size_t a,
const
std::tuple<Ts...>& t)
const
{
28
typedef
typename
std::tuple_element<0, std::tuple<Ts...>>::type NextT;
29
std::size_t b = std::hash<NextT>()(std::get<0>(t));
30
return
hash_combiner(a, b);
31
}
32
};
33
34
ZEN_NAMESPACE_END
35
36
template
<
class
...Ts>
37
struct
std::hash<std::tuple<Ts...>> {
38
std::size_t operator()(
const
std::tuple<Ts...>& t)
const
{
39
const
std::size_t begin = std::tuple_size<std::tuple<Ts...>>
::value
-1;
40
return ::ZEN_NAMESPACE::tuple_hash_impl<begin, Ts...>()(0, t);
41
}
42
};
43
44
#endif
// of #ifndef ZEN_TUPLE_HASH_HPP
value
Definition
value.hpp:34
right
right_t< void > right()
Definition
either.hpp:329
left
left_t< void > left()
Definition
either.hpp:297
tuple_hash_impl
Definition
tuple_hash.hpp:16
Generated by
1.15.0