]> git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/functional/hash/examples/portable.cpp
add subtree-ish sources for 12.0.3
[ceph.git] / ceph / src / boost / libs / functional / hash / examples / portable.cpp
1
2 // Copyright 2005-2009 Daniel James.
3 // Distributed under the Boost Software License, Version 1.0. (See accompanying
4 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
5
6 // Force use of assert.
7 #if defined(NDEBUG)
8 #undef NDEBUG
9 #endif
10
11 #include <boost/functional/hash.hpp>
12 #include <cassert>
13
14 // This example illustrates how to customise boost::hash portably, so that
15 // it'll work on both compilers that don't implement argument dependent lookup
16 // and compilers that implement strict two-phase template instantiation.
17
18 namespace foo
19 {
20 template <class T>
21 class custom_type
22 {
23 T value;
24 public:
25 custom_type(T x) : value(x) {}
26
27 std::size_t hash() const
28 {
29 boost::hash<T> hasher;
30 return hasher(value);
31 }
32 };
33 }
34
35 #ifdef BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP
36 namespace boost
37 #else
38 namespace foo
39 #endif
40 {
41 template <class T>
42 std::size_t hash_value(foo::custom_type<T> x)
43 {
44 return x.hash();
45 }
46 }
47
48 int main()
49 {
50 foo::custom_type<int> x(1), y(2), z(1);
51
52 boost::hash<foo::custom_type<int> > hasher;
53
54 assert(hasher(x) == hasher(x));
55 assert(hasher(x) != hasher(y));
56 assert(hasher(x) == hasher(z));
57
58 return 0;
59 }