Added hashlib support for std::tuple<>
authorClifford Wolf <clifford@clifford.at>
Tue, 7 Apr 2015 15:23:30 +0000 (17:23 +0200)
committerClifford Wolf <clifford@clifford.at>
Tue, 7 Apr 2015 15:23:30 +0000 (17:23 +0200)
kernel/hashlib.h

index 7cea195d58d4dbcbeddf88539557f746f6a1ea3c..b6cedc4962d5eb57ede8a1edd01ec89454c63bec 100644 (file)
@@ -92,6 +92,21 @@ template<typename P, typename Q> struct hash_ops<std::pair<P, Q>> {
        }
 };
 
+template<typename... T> struct hash_ops<std::tuple<T...>> {
+       static inline bool cmp(std::tuple<T...> a, std::tuple<T...> b) {
+               return a == b;
+       }
+       template<size_t I = 0>
+       static inline typename std::enable_if<I == sizeof...(T), unsigned int>::type hash(std::tuple<T...>) {
+               return mkhash_init;
+       }
+       template<size_t I = 0>
+       static inline typename std::enable_if<I != sizeof...(T), unsigned int>::type hash(std::tuple<T...> a) {
+               hash_ops<typename std::tuple_element<I, std::tuple<T...>>::type> element_ops;
+               return mkhash(hash<I+1>(a), element_ops.hash(std::get<I>(a)));
+       }
+};
+
 template<typename T> struct hash_ops<std::vector<T>> {
        static inline bool cmp(std::vector<T> a, std::vector<T> b) {
                return a == b;