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 ); 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 * @brief Combine multiple hashes utilizing previous hash result
* @tparam T A hashable type * @tparam T A hashable type
* @param __seed A seed value input and output for the result. * @param seed A seed value input and output for the result.
* @param __val A hashable object of type T * @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 > template< typename T, typename ... Types >
static inline void hash_combine( std::size_t &seed, const T &val, const Types &... args ) 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... ); hash_combine( seed, args... );
} }
template <typename... Types> template <typename... Types>
static inline std::size_t hash_val( const Types &... args ) static inline std::size_t hash_val( const Types &... args )
{ {
std::size_t seed = 0; std::size_t seed = 0xa82de1c0;
hash_combine( seed, args... ); hash_combine( seed, args... );
return seed; return seed;
} }