Zen C++ Libraries
Zero-dependency re-usable components for C++
Loading...
Searching...
No Matches
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
9ZEN_NAMESPACE_START
10
11inline std::size_t hash_combiner(std::size_t left, std::size_t right) {
12 return left + 0x9e3779b9 + (right<<6) + (right>>2);
13}
14
15template<int I, class...Ts>
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
25template<class...Ts>
26struct 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
34ZEN_NAMESPACE_END
35
36template<class...Ts>
37struct 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
Definition value.hpp:34
right_t< void > right()
Definition either.hpp:329
left_t< void > left()
Definition either.hpp:297
Definition tuple_hash.hpp:16