diff options
Diffstat (limited to 'src/lib/corelib/tools/stlutils.h')
-rw-r--r-- | src/lib/corelib/tools/stlutils.h | 31 |
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 |