1// Copyright 2020 Peter Dimov
2// Distributed under the Boost Software License, Version 1.0.
3// https://www.boost.org/LICENSE_1_0.txt
4
5#include <boost/smart_ptr/owner_hash.hpp>
6#include <boost/shared_ptr.hpp>
7#include <boost/weak_ptr.hpp>
8#include <boost/core/lightweight_test.hpp>
9
10template<class T> std::size_t hash_( T const& t )
11{
12 return boost::owner_hash<T>()( t );
13}
14
15int main()
16{
17 boost::shared_ptr<int> p1( new int );
18 boost::shared_ptr<int> p2( p1 );
19
20 BOOST_TEST_EQ( hash_( p1 ), hash_( p2 ) );
21
22 boost::shared_ptr<int> p3( new int );
23
24 BOOST_TEST_NE( hash_( p1 ), hash_( p3 ) );
25
26 boost::shared_ptr<int> p4;
27 boost::shared_ptr<int> p5;
28
29 BOOST_TEST_EQ( hash_( p4 ), hash_( p5 ) );
30 BOOST_TEST_NE( hash_( p4 ), hash_( p3 ) );
31
32 boost::shared_ptr<int> p6( static_cast<int*>(0) );
33
34 BOOST_TEST_NE( hash_( p4 ), hash_( p6 ) );
35
36 boost::shared_ptr<void> p7( p1 );
37
38 BOOST_TEST_EQ( hash_( p1 ), hash_( p7 ) );
39
40 boost::shared_ptr<void> p8;
41
42 BOOST_TEST_NE( hash_( p1 ), hash_( p8 ) );
43 BOOST_TEST_EQ( hash_( p4 ), hash_( p8 ) );
44
45 boost::weak_ptr<int> q1( p1 );
46
47 BOOST_TEST_EQ( hash_( p1 ), hash_( q1 ) );
48
49 boost::weak_ptr<int> q2( p1 );
50
51 BOOST_TEST_EQ( hash_( q1 ), hash_( q2 ) );
52
53 boost::weak_ptr<int> q3( p3 );
54
55 BOOST_TEST_NE( hash_( p1 ), hash_( q3 ) );
56 BOOST_TEST_NE( hash_( q1 ), hash_( q3 ) );
57
58 boost::weak_ptr<int> q4;
59
60 BOOST_TEST_EQ( hash_( p4 ), hash_( q4 ) );
61 BOOST_TEST_NE( hash_( q1 ), hash_( q4 ) );
62
63 boost::weak_ptr<void> q5;
64
65 BOOST_TEST_EQ( hash_( q4 ), hash_( q5 ) );
66
67 boost::weak_ptr<void> q7( p7 );
68
69 BOOST_TEST_EQ( hash_( p1 ), hash_( q7 ) );
70 BOOST_TEST_EQ( hash_( q1 ), hash_( q7 ) );
71
72 p1.reset();
73 p2.reset();
74 p3.reset();
75 p7.reset();
76
77 BOOST_TEST( q1.expired() );
78 BOOST_TEST( q2.expired() );
79 BOOST_TEST( q3.expired() );
80 BOOST_TEST( q7.expired() );
81
82 BOOST_TEST_EQ( hash_( q1 ), hash_( q2 ) );
83 BOOST_TEST_EQ( hash_( q1 ), hash_( q7 ) );
84 BOOST_TEST_NE( hash_( q1 ), hash_( q3 ) );
85 BOOST_TEST_NE( hash_( q1 ), hash_( q4 ) );
86
87 return boost::report_errors();
88}
89

source code of boost/libs/smart_ptr/test/owner_hash_test.cpp