Nektar++
HashUtils.hpp
Go to the documentation of this file.
1///////////////////////////////////////////////////////////////////////////////
2//
3// File: HashUtils.hpp
4//
5// For more information, please see: http://www.nektar.info
6//
7// The MIT License
8//
9// Copyright (c) 2006 Division of Applied Mathematics, Brown University (USA),
10// Department of Aeronautics, Imperial College London (UK), and Scientific
11// Computing and Imaging Institute, University of Utah (USA).
12//
13// Permission is hereby granted, free of charge, to any person obtaining a
14// copy of this software and associated documentation files (the "Software"),
15// to deal in the Software without restriction, including without limitation
16// the rights to use, copy, modify, merge, publish, distribute, sublicense,
17// and/or sell copies of the Software, and to permit persons to whom the
18// Software is furnished to do so, subject to the following conditions:
19//
20// The above copyright notice and this permission notice shall be included
21// in all copies or substantial portions of the Software.
22//
23// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
24// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
25// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
26// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
27// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
28// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
29// DEALINGS IN THE SOFTWARE.
30//
31// Description: Hash utilities for C++11 STL maps to support combined hashes
32// and enumerations.
33//
34///////////////////////////////////////////////////////////////////////////////
35
36#ifndef LIBUTILITIES_BASICUTILS_HASHUTILS
37#define LIBUTILITIES_BASICUTILS_HASHUTILS
38
39#include <functional>
40
41namespace Nektar
42{
43
44inline void hash_combine([[maybe_unused]] std::size_t &seed)
45{
46}
47
48template <typename T, typename... Args>
49inline void hash_combine(std::size_t &seed, const T &v, Args... args)
50{
51 std::hash<T> hasher;
52 seed ^= hasher(v) + 0x9e3779b9 + (seed << 6) + (seed >> 2);
53 hash_combine(seed, args...);
54}
55
56template <typename T, typename... Args>
57inline std::size_t hash_combine([[maybe_unused]] const T &v, Args... args)
58{
59 std::size_t seed = 0;
60 hash_combine(seed, args...);
61 return seed;
62}
63
64template <typename Iter> std::size_t hash_range(Iter first, Iter last)
65{
66 std::size_t seed = 0;
67 for (; first != last; ++first)
68 {
69 hash_combine(seed, *first);
70 }
71 return seed;
72}
73
74template <typename Iter>
75void hash_range(std::size_t &seed, Iter first, Iter last)
76{
77 hash_combine(seed, hash_range(first, last));
78}
79
81{
82 template <typename T> std::size_t operator()(T t) const
83 {
84 return static_cast<std::size_t>(t);
85 }
86};
87
89{
90 template <class T1, class T2>
91 std::size_t operator()(const std::pair<T1, T2> &p) const
92 {
93 std::size_t seed = 0;
94 auto h1 = std::hash<T1>{}(p.first);
95 auto h2 = std::hash<T2>{}(p.second);
96 hash_combine(seed, h1, h2);
97 return seed;
98 }
99};
100
101} // namespace Nektar
102#endif
std::size_t hash_range(Iter first, Iter last)
Definition: HashUtils.hpp:64
void hash_combine(std::size_t &seed)
Definition: HashUtils.hpp:44
std::size_t operator()(T t) const
Definition: HashUtils.hpp:82
std::size_t operator()(const std::pair< T1, T2 > &p) const
Definition: HashUtils.hpp:91