annotate DEPENDENCIES/generic/include/boost/functional/hash/extensions.hpp @ 16:2665513ce2d3

Add boost headers
author Chris Cannam
date Tue, 05 Aug 2014 11:11:38 +0100
parents
children c530137014c0
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@16 16 #include <boost/functional/hash/hash.hpp>
Chris@16 17 #include <boost/detail/container_fwd.hpp>
Chris@16 18 #include <boost/utility/enable_if.hpp>
Chris@16 19 #include <boost/static_assert.hpp>
Chris@16 20 #include <boost/preprocessor/repetition/repeat_from_to.hpp>
Chris@16 21 #include <boost/preprocessor/repetition/enum_params.hpp>
Chris@16 22
Chris@16 23 #if !defined(BOOST_NO_CXX11_HDR_ARRAY)
Chris@16 24 # include <array>
Chris@16 25 #endif
Chris@16 26
Chris@16 27 #if !defined(BOOST_NO_CXX11_HDR_TUPLE)
Chris@16 28 # include <tuple>
Chris@16 29 #endif
Chris@16 30
Chris@16 31 #if !defined(BOOST_NO_CXX11_HDR_MEMORY)
Chris@16 32 # include <memory>
Chris@16 33 #endif
Chris@16 34
Chris@16 35 #if defined(_MSC_VER) && (_MSC_VER >= 1020)
Chris@16 36 # pragma once
Chris@16 37 #endif
Chris@16 38
Chris@16 39 #if defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING)
Chris@16 40 #include <boost/type_traits/is_array.hpp>
Chris@16 41 #endif
Chris@16 42
Chris@16 43 #if BOOST_WORKAROUND(BOOST_MSVC, < 1300)
Chris@16 44 #include <boost/type_traits/is_const.hpp>
Chris@16 45 #endif
Chris@16 46
Chris@16 47 namespace boost
Chris@16 48 {
Chris@16 49 template <class A, class B>
Chris@16 50 std::size_t hash_value(std::pair<A, B> const&);
Chris@16 51 template <class T, class A>
Chris@16 52 std::size_t hash_value(std::vector<T, A> const&);
Chris@16 53 template <class T, class A>
Chris@16 54 std::size_t hash_value(std::list<T, A> const& v);
Chris@16 55 template <class T, class A>
Chris@16 56 std::size_t hash_value(std::deque<T, A> const& v);
Chris@16 57 template <class K, class C, class A>
Chris@16 58 std::size_t hash_value(std::set<K, C, A> const& v);
Chris@16 59 template <class K, class C, class A>
Chris@16 60 std::size_t hash_value(std::multiset<K, C, A> const& v);
Chris@16 61 template <class K, class T, class C, class A>
Chris@16 62 std::size_t hash_value(std::map<K, T, C, A> const& v);
Chris@16 63 template <class K, class T, class C, class A>
Chris@16 64 std::size_t hash_value(std::multimap<K, T, C, A> const& v);
Chris@16 65
Chris@16 66 template <class T>
Chris@16 67 std::size_t hash_value(std::complex<T> const&);
Chris@16 68
Chris@16 69 template <class A, class B>
Chris@16 70 std::size_t hash_value(std::pair<A, B> const& v)
Chris@16 71 {
Chris@16 72 std::size_t seed = 0;
Chris@16 73 boost::hash_combine(seed, v.first);
Chris@16 74 boost::hash_combine(seed, v.second);
Chris@16 75 return seed;
Chris@16 76 }
Chris@16 77
Chris@16 78 template <class T, class A>
Chris@16 79 std::size_t hash_value(std::vector<T, A> const& v)
Chris@16 80 {
Chris@16 81 return boost::hash_range(v.begin(), v.end());
Chris@16 82 }
Chris@16 83
Chris@16 84 template <class T, class A>
Chris@16 85 std::size_t hash_value(std::list<T, A> const& v)
Chris@16 86 {
Chris@16 87 return boost::hash_range(v.begin(), v.end());
Chris@16 88 }
Chris@16 89
Chris@16 90 template <class T, class A>
Chris@16 91 std::size_t hash_value(std::deque<T, A> const& v)
Chris@16 92 {
Chris@16 93 return boost::hash_range(v.begin(), v.end());
Chris@16 94 }
Chris@16 95
Chris@16 96 template <class K, class C, class A>
Chris@16 97 std::size_t hash_value(std::set<K, C, A> const& v)
Chris@16 98 {
Chris@16 99 return boost::hash_range(v.begin(), v.end());
Chris@16 100 }
Chris@16 101
Chris@16 102 template <class K, class C, class A>
Chris@16 103 std::size_t hash_value(std::multiset<K, C, A> const& v)
Chris@16 104 {
Chris@16 105 return boost::hash_range(v.begin(), v.end());
Chris@16 106 }
Chris@16 107
Chris@16 108 template <class K, class T, class C, class A>
Chris@16 109 std::size_t hash_value(std::map<K, T, C, A> const& v)
Chris@16 110 {
Chris@16 111 return boost::hash_range(v.begin(), v.end());
Chris@16 112 }
Chris@16 113
Chris@16 114 template <class K, class T, class C, class A>
Chris@16 115 std::size_t hash_value(std::multimap<K, T, C, A> const& v)
Chris@16 116 {
Chris@16 117 return boost::hash_range(v.begin(), v.end());
Chris@16 118 }
Chris@16 119
Chris@16 120 template <class T>
Chris@16 121 std::size_t hash_value(std::complex<T> const& v)
Chris@16 122 {
Chris@16 123 boost::hash<T> hasher;
Chris@16 124 std::size_t seed = hasher(v.imag());
Chris@16 125 seed ^= hasher(v.real()) + (seed<<6) + (seed>>2);
Chris@16 126 return seed;
Chris@16 127 }
Chris@16 128
Chris@16 129 #if !defined(BOOST_NO_CXX11_HDR_ARRAY)
Chris@16 130 template <class T, std::size_t N>
Chris@16 131 std::size_t hash_value(std::array<T, N> const& v)
Chris@16 132 {
Chris@16 133 return boost::hash_range(v.begin(), v.end());
Chris@16 134 }
Chris@16 135 #endif
Chris@16 136
Chris@16 137 #if !defined(BOOST_NO_CXX11_HDR_TUPLE)
Chris@16 138 namespace hash_detail {
Chris@16 139 template <std::size_t I, typename T>
Chris@16 140 inline typename boost::enable_if_c<(I == std::tuple_size<T>::value),
Chris@16 141 void>::type
Chris@16 142 hash_combine_tuple(std::size_t&, T const&)
Chris@16 143 {
Chris@16 144 }
Chris@16 145
Chris@16 146 template <std::size_t I, typename T>
Chris@16 147 inline typename boost::enable_if_c<(I < std::tuple_size<T>::value),
Chris@16 148 void>::type
Chris@16 149 hash_combine_tuple(std::size_t& seed, T const& v)
Chris@16 150 {
Chris@16 151 boost::hash_combine(seed, std::get<I>(v));
Chris@16 152 boost::hash_detail::hash_combine_tuple<I + 1>(seed, v);
Chris@16 153 }
Chris@16 154
Chris@16 155 template <typename T>
Chris@16 156 inline std::size_t hash_tuple(T const& v)
Chris@16 157 {
Chris@16 158 std::size_t seed = 0;
Chris@16 159 boost::hash_detail::hash_combine_tuple<0>(seed, v);
Chris@16 160 return seed;
Chris@16 161 }
Chris@16 162 }
Chris@16 163
Chris@16 164 #if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
Chris@16 165 template <typename... T>
Chris@16 166 inline std::size_t hash_value(std::tuple<T...> const& v)
Chris@16 167 {
Chris@16 168 return boost::hash_detail::hash_tuple(v);
Chris@16 169 }
Chris@16 170 #else
Chris@16 171
Chris@16 172 inline std::size_t hash_value(std::tuple<> const& v)
Chris@16 173 {
Chris@16 174 return boost::hash_detail::hash_tuple(v);
Chris@16 175 }
Chris@16 176
Chris@16 177 # define BOOST_HASH_TUPLE_F(z, n, _) \
Chris@16 178 template< \
Chris@16 179 BOOST_PP_ENUM_PARAMS_Z(z, n, typename A) \
Chris@16 180 > \
Chris@16 181 inline std::size_t hash_value(std::tuple< \
Chris@16 182 BOOST_PP_ENUM_PARAMS_Z(z, n, A) \
Chris@16 183 > const& v) \
Chris@16 184 { \
Chris@16 185 return boost::hash_detail::hash_tuple(v); \
Chris@16 186 }
Chris@16 187
Chris@16 188 BOOST_PP_REPEAT_FROM_TO(1, 11, BOOST_HASH_TUPLE_F, _)
Chris@16 189 # undef BOOST_HASH_TUPLE_F
Chris@16 190 #endif
Chris@16 191
Chris@16 192 #endif
Chris@16 193
Chris@16 194 #if !defined(BOOST_NO_CXX11_SMART_PTR)
Chris@16 195 template <typename T>
Chris@16 196 inline std::size_t hash_value(std::shared_ptr<T> const& x) {
Chris@16 197 return boost::hash_value(x.get());
Chris@16 198 }
Chris@16 199
Chris@16 200 template <typename T, typename Deleter>
Chris@16 201 inline std::size_t hash_value(std::unique_ptr<T, Deleter> const& x) {
Chris@16 202 return boost::hash_value(x.get());
Chris@16 203 }
Chris@16 204 #endif
Chris@16 205
Chris@16 206 //
Chris@16 207 // call_hash_impl
Chris@16 208 //
Chris@16 209
Chris@16 210 // On compilers without function template ordering, this deals with arrays.
Chris@16 211
Chris@16 212 #if defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING)
Chris@16 213 namespace hash_detail
Chris@16 214 {
Chris@16 215 template <bool IsArray>
Chris@16 216 struct call_hash_impl
Chris@16 217 {
Chris@16 218 template <class T>
Chris@16 219 struct inner
Chris@16 220 {
Chris@16 221 static std::size_t call(T const& v)
Chris@16 222 {
Chris@16 223 using namespace boost;
Chris@16 224 return hash_value(v);
Chris@16 225 }
Chris@16 226 };
Chris@16 227 };
Chris@16 228
Chris@16 229 template <>
Chris@16 230 struct call_hash_impl<true>
Chris@16 231 {
Chris@16 232 template <class Array>
Chris@16 233 struct inner
Chris@16 234 {
Chris@16 235 #if !BOOST_WORKAROUND(BOOST_MSVC, < 1300)
Chris@16 236 static std::size_t call(Array const& v)
Chris@16 237 #else
Chris@16 238 static std::size_t call(Array& v)
Chris@16 239 #endif
Chris@16 240 {
Chris@16 241 const int size = sizeof(v) / sizeof(*v);
Chris@16 242 return boost::hash_range(v, v + size);
Chris@16 243 }
Chris@16 244 };
Chris@16 245 };
Chris@16 246
Chris@16 247 template <class T>
Chris@16 248 struct call_hash
Chris@16 249 : public call_hash_impl<boost::is_array<T>::value>
Chris@16 250 ::BOOST_NESTED_TEMPLATE inner<T>
Chris@16 251 {
Chris@16 252 };
Chris@16 253 }
Chris@16 254 #endif // BOOST_NO_FUNCTION_TEMPLATE_ORDERING
Chris@16 255
Chris@16 256 //
Chris@16 257 // boost::hash
Chris@16 258 //
Chris@16 259
Chris@16 260
Chris@16 261 #if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
Chris@16 262
Chris@16 263 template <class T> struct hash
Chris@16 264 : std::unary_function<T, std::size_t>
Chris@16 265 {
Chris@16 266 #if !defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING)
Chris@16 267 std::size_t operator()(T const& val) const
Chris@16 268 {
Chris@16 269 return hash_value(val);
Chris@16 270 }
Chris@16 271 #else
Chris@16 272 std::size_t operator()(T const& val) const
Chris@16 273 {
Chris@16 274 return hash_detail::call_hash<T>::call(val);
Chris@16 275 }
Chris@16 276 #endif
Chris@16 277 };
Chris@16 278
Chris@16 279 #if BOOST_WORKAROUND(__DMC__, <= 0x848)
Chris@16 280 template <class T, unsigned int n> struct hash<T[n]>
Chris@16 281 : std::unary_function<T[n], std::size_t>
Chris@16 282 {
Chris@16 283 std::size_t operator()(const T* val) const
Chris@16 284 {
Chris@16 285 return boost::hash_range(val, val+n);
Chris@16 286 }
Chris@16 287 };
Chris@16 288 #endif
Chris@16 289
Chris@16 290 #else // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
Chris@16 291
Chris@16 292 // On compilers without partial specialization, boost::hash<T>
Chris@16 293 // has already been declared to deal with pointers, so just
Chris@16 294 // need to supply the non-pointer version of hash_impl.
Chris@16 295
Chris@16 296 namespace hash_detail
Chris@16 297 {
Chris@16 298 template <bool IsPointer>
Chris@16 299 struct hash_impl;
Chris@16 300
Chris@16 301 #if !BOOST_WORKAROUND(BOOST_MSVC, < 1300)
Chris@16 302
Chris@16 303 template <>
Chris@16 304 struct hash_impl<false>
Chris@16 305 {
Chris@16 306 template <class T>
Chris@16 307 struct inner
Chris@16 308 : std::unary_function<T, std::size_t>
Chris@16 309 {
Chris@16 310 #if !defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING)
Chris@16 311 std::size_t operator()(T const& val) const
Chris@16 312 {
Chris@16 313 return hash_value(val);
Chris@16 314 }
Chris@16 315 #else
Chris@16 316 std::size_t operator()(T const& val) const
Chris@16 317 {
Chris@16 318 return hash_detail::call_hash<T>::call(val);
Chris@16 319 }
Chris@16 320 #endif
Chris@16 321 };
Chris@16 322 };
Chris@16 323
Chris@16 324 #else // Visual C++ 6.5
Chris@16 325
Chris@16 326 // Visual C++ 6.5 has problems with nested member functions and
Chris@16 327 // applying const to const types in templates. So we get this:
Chris@16 328
Chris@16 329 template <bool IsConst>
Chris@16 330 struct hash_impl_msvc
Chris@16 331 {
Chris@16 332 template <class T>
Chris@16 333 struct inner
Chris@16 334 : public std::unary_function<T, std::size_t>
Chris@16 335 {
Chris@16 336 std::size_t operator()(T const& val) const
Chris@16 337 {
Chris@16 338 return hash_detail::call_hash<T const>::call(val);
Chris@16 339 }
Chris@16 340
Chris@16 341 std::size_t operator()(T& val) const
Chris@16 342 {
Chris@16 343 return hash_detail::call_hash<T>::call(val);
Chris@16 344 }
Chris@16 345 };
Chris@16 346 };
Chris@16 347
Chris@16 348 template <>
Chris@16 349 struct hash_impl_msvc<true>
Chris@16 350 {
Chris@16 351 template <class T>
Chris@16 352 struct inner
Chris@16 353 : public std::unary_function<T, std::size_t>
Chris@16 354 {
Chris@16 355 std::size_t operator()(T& val) const
Chris@16 356 {
Chris@16 357 return hash_detail::call_hash<T>::call(val);
Chris@16 358 }
Chris@16 359 };
Chris@16 360 };
Chris@16 361
Chris@16 362 template <class T>
Chris@16 363 struct hash_impl_msvc2
Chris@16 364 : public hash_impl_msvc<boost::is_const<T>::value>
Chris@16 365 ::BOOST_NESTED_TEMPLATE inner<T> {};
Chris@16 366
Chris@16 367 template <>
Chris@16 368 struct hash_impl<false>
Chris@16 369 {
Chris@16 370 template <class T>
Chris@16 371 struct inner : public hash_impl_msvc2<T> {};
Chris@16 372 };
Chris@16 373
Chris@16 374 #endif // Visual C++ 6.5
Chris@16 375 }
Chris@16 376 #endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
Chris@16 377 }
Chris@16 378
Chris@16 379 #endif