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 <boost/core/ignore_unused.hpp>
40
41#include <functional>
42
43namespace Nektar
44{
45
46inline void hash_combine(std::size_t &seed)
47{
48 boost::ignore_unused(seed);
49}
50
51template <typename T, typename... Args>
52inline void hash_combine(std::size_t &seed, const T &v, Args... args)
53{
54 std::hash<T> hasher;
55 seed ^= hasher(v) + 0x9e3779b9 + (seed << 6) + (seed >> 2);
56 hash_combine(seed, args...);
57}
58
59template <typename T, typename... Args>
60inline std::size_t hash_combine(const T &v, Args... args)
61{
62 boost::ignore_unused(v);
63 std::size_t seed = 0;
64 hash_combine(seed, args...);
65 return seed;
66}
67
68template <typename Iter> std::size_t hash_range(Iter first, Iter last)
69{
70 std::size_t seed = 0;
71 for (; first != last; ++first)
72 {
73 hash_combine(seed, *first);
74 }
75 return seed;
76}
77
78template <typename Iter>
79void hash_range(std::size_t &seed, Iter first, Iter last)
80{
81 hash_combine(seed, hash_range(first, last));
82}
83
85{
86 template <typename T> std::size_t operator()(T t) const
87 {
88 return static_cast<std::size_t>(t);
89 }
90};
91
93{
94 template <class T1, class T2>
95 std::size_t operator()(const std::pair<T1, T2> &p) const
96 {
97 std::size_t seed = 0;
98 auto h1 = std::hash<T1>{}(p.first);
99 auto h2 = std::hash<T2>{}(p.second);
100 hash_combine(seed, h1, h2);
101 return seed;
102 }
103};
104
105} // namespace Nektar
106#endif
The above copyright notice and this permission notice shall be included.
Definition: CoupledSolver.h:2
std::size_t hash_range(Iter first, Iter last)
Definition: HashUtils.hpp:68
void hash_combine(std::size_t &seed)
Definition: HashUtils.hpp:46
std::size_t operator()(T t) const
Definition: HashUtils.hpp:86
std::size_t operator()(const std::pair< T1, T2 > &p) const
Definition: HashUtils.hpp:95