Update templating for hash values

This cleans the template for hash_combine to provide a single signature
for basic hash_combine, recursing to a null function.
This commit is contained in:
Seth Hillbrand 2020-07-10 09:56:50 -07:00
parent 106259f6e6
commit 95bfb64d48
1 changed files with 10 additions and 11 deletions

View File

@ -57,30 +57,29 @@ enum HASH_FLAGS
*/
std::size_t hash_eda( const EDA_ITEM* aItem, int aFlags = HASH_FLAGS::HASH_ALL );
/**
* This is a dummy function to take the final case of hash_combine below
* @param seed
*/
static inline void hash_combine( std::size_t &seed ) {}
/**
* @brief Combine multiple hashes utilizing previous hash result
* @tparam T A hashable type
* @param __seed A seed value input and output for the result.
* @param __val A hashable object of type T
* @tparam T A hashable type
* @param seed A seed value input and output for the result.
* @param val A hashable object of type T
*/
template< typename T >
static inline void hash_combine( std::size_t &__seed, const T &__val )
{
__seed ^= std::hash<T>()( __val ) + 0x9e3779b9 + ( __seed << 6 ) + ( __seed >> 2 );
}
template< typename T, typename ... Types >
static inline void hash_combine( std::size_t &seed, const T &val, const Types &... args )
{
hash_combine( seed, val );
seed ^= std::hash<T>()( val ) + 0x9e3779b9 + ( seed << 6 ) + ( seed >> 2 );
hash_combine( seed, args... );
}
template <typename... Types>
static inline std::size_t hash_val( const Types &... args )
{
std::size_t seed = 0;
std::size_t seed = 0xa82de1c0;
hash_combine( seed, args... );
return seed;
}