1 // Copyright 2011, 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/weak_ptr.hpp>
6 #include <boost/shared_ptr.hpp>
7 #include <boost/functional/hash.hpp>
8 #include <boost/core/lightweight_test.hpp>
9 
main()10 int main()
11 {
12     {
13         boost::hash< boost::weak_ptr<int> > hasher;
14 
15         boost::shared_ptr<int> p1, p2( p1 ), p3( new int ), p4( p3 ), p5( new int );
16         boost::weak_ptr<int> q1( p1 ), q2( p2 ), q3( p3 ), q4( p4 ), q5( p5 );
17 
18         BOOST_TEST_EQ( hasher( q1 ), hasher( q2 ) );
19         BOOST_TEST_NE( hasher( q1 ), hasher( q3 ) );
20         BOOST_TEST_EQ( hasher( q3 ), hasher( q4 ) );
21         BOOST_TEST_NE( hasher( q3 ), hasher( q5 ) );
22 
23         p3.reset();
24         p4.reset();
25         p5.reset();
26 
27         BOOST_TEST_EQ( hasher( q1 ), hasher( q2 ) );
28         BOOST_TEST_NE( hasher( q1 ), hasher( q3 ) );
29         BOOST_TEST_EQ( hasher( q3 ), hasher( q4 ) );
30         BOOST_TEST_NE( hasher( q3 ), hasher( q5 ) );
31     }
32 
33     {
34         boost::hash< boost::weak_ptr<int[]> > hasher;
35 
36         boost::shared_ptr<int[]> p1, p2( p1 ), p3( new int[1] ), p4( p3 ), p5( new int[1] );
37         boost::weak_ptr<int[]> q1( p1 ), q2( p2 ), q3( p3 ), q4( p4 ), q5( p5 );
38 
39         BOOST_TEST_EQ( hasher( q1 ), hasher( q2 ) );
40         BOOST_TEST_NE( hasher( q1 ), hasher( q3 ) );
41         BOOST_TEST_EQ( hasher( q3 ), hasher( q4 ) );
42         BOOST_TEST_NE( hasher( q3 ), hasher( q5 ) );
43 
44         p3.reset();
45         p4.reset();
46         p5.reset();
47 
48         BOOST_TEST_EQ( hasher( q1 ), hasher( q2 ) );
49         BOOST_TEST_NE( hasher( q1 ), hasher( q3 ) );
50         BOOST_TEST_EQ( hasher( q3 ), hasher( q4 ) );
51         BOOST_TEST_NE( hasher( q3 ), hasher( q5 ) );
52     }
53 
54     {
55         boost::hash< boost::weak_ptr<int[1]> > hasher;
56 
57         boost::shared_ptr<int[1]> p1, p2( p1 ), p3( new int[1] ), p4( p3 ), p5( new int[1] );
58         boost::weak_ptr<int[1]> q1( p1 ), q2( p2 ), q3( p3 ), q4( p4 ), q5( p5 );
59 
60         BOOST_TEST_EQ( hasher( q1 ), hasher( q2 ) );
61         BOOST_TEST_NE( hasher( q1 ), hasher( q3 ) );
62         BOOST_TEST_EQ( hasher( q3 ), hasher( q4 ) );
63         BOOST_TEST_NE( hasher( q3 ), hasher( q5 ) );
64 
65         p3.reset();
66         p4.reset();
67         p5.reset();
68 
69         BOOST_TEST_EQ( hasher( q1 ), hasher( q2 ) );
70         BOOST_TEST_NE( hasher( q1 ), hasher( q3 ) );
71         BOOST_TEST_EQ( hasher( q3 ), hasher( q4 ) );
72         BOOST_TEST_NE( hasher( q3 ), hasher( q5 ) );
73     }
74 
75     return boost::report_errors();
76 }
77