annotate DEPENDENCIES/generic/include/boost/functional/hash/extensions.hpp @ 125:34e428693f5d vext

Vext -> Repoint
author Chris Cannam
date Thu, 14 Jun 2018 11:15:39 +0100
parents c530137014c0
children
rev   line source
Chris@16 1
Chris@16 2 // Copyright 2005-2009 Daniel James.
Chris@16 3 // Distributed under the Boost Software License, Version 1.0. (See accompanying
Chris@16 4 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
Chris@16 5
Chris@16 6 // Based on Peter Dimov's proposal
Chris@16 7 // http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2005/n1756.pdf
Chris@16 8 // issue 6.18.
Chris@16 9
Chris@16 10 // This implements the extensions to the standard.
Chris@16 11 // It's undocumented, so you shouldn't use it....
Chris@16 12
Chris@16 13 #if !defined(BOOST_FUNCTIONAL_HASH_EXTENSIONS_HPP)
Chris@16 14 #define BOOST_FUNCTIONAL_HASH_EXTENSIONS_HPP
Chris@16 15
Chris@101 16 #include <boost/config.hpp>
Chris@101 17 #if defined(BOOST_HAS_PRAGMA_ONCE)
Chris@101 18 #pragma once
Chris@101 19 #endif
Chris@101 20
Chris@16 21 #include <boost/functional/hash/hash.hpp>
Chris@16 22 #include <boost/detail/container_fwd.hpp>
Chris@16 23 #include <boost/utility/enable_if.hpp>
Chris@16 24 #include <boost/static_assert.hpp>
Chris@16 25 #include <boost/preprocessor/repetition/repeat_from_to.hpp>
Chris@16 26 #include <boost/preprocessor/repetition/enum_params.hpp>
Chris@16 27
Chris@16 28 #if !defined(BOOST_NO_CXX11_HDR_ARRAY)
Chris@16 29 # include <array>
Chris@16 30 #endif
Chris@16 31
Chris@16 32 #if !defined(BOOST_NO_CXX11_HDR_TUPLE)
Chris@16 33 # include <tuple>
Chris@16 34 #endif
Chris@16 35
Chris@16 36 #if !defined(BOOST_NO_CXX11_HDR_MEMORY)
Chris@16 37 # include <memory>
Chris@16 38 #endif
Chris@16 39
Chris@16 40 #if defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING)
Chris@16 41 #include <boost/type_traits/is_array.hpp>
Chris@16 42 #endif
Chris@16 43
Chris@16 44 namespace boost
Chris@16 45 {
Chris@16 46 template <class A, class B>
Chris@16 47 std::size_t hash_value(std::pair<A, B> const&);
Chris@16 48 template <class T, class A>
Chris@16 49 std::size_t hash_value(std::vector<T, A> const&);
Chris@16 50 template <class T, class A>
Chris@16 51 std::size_t hash_value(std::list<T, A> const& v);
Chris@16 52 template <class T, class A>
Chris@16 53 std::size_t hash_value(std::deque<T, A> const& v);
Chris@16 54 template <class K, class C, class A>
Chris@16 55 std::size_t hash_value(std::set<K, C, A> const& v);
Chris@16 56 template <class K, class C, class A>
Chris@16 57 std::size_t hash_value(std::multiset<K, C, A> const& v);
Chris@16 58 template <class K, class T, class C, class A>
Chris@16 59 std::size_t hash_value(std::map<K, T, C, A> const& v);
Chris@16 60 template <class K, class T, class C, class A>
Chris@16 61 std::size_t hash_value(std::multimap<K, T, C, A> const& v);
Chris@16 62
Chris@16 63 template <class T>
Chris@16 64 std::size_t hash_value(std::complex<T> const&);
Chris@16 65
Chris@16 66 template <class A, class B>
Chris@16 67 std::size_t hash_value(std::pair<A, B> const& v)
Chris@16 68 {
Chris@16 69 std::size_t seed = 0;
Chris@16 70 boost::hash_combine(seed, v.first);
Chris@16 71 boost::hash_combine(seed, v.second);
Chris@16 72 return seed;
Chris@16 73 }
Chris@16 74
Chris@16 75 template <class T, class A>
Chris@16 76 std::size_t hash_value(std::vector<T, A> const& v)
Chris@16 77 {
Chris@16 78 return boost::hash_range(v.begin(), v.end());
Chris@16 79 }
Chris@16 80
Chris@16 81 template <class T, class A>
Chris@16 82 std::size_t hash_value(std::list<T, A> const& v)
Chris@16 83 {
Chris@16 84 return boost::hash_range(v.begin(), v.end());
Chris@16 85 }
Chris@16 86
Chris@16 87 template <class T, class A>
Chris@16 88 std::size_t hash_value(std::deque<T, A> const& v)
Chris@16 89 {
Chris@16 90 return boost::hash_range(v.begin(), v.end());
Chris@16 91 }
Chris@16 92
Chris@16 93 template <class K, class C, class A>
Chris@16 94 std::size_t hash_value(std::set<K, C, A> const& v)
Chris@16 95 {
Chris@16 96 return boost::hash_range(v.begin(), v.end());
Chris@16 97 }
Chris@16 98
Chris@16 99 template <class K, class C, class A>
Chris@16 100 std::size_t hash_value(std::multiset<K, C, A> const& v)
Chris@16 101 {
Chris@16 102 return boost::hash_range(v.begin(), v.end());
Chris@16 103 }
Chris@16 104
Chris@16 105 template <class K, class T, class C, class A>
Chris@16 106 std::size_t hash_value(std::map<K, T, C, A> const& v)
Chris@16 107 {
Chris@16 108 return boost::hash_range(v.begin(), v.end());
Chris@16 109 }
Chris@16 110
Chris@16 111 template <class K, class T, class C, class A>
Chris@16 112 std::size_t hash_value(std::multimap<K, T, C, A> const& v)
Chris@16 113 {
Chris@16 114 return boost::hash_range(v.begin(), v.end());
Chris@16 115 }
Chris@16 116
Chris@16 117 template <class T>
Chris@16 118 std::size_t hash_value(std::complex<T> const& v)
Chris@16 119 {
Chris@16 120 boost::hash<T> hasher;
Chris@16 121 std::size_t seed = hasher(v.imag());
Chris@16 122 seed ^= hasher(v.real()) + (seed<<6) + (seed>>2);
Chris@16 123 return seed;
Chris@16 124 }
Chris@16 125
Chris@16 126 #if !defined(BOOST_NO_CXX11_HDR_ARRAY)
Chris@16 127 template <class T, std::size_t N>
Chris@16 128 std::size_t hash_value(std::array<T, N> const& v)
Chris@16 129 {
Chris@16 130 return boost::hash_range(v.begin(), v.end());
Chris@16 131 }
Chris@16 132 #endif
Chris@16 133
Chris@16 134 #if !defined(BOOST_NO_CXX11_HDR_TUPLE)
Chris@16 135 namespace hash_detail {
Chris@16 136 template <std::size_t I, typename T>
Chris@16 137 inline typename boost::enable_if_c<(I == std::tuple_size<T>::value),
Chris@16 138 void>::type
Chris@16 139 hash_combine_tuple(std::size_t&, T const&)
Chris@16 140 {
Chris@16 141 }
Chris@16 142
Chris@16 143 template <std::size_t I, typename T>
Chris@16 144 inline typename boost::enable_if_c<(I < std::tuple_size<T>::value),
Chris@16 145 void>::type
Chris@16 146 hash_combine_tuple(std::size_t& seed, T const& v)
Chris@16 147 {
Chris@16 148 boost::hash_combine(seed, std::get<I>(v));
Chris@16 149 boost::hash_detail::hash_combine_tuple<I + 1>(seed, v);
Chris@16 150 }
Chris@16 151
Chris@16 152 template <typename T>
Chris@16 153 inline std::size_t hash_tuple(T const& v)
Chris@16 154 {
Chris@16 155 std::size_t seed = 0;
Chris@16 156 boost::hash_detail::hash_combine_tuple<0>(seed, v);
Chris@16 157 return seed;
Chris@16 158 }
Chris@16 159 }
Chris@16 160
Chris@16 161 #if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
Chris@16 162 template <typename... T>
Chris@16 163 inline std::size_t hash_value(std::tuple<T...> const& v)
Chris@16 164 {
Chris@16 165 return boost::hash_detail::hash_tuple(v);
Chris@16 166 }
Chris@16 167 #else
Chris@16 168
Chris@16 169 inline std::size_t hash_value(std::tuple<> const& v)
Chris@16 170 {
Chris@16 171 return boost::hash_detail::hash_tuple(v);
Chris@16 172 }
Chris@16 173
Chris@16 174 # define BOOST_HASH_TUPLE_F(z, n, _) \
Chris@16 175 template< \
Chris@16 176 BOOST_PP_ENUM_PARAMS_Z(z, n, typename A) \
Chris@16 177 > \
Chris@16 178 inline std::size_t hash_value(std::tuple< \
Chris@16 179 BOOST_PP_ENUM_PARAMS_Z(z, n, A) \
Chris@16 180 > const& v) \
Chris@16 181 { \
Chris@16 182 return boost::hash_detail::hash_tuple(v); \
Chris@16 183 }
Chris@16 184
Chris@16 185 BOOST_PP_REPEAT_FROM_TO(1, 11, BOOST_HASH_TUPLE_F, _)
Chris@16 186 # undef BOOST_HASH_TUPLE_F
Chris@16 187 #endif
Chris@16 188
Chris@16 189 #endif
Chris@16 190
Chris@16 191 #if !defined(BOOST_NO_CXX11_SMART_PTR)
Chris@16 192 template <typename T>
Chris@16 193 inline std::size_t hash_value(std::shared_ptr<T> const& x) {
Chris@16 194 return boost::hash_value(x.get());
Chris@16 195 }
Chris@16 196
Chris@16 197 template <typename T, typename Deleter>
Chris@16 198 inline std::size_t hash_value(std::unique_ptr<T, Deleter> const& x) {
Chris@16 199 return boost::hash_value(x.get());
Chris@16 200 }
Chris@16 201 #endif
Chris@16 202
Chris@16 203 //
Chris@16 204 // call_hash_impl
Chris@16 205 //
Chris@16 206
Chris@16 207 // On compilers without function template ordering, this deals with arrays.
Chris@16 208
Chris@16 209 #if defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING)
Chris@16 210 namespace hash_detail
Chris@16 211 {
Chris@16 212 template <bool IsArray>
Chris@16 213 struct call_hash_impl
Chris@16 214 {
Chris@16 215 template <class T>
Chris@16 216 struct inner
Chris@16 217 {
Chris@16 218 static std::size_t call(T const& v)
Chris@16 219 {
Chris@16 220 using namespace boost;
Chris@16 221 return hash_value(v);
Chris@16 222 }
Chris@16 223 };
Chris@16 224 };
Chris@16 225
Chris@16 226 template <>
Chris@16 227 struct call_hash_impl<true>
Chris@16 228 {
Chris@16 229 template <class Array>
Chris@16 230 struct inner
Chris@16 231 {
Chris@16 232 static std::size_t call(Array const& v)
Chris@16 233 {
Chris@16 234 const int size = sizeof(v) / sizeof(*v);
Chris@16 235 return boost::hash_range(v, v + size);
Chris@16 236 }
Chris@16 237 };
Chris@16 238 };
Chris@16 239
Chris@16 240 template <class T>
Chris@16 241 struct call_hash
Chris@16 242 : public call_hash_impl<boost::is_array<T>::value>
Chris@16 243 ::BOOST_NESTED_TEMPLATE inner<T>
Chris@16 244 {
Chris@16 245 };
Chris@16 246 }
Chris@16 247 #endif // BOOST_NO_FUNCTION_TEMPLATE_ORDERING
Chris@16 248
Chris@16 249 //
Chris@16 250 // boost::hash
Chris@16 251 //
Chris@16 252
Chris@16 253
Chris@16 254 #if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
Chris@16 255
Chris@16 256 template <class T> struct hash
Chris@16 257 : std::unary_function<T, std::size_t>
Chris@16 258 {
Chris@16 259 #if !defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING)
Chris@16 260 std::size_t operator()(T const& val) const
Chris@16 261 {
Chris@16 262 return hash_value(val);
Chris@16 263 }
Chris@16 264 #else
Chris@16 265 std::size_t operator()(T const& val) const
Chris@16 266 {
Chris@16 267 return hash_detail::call_hash<T>::call(val);
Chris@16 268 }
Chris@16 269 #endif
Chris@16 270 };
Chris@16 271
Chris@16 272 #if BOOST_WORKAROUND(__DMC__, <= 0x848)
Chris@16 273 template <class T, unsigned int n> struct hash<T[n]>
Chris@16 274 : std::unary_function<T[n], std::size_t>
Chris@16 275 {
Chris@16 276 std::size_t operator()(const T* val) const
Chris@16 277 {
Chris@16 278 return boost::hash_range(val, val+n);
Chris@16 279 }
Chris@16 280 };
Chris@16 281 #endif
Chris@16 282
Chris@16 283 #else // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
Chris@16 284
Chris@16 285 // On compilers without partial specialization, boost::hash<T>
Chris@16 286 // has already been declared to deal with pointers, so just
Chris@16 287 // need to supply the non-pointer version of hash_impl.
Chris@16 288
Chris@16 289 namespace hash_detail
Chris@16 290 {
Chris@16 291 template <bool IsPointer>
Chris@16 292 struct hash_impl;
Chris@16 293
Chris@16 294 template <>
Chris@16 295 struct hash_impl<false>
Chris@16 296 {
Chris@16 297 template <class T>
Chris@16 298 struct inner
Chris@16 299 : std::unary_function<T, std::size_t>
Chris@16 300 {
Chris@16 301 #if !defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING)
Chris@16 302 std::size_t operator()(T const& val) const
Chris@16 303 {
Chris@16 304 return hash_value(val);
Chris@16 305 }
Chris@16 306 #else
Chris@16 307 std::size_t operator()(T const& val) const
Chris@16 308 {
Chris@16 309 return hash_detail::call_hash<T>::call(val);
Chris@16 310 }
Chris@16 311 #endif
Chris@16 312 };
Chris@16 313 };
Chris@16 314 }
Chris@16 315 #endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
Chris@16 316 }
Chris@16 317
Chris@16 318 #endif