aboutsummaryrefslogtreecommitdiffstats
path: root/src/lib/corelib/tools/stlutils.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/corelib/tools/stlutils.h')
-rw-r--r--src/lib/corelib/tools/stlutils.h31
1 files changed, 31 insertions, 0 deletions
diff --git a/src/lib/corelib/tools/stlutils.h b/src/lib/corelib/tools/stlutils.h
index d4c569a95..e13fcdfe5 100644
--- a/src/lib/corelib/tools/stlutils.h
+++ b/src/lib/corelib/tools/stlutils.h
@@ -152,6 +152,37 @@ C &operator<<(C &container, const C &other)
return container;
}
+// based on http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0814r0.pdf
+template<typename T>
+void hashCombineHelper(size_t &seed, const T &val)
+{
+ seed ^= std::hash<T>()(val) + 0x9e3779b9 + (seed << 6) + (seed >> 2);
+}
+
+template<typename... Types>
+size_t hashCombine(const Types &... args)
+{
+ size_t seed = 0;
+ (hashCombineHelper(seed, args), ...); // create hash value with seed over all args return seed;
+ return seed;
+}
+
+template<typename It>
+size_t hashRange(It first, It last)
+{
+ size_t seed = 0;
+ for (; first != last; ++first)
+ hashCombineHelper(seed, *first);
+
+ return seed;
+}
+
+template<typename R>
+size_t hashRange(R &&range)
+{
+ return hashRange(std::begin(range), std::end(range));
+}
+
} // namespace Internal
} // namespace qbs