aboutsummaryrefslogtreecommitdiffstats
path: root/meta/recipes-support/boost/files/hash_enums.patch
blob: 368da962c1a89ae84ccfb038ca04da5af45b00f1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
Allow hashing of enums.
Fixes errors like 

/opt/poky/1.3.0-1/sysroots/i586-poky-linux/usr/include/boost/functional/hash/extensions.hpp:257:34: error: no matching function for call to 'hash_value(const myspace::idx&)'

Upstream-Status: Pending
Singed-off-by: Khem Raj <raj.khem@gmail.com>

Index: boost_1_51_0/boost/functional/hash/hash.hpp
===================================================================
--- boost_1_51_0.orig/boost/functional/hash/hash.hpp	2012-07-15 16:28:30.000000000 -0700
+++ boost_1_51_0/boost/functional/hash/hash.hpp	2012-09-26 14:00:57.738364002 -0700
@@ -15,6 +15,8 @@
 #include <boost/functional/hash/detail/hash_float.hpp>
 #include <string>
 #include <boost/limits.hpp>
+#include <boost/type_traits/is_enum.hpp>
+#include <boost/utility/enable_if.hpp>
 
 #if defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
 #include <boost/type_traits/is_pointer.hpp>
@@ -89,6 +91,9 @@
     typename boost::hash_detail::long_numbers<T>::type hash_value(T);
     template <typename T>
     typename boost::hash_detail::ulong_numbers<T>::type hash_value(T);
+    template <typename T>
+    typename boost::enable_if<boost::is_enum<T>, std::size_t>::type
+      hash_value(T);
 
 #if !BOOST_WORKAROUND(__DMC__, <= 0x848)
     template <class T> std::size_t hash_value(T* const&);
@@ -178,7 +183,12 @@
     {
         return hash_detail::hash_value_unsigned(v);
     }
-
+    template <typename T>
+    typename boost::enable_if<boost::is_enum<T>, std::size_t>::type
+      hash_value(T v)
+    {
+      return static_cast<std::size_t>(v);
+    }
     // Implementation by Alberto Barbati and Dave Harris.
 #if !BOOST_WORKAROUND(__DMC__, <= 0x848)
     template <class T> std::size_t hash_value(T* const& v)