]>
git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/tr1/test/test_shared_ptr.cpp
1 // (C) Copyright John Maddock 2005.
2 // Use, modification and distribution are subject to the
3 // Boost Software License, Version 1.0. (See accompanying file
4 // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6 #ifdef TEST_STD_HEADERS
9 #include <boost/tr1/memory.hpp>
13 #include <boost/static_assert.hpp>
14 #include <boost/type_traits/is_base_and_derived.hpp>
15 #include <boost/type_traits/is_same.hpp>
16 #include "verify_return.hpp"
22 struct derived
: public base
{};
23 struct derived_deleter
25 void operator()(derived
*b
)
33 virtual ~abstract_base();
36 struct concrete
: public abstract_base
41 struct shared_self
: public std::tr1::enable_shared_from_this
<shared_self
>
43 typedef std::tr1::enable_shared_from_this
<shared_self
> base_type
;
44 shared_self() : base_type(){}
45 shared_self(const shared_self
& s
) : base_type(s
){}
47 // implicit assignment:
48 //shared_self& operator=(const shared_self& s)
57 std::tr1::bad_weak_ptr b
;
58 BOOST_STATIC_ASSERT((::boost::is_base_and_derived
<std::exception
, std::tr1::bad_weak_ptr
>::value
));
61 typedef std::tr1::shared_ptr
<derived
> pderived
;
62 typedef std::tr1::shared_ptr
<base
> pbase
;
63 typedef std::tr1::shared_ptr
<abstract_base
> pabase
;
64 BOOST_STATIC_ASSERT((::boost::is_same
<pderived::element_type
, derived
>::value
));
66 pabase
pb1(new concrete());
67 pbase
pb2(new derived(), derived_deleter());
70 std::tr1::weak_ptr
<derived
>* pweak
= 0;
72 std::auto_ptr
<derived
>* pap
= 0;
79 pb1
.reset(new concrete());
80 pb2
.reset(new derived(), derived_deleter());
81 verify_return_type(pb2
.get(), static_cast<base
*>(0));
82 verify_return_type(*pb2
, base());
83 verify_return_type(pb2
->member(), char(0));
84 verify_return_type(pb2
.use_count(), long(0));
85 verify_return_type(pb2
.unique(), bool(0));
88 if(pb2
&& pb3
) { noop(); }
89 // heterogeneous compare:
90 verify_return_type(pd1
== pb2
, bool());
91 verify_return_type(pd1
!= pb2
, bool());
92 verify_return_type(pd1
< pb2
, bool());
93 std::cout
<< pb1
<< pb2
<< std::endl
;
94 std::tr1::swap(pb2
, pb3
);
95 swap(pb2
, pb3
); // ADL
96 verify_return_type(std::tr1::static_pointer_cast
<derived
>(pb2
), pderived());
97 verify_return_type(std::tr1::dynamic_pointer_cast
<concrete
>(pb1
), std::tr1::shared_ptr
<concrete
>());
98 verify_return_type(std::tr1::const_pointer_cast
<base
>(std::tr1::shared_ptr
<const base
>()), std::tr1::shared_ptr
<base
>());
99 verify_return_type(std::tr1::get_deleter
<derived_deleter
>(pb2
), static_cast<derived_deleter
*>(0));
102 typedef std::tr1::weak_ptr
<base
> wpb_t
;
103 BOOST_STATIC_ASSERT((::boost::is_same
<wpb_t::element_type
, base
>::value
));
107 std::tr1::weak_ptr
<derived
> wpd
;
114 verify_return_type(wpb4
.use_count(), long(0));
115 verify_return_type(wpb4
.expired(), bool(0));
116 verify_return_type(wpb4
.lock(), pb2
);
118 // enable_shared_from_this:
119 typedef std::tr1::shared_ptr
<shared_self
> pshared_self
;
120 typedef std::tr1::shared_ptr
<const shared_self
> pcshared_self
;
121 pshared_self
sf1(new shared_self());
122 pshared_self
sf2(new shared_self(*sf1
));
124 pcshared_self
csf(sf1
);
125 verify_return_type(sf1
->shared_from_this(), sf1
);
126 verify_return_type(csf
->shared_from_this(), csf
);