add a hash combine implementation that has some minor performance guarantees
This commit is contained in:
		
							parent
							
								
									31fbf99109
								
							
						
					
					
						commit
						2b2ed50721
					
				| @ -32,13 +32,41 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |||||||
| 
 | 
 | ||||||
| #include <functional> | #include <functional> | ||||||
| 
 | 
 | ||||||
|  | // this is largely inspired by boost's hash combine
 | ||||||
|  | template<typename T> | ||||||
|  | inline void hash_combine(std::size_t &seed, const T& val) | ||||||
|  | { | ||||||
|  |     seed ^= std::hash<T>()(val) + 0x9e3779b9 + (seed << 6) + (seed >> 2); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | template<typename T> | ||||||
|  | inline void hash_val(std::size_t &seed, const T& val) | ||||||
|  | { | ||||||
|  |     hash_combine(seed, val); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | template<typename T, typename ... Types> | ||||||
|  | inline void hash_val(std::size_t &seed, const T& val, const Types& ... args) | ||||||
|  | { | ||||||
|  |     hash_combine(seed, val); | ||||||
|  |     hash_val(seed, args ...); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | template<typename ... Types> | ||||||
|  | inline std::size_t hash_val( const Types&... args) | ||||||
|  | { | ||||||
|  |     std::size_t seed = 0; | ||||||
|  |     hash_val(seed, args...); | ||||||
|  |     return seed; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| namespace std | namespace std | ||||||
| { | { | ||||||
| template <> struct hash<std::pair<NodeID, NodeID>> | template <> struct hash<std::pair<NodeID, NodeID>> | ||||||
| { | { | ||||||
|     size_t operator()(const std::pair<NodeID, NodeID> &pair) const |     size_t operator()(const std::pair<NodeID, NodeID> &pair) const | ||||||
|     { |     { | ||||||
|         return std::hash<int>()(pair.first) ^ std::hash<int>()(pair.second); |         return hash_val(pair.first, pair.second); | ||||||
|     } |     } | ||||||
| }; | }; | ||||||
| } | } | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user