diff --git a/libs/gfx/source/renderer/deferred.cpp b/libs/gfx/source/renderer/deferred.cpp index cb2aacc8..24897484 100644 --- a/libs/gfx/source/renderer/deferred.cpp +++ b/libs/gfx/source/renderer/deferred.cpp @@ -20,50 +20,10 @@ #include #include +#include #include - -void hash_combine(std::size_t & seed, std::size_t value) -{ - seed ^= value + 0x9e3779b9 + (seed<<6) + (seed>>2); -} - -namespace std -{ - - template - struct hash> - { - std::hash h1; - std::hash h2; - - std::size_t operator() (std::tuple const & t) const - { - std::size_t h = 0; - hash_combine(h, h1(std::get<0>(t))); - hash_combine(h, h2(std::get<1>(t))); - return h; - } - }; - - template - struct hash> - { - std::hash h1; - std::hash h2; - std::hash h3; - - std::size_t operator() (std::tuple const & t) const - { - std::size_t h = 0; - hash_combine(h, h1(std::get<0>(t))); - hash_combine(h, h2(std::get<1>(t))); - hash_combine(h, h3(std::get<2>(t))); - return h; - } - }; - -} +#include namespace psemek::gfx { diff --git a/libs/util/include/psemek/util/hash.hpp b/libs/util/include/psemek/util/hash.hpp new file mode 100644 index 00000000..4e6a1e9c --- /dev/null +++ b/libs/util/include/psemek/util/hash.hpp @@ -0,0 +1,39 @@ +#pragma once + +#include +#include + +namespace psemek::util +{ + + // based on boost::hash_combine + inline void hash_combine(std::size_t & seed, std::size_t value) + { + seed ^= value + 0x9e3779b9 + (seed<<6) + (seed>>2); + } + +} + +namespace std +{ + + template + struct hash> + : std::tuple...> + { + std::size_t operator()(std::tuple const & t) const + { + return hash_impl(t, std::make_index_sequence{}); + } + + private: + template + std::size_t hash_impl(std::tuple const & t, std::index_sequence) const + { + std::size_t result = 0; + (::psemek::util::hash_combine(result, std::get(*this)(std::get(t))), ...); + return result; + } + }; + +}