Hash.h
1 /*********************************************************************
2  * Software License Agreement (BSD License)
3  *
4  * Copyright (c) 2016, Rice University
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  *
11  * * Redistributions of source code must retain the above copyright
12  * notice, this list of conditions and the following disclaimer.
13  * * Redistributions in binary form must reproduce the above
14  * copyright notice, this list of conditions and the following
15  * disclaimer in the documentation and/or other materials provided
16  * with the distribution.
17  * * Neither the name of the Rice University nor the names of its
18  * contributors may be used to endorse or promote products derived
19  * from this software without specific prior written permission.
20  *
21  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
24  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
25  * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
26  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
27  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
28  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
29  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
31  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
32  * POSSIBILITY OF SUCH DAMAGE.
33  *********************************************************************/
34 
35 /* Author: Mark Moll */
36 
37 #ifndef OMPL_UTIL_HASH_
38 #define OMPL_UTIL_HASH_
39 
40 #include <functional>
41 #include <type_traits>
42 #include <utility>
43 #include <vector>
44 #include <boost/functional/hash.hpp>
45 
46 namespace ompl
47 {
48  // copied from <boost/functional/hash.hpp>
49  template <class T>
50  inline void hash_combine(std::size_t &seed, const T &v)
51  {
52  std::hash<T> hasher;
53  seed ^= hasher(v) + 0x9e3779b9 + (seed << 6) + (seed >> 2);
54  }
55 } // namespace ompl
56 
57 namespace std
58 {
59  template <class U, class V>
60  struct hash<std::pair<U, V>>
61  {
62  using argument_type = std::pair<U, V>;
63  using result_type = std::size_t;
64  result_type operator()(argument_type const &p) const
65  {
66  result_type h = std::hash<std::remove_cv_t<U>>()(p.first);
67  ompl::hash_combine(h, p.second);
68  return h;
69  }
70  };
71 
72  template <class T>
73  struct hash<std::vector<T>>
74  {
75  using argument_type = std::vector<T>;
76  using result_type = std::size_t;
77  result_type operator()(argument_type const &v) const
78  {
79  result_type h = 0;
80  boost::hash_range(h, v.begin(), v.end());
81  return h;
82  }
83  };
84 } // namespace std
85 
86 #endif
Main namespace. Contains everything in this library.