| 
									
										
										
										
											2003-11-28 15:35:21 +00:00
										 |  |  | #include <boost/config.hpp>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #if defined(BOOST_MSVC)
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-01-25 13:54:30 +00:00
										 |  |  | #pragma warning(disable: 4786)  // identifier truncated in debug info
 | 
					
						
							|  |  |  | #pragma warning(disable: 4710)  // function not inlined
 | 
					
						
							|  |  |  | #pragma warning(disable: 4711)  // function selected for automatic inline expansion
 | 
					
						
							|  |  |  | #pragma warning(disable: 4514)  // unreferenced inline removed
 | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  | #pragma warning(disable: 4355)  // 'this' : used in base member initializer list
 | 
					
						
							| 
									
										
										
										
											2003-11-28 15:35:21 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | #if (BOOST_MSVC >= 1310)
 | 
					
						
							|  |  |  | #pragma warning(disable: 4675)  // resolved overload found with Koenig lookup
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-01-25 13:54:30 +00:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | //
 | 
					
						
							| 
									
										
										
										
											2002-11-25 12:12:45 +00:00
										 |  |  | //  shared_ptr_test.cpp
 | 
					
						
							| 
									
										
										
										
											2002-01-25 13:54:30 +00:00
										 |  |  | //
 | 
					
						
							| 
									
										
										
										
											2003-01-13 18:32:16 +00:00
										 |  |  | //  Copyright (c) 2002, 2003 Peter Dimov
 | 
					
						
							| 
									
										
										
										
											2002-01-25 13:54:30 +00:00
										 |  |  | //
 | 
					
						
							| 
									
										
										
										
											2004-07-26 00:32:12 +00:00
										 |  |  | // Distributed under the Boost Software License, Version 1.0. (See
 | 
					
						
							|  |  |  | // accompanying file LICENSE_1_0.txt or copy at
 | 
					
						
							|  |  |  | // http://www.boost.org/LICENSE_1_0.txt)
 | 
					
						
							| 
									
										
										
										
											2002-01-25 13:54:30 +00:00
										 |  |  | //
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-08-16 16:41:16 +00:00
										 |  |  | #include <boost/detail/lightweight_test.hpp>
 | 
					
						
							| 
									
										
										
										
											2002-01-25 13:54:30 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | #include <boost/shared_ptr.hpp>
 | 
					
						
							|  |  |  | #include <boost/weak_ptr.hpp>
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  | #include <map>
 | 
					
						
							|  |  |  | #include <vector>
 | 
					
						
							| 
									
										
										
										
											2002-08-13 15:58:12 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  | //
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace n_element_type | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void f(int &) | 
					
						
							| 
									
										
										
										
											2002-01-25 13:54:30 +00:00
										 |  |  | { | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  | void test() | 
					
						
							| 
									
										
										
										
											2002-01-25 13:54:30 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  |     typedef boost::shared_ptr<int>::element_type T; | 
					
						
							|  |  |  |     T t; | 
					
						
							|  |  |  |     f(t); | 
					
						
							| 
									
										
										
										
											2002-01-25 13:54:30 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  | } // namespace n_element_type
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace n_constructors | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class incomplete; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void default_constructor() | 
					
						
							| 
									
										
										
										
											2002-01-25 13:54:30 +00:00
										 |  |  | { | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  |         boost::shared_ptr<int> pi; | 
					
						
							|  |  |  |         BOOST_TEST(pi? false: true); | 
					
						
							|  |  |  |         BOOST_TEST(!pi); | 
					
						
							|  |  |  |         BOOST_TEST(pi.get() == 0); | 
					
						
							| 
									
										
										
										
											2002-01-25 13:54:30 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  |         boost::shared_ptr<void> pv; | 
					
						
							|  |  |  |         BOOST_TEST(pv? false: true); | 
					
						
							|  |  |  |         BOOST_TEST(!pv); | 
					
						
							|  |  |  |         BOOST_TEST(pv.get() == 0); | 
					
						
							| 
									
										
										
										
											2002-01-25 13:54:30 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-02-09 12:34:05 +00:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  |         boost::shared_ptr<incomplete> px; | 
					
						
							|  |  |  |         BOOST_TEST(px? false: true); | 
					
						
							|  |  |  |         BOOST_TEST(!px); | 
					
						
							|  |  |  |         BOOST_TEST(px.get() == 0); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | struct A | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     int dummy; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | struct X | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     static long instances; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     X() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         ++instances; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ~X() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         --instances; | 
					
						
							| 
									
										
										
										
											2002-02-09 12:34:05 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-01-25 13:54:30 +00:00
										 |  |  | private: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     X(X const &); | 
					
						
							|  |  |  |     X & operator= (X const &); | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  | long X::instances = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-22 13:49:54 +00:00
										 |  |  | // virtual inheritance stresses the implementation
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | struct Y: public A, public virtual X | 
					
						
							| 
									
										
										
										
											2002-01-25 13:54:30 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  |     static long instances; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-01-25 13:54:30 +00:00
										 |  |  |     Y() | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  |         ++instances; | 
					
						
							| 
									
										
										
										
											2002-01-25 13:54:30 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ~Y() | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  |         --instances; | 
					
						
							| 
									
										
										
										
											2002-02-09 12:34:05 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-01-25 13:54:30 +00:00
										 |  |  | private: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     Y(Y const &); | 
					
						
							|  |  |  |     Y & operator= (Y const &); | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  | long Y::instances = 0; | 
					
						
							| 
									
										
										
										
											2002-01-25 13:54:30 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-09-08 12:26:02 +00:00
										 |  |  | template<class T> void pc0_test(T * p) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     BOOST_TEST(p == 0); | 
					
						
							|  |  |  |     boost::shared_ptr<T> pt(p); | 
					
						
							|  |  |  |     BOOST_TEST(pt? false: true); | 
					
						
							|  |  |  |     BOOST_TEST(!pt); | 
					
						
							|  |  |  |     BOOST_TEST(pt.get() == 0); | 
					
						
							|  |  |  |     BOOST_TEST(pt.use_count() == 1); | 
					
						
							|  |  |  |     BOOST_TEST(pt.unique()); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  | void pointer_constructor() | 
					
						
							| 
									
										
										
										
											2002-01-25 13:54:30 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2003-09-08 12:26:02 +00:00
										 |  |  |     pc0_test(static_cast<int*>(0)); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-11-27 16:58:23 +00:00
										 |  |  | #if !defined(BOOST_MSVC) || (BOOST_MSVC > 1300)
 | 
					
						
							| 
									
										
										
										
											2003-09-08 12:26:02 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     pc0_test(static_cast<int const*>(0)); | 
					
						
							|  |  |  |     pc0_test(static_cast<int volatile*>(0)); | 
					
						
							|  |  |  |     pc0_test(static_cast<int const volatile*>(0)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2003-09-08 12:26:02 +00:00
										 |  |  |         boost::shared_ptr<int const> pi(static_cast<int*>(0)); | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  |         BOOST_TEST(pi? false: true); | 
					
						
							|  |  |  |         BOOST_TEST(!pi); | 
					
						
							|  |  |  |         BOOST_TEST(pi.get() == 0); | 
					
						
							|  |  |  |         BOOST_TEST(pi.use_count() == 1); | 
					
						
							|  |  |  |         BOOST_TEST(pi.unique()); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2002-01-25 13:54:30 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2003-09-08 12:26:02 +00:00
										 |  |  |         boost::shared_ptr<int volatile> pi(static_cast<int*>(0)); | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  |         BOOST_TEST(pi? false: true); | 
					
						
							|  |  |  |         BOOST_TEST(!pi); | 
					
						
							|  |  |  |         BOOST_TEST(pi.get() == 0); | 
					
						
							|  |  |  |         BOOST_TEST(pi.use_count() == 1); | 
					
						
							|  |  |  |         BOOST_TEST(pi.unique()); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2002-05-01 11:22:22 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  |         boost::shared_ptr<void> pv(static_cast<int*>(0)); | 
					
						
							|  |  |  |         BOOST_TEST(pv? false: true); | 
					
						
							|  |  |  |         BOOST_TEST(!pv); | 
					
						
							|  |  |  |         BOOST_TEST(pv.get() == 0); | 
					
						
							|  |  |  |         BOOST_TEST(pv.use_count() == 1); | 
					
						
							|  |  |  |         BOOST_TEST(pv.unique()); | 
					
						
							| 
									
										
										
										
											2002-05-01 11:22:22 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  |         boost::shared_ptr<void const> pv(static_cast<int*>(0)); | 
					
						
							|  |  |  |         BOOST_TEST(pv? false: true); | 
					
						
							|  |  |  |         BOOST_TEST(!pv); | 
					
						
							|  |  |  |         BOOST_TEST(pv.get() == 0); | 
					
						
							|  |  |  |         BOOST_TEST(pv.use_count() == 1); | 
					
						
							|  |  |  |         BOOST_TEST(pv.unique()); | 
					
						
							| 
									
										
										
										
											2002-05-01 11:22:22 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-09-08 12:26:02 +00:00
										 |  |  |     pc0_test(static_cast<X*>(0)); | 
					
						
							|  |  |  |     pc0_test(static_cast<X const*>(0)); | 
					
						
							|  |  |  |     pc0_test(static_cast<X volatile*>(0)); | 
					
						
							|  |  |  |     pc0_test(static_cast<X const volatile*>(0)); | 
					
						
							| 
									
										
										
										
											2002-07-22 16:36:52 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-07-24 14:14:17 +00:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  |         boost::shared_ptr<X const> px(static_cast<X*>(0)); | 
					
						
							|  |  |  |         BOOST_TEST(px? false: true); | 
					
						
							|  |  |  |         BOOST_TEST(!px); | 
					
						
							|  |  |  |         BOOST_TEST(px.get() == 0); | 
					
						
							|  |  |  |         BOOST_TEST(px.use_count() == 1); | 
					
						
							|  |  |  |         BOOST_TEST(px.unique()); | 
					
						
							| 
									
										
										
										
											2002-07-24 14:14:17 +00:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2002-07-22 16:36:52 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  |     { | 
					
						
							|  |  |  |         boost::shared_ptr<X> px(static_cast<Y*>(0)); | 
					
						
							|  |  |  |         BOOST_TEST(px? false: true); | 
					
						
							|  |  |  |         BOOST_TEST(!px); | 
					
						
							|  |  |  |         BOOST_TEST(px.get() == 0); | 
					
						
							|  |  |  |         BOOST_TEST(px.use_count() == 1); | 
					
						
							|  |  |  |         BOOST_TEST(px.unique()); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2002-05-01 11:22:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  |     { | 
					
						
							|  |  |  |         boost::shared_ptr<X const> px(static_cast<Y*>(0)); | 
					
						
							|  |  |  |         BOOST_TEST(px? false: true); | 
					
						
							|  |  |  |         BOOST_TEST(!px); | 
					
						
							|  |  |  |         BOOST_TEST(px.get() == 0); | 
					
						
							|  |  |  |         BOOST_TEST(px.use_count() == 1); | 
					
						
							|  |  |  |         BOOST_TEST(px.unique()); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2002-05-01 11:22:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  |     { | 
					
						
							|  |  |  |         boost::shared_ptr<void> pv(static_cast<X*>(0)); | 
					
						
							|  |  |  |         BOOST_TEST(pv? false: true); | 
					
						
							|  |  |  |         BOOST_TEST(!pv); | 
					
						
							|  |  |  |         BOOST_TEST(pv.get() == 0); | 
					
						
							|  |  |  |         BOOST_TEST(pv.use_count() == 1); | 
					
						
							|  |  |  |         BOOST_TEST(pv.unique()); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2002-02-09 12:34:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  |     { | 
					
						
							|  |  |  |         boost::shared_ptr<void const> pv(static_cast<X*>(0)); | 
					
						
							|  |  |  |         BOOST_TEST(pv? false: true); | 
					
						
							|  |  |  |         BOOST_TEST(!pv); | 
					
						
							|  |  |  |         BOOST_TEST(pv.get() == 0); | 
					
						
							|  |  |  |         BOOST_TEST(pv.use_count() == 1); | 
					
						
							|  |  |  |         BOOST_TEST(pv.unique()); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2002-02-12 16:55:25 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  |     { | 
					
						
							|  |  |  |         int * p = new int(7); | 
					
						
							|  |  |  |         boost::shared_ptr<int> pi(p); | 
					
						
							|  |  |  |         BOOST_TEST(pi? true: false); | 
					
						
							|  |  |  |         BOOST_TEST(!!pi); | 
					
						
							|  |  |  |         BOOST_TEST(pi.get() == p); | 
					
						
							|  |  |  |         BOOST_TEST(pi.use_count() == 1); | 
					
						
							|  |  |  |         BOOST_TEST(pi.unique()); | 
					
						
							|  |  |  |         BOOST_TEST(*pi == 7); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2002-02-09 12:34:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  |     { | 
					
						
							|  |  |  |         int * p = new int(7); | 
					
						
							|  |  |  |         boost::shared_ptr<int const> pi(p); | 
					
						
							|  |  |  |         BOOST_TEST(pi? true: false); | 
					
						
							|  |  |  |         BOOST_TEST(!!pi); | 
					
						
							|  |  |  |         BOOST_TEST(pi.get() == p); | 
					
						
							|  |  |  |         BOOST_TEST(pi.use_count() == 1); | 
					
						
							|  |  |  |         BOOST_TEST(pi.unique()); | 
					
						
							|  |  |  |         BOOST_TEST(*pi == 7); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2002-02-12 16:55:25 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  |     { | 
					
						
							|  |  |  |         int * p = new int(7); | 
					
						
							|  |  |  |         boost::shared_ptr<void> pv(p); | 
					
						
							|  |  |  |         BOOST_TEST(pv? true: false); | 
					
						
							|  |  |  |         BOOST_TEST(!!pv); | 
					
						
							|  |  |  |         BOOST_TEST(pv.get() == p); | 
					
						
							|  |  |  |         BOOST_TEST(pv.use_count() == 1); | 
					
						
							|  |  |  |         BOOST_TEST(pv.unique()); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2002-02-09 12:34:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  |     { | 
					
						
							|  |  |  |         int * p = new int(7); | 
					
						
							|  |  |  |         boost::shared_ptr<void const> pv(p); | 
					
						
							|  |  |  |         BOOST_TEST(pv? true: false); | 
					
						
							|  |  |  |         BOOST_TEST(!!pv); | 
					
						
							|  |  |  |         BOOST_TEST(pv.get() == p); | 
					
						
							|  |  |  |         BOOST_TEST(pv.use_count() == 1); | 
					
						
							|  |  |  |         BOOST_TEST(pv.unique()); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2002-02-09 12:34:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  |     BOOST_TEST(X::instances == 0); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         X * p = new X; | 
					
						
							|  |  |  |         boost::shared_ptr<X> px(p); | 
					
						
							|  |  |  |         BOOST_TEST(px? true: false); | 
					
						
							|  |  |  |         BOOST_TEST(!!px); | 
					
						
							|  |  |  |         BOOST_TEST(px.get() == p); | 
					
						
							|  |  |  |         BOOST_TEST(px.use_count() == 1); | 
					
						
							|  |  |  |         BOOST_TEST(px.unique()); | 
					
						
							|  |  |  |         BOOST_TEST(X::instances == 1); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     BOOST_TEST(X::instances == 0); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         X * p = new X; | 
					
						
							|  |  |  |         boost::shared_ptr<X const> px(p); | 
					
						
							|  |  |  |         BOOST_TEST(px? true: false); | 
					
						
							|  |  |  |         BOOST_TEST(!!px); | 
					
						
							|  |  |  |         BOOST_TEST(px.get() == p); | 
					
						
							|  |  |  |         BOOST_TEST(px.use_count() == 1); | 
					
						
							|  |  |  |         BOOST_TEST(px.unique()); | 
					
						
							|  |  |  |         BOOST_TEST(X::instances == 1); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     BOOST_TEST(X::instances == 0); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         X * p = new X; | 
					
						
							|  |  |  |         boost::shared_ptr<void> pv(p); | 
					
						
							|  |  |  |         BOOST_TEST(pv? true: false); | 
					
						
							|  |  |  |         BOOST_TEST(!!pv); | 
					
						
							|  |  |  |         BOOST_TEST(pv.get() == p); | 
					
						
							|  |  |  |         BOOST_TEST(pv.use_count() == 1); | 
					
						
							|  |  |  |         BOOST_TEST(pv.unique()); | 
					
						
							|  |  |  |         BOOST_TEST(X::instances == 1); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     BOOST_TEST(X::instances == 0); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         X * p = new X; | 
					
						
							|  |  |  |         boost::shared_ptr<void const> pv(p); | 
					
						
							|  |  |  |         BOOST_TEST(pv? true: false); | 
					
						
							|  |  |  |         BOOST_TEST(!!pv); | 
					
						
							|  |  |  |         BOOST_TEST(pv.get() == p); | 
					
						
							|  |  |  |         BOOST_TEST(pv.use_count() == 1); | 
					
						
							|  |  |  |         BOOST_TEST(pv.unique()); | 
					
						
							|  |  |  |         BOOST_TEST(X::instances == 1); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     BOOST_TEST(X::instances == 0); | 
					
						
							|  |  |  |     BOOST_TEST(Y::instances == 0); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         Y * p = new Y; | 
					
						
							|  |  |  |         boost::shared_ptr<X> px(p); | 
					
						
							|  |  |  |         BOOST_TEST(px? true: false); | 
					
						
							|  |  |  |         BOOST_TEST(!!px); | 
					
						
							|  |  |  |         BOOST_TEST(px.get() == p); | 
					
						
							|  |  |  |         BOOST_TEST(px.use_count() == 1); | 
					
						
							|  |  |  |         BOOST_TEST(px.unique()); | 
					
						
							|  |  |  |         BOOST_TEST(X::instances == 1); | 
					
						
							|  |  |  |         BOOST_TEST(Y::instances == 1); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     BOOST_TEST(X::instances == 0); | 
					
						
							|  |  |  |     BOOST_TEST(Y::instances == 0); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         Y * p = new Y; | 
					
						
							|  |  |  |         boost::shared_ptr<X const> px(p); | 
					
						
							|  |  |  |         BOOST_TEST(px? true: false); | 
					
						
							|  |  |  |         BOOST_TEST(!!px); | 
					
						
							|  |  |  |         BOOST_TEST(px.get() == p); | 
					
						
							|  |  |  |         BOOST_TEST(px.use_count() == 1); | 
					
						
							|  |  |  |         BOOST_TEST(px.unique()); | 
					
						
							|  |  |  |         BOOST_TEST(X::instances == 1); | 
					
						
							|  |  |  |         BOOST_TEST(Y::instances == 1); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     BOOST_TEST(X::instances == 0); | 
					
						
							|  |  |  |     BOOST_TEST(Y::instances == 0); | 
					
						
							| 
									
										
										
										
											2002-02-09 12:34:05 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  | int m = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void deleter(int * p) | 
					
						
							| 
									
										
										
										
											2002-02-09 12:34:05 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  |     BOOST_TEST(p == 0); | 
					
						
							| 
									
										
										
										
											2002-02-09 12:34:05 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  | void deleter2(int * p) | 
					
						
							| 
									
										
										
										
											2002-02-12 16:55:25 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  |     BOOST_TEST(p == &m); | 
					
						
							|  |  |  |     ++*p; | 
					
						
							| 
									
										
										
										
											2002-02-12 16:55:25 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  | struct deleter3 | 
					
						
							| 
									
										
										
										
											2002-02-12 16:55:25 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2002-11-21 13:20:46 +00:00
										 |  |  |     void operator()(incomplete * p) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         BOOST_TEST(p == 0); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  | }; | 
					
						
							| 
									
										
										
										
											2002-02-12 16:55:25 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  | // Borland C++ 5.5.1 fails on static_cast<incomplete*>(0)
 | 
					
						
							| 
									
										
										
										
											2002-11-12 13:14:50 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  | incomplete * p0 = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void deleter_constructor() | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2002-11-12 13:14:50 +00:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  |         boost::shared_ptr<int> pi(static_cast<int*>(0), deleter); | 
					
						
							|  |  |  |         BOOST_TEST(pi? false: true); | 
					
						
							|  |  |  |         BOOST_TEST(!pi); | 
					
						
							|  |  |  |         BOOST_TEST(pi.get() == 0); | 
					
						
							|  |  |  |         BOOST_TEST(pi.use_count() == 1); | 
					
						
							|  |  |  |         BOOST_TEST(pi.unique()); | 
					
						
							| 
									
										
										
										
											2002-11-12 13:14:50 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  |         boost::shared_ptr<void> pv(static_cast<int*>(0), &deleter); | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  |         BOOST_TEST(pv? false: true); | 
					
						
							|  |  |  |         BOOST_TEST(!pv); | 
					
						
							|  |  |  |         BOOST_TEST(pv.get() == 0); | 
					
						
							|  |  |  |         BOOST_TEST(pv.use_count() == 1); | 
					
						
							|  |  |  |         BOOST_TEST(pv.unique()); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2002-11-12 13:14:50 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  |     { | 
					
						
							|  |  |  |         boost::shared_ptr<void const> pv(static_cast<int*>(0), deleter); | 
					
						
							|  |  |  |         BOOST_TEST(pv? false: true); | 
					
						
							|  |  |  |         BOOST_TEST(!pv); | 
					
						
							|  |  |  |         BOOST_TEST(pv.get() == 0); | 
					
						
							|  |  |  |         BOOST_TEST(pv.use_count() == 1); | 
					
						
							|  |  |  |         BOOST_TEST(pv.unique()); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2002-11-12 13:14:50 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  |         boost::shared_ptr<incomplete> px(p0, deleter3()); | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  |         BOOST_TEST(px? false: true); | 
					
						
							|  |  |  |         BOOST_TEST(!px); | 
					
						
							|  |  |  |         BOOST_TEST(px.get() == 0); | 
					
						
							|  |  |  |         BOOST_TEST(px.use_count() == 1); | 
					
						
							|  |  |  |         BOOST_TEST(px.unique()); | 
					
						
							| 
									
										
										
										
											2002-11-12 13:14:50 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  |         boost::shared_ptr<void> pv(p0, deleter3()); | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  |         BOOST_TEST(pv? false: true); | 
					
						
							|  |  |  |         BOOST_TEST(!pv); | 
					
						
							|  |  |  |         BOOST_TEST(pv.get() == 0); | 
					
						
							|  |  |  |         BOOST_TEST(pv.use_count() == 1); | 
					
						
							|  |  |  |         BOOST_TEST(pv.unique()); | 
					
						
							| 
									
										
										
										
											2002-11-12 13:14:50 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  |         boost::shared_ptr<void const> pv(p0, deleter3()); | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  |         BOOST_TEST(pv? false: true); | 
					
						
							|  |  |  |         BOOST_TEST(!pv); | 
					
						
							|  |  |  |         BOOST_TEST(pv.get() == 0); | 
					
						
							|  |  |  |         BOOST_TEST(pv.use_count() == 1); | 
					
						
							|  |  |  |         BOOST_TEST(pv.unique()); | 
					
						
							| 
									
										
										
										
											2002-11-12 13:14:50 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  |     BOOST_TEST(m == 0); | 
					
						
							| 
									
										
										
										
											2002-01-25 13:54:30 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  |         boost::shared_ptr<int> pi(&m, deleter2); | 
					
						
							|  |  |  |         BOOST_TEST(pi? true: false); | 
					
						
							|  |  |  |         BOOST_TEST(!!pi); | 
					
						
							|  |  |  |         BOOST_TEST(pi.get() == &m); | 
					
						
							|  |  |  |         BOOST_TEST(pi.use_count() == 1); | 
					
						
							|  |  |  |         BOOST_TEST(pi.unique()); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2002-01-25 13:54:30 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  |     BOOST_TEST(m == 1); | 
					
						
							| 
									
										
										
										
											2002-02-09 12:34:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  |         boost::shared_ptr<int const> pi(&m, &deleter2); | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  |         BOOST_TEST(pi? true: false); | 
					
						
							|  |  |  |         BOOST_TEST(!!pi); | 
					
						
							|  |  |  |         BOOST_TEST(pi.get() == &m); | 
					
						
							|  |  |  |         BOOST_TEST(pi.use_count() == 1); | 
					
						
							|  |  |  |         BOOST_TEST(pi.unique()); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2002-02-09 12:34:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  |     BOOST_TEST(m == 2); | 
					
						
							| 
									
										
										
										
											2002-01-25 13:54:30 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  |     { | 
					
						
							|  |  |  |         boost::shared_ptr<void> pv(&m, deleter2); | 
					
						
							|  |  |  |         BOOST_TEST(pv? true: false); | 
					
						
							|  |  |  |         BOOST_TEST(!!pv); | 
					
						
							|  |  |  |         BOOST_TEST(pv.get() == &m); | 
					
						
							|  |  |  |         BOOST_TEST(pv.use_count() == 1); | 
					
						
							|  |  |  |         BOOST_TEST(pv.unique()); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2002-02-12 16:55:25 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  |     BOOST_TEST(m == 3); | 
					
						
							| 
									
										
										
										
											2002-01-25 13:54:30 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  |         boost::shared_ptr<void const> pv(&m, &deleter2); | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  |         BOOST_TEST(pv? true: false); | 
					
						
							|  |  |  |         BOOST_TEST(!!pv); | 
					
						
							|  |  |  |         BOOST_TEST(pv.get() == &m); | 
					
						
							|  |  |  |         BOOST_TEST(pv.use_count() == 1); | 
					
						
							|  |  |  |         BOOST_TEST(pv.unique()); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2002-02-09 12:34:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  |     BOOST_TEST(m == 4); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2002-01-25 13:54:30 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  | void copy_constructor() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         boost::shared_ptr<int> pi; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         boost::shared_ptr<int> pi2(pi); | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  |         BOOST_TEST(pi2 == pi); | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  |         BOOST_TEST(pi2? false: true); | 
					
						
							|  |  |  |         BOOST_TEST(!pi2); | 
					
						
							|  |  |  |         BOOST_TEST(pi2.get() == 0); | 
					
						
							| 
									
										
										
										
											2003-01-13 18:32:16 +00:00
										 |  |  |         BOOST_TEST(pi2.use_count() == pi.use_count()); | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         boost::shared_ptr<void> pi3(pi); | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  |         BOOST_TEST(pi3 == pi); | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  |         BOOST_TEST(pi3? false: true); | 
					
						
							|  |  |  |         BOOST_TEST(!pi3); | 
					
						
							|  |  |  |         BOOST_TEST(pi3.get() == 0); | 
					
						
							| 
									
										
										
										
											2003-01-13 18:32:16 +00:00
										 |  |  |         BOOST_TEST(pi3.use_count() == pi.use_count()); | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         boost::shared_ptr<void> pi4(pi3); | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  |         BOOST_TEST(pi4 == pi3); | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  |         BOOST_TEST(pi4? false: true); | 
					
						
							|  |  |  |         BOOST_TEST(!pi4); | 
					
						
							|  |  |  |         BOOST_TEST(pi4.get() == 0); | 
					
						
							| 
									
										
										
										
											2003-01-13 18:32:16 +00:00
										 |  |  |         BOOST_TEST(pi4.use_count() == pi3.use_count()); | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2002-02-09 12:34:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  |     { | 
					
						
							|  |  |  |         boost::shared_ptr<void> pv; | 
					
						
							| 
									
										
										
										
											2002-01-25 13:54:30 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  |         boost::shared_ptr<void> pv2(pv); | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  |         BOOST_TEST(pv2 == pv); | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  |         BOOST_TEST(pv2? false: true); | 
					
						
							|  |  |  |         BOOST_TEST(!pv2); | 
					
						
							|  |  |  |         BOOST_TEST(pv2.get() == 0); | 
					
						
							| 
									
										
										
										
											2003-01-13 18:32:16 +00:00
										 |  |  |         BOOST_TEST(pv2.use_count() == pv.use_count()); | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2002-01-25 13:54:30 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  |     { | 
					
						
							|  |  |  |         boost::shared_ptr<incomplete> px; | 
					
						
							| 
									
										
										
										
											2002-02-12 16:55:25 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  |         boost::shared_ptr<incomplete> px2(px); | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  |         BOOST_TEST(px2 == px); | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  |         BOOST_TEST(px2? false: true); | 
					
						
							|  |  |  |         BOOST_TEST(!px2); | 
					
						
							|  |  |  |         BOOST_TEST(px2.get() == 0); | 
					
						
							| 
									
										
										
										
											2003-01-13 18:32:16 +00:00
										 |  |  |         BOOST_TEST(px2.use_count() == px.use_count()); | 
					
						
							| 
									
										
										
										
											2002-01-25 13:54:30 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  |         boost::shared_ptr<void> px3(px); | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  |         BOOST_TEST(px3 == px); | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  |         BOOST_TEST(px3? false: true); | 
					
						
							|  |  |  |         BOOST_TEST(!px3); | 
					
						
							|  |  |  |         BOOST_TEST(px3.get() == 0); | 
					
						
							| 
									
										
										
										
											2003-01-13 18:32:16 +00:00
										 |  |  |         BOOST_TEST(px3.use_count() == px.use_count()); | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2002-01-25 13:54:30 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  |     { | 
					
						
							|  |  |  |         boost::shared_ptr<int> pi(static_cast<int*>(0)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         boost::shared_ptr<int> pi2(pi); | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  |         BOOST_TEST(pi2 == pi); | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  |         BOOST_TEST(pi2? false: true); | 
					
						
							|  |  |  |         BOOST_TEST(!pi2); | 
					
						
							|  |  |  |         BOOST_TEST(pi2.get() == 0); | 
					
						
							|  |  |  |         BOOST_TEST(pi2.use_count() == 2); | 
					
						
							|  |  |  |         BOOST_TEST(!pi2.unique()); | 
					
						
							| 
									
										
										
										
											2003-01-13 18:32:16 +00:00
										 |  |  |         BOOST_TEST(pi2.use_count() == pi.use_count()); | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  |         BOOST_TEST(!(pi < pi2 || pi2 < pi)); // shared ownership test
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         boost::shared_ptr<void> pi3(pi); | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  |         BOOST_TEST(pi3 == pi); | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  |         BOOST_TEST(pi3? false: true); | 
					
						
							|  |  |  |         BOOST_TEST(!pi3); | 
					
						
							|  |  |  |         BOOST_TEST(pi3.get() == 0); | 
					
						
							|  |  |  |         BOOST_TEST(pi3.use_count() == 3); | 
					
						
							|  |  |  |         BOOST_TEST(!pi3.unique()); | 
					
						
							| 
									
										
										
										
											2003-01-13 18:32:16 +00:00
										 |  |  |         BOOST_TEST(pi3.use_count() == pi.use_count()); | 
					
						
							|  |  |  |         BOOST_TEST(!(pi < pi3 || pi3 < pi)); // shared ownership test
 | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         boost::shared_ptr<void> pi4(pi2); | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  |         BOOST_TEST(pi4 == pi2); | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  |         BOOST_TEST(pi4? false: true); | 
					
						
							|  |  |  |         BOOST_TEST(!pi4); | 
					
						
							|  |  |  |         BOOST_TEST(pi4.get() == 0); | 
					
						
							|  |  |  |         BOOST_TEST(pi4.use_count() == 4); | 
					
						
							|  |  |  |         BOOST_TEST(!pi4.unique()); | 
					
						
							| 
									
										
										
										
											2003-01-13 18:32:16 +00:00
										 |  |  |         BOOST_TEST(pi4.use_count() == pi2.use_count()); | 
					
						
							|  |  |  |         BOOST_TEST(!(pi2 < pi4 || pi4 < pi2)); // shared ownership test
 | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         BOOST_TEST(pi3.use_count() == pi4.use_count()); | 
					
						
							|  |  |  |         BOOST_TEST(!(pi3 < pi4 || pi4 < pi3)); // shared ownership test
 | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2002-01-25 13:54:30 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  |     { | 
					
						
							|  |  |  |         boost::shared_ptr<X> px(static_cast<X*>(0)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         boost::shared_ptr<X> px2(px); | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  |         BOOST_TEST(px2 == px); | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  |         BOOST_TEST(px2? false: true); | 
					
						
							|  |  |  |         BOOST_TEST(!px2); | 
					
						
							|  |  |  |         BOOST_TEST(px2.get() == 0); | 
					
						
							|  |  |  |         BOOST_TEST(px2.use_count() == 2); | 
					
						
							|  |  |  |         BOOST_TEST(!px2.unique()); | 
					
						
							| 
									
										
										
										
											2003-01-13 18:32:16 +00:00
										 |  |  |         BOOST_TEST(px2.use_count() == px.use_count()); | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  |         BOOST_TEST(!(px < px2 || px2 < px)); // shared ownership test
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         boost::shared_ptr<void> px3(px); | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  |         BOOST_TEST(px3 == px); | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  |         BOOST_TEST(px3? false: true); | 
					
						
							|  |  |  |         BOOST_TEST(!px3); | 
					
						
							|  |  |  |         BOOST_TEST(px3.get() == 0); | 
					
						
							|  |  |  |         BOOST_TEST(px3.use_count() == 3); | 
					
						
							|  |  |  |         BOOST_TEST(!px3.unique()); | 
					
						
							| 
									
										
										
										
											2003-01-13 18:32:16 +00:00
										 |  |  |         BOOST_TEST(px3.use_count() == px.use_count()); | 
					
						
							|  |  |  |         BOOST_TEST(!(px < px3 || px3 < px)); // shared ownership test
 | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         boost::shared_ptr<void> px4(px2); | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  |         BOOST_TEST(px4 == px2); | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  |         BOOST_TEST(px4? false: true); | 
					
						
							|  |  |  |         BOOST_TEST(!px4); | 
					
						
							|  |  |  |         BOOST_TEST(px4.get() == 0); | 
					
						
							|  |  |  |         BOOST_TEST(px4.use_count() == 4); | 
					
						
							|  |  |  |         BOOST_TEST(!px4.unique()); | 
					
						
							| 
									
										
										
										
											2003-01-13 18:32:16 +00:00
										 |  |  |         BOOST_TEST(px4.use_count() == px2.use_count()); | 
					
						
							|  |  |  |         BOOST_TEST(!(px2 < px4 || px4 < px2)); // shared ownership test
 | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         BOOST_TEST(px3.use_count() == px4.use_count()); | 
					
						
							|  |  |  |         BOOST_TEST(!(px3 < px4 || px4 < px3)); // shared ownership test
 | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2002-02-13 13:16:15 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  |     { | 
					
						
							|  |  |  |         int * p = new int(7); | 
					
						
							|  |  |  |         boost::shared_ptr<int> pi(p); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         boost::shared_ptr<int> pi2(pi); | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  |         BOOST_TEST(pi2 == pi); | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  |         BOOST_TEST(pi2? true: false); | 
					
						
							|  |  |  |         BOOST_TEST(!!pi2); | 
					
						
							|  |  |  |         BOOST_TEST(pi2.get() == p); | 
					
						
							|  |  |  |         BOOST_TEST(pi2.use_count() == 2); | 
					
						
							|  |  |  |         BOOST_TEST(!pi2.unique()); | 
					
						
							|  |  |  |         BOOST_TEST(*pi2 == 7); | 
					
						
							| 
									
										
										
										
											2003-01-13 18:32:16 +00:00
										 |  |  |         BOOST_TEST(pi2.use_count() == pi.use_count()); | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  |         BOOST_TEST(!(pi < pi2 || pi2 < pi)); // shared ownership test
 | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2002-02-13 13:16:15 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  |     { | 
					
						
							|  |  |  |         int * p = new int(7); | 
					
						
							|  |  |  |         boost::shared_ptr<void> pv(p); | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  |         BOOST_TEST(pv.get() == p); | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         boost::shared_ptr<void> pv2(pv); | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  |         BOOST_TEST(pv2 == pv); | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  |         BOOST_TEST(pv2? true: false); | 
					
						
							|  |  |  |         BOOST_TEST(!!pv2); | 
					
						
							|  |  |  |         BOOST_TEST(pv2.get() == p); | 
					
						
							|  |  |  |         BOOST_TEST(pv2.use_count() == 2); | 
					
						
							|  |  |  |         BOOST_TEST(!pv2.unique()); | 
					
						
							| 
									
										
										
										
											2003-01-13 18:32:16 +00:00
										 |  |  |         BOOST_TEST(pv2.use_count() == pv.use_count()); | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  |         BOOST_TEST(!(pv < pv2 || pv2 < pv)); // shared ownership test
 | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2002-01-25 13:54:30 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  |     BOOST_TEST(X::instances == 0); | 
					
						
							| 
									
										
										
										
											2002-01-25 13:54:30 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  |     { | 
					
						
							|  |  |  |         X * p = new X; | 
					
						
							|  |  |  |         boost::shared_ptr<X> px(p); | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  |         BOOST_TEST(px.get() == p); | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         boost::shared_ptr<X> px2(px); | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  |         BOOST_TEST(px2 == px); | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  |         BOOST_TEST(px2? true: false); | 
					
						
							|  |  |  |         BOOST_TEST(!!px2); | 
					
						
							|  |  |  |         BOOST_TEST(px2.get() == p); | 
					
						
							|  |  |  |         BOOST_TEST(px2.use_count() == 2); | 
					
						
							|  |  |  |         BOOST_TEST(!px2.unique()); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         BOOST_TEST(X::instances == 1); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-01-13 18:32:16 +00:00
										 |  |  |         BOOST_TEST(px2.use_count() == px.use_count()); | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  |         BOOST_TEST(!(px < px2 || px2 < px)); // shared ownership test
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         boost::shared_ptr<void> px3(px); | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  |         BOOST_TEST(px3 == px); | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  |         BOOST_TEST(px3? true: false); | 
					
						
							|  |  |  |         BOOST_TEST(!!px3); | 
					
						
							|  |  |  |         BOOST_TEST(px3.get() == p); | 
					
						
							|  |  |  |         BOOST_TEST(px3.use_count() == 3); | 
					
						
							|  |  |  |         BOOST_TEST(!px3.unique()); | 
					
						
							| 
									
										
										
										
											2003-01-13 18:32:16 +00:00
										 |  |  |         BOOST_TEST(px3.use_count() == px.use_count()); | 
					
						
							|  |  |  |         BOOST_TEST(!(px < px3 || px3 < px)); // shared ownership test
 | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         boost::shared_ptr<void> px4(px2); | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  |         BOOST_TEST(px4 == px2); | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  |         BOOST_TEST(px4? true: false); | 
					
						
							|  |  |  |         BOOST_TEST(!!px4); | 
					
						
							|  |  |  |         BOOST_TEST(px4.get() == p); | 
					
						
							|  |  |  |         BOOST_TEST(px4.use_count() == 4); | 
					
						
							|  |  |  |         BOOST_TEST(!px4.unique()); | 
					
						
							| 
									
										
										
										
											2003-01-13 18:32:16 +00:00
										 |  |  |         BOOST_TEST(px4.use_count() == px2.use_count()); | 
					
						
							|  |  |  |         BOOST_TEST(!(px2 < px4 || px4 < px2)); // shared ownership test
 | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         BOOST_TEST(px3.use_count() == px4.use_count()); | 
					
						
							|  |  |  |         BOOST_TEST(!(px3 < px4 || px4 < px3)); // shared ownership test
 | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2002-02-09 12:34:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  |     BOOST_TEST(X::instances == 0); | 
					
						
							|  |  |  |     BOOST_TEST(Y::instances == 0); | 
					
						
							| 
									
										
										
										
											2002-02-13 13:16:15 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  |     { | 
					
						
							|  |  |  |         Y * p = new Y; | 
					
						
							|  |  |  |         boost::shared_ptr<Y> py(p); | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  |         BOOST_TEST(py.get() == p); | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         boost::shared_ptr<X> px(py); | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  |         BOOST_TEST(px == py); | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  |         BOOST_TEST(px? true: false); | 
					
						
							|  |  |  |         BOOST_TEST(!!px); | 
					
						
							|  |  |  |         BOOST_TEST(px.get() == p); | 
					
						
							|  |  |  |         BOOST_TEST(px.use_count() == 2); | 
					
						
							|  |  |  |         BOOST_TEST(!px.unique()); | 
					
						
							| 
									
										
										
										
											2003-01-13 18:32:16 +00:00
										 |  |  |         BOOST_TEST(px.use_count() == py.use_count()); | 
					
						
							|  |  |  |         BOOST_TEST(!(px < py || py < px)); // shared ownership test
 | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         BOOST_TEST(X::instances == 1); | 
					
						
							|  |  |  |         BOOST_TEST(Y::instances == 1); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         boost::shared_ptr<void const> pv(px); | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  |         BOOST_TEST(pv == px); | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  |         BOOST_TEST(pv? true: false); | 
					
						
							|  |  |  |         BOOST_TEST(!!pv); | 
					
						
							|  |  |  |         BOOST_TEST(pv.get() == px.get()); | 
					
						
							|  |  |  |         BOOST_TEST(pv.use_count() == 3); | 
					
						
							|  |  |  |         BOOST_TEST(!pv.unique()); | 
					
						
							| 
									
										
										
										
											2003-01-13 18:32:16 +00:00
										 |  |  |         BOOST_TEST(pv.use_count() == px.use_count()); | 
					
						
							|  |  |  |         BOOST_TEST(!(px < pv || pv < px)); // shared ownership test
 | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         boost::shared_ptr<void const> pv2(py); | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  |         BOOST_TEST(pv2 == py); | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  |         BOOST_TEST(pv2? true: false); | 
					
						
							|  |  |  |         BOOST_TEST(!!pv2); | 
					
						
							|  |  |  |         BOOST_TEST(pv2.get() == py.get()); | 
					
						
							|  |  |  |         BOOST_TEST(pv2.use_count() == 4); | 
					
						
							|  |  |  |         BOOST_TEST(!pv2.unique()); | 
					
						
							| 
									
										
										
										
											2003-01-13 18:32:16 +00:00
										 |  |  |         BOOST_TEST(pv2.use_count() == py.use_count()); | 
					
						
							|  |  |  |         BOOST_TEST(!(py < pv2 || pv2 < py)); // shared ownership test
 | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         BOOST_TEST(pv.use_count() == pv2.use_count()); | 
					
						
							|  |  |  |         BOOST_TEST(!(pv < pv2 || pv2 < pv)); // shared ownership test
 | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2002-01-25 13:54:30 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  |     BOOST_TEST(X::instances == 0); | 
					
						
							|  |  |  |     BOOST_TEST(Y::instances == 0); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void weak_ptr_constructor() | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2002-11-21 13:20:46 +00:00
										 |  |  |     { | 
					
						
							|  |  |  |         boost::weak_ptr<Y> wp; | 
					
						
							| 
									
										
										
										
											2003-01-13 18:32:16 +00:00
										 |  |  |         BOOST_TEST(wp.use_count() == 0); | 
					
						
							| 
									
										
										
										
											2002-11-21 13:20:46 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         try | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             boost::shared_ptr<Y> p2(wp); | 
					
						
							|  |  |  |             BOOST_ERROR("shared_ptr<Y> p2(wp) failed to throw"); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         catch(boost::bad_weak_ptr) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         try | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             boost::shared_ptr<X> p3(wp); | 
					
						
							|  |  |  |             BOOST_ERROR("shared_ptr<X> p3(wp) failed to throw"); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         catch(boost::bad_weak_ptr) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-01-13 18:32:16 +00:00
										 |  |  |     { | 
					
						
							|  |  |  |         boost::shared_ptr<Y> p; | 
					
						
							|  |  |  |         boost::weak_ptr<Y> wp(p); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if(wp.use_count() != 0) // 0 allowed but not required
 | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             boost::shared_ptr<Y> p2(wp); | 
					
						
							|  |  |  |             BOOST_TEST(p2.use_count() == wp.use_count()); | 
					
						
							|  |  |  |             BOOST_TEST(p2.get() == 0); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             boost::shared_ptr<X> p3(wp); | 
					
						
							|  |  |  |             BOOST_TEST(p3.use_count() == wp.use_count()); | 
					
						
							|  |  |  |             BOOST_TEST(p3.get() == 0); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2003-01-13 18:32:16 +00:00
										 |  |  |         boost::shared_ptr<Y> p(new Y); | 
					
						
							|  |  |  |         boost::weak_ptr<Y> wp(p); | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-01-13 18:32:16 +00:00
										 |  |  |         { | 
					
						
							|  |  |  |             boost::shared_ptr<Y> p2(wp); | 
					
						
							|  |  |  |             BOOST_TEST(p2? true: false); | 
					
						
							|  |  |  |             BOOST_TEST(!!p2); | 
					
						
							|  |  |  |             BOOST_TEST(p2.get() == p.get()); | 
					
						
							|  |  |  |             BOOST_TEST(p2.use_count() == 2); | 
					
						
							|  |  |  |             BOOST_TEST(!p2.unique()); | 
					
						
							|  |  |  |             BOOST_TEST(p2.use_count() == wp.use_count()); | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-01-13 18:32:16 +00:00
										 |  |  |             BOOST_TEST(p.use_count() == p2.use_count()); | 
					
						
							|  |  |  |             BOOST_TEST(!(p < p2 || p2 < p)); // shared ownership test
 | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-01-13 18:32:16 +00:00
										 |  |  |             boost::shared_ptr<X> p3(wp); | 
					
						
							|  |  |  |             BOOST_TEST(p3? true: false); | 
					
						
							|  |  |  |             BOOST_TEST(!!p3); | 
					
						
							|  |  |  |             BOOST_TEST(p3.get() == p.get()); | 
					
						
							|  |  |  |             BOOST_TEST(p3.use_count() == 3); | 
					
						
							|  |  |  |             BOOST_TEST(!p3.unique()); | 
					
						
							|  |  |  |             BOOST_TEST(p3.use_count() == wp.use_count()); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             BOOST_TEST(p.use_count() == p3.use_count()); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-01-13 18:32:16 +00:00
										 |  |  |         p.reset(); | 
					
						
							|  |  |  |         BOOST_TEST(wp.use_count() == 0); | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-01-13 18:32:16 +00:00
										 |  |  |         try | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             boost::shared_ptr<Y> p2(wp); | 
					
						
							|  |  |  |             BOOST_ERROR("shared_ptr<Y> p2(wp) failed to throw"); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         catch(boost::bad_weak_ptr) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-01-13 18:32:16 +00:00
										 |  |  |         try | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             boost::shared_ptr<X> p3(wp); | 
					
						
							|  |  |  |             BOOST_ERROR("shared_ptr<X> p3(wp) failed to throw"); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         catch(boost::bad_weak_ptr) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-06-18 16:03:09 +00:00
										 |  |  | #if defined(BOOST_DINKUMWARE_STDLIB) && (BOOST_DINKUMWARE_STDLIB < 306)
 | 
					
						
							|  |  |  | #  define BOOST_OLD_AUTO_PTR
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  | void auto_ptr_constructor() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         std::auto_ptr<int> p; | 
					
						
							|  |  |  |         boost::shared_ptr<int> pi(p); | 
					
						
							|  |  |  |         BOOST_TEST(pi? false: true); | 
					
						
							|  |  |  |         BOOST_TEST(!pi); | 
					
						
							|  |  |  |         BOOST_TEST(pi.get() == 0); | 
					
						
							|  |  |  |         BOOST_TEST(pi.use_count() == 1); | 
					
						
							|  |  |  |         BOOST_TEST(pi.unique()); | 
					
						
							|  |  |  |         BOOST_TEST(p.get() == 0); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         std::auto_ptr<int> p; | 
					
						
							|  |  |  |         boost::shared_ptr<int const> pi(p); | 
					
						
							|  |  |  |         BOOST_TEST(pi? false: true); | 
					
						
							|  |  |  |         BOOST_TEST(!pi); | 
					
						
							|  |  |  |         BOOST_TEST(pi.get() == 0); | 
					
						
							|  |  |  |         BOOST_TEST(pi.use_count() == 1); | 
					
						
							|  |  |  |         BOOST_TEST(pi.unique()); | 
					
						
							|  |  |  |         BOOST_TEST(p.get() == 0); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         std::auto_ptr<int> p; | 
					
						
							|  |  |  |         boost::shared_ptr<void> pv(p); | 
					
						
							|  |  |  |         BOOST_TEST(pv? false: true); | 
					
						
							|  |  |  |         BOOST_TEST(!pv); | 
					
						
							|  |  |  |         BOOST_TEST(pv.get() == 0); | 
					
						
							|  |  |  |         BOOST_TEST(pv.use_count() == 1); | 
					
						
							|  |  |  |         BOOST_TEST(pv.unique()); | 
					
						
							|  |  |  |         BOOST_TEST(p.get() == 0); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         std::auto_ptr<int> p; | 
					
						
							|  |  |  |         boost::shared_ptr<void const> pv(p); | 
					
						
							|  |  |  |         BOOST_TEST(pv? false: true); | 
					
						
							|  |  |  |         BOOST_TEST(!pv); | 
					
						
							|  |  |  |         BOOST_TEST(pv.get() == 0); | 
					
						
							|  |  |  |         BOOST_TEST(pv.use_count() == 1); | 
					
						
							|  |  |  |         BOOST_TEST(pv.unique()); | 
					
						
							|  |  |  |         BOOST_TEST(p.get() == 0); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         std::auto_ptr<X> p; | 
					
						
							|  |  |  |         boost::shared_ptr<X> px(p); | 
					
						
							|  |  |  |         BOOST_TEST(px? false: true); | 
					
						
							|  |  |  |         BOOST_TEST(!px); | 
					
						
							|  |  |  |         BOOST_TEST(px.get() == 0); | 
					
						
							|  |  |  |         BOOST_TEST(px.use_count() == 1); | 
					
						
							|  |  |  |         BOOST_TEST(px.unique()); | 
					
						
							|  |  |  |         BOOST_TEST(p.get() == 0); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         std::auto_ptr<X> p; | 
					
						
							|  |  |  |         boost::shared_ptr<X const> px(p); | 
					
						
							|  |  |  |         BOOST_TEST(px? false: true); | 
					
						
							|  |  |  |         BOOST_TEST(!px); | 
					
						
							|  |  |  |         BOOST_TEST(px.get() == 0); | 
					
						
							|  |  |  |         BOOST_TEST(px.use_count() == 1); | 
					
						
							|  |  |  |         BOOST_TEST(px.unique()); | 
					
						
							|  |  |  |         BOOST_TEST(p.get() == 0); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         std::auto_ptr<Y> p; | 
					
						
							|  |  |  |         boost::shared_ptr<X> px(p); | 
					
						
							|  |  |  |         BOOST_TEST(px? false: true); | 
					
						
							|  |  |  |         BOOST_TEST(!px); | 
					
						
							|  |  |  |         BOOST_TEST(px.get() == 0); | 
					
						
							|  |  |  |         BOOST_TEST(px.use_count() == 1); | 
					
						
							|  |  |  |         BOOST_TEST(px.unique()); | 
					
						
							|  |  |  |         BOOST_TEST(p.get() == 0); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         std::auto_ptr<Y> p; | 
					
						
							|  |  |  |         boost::shared_ptr<X const> px(p); | 
					
						
							|  |  |  |         BOOST_TEST(px? false: true); | 
					
						
							|  |  |  |         BOOST_TEST(!px); | 
					
						
							|  |  |  |         BOOST_TEST(px.get() == 0); | 
					
						
							|  |  |  |         BOOST_TEST(px.use_count() == 1); | 
					
						
							|  |  |  |         BOOST_TEST(px.unique()); | 
					
						
							|  |  |  |         BOOST_TEST(p.get() == 0); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         std::auto_ptr<Y> p; | 
					
						
							|  |  |  |         boost::shared_ptr<void> pv(p); | 
					
						
							|  |  |  |         BOOST_TEST(pv? false: true); | 
					
						
							|  |  |  |         BOOST_TEST(!pv); | 
					
						
							|  |  |  |         BOOST_TEST(pv.get() == 0); | 
					
						
							|  |  |  |         BOOST_TEST(pv.use_count() == 1); | 
					
						
							|  |  |  |         BOOST_TEST(pv.unique()); | 
					
						
							|  |  |  |         BOOST_TEST(p.get() == 0); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         std::auto_ptr<Y> p; | 
					
						
							|  |  |  |         boost::shared_ptr<void const> pv(p); | 
					
						
							|  |  |  |         BOOST_TEST(pv? false: true); | 
					
						
							|  |  |  |         BOOST_TEST(!pv); | 
					
						
							|  |  |  |         BOOST_TEST(pv.get() == 0); | 
					
						
							|  |  |  |         BOOST_TEST(pv.use_count() == 1); | 
					
						
							|  |  |  |         BOOST_TEST(pv.unique()); | 
					
						
							|  |  |  |         BOOST_TEST(p.get() == 0); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         std::auto_ptr<int> p(new int(7)); | 
					
						
							|  |  |  |         int * q = p.get(); | 
					
						
							|  |  |  |         boost::shared_ptr<int> pi(p); | 
					
						
							|  |  |  |         BOOST_TEST(pi? true: false); | 
					
						
							|  |  |  |         BOOST_TEST(!!pi); | 
					
						
							|  |  |  |         BOOST_TEST(pi.get() == q); | 
					
						
							|  |  |  |         BOOST_TEST(pi.use_count() == 1); | 
					
						
							|  |  |  |         BOOST_TEST(pi.unique()); | 
					
						
							|  |  |  |         BOOST_TEST(*pi == 7); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-06-18 16:03:09 +00:00
										 |  |  | #if !defined(BOOST_OLD_AUTO_PTR)
 | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  |         BOOST_TEST(p.get() == 0); | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         std::auto_ptr<int> p(new int(7)); | 
					
						
							|  |  |  |         int * q = p.get(); | 
					
						
							|  |  |  |         boost::shared_ptr<int const> pi(p); | 
					
						
							|  |  |  |         BOOST_TEST(pi? true: false); | 
					
						
							|  |  |  |         BOOST_TEST(!!pi); | 
					
						
							|  |  |  |         BOOST_TEST(pi.get() == q); | 
					
						
							|  |  |  |         BOOST_TEST(pi.use_count() == 1); | 
					
						
							|  |  |  |         BOOST_TEST(pi.unique()); | 
					
						
							|  |  |  |         BOOST_TEST(*pi == 7); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-06-18 16:03:09 +00:00
										 |  |  | #if !defined(BOOST_OLD_AUTO_PTR)
 | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  |         BOOST_TEST(p.get() == 0); | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         std::auto_ptr<int> p(new int(7)); | 
					
						
							|  |  |  |         int * q = p.get(); | 
					
						
							|  |  |  |         boost::shared_ptr<void> pv(p); | 
					
						
							|  |  |  |         BOOST_TEST(pv? true: false); | 
					
						
							|  |  |  |         BOOST_TEST(!!pv); | 
					
						
							|  |  |  |         BOOST_TEST(pv.get() == q); | 
					
						
							|  |  |  |         BOOST_TEST(pv.use_count() == 1); | 
					
						
							|  |  |  |         BOOST_TEST(pv.unique()); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-06-18 16:03:09 +00:00
										 |  |  | #if !defined(BOOST_OLD_AUTO_PTR)
 | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  |         BOOST_TEST(p.get() == 0); | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         std::auto_ptr<int> p(new int(7)); | 
					
						
							|  |  |  |         int * q = p.get(); | 
					
						
							|  |  |  |         boost::shared_ptr<void const> pv(p); | 
					
						
							|  |  |  |         BOOST_TEST(pv? true: false); | 
					
						
							|  |  |  |         BOOST_TEST(!!pv); | 
					
						
							|  |  |  |         BOOST_TEST(pv.get() == q); | 
					
						
							|  |  |  |         BOOST_TEST(pv.use_count() == 1); | 
					
						
							|  |  |  |         BOOST_TEST(pv.unique()); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-06-18 16:03:09 +00:00
										 |  |  | #if !defined(BOOST_OLD_AUTO_PTR)
 | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  |         BOOST_TEST(p.get() == 0); | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     BOOST_TEST(X::instances == 0); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         std::auto_ptr<X> p(new X); | 
					
						
							|  |  |  |         X * q = p.get(); | 
					
						
							|  |  |  |         boost::shared_ptr<X> px(p); | 
					
						
							|  |  |  |         BOOST_TEST(px? true: false); | 
					
						
							|  |  |  |         BOOST_TEST(!!px); | 
					
						
							|  |  |  |         BOOST_TEST(px.get() == q); | 
					
						
							|  |  |  |         BOOST_TEST(px.use_count() == 1); | 
					
						
							|  |  |  |         BOOST_TEST(px.unique()); | 
					
						
							|  |  |  |         BOOST_TEST(X::instances == 1); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-06-18 16:03:09 +00:00
										 |  |  | #if !defined(BOOST_OLD_AUTO_PTR)
 | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  |         BOOST_TEST(p.get() == 0); | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     BOOST_TEST(X::instances == 0); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         std::auto_ptr<X> p(new X); | 
					
						
							|  |  |  |         X * q = p.get(); | 
					
						
							|  |  |  |         boost::shared_ptr<X const> px(p); | 
					
						
							|  |  |  |         BOOST_TEST(px? true: false); | 
					
						
							|  |  |  |         BOOST_TEST(!!px); | 
					
						
							|  |  |  |         BOOST_TEST(px.get() == q); | 
					
						
							|  |  |  |         BOOST_TEST(px.use_count() == 1); | 
					
						
							|  |  |  |         BOOST_TEST(px.unique()); | 
					
						
							|  |  |  |         BOOST_TEST(X::instances == 1); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-06-18 16:03:09 +00:00
										 |  |  | #if !defined(BOOST_OLD_AUTO_PTR)
 | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  |         BOOST_TEST(p.get() == 0); | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     BOOST_TEST(X::instances == 0); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         std::auto_ptr<X> p(new X); | 
					
						
							|  |  |  |         X * q = p.get(); | 
					
						
							|  |  |  |         boost::shared_ptr<void> pv(p); | 
					
						
							|  |  |  |         BOOST_TEST(pv? true: false); | 
					
						
							|  |  |  |         BOOST_TEST(!!pv); | 
					
						
							|  |  |  |         BOOST_TEST(pv.get() == q); | 
					
						
							|  |  |  |         BOOST_TEST(pv.use_count() == 1); | 
					
						
							|  |  |  |         BOOST_TEST(pv.unique()); | 
					
						
							|  |  |  |         BOOST_TEST(X::instances == 1); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-06-18 16:03:09 +00:00
										 |  |  | #if !defined(BOOST_OLD_AUTO_PTR)
 | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  |         BOOST_TEST(p.get() == 0); | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     BOOST_TEST(X::instances == 0); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         std::auto_ptr<X> p(new X); | 
					
						
							|  |  |  |         X * q = p.get(); | 
					
						
							|  |  |  |         boost::shared_ptr<void const> pv(p); | 
					
						
							|  |  |  |         BOOST_TEST(pv? true: false); | 
					
						
							|  |  |  |         BOOST_TEST(!!pv); | 
					
						
							|  |  |  |         BOOST_TEST(pv.get() == q); | 
					
						
							|  |  |  |         BOOST_TEST(pv.use_count() == 1); | 
					
						
							|  |  |  |         BOOST_TEST(pv.unique()); | 
					
						
							|  |  |  |         BOOST_TEST(X::instances == 1); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-06-18 16:03:09 +00:00
										 |  |  | #if !defined(BOOST_OLD_AUTO_PTR)
 | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  |         BOOST_TEST(p.get() == 0); | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     BOOST_TEST(X::instances == 0); | 
					
						
							|  |  |  |     BOOST_TEST(Y::instances == 0); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         std::auto_ptr<Y> p(new Y); | 
					
						
							|  |  |  |         Y * q = p.get(); | 
					
						
							|  |  |  |         boost::shared_ptr<X> px(p); | 
					
						
							|  |  |  |         BOOST_TEST(px? true: false); | 
					
						
							|  |  |  |         BOOST_TEST(!!px); | 
					
						
							|  |  |  |         BOOST_TEST(px.get() == q); | 
					
						
							|  |  |  |         BOOST_TEST(px.use_count() == 1); | 
					
						
							|  |  |  |         BOOST_TEST(px.unique()); | 
					
						
							|  |  |  |         BOOST_TEST(X::instances == 1); | 
					
						
							|  |  |  |         BOOST_TEST(Y::instances == 1); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-06-18 16:03:09 +00:00
										 |  |  | #if !defined(BOOST_OLD_AUTO_PTR)
 | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  |         BOOST_TEST(p.get() == 0); | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     BOOST_TEST(X::instances == 0); | 
					
						
							|  |  |  |     BOOST_TEST(Y::instances == 0); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         std::auto_ptr<Y> p(new Y); | 
					
						
							|  |  |  |         Y * q = p.get(); | 
					
						
							|  |  |  |         boost::shared_ptr<X const> px(p); | 
					
						
							|  |  |  |         BOOST_TEST(px? true: false); | 
					
						
							|  |  |  |         BOOST_TEST(!!px); | 
					
						
							|  |  |  |         BOOST_TEST(px.get() == q); | 
					
						
							|  |  |  |         BOOST_TEST(px.use_count() == 1); | 
					
						
							|  |  |  |         BOOST_TEST(px.unique()); | 
					
						
							|  |  |  |         BOOST_TEST(X::instances == 1); | 
					
						
							|  |  |  |         BOOST_TEST(Y::instances == 1); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-06-18 16:03:09 +00:00
										 |  |  | #if !defined(BOOST_OLD_AUTO_PTR)
 | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  |         BOOST_TEST(p.get() == 0); | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     BOOST_TEST(X::instances == 0); | 
					
						
							|  |  |  |     BOOST_TEST(Y::instances == 0); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void test() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     default_constructor(); | 
					
						
							|  |  |  |     pointer_constructor(); | 
					
						
							|  |  |  |     deleter_constructor(); | 
					
						
							|  |  |  |     copy_constructor(); | 
					
						
							|  |  |  |     weak_ptr_constructor(); | 
					
						
							|  |  |  |     auto_ptr_constructor(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } // namespace n_constructors
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace n_assignment | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  | class incomplete; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | struct A | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     int dummy; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | struct X | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     static long instances; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     X() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         ++instances; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ~X() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         --instances; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | private: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     X(X const &); | 
					
						
							|  |  |  |     X & operator= (X const &); | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | long X::instances = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-25 13:51:56 +00:00
										 |  |  | struct Y: public A, public virtual X | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  | { | 
					
						
							|  |  |  |     static long instances; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     Y() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         ++instances; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ~Y() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         --instances; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | private: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     Y(Y const &); | 
					
						
							|  |  |  |     Y & operator= (Y const &); | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | long Y::instances = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void copy_assignment() | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2002-11-21 13:20:46 +00:00
										 |  |  |     { | 
					
						
							|  |  |  |         boost::shared_ptr<incomplete> p1; | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-21 13:20:46 +00:00
										 |  |  |         p1 = p1; | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         BOOST_TEST(p1 == p1); | 
					
						
							|  |  |  |         BOOST_TEST(p1? false: true); | 
					
						
							|  |  |  |         BOOST_TEST(!p1); | 
					
						
							|  |  |  |         BOOST_TEST(p1.get() == 0); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-21 13:20:46 +00:00
										 |  |  |         boost::shared_ptr<incomplete> p2; | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-21 13:20:46 +00:00
										 |  |  |         p1 = p2; | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         BOOST_TEST(p1 == p2); | 
					
						
							|  |  |  |         BOOST_TEST(p1? false: true); | 
					
						
							|  |  |  |         BOOST_TEST(!p1); | 
					
						
							|  |  |  |         BOOST_TEST(p1.get() == 0); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-21 13:20:46 +00:00
										 |  |  |         boost::shared_ptr<incomplete> p3(p1); | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-21 13:20:46 +00:00
										 |  |  |         p1 = p3; | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         BOOST_TEST(p1 == p3); | 
					
						
							|  |  |  |         BOOST_TEST(p1? false: true); | 
					
						
							|  |  |  |         BOOST_TEST(!p1); | 
					
						
							|  |  |  |         BOOST_TEST(p1.get() == 0); | 
					
						
							| 
									
										
										
										
											2002-11-21 13:20:46 +00:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-21 13:20:46 +00:00
										 |  |  |     { | 
					
						
							|  |  |  |         boost::shared_ptr<void> p1; | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-21 13:20:46 +00:00
										 |  |  |         p1 = p1; | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         BOOST_TEST(p1 == p1); | 
					
						
							|  |  |  |         BOOST_TEST(p1? false: true); | 
					
						
							|  |  |  |         BOOST_TEST(!p1); | 
					
						
							|  |  |  |         BOOST_TEST(p1.get() == 0); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-21 13:20:46 +00:00
										 |  |  |         boost::shared_ptr<void> p2; | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-21 13:20:46 +00:00
										 |  |  |         p1 = p2; | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         BOOST_TEST(p1 == p2); | 
					
						
							|  |  |  |         BOOST_TEST(p1? false: true); | 
					
						
							|  |  |  |         BOOST_TEST(!p1); | 
					
						
							|  |  |  |         BOOST_TEST(p1.get() == 0); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-21 13:20:46 +00:00
										 |  |  |         boost::shared_ptr<void> p3(p1); | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-21 13:20:46 +00:00
										 |  |  |         p1 = p3; | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         BOOST_TEST(p1 == p3); | 
					
						
							|  |  |  |         BOOST_TEST(p1? false: true); | 
					
						
							|  |  |  |         BOOST_TEST(!p1); | 
					
						
							|  |  |  |         BOOST_TEST(p1.get() == 0); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-21 13:20:46 +00:00
										 |  |  |         boost::shared_ptr<void> p4(new int); | 
					
						
							|  |  |  |         BOOST_TEST(p4.use_count() == 1); | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-21 13:20:46 +00:00
										 |  |  |         p1 = p4; | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         BOOST_TEST(p1 == p4); | 
					
						
							|  |  |  |         BOOST_TEST(!(p1 < p4 || p4 < p1)); | 
					
						
							| 
									
										
										
										
											2002-11-21 13:20:46 +00:00
										 |  |  |         BOOST_TEST(p1.use_count() == 2); | 
					
						
							|  |  |  |         BOOST_TEST(p4.use_count() == 2); | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-21 13:20:46 +00:00
										 |  |  |         p1 = p3; | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         BOOST_TEST(p1 == p3); | 
					
						
							| 
									
										
										
										
											2002-11-21 13:20:46 +00:00
										 |  |  |         BOOST_TEST(p4.use_count() == 1); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-21 13:20:46 +00:00
										 |  |  |     { | 
					
						
							|  |  |  |         boost::shared_ptr<X> p1; | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-21 13:20:46 +00:00
										 |  |  |         p1 = p1; | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         BOOST_TEST(p1 == p1); | 
					
						
							|  |  |  |         BOOST_TEST(p1? false: true); | 
					
						
							|  |  |  |         BOOST_TEST(!p1); | 
					
						
							|  |  |  |         BOOST_TEST(p1.get() == 0); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-21 13:20:46 +00:00
										 |  |  |         boost::shared_ptr<X> p2; | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-21 13:20:46 +00:00
										 |  |  |         p1 = p2; | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         BOOST_TEST(p1 == p2); | 
					
						
							|  |  |  |         BOOST_TEST(p1? false: true); | 
					
						
							|  |  |  |         BOOST_TEST(!p1); | 
					
						
							|  |  |  |         BOOST_TEST(p1.get() == 0); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-21 13:20:46 +00:00
										 |  |  |         boost::shared_ptr<X> p3(p1); | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-21 13:20:46 +00:00
										 |  |  |         p1 = p3; | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         BOOST_TEST(p1 == p3); | 
					
						
							|  |  |  |         BOOST_TEST(p1? false: true); | 
					
						
							|  |  |  |         BOOST_TEST(!p1); | 
					
						
							|  |  |  |         BOOST_TEST(p1.get() == 0); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-21 13:20:46 +00:00
										 |  |  |         BOOST_TEST(X::instances == 0); | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-21 13:20:46 +00:00
										 |  |  |         boost::shared_ptr<X> p4(new X); | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-21 13:20:46 +00:00
										 |  |  |         BOOST_TEST(X::instances == 1); | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-21 13:20:46 +00:00
										 |  |  |         p1 = p4; | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-21 13:20:46 +00:00
										 |  |  |         BOOST_TEST(X::instances == 1); | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         BOOST_TEST(p1 == p4); | 
					
						
							|  |  |  |         BOOST_TEST(!(p1 < p4 || p4 < p1)); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-21 13:20:46 +00:00
										 |  |  |         BOOST_TEST(p1.use_count() == 2); | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-21 13:20:46 +00:00
										 |  |  |         p1 = p2; | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         BOOST_TEST(p1 == p2); | 
					
						
							| 
									
										
										
										
											2002-11-21 13:20:46 +00:00
										 |  |  |         BOOST_TEST(X::instances == 1); | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-21 13:20:46 +00:00
										 |  |  |         p4 = p3; | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         BOOST_TEST(p4 == p3); | 
					
						
							| 
									
										
										
										
											2002-11-21 13:20:46 +00:00
										 |  |  |         BOOST_TEST(X::instances == 0); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void conversion_assignment() | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2002-11-21 13:20:46 +00:00
										 |  |  |     { | 
					
						
							|  |  |  |         boost::shared_ptr<void> p1; | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-21 13:20:46 +00:00
										 |  |  |         boost::shared_ptr<incomplete> p2; | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-21 13:20:46 +00:00
										 |  |  |         p1 = p2; | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         BOOST_TEST(p1 == p2); | 
					
						
							|  |  |  |         BOOST_TEST(p1? false: true); | 
					
						
							|  |  |  |         BOOST_TEST(!p1); | 
					
						
							|  |  |  |         BOOST_TEST(p1.get() == 0); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-21 13:20:46 +00:00
										 |  |  |         boost::shared_ptr<int> p4(new int); | 
					
						
							|  |  |  |         BOOST_TEST(p4.use_count() == 1); | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-21 13:20:46 +00:00
										 |  |  |         boost::shared_ptr<void> p5(p4); | 
					
						
							|  |  |  |         BOOST_TEST(p4.use_count() == 2); | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-21 13:20:46 +00:00
										 |  |  |         p1 = p4; | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         BOOST_TEST(p1 == p4); | 
					
						
							|  |  |  |         BOOST_TEST(!(p1 < p5 || p5 < p1)); | 
					
						
							| 
									
										
										
										
											2002-11-21 13:20:46 +00:00
										 |  |  |         BOOST_TEST(p1.use_count() == 3); | 
					
						
							|  |  |  |         BOOST_TEST(p4.use_count() == 3); | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-21 13:20:46 +00:00
										 |  |  |         p1 = p2; | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         BOOST_TEST(p1 == p2); | 
					
						
							| 
									
										
										
										
											2002-11-21 13:20:46 +00:00
										 |  |  |         BOOST_TEST(p4.use_count() == 2); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-21 13:20:46 +00:00
										 |  |  |     { | 
					
						
							|  |  |  |         boost::shared_ptr<X> p1; | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-21 13:20:46 +00:00
										 |  |  |         boost::shared_ptr<Y> p2; | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-21 13:20:46 +00:00
										 |  |  |         p1 = p2; | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         BOOST_TEST(p1 == p2); | 
					
						
							|  |  |  |         BOOST_TEST(p1? false: true); | 
					
						
							|  |  |  |         BOOST_TEST(!p1); | 
					
						
							|  |  |  |         BOOST_TEST(p1.get() == 0); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-21 13:20:46 +00:00
										 |  |  |         BOOST_TEST(X::instances == 0); | 
					
						
							|  |  |  |         BOOST_TEST(Y::instances == 0); | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-21 13:20:46 +00:00
										 |  |  |         boost::shared_ptr<Y> p4(new Y); | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-21 13:20:46 +00:00
										 |  |  |         BOOST_TEST(X::instances == 1); | 
					
						
							|  |  |  |         BOOST_TEST(Y::instances == 1); | 
					
						
							|  |  |  |         BOOST_TEST(p4.use_count() == 1); | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-21 13:20:46 +00:00
										 |  |  |         boost::shared_ptr<X> p5(p4); | 
					
						
							|  |  |  |         BOOST_TEST(p4.use_count() == 2); | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-21 13:20:46 +00:00
										 |  |  |         p1 = p4; | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-21 13:20:46 +00:00
										 |  |  |         BOOST_TEST(X::instances == 1); | 
					
						
							|  |  |  |         BOOST_TEST(Y::instances == 1); | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         BOOST_TEST(p1 == p4); | 
					
						
							|  |  |  |         BOOST_TEST(!(p1 < p5 || p5 < p1)); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-21 13:20:46 +00:00
										 |  |  |         BOOST_TEST(p1.use_count() == 3); | 
					
						
							|  |  |  |         BOOST_TEST(p4.use_count() == 3); | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-21 13:20:46 +00:00
										 |  |  |         p1 = p2; | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         BOOST_TEST(p1 == p2); | 
					
						
							| 
									
										
										
										
											2002-11-21 13:20:46 +00:00
										 |  |  |         BOOST_TEST(X::instances == 1); | 
					
						
							|  |  |  |         BOOST_TEST(Y::instances == 1); | 
					
						
							|  |  |  |         BOOST_TEST(p4.use_count() == 2); | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-21 13:20:46 +00:00
										 |  |  |         p4 = p2; | 
					
						
							|  |  |  |         p5 = p2; | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         BOOST_TEST(p4 == p2); | 
					
						
							| 
									
										
										
										
											2002-11-21 13:20:46 +00:00
										 |  |  |         BOOST_TEST(X::instances == 0); | 
					
						
							|  |  |  |         BOOST_TEST(Y::instances == 0); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void auto_ptr_assignment() | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2002-11-21 13:20:46 +00:00
										 |  |  |     { | 
					
						
							|  |  |  |         boost::shared_ptr<int> p1; | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-21 13:20:46 +00:00
										 |  |  |         std::auto_ptr<int> p2; | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-21 13:20:46 +00:00
										 |  |  |         p1 = p2; | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  |         BOOST_TEST(p1? false: true); | 
					
						
							|  |  |  |         BOOST_TEST(!p1); | 
					
						
							|  |  |  |         BOOST_TEST(p1.get() == 0); | 
					
						
							| 
									
										
										
										
											2002-11-21 13:20:46 +00:00
										 |  |  |         BOOST_TEST(p1.use_count() == 1); | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-21 13:20:46 +00:00
										 |  |  |         int * p = new int; | 
					
						
							|  |  |  |         std::auto_ptr<int> p3(p); | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-21 13:20:46 +00:00
										 |  |  |         p1 = p3; | 
					
						
							|  |  |  |         BOOST_TEST(p1.get() == p); | 
					
						
							|  |  |  |         BOOST_TEST(p1.use_count() == 1); | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-06-18 16:03:09 +00:00
										 |  |  | #if !defined(BOOST_OLD_AUTO_PTR)
 | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  |         BOOST_TEST(p3.get() == 0); | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-21 13:20:46 +00:00
										 |  |  |         p1 = p2; | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  |         BOOST_TEST(p1? false: true); | 
					
						
							|  |  |  |         BOOST_TEST(!p1); | 
					
						
							|  |  |  |         BOOST_TEST(p1.get() == 0); | 
					
						
							| 
									
										
										
										
											2002-11-21 13:20:46 +00:00
										 |  |  |         BOOST_TEST(p1.use_count() == 1); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-21 13:20:46 +00:00
										 |  |  |     { | 
					
						
							|  |  |  |         boost::shared_ptr<void> p1; | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-21 13:20:46 +00:00
										 |  |  |         std::auto_ptr<int> p2; | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-21 13:20:46 +00:00
										 |  |  |         p1 = p2; | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  |         BOOST_TEST(p1? false: true); | 
					
						
							|  |  |  |         BOOST_TEST(!p1); | 
					
						
							|  |  |  |         BOOST_TEST(p1.get() == 0); | 
					
						
							| 
									
										
										
										
											2002-11-21 13:20:46 +00:00
										 |  |  |         BOOST_TEST(p1.use_count() == 1); | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-21 13:20:46 +00:00
										 |  |  |         int * p = new int; | 
					
						
							|  |  |  |         std::auto_ptr<int> p3(p); | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-21 13:20:46 +00:00
										 |  |  |         p1 = p3; | 
					
						
							|  |  |  |         BOOST_TEST(p1.get() == p); | 
					
						
							|  |  |  |         BOOST_TEST(p1.use_count() == 1); | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-06-18 16:03:09 +00:00
										 |  |  | #if !defined(BOOST_OLD_AUTO_PTR)
 | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  |         BOOST_TEST(p3.get() == 0); | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-21 13:20:46 +00:00
										 |  |  |         p1 = p2; | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  |         BOOST_TEST(p1? false: true); | 
					
						
							|  |  |  |         BOOST_TEST(!p1); | 
					
						
							|  |  |  |         BOOST_TEST(p1.get() == 0); | 
					
						
							| 
									
										
										
										
											2002-11-21 13:20:46 +00:00
										 |  |  |         BOOST_TEST(p1.use_count() == 1); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-21 13:20:46 +00:00
										 |  |  |     { | 
					
						
							|  |  |  |         boost::shared_ptr<X> p1; | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-21 13:20:46 +00:00
										 |  |  |         std::auto_ptr<Y> p2; | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-21 13:20:46 +00:00
										 |  |  |         p1 = p2; | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  |         BOOST_TEST(p1? false: true); | 
					
						
							|  |  |  |         BOOST_TEST(!p1); | 
					
						
							|  |  |  |         BOOST_TEST(p1.get() == 0); | 
					
						
							| 
									
										
										
										
											2002-11-21 13:20:46 +00:00
										 |  |  |         BOOST_TEST(p1.use_count() == 1); | 
					
						
							|  |  |  |         BOOST_TEST(X::instances == 0); | 
					
						
							|  |  |  |         BOOST_TEST(Y::instances == 0); | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-21 13:20:46 +00:00
										 |  |  |         Y * p = new Y; | 
					
						
							|  |  |  |         std::auto_ptr<Y> p3(p); | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-21 13:20:46 +00:00
										 |  |  |         BOOST_TEST(X::instances == 1); | 
					
						
							|  |  |  |         BOOST_TEST(Y::instances == 1); | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-21 13:20:46 +00:00
										 |  |  |         p1 = p3; | 
					
						
							|  |  |  |         BOOST_TEST(p1.get() == p); | 
					
						
							|  |  |  |         BOOST_TEST(p1.use_count() == 1); | 
					
						
							|  |  |  |         BOOST_TEST(X::instances == 1); | 
					
						
							|  |  |  |         BOOST_TEST(Y::instances == 1); | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-06-18 16:03:09 +00:00
										 |  |  | #if !defined(BOOST_OLD_AUTO_PTR)
 | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  |         BOOST_TEST(p3.get() == 0); | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-21 13:20:46 +00:00
										 |  |  |         p1 = p2; | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  |         BOOST_TEST(p1? false: true); | 
					
						
							|  |  |  |         BOOST_TEST(!p1); | 
					
						
							|  |  |  |         BOOST_TEST(p1.get() == 0); | 
					
						
							| 
									
										
										
										
											2002-11-21 13:20:46 +00:00
										 |  |  |         BOOST_TEST(p1.use_count() == 1); | 
					
						
							|  |  |  |         BOOST_TEST(X::instances == 0); | 
					
						
							|  |  |  |         BOOST_TEST(Y::instances == 0); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  | void test() | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2002-11-21 13:20:46 +00:00
										 |  |  |     copy_assignment(); | 
					
						
							|  |  |  |     conversion_assignment(); | 
					
						
							|  |  |  |     auto_ptr_assignment(); | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } // namespace n_assignment
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace n_reset | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-25 13:51:56 +00:00
										 |  |  | class incomplete; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | incomplete * p0 = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void deleter(incomplete *) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | struct X | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     static long instances; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     X() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         ++instances; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ~X() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         --instances; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | private: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     X(X const &); | 
					
						
							|  |  |  |     X & operator= (X const &); | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | long X::instances = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  | void plain_reset() | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2002-11-25 13:51:56 +00:00
										 |  |  |     { | 
					
						
							|  |  |  |         boost::shared_ptr<int> pi; | 
					
						
							|  |  |  |         pi.reset(); | 
					
						
							|  |  |  |         BOOST_TEST(pi? false: true); | 
					
						
							|  |  |  |         BOOST_TEST(!pi); | 
					
						
							|  |  |  |         BOOST_TEST(pi.get() == 0); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         boost::shared_ptr<int> pi(static_cast<int*>(0)); | 
					
						
							|  |  |  |         pi.reset(); | 
					
						
							|  |  |  |         BOOST_TEST(pi? false: true); | 
					
						
							|  |  |  |         BOOST_TEST(!pi); | 
					
						
							|  |  |  |         BOOST_TEST(pi.get() == 0); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         boost::shared_ptr<int> pi(new int); | 
					
						
							|  |  |  |         pi.reset(); | 
					
						
							|  |  |  |         BOOST_TEST(pi? false: true); | 
					
						
							|  |  |  |         BOOST_TEST(!pi); | 
					
						
							|  |  |  |         BOOST_TEST(pi.get() == 0); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         boost::shared_ptr<incomplete> px; | 
					
						
							|  |  |  |         px.reset(); | 
					
						
							|  |  |  |         BOOST_TEST(px? false: true); | 
					
						
							|  |  |  |         BOOST_TEST(!px); | 
					
						
							|  |  |  |         BOOST_TEST(px.get() == 0); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         boost::shared_ptr<incomplete> px(p0, deleter); | 
					
						
							|  |  |  |         px.reset(); | 
					
						
							|  |  |  |         BOOST_TEST(px? false: true); | 
					
						
							|  |  |  |         BOOST_TEST(!px); | 
					
						
							|  |  |  |         BOOST_TEST(px.get() == 0); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         boost::shared_ptr<X> px; | 
					
						
							|  |  |  |         px.reset(); | 
					
						
							|  |  |  |         BOOST_TEST(px? false: true); | 
					
						
							|  |  |  |         BOOST_TEST(!px); | 
					
						
							|  |  |  |         BOOST_TEST(px.get() == 0); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         BOOST_TEST(X::instances == 0); | 
					
						
							|  |  |  |         boost::shared_ptr<X> px(new X); | 
					
						
							|  |  |  |         BOOST_TEST(X::instances == 1); | 
					
						
							|  |  |  |         px.reset(); | 
					
						
							|  |  |  |         BOOST_TEST(px? false: true); | 
					
						
							|  |  |  |         BOOST_TEST(!px); | 
					
						
							|  |  |  |         BOOST_TEST(px.get() == 0); | 
					
						
							|  |  |  |         BOOST_TEST(X::instances == 0); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         boost::shared_ptr<void> pv; | 
					
						
							|  |  |  |         pv.reset(); | 
					
						
							|  |  |  |         BOOST_TEST(pv? false: true); | 
					
						
							|  |  |  |         BOOST_TEST(!pv); | 
					
						
							|  |  |  |         BOOST_TEST(pv.get() == 0); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         BOOST_TEST(X::instances == 0); | 
					
						
							|  |  |  |         boost::shared_ptr<void> pv(new X); | 
					
						
							|  |  |  |         BOOST_TEST(X::instances == 1); | 
					
						
							|  |  |  |         pv.reset(); | 
					
						
							|  |  |  |         BOOST_TEST(pv? false: true); | 
					
						
							|  |  |  |         BOOST_TEST(!pv); | 
					
						
							|  |  |  |         BOOST_TEST(pv.get() == 0); | 
					
						
							|  |  |  |         BOOST_TEST(X::instances == 0); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-25 13:51:56 +00:00
										 |  |  | struct A | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     int dummy; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | struct Y: public A, public virtual X | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     static long instances; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     Y() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         ++instances; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ~Y() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         --instances; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | private: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     Y(Y const &); | 
					
						
							|  |  |  |     Y & operator= (Y const &); | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | long Y::instances = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  | void pointer_reset() | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2002-11-25 13:51:56 +00:00
										 |  |  |     { | 
					
						
							|  |  |  |         boost::shared_ptr<int> pi; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         pi.reset(static_cast<int*>(0)); | 
					
						
							|  |  |  |         BOOST_TEST(pi? false: true); | 
					
						
							|  |  |  |         BOOST_TEST(!pi); | 
					
						
							|  |  |  |         BOOST_TEST(pi.get() == 0); | 
					
						
							|  |  |  |         BOOST_TEST(pi.use_count() == 1); | 
					
						
							|  |  |  |         BOOST_TEST(pi.unique()); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         int * p = new int; | 
					
						
							|  |  |  |         pi.reset(p); | 
					
						
							|  |  |  |         BOOST_TEST(pi? true: false); | 
					
						
							|  |  |  |         BOOST_TEST(!!pi); | 
					
						
							|  |  |  |         BOOST_TEST(pi.get() == p); | 
					
						
							|  |  |  |         BOOST_TEST(pi.use_count() == 1); | 
					
						
							|  |  |  |         BOOST_TEST(pi.unique()); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         pi.reset(static_cast<int*>(0)); | 
					
						
							|  |  |  |         BOOST_TEST(pi? false: true); | 
					
						
							|  |  |  |         BOOST_TEST(!pi); | 
					
						
							|  |  |  |         BOOST_TEST(pi.get() == 0); | 
					
						
							|  |  |  |         BOOST_TEST(pi.use_count() == 1); | 
					
						
							|  |  |  |         BOOST_TEST(pi.unique()); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         boost::shared_ptr<X> px; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         px.reset(static_cast<X*>(0)); | 
					
						
							|  |  |  |         BOOST_TEST(px? false: true); | 
					
						
							|  |  |  |         BOOST_TEST(!px); | 
					
						
							|  |  |  |         BOOST_TEST(px.get() == 0); | 
					
						
							|  |  |  |         BOOST_TEST(px.use_count() == 1); | 
					
						
							|  |  |  |         BOOST_TEST(px.unique()); | 
					
						
							|  |  |  |         BOOST_TEST(X::instances == 0); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         X * p = new X; | 
					
						
							|  |  |  |         px.reset(p); | 
					
						
							|  |  |  |         BOOST_TEST(px? true: false); | 
					
						
							|  |  |  |         BOOST_TEST(!!px); | 
					
						
							|  |  |  |         BOOST_TEST(px.get() == p); | 
					
						
							|  |  |  |         BOOST_TEST(px.use_count() == 1); | 
					
						
							|  |  |  |         BOOST_TEST(px.unique()); | 
					
						
							|  |  |  |         BOOST_TEST(X::instances == 1); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         px.reset(static_cast<X*>(0)); | 
					
						
							|  |  |  |         BOOST_TEST(px? false: true); | 
					
						
							|  |  |  |         BOOST_TEST(!px); | 
					
						
							|  |  |  |         BOOST_TEST(px.get() == 0); | 
					
						
							|  |  |  |         BOOST_TEST(px.use_count() == 1); | 
					
						
							|  |  |  |         BOOST_TEST(px.unique()); | 
					
						
							|  |  |  |         BOOST_TEST(X::instances == 0); | 
					
						
							|  |  |  |         BOOST_TEST(Y::instances == 0); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         Y * q = new Y; | 
					
						
							|  |  |  |         px.reset(q); | 
					
						
							|  |  |  |         BOOST_TEST(px? true: false); | 
					
						
							|  |  |  |         BOOST_TEST(!!px); | 
					
						
							|  |  |  |         BOOST_TEST(px.get() == q); | 
					
						
							|  |  |  |         BOOST_TEST(px.use_count() == 1); | 
					
						
							|  |  |  |         BOOST_TEST(px.unique()); | 
					
						
							|  |  |  |         BOOST_TEST(X::instances == 1); | 
					
						
							|  |  |  |         BOOST_TEST(Y::instances == 1); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         px.reset(static_cast<Y*>(0)); | 
					
						
							|  |  |  |         BOOST_TEST(px? false: true); | 
					
						
							|  |  |  |         BOOST_TEST(!px); | 
					
						
							|  |  |  |         BOOST_TEST(px.get() == 0); | 
					
						
							|  |  |  |         BOOST_TEST(px.use_count() == 1); | 
					
						
							|  |  |  |         BOOST_TEST(px.unique()); | 
					
						
							|  |  |  |         BOOST_TEST(X::instances == 0); | 
					
						
							|  |  |  |         BOOST_TEST(Y::instances == 0); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         boost::shared_ptr<void> pv; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         pv.reset(static_cast<X*>(0)); | 
					
						
							|  |  |  |         BOOST_TEST(pv? false: true); | 
					
						
							|  |  |  |         BOOST_TEST(!pv); | 
					
						
							|  |  |  |         BOOST_TEST(pv.get() == 0); | 
					
						
							|  |  |  |         BOOST_TEST(pv.use_count() == 1); | 
					
						
							|  |  |  |         BOOST_TEST(pv.unique()); | 
					
						
							|  |  |  |         BOOST_TEST(X::instances == 0); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         X * p = new X; | 
					
						
							|  |  |  |         pv.reset(p); | 
					
						
							|  |  |  |         BOOST_TEST(pv? true: false); | 
					
						
							|  |  |  |         BOOST_TEST(!!pv); | 
					
						
							|  |  |  |         BOOST_TEST(pv.get() == p); | 
					
						
							|  |  |  |         BOOST_TEST(pv.use_count() == 1); | 
					
						
							|  |  |  |         BOOST_TEST(pv.unique()); | 
					
						
							|  |  |  |         BOOST_TEST(X::instances == 1); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         pv.reset(static_cast<X*>(0)); | 
					
						
							|  |  |  |         BOOST_TEST(pv? false: true); | 
					
						
							|  |  |  |         BOOST_TEST(!pv); | 
					
						
							|  |  |  |         BOOST_TEST(pv.get() == 0); | 
					
						
							|  |  |  |         BOOST_TEST(pv.use_count() == 1); | 
					
						
							|  |  |  |         BOOST_TEST(pv.unique()); | 
					
						
							|  |  |  |         BOOST_TEST(X::instances == 0); | 
					
						
							|  |  |  |         BOOST_TEST(Y::instances == 0); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         Y * q = new Y; | 
					
						
							|  |  |  |         pv.reset(q); | 
					
						
							|  |  |  |         BOOST_TEST(pv? true: false); | 
					
						
							|  |  |  |         BOOST_TEST(!!pv); | 
					
						
							|  |  |  |         BOOST_TEST(pv.get() == q); | 
					
						
							|  |  |  |         BOOST_TEST(pv.use_count() == 1); | 
					
						
							|  |  |  |         BOOST_TEST(pv.unique()); | 
					
						
							|  |  |  |         BOOST_TEST(X::instances == 1); | 
					
						
							|  |  |  |         BOOST_TEST(Y::instances == 1); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         pv.reset(static_cast<Y*>(0)); | 
					
						
							|  |  |  |         BOOST_TEST(pv? false: true); | 
					
						
							|  |  |  |         BOOST_TEST(!pv); | 
					
						
							|  |  |  |         BOOST_TEST(pv.get() == 0); | 
					
						
							|  |  |  |         BOOST_TEST(pv.use_count() == 1); | 
					
						
							|  |  |  |         BOOST_TEST(pv.unique()); | 
					
						
							|  |  |  |         BOOST_TEST(X::instances == 0); | 
					
						
							|  |  |  |         BOOST_TEST(Y::instances == 0); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void * deleted = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void deleter2(void * p) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     deleted = p; | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void deleter_reset() | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2002-11-25 13:51:56 +00:00
										 |  |  |     { | 
					
						
							|  |  |  |         boost::shared_ptr<int> pi; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         pi.reset(static_cast<int*>(0), deleter2); | 
					
						
							|  |  |  |         BOOST_TEST(pi? false: true); | 
					
						
							|  |  |  |         BOOST_TEST(!pi); | 
					
						
							|  |  |  |         BOOST_TEST(pi.get() == 0); | 
					
						
							|  |  |  |         BOOST_TEST(pi.use_count() == 1); | 
					
						
							|  |  |  |         BOOST_TEST(pi.unique()); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         deleted = π | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         int m = 0; | 
					
						
							|  |  |  |         pi.reset(&m, deleter2); | 
					
						
							|  |  |  |         BOOST_TEST(deleted == 0); | 
					
						
							|  |  |  |         BOOST_TEST(pi? true: false); | 
					
						
							|  |  |  |         BOOST_TEST(!!pi); | 
					
						
							|  |  |  |         BOOST_TEST(pi.get() == &m); | 
					
						
							|  |  |  |         BOOST_TEST(pi.use_count() == 1); | 
					
						
							|  |  |  |         BOOST_TEST(pi.unique()); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         pi.reset(static_cast<int*>(0), deleter2); | 
					
						
							|  |  |  |         BOOST_TEST(deleted == &m); | 
					
						
							|  |  |  |         BOOST_TEST(pi? false: true); | 
					
						
							|  |  |  |         BOOST_TEST(!pi); | 
					
						
							|  |  |  |         BOOST_TEST(pi.get() == 0); | 
					
						
							|  |  |  |         BOOST_TEST(pi.use_count() == 1); | 
					
						
							|  |  |  |         BOOST_TEST(pi.unique()); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         pi.reset(); | 
					
						
							|  |  |  |         BOOST_TEST(deleted == 0); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         boost::shared_ptr<X> px; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         px.reset(static_cast<X*>(0), deleter2); | 
					
						
							|  |  |  |         BOOST_TEST(px? false: true); | 
					
						
							|  |  |  |         BOOST_TEST(!px); | 
					
						
							|  |  |  |         BOOST_TEST(px.get() == 0); | 
					
						
							|  |  |  |         BOOST_TEST(px.use_count() == 1); | 
					
						
							|  |  |  |         BOOST_TEST(px.unique()); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         deleted = &px; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         X x; | 
					
						
							|  |  |  |         px.reset(&x, deleter2); | 
					
						
							|  |  |  |         BOOST_TEST(deleted == 0); | 
					
						
							|  |  |  |         BOOST_TEST(px? true: false); | 
					
						
							|  |  |  |         BOOST_TEST(!!px); | 
					
						
							|  |  |  |         BOOST_TEST(px.get() == &x); | 
					
						
							|  |  |  |         BOOST_TEST(px.use_count() == 1); | 
					
						
							|  |  |  |         BOOST_TEST(px.unique()); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         px.reset(static_cast<X*>(0), deleter2); | 
					
						
							|  |  |  |         BOOST_TEST(deleted == &x); | 
					
						
							|  |  |  |         BOOST_TEST(px? false: true); | 
					
						
							|  |  |  |         BOOST_TEST(!px); | 
					
						
							|  |  |  |         BOOST_TEST(px.get() == 0); | 
					
						
							|  |  |  |         BOOST_TEST(px.use_count() == 1); | 
					
						
							|  |  |  |         BOOST_TEST(px.unique()); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         Y y; | 
					
						
							|  |  |  |         px.reset(&y, deleter2); | 
					
						
							|  |  |  |         BOOST_TEST(deleted == 0); | 
					
						
							|  |  |  |         BOOST_TEST(px? true: false); | 
					
						
							|  |  |  |         BOOST_TEST(!!px); | 
					
						
							|  |  |  |         BOOST_TEST(px.get() == &y); | 
					
						
							|  |  |  |         BOOST_TEST(px.use_count() == 1); | 
					
						
							|  |  |  |         BOOST_TEST(px.unique()); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         px.reset(static_cast<Y*>(0), deleter2); | 
					
						
							|  |  |  |         BOOST_TEST(deleted == &y); | 
					
						
							|  |  |  |         BOOST_TEST(px? false: true); | 
					
						
							|  |  |  |         BOOST_TEST(!px); | 
					
						
							|  |  |  |         BOOST_TEST(px.get() == 0); | 
					
						
							|  |  |  |         BOOST_TEST(px.use_count() == 1); | 
					
						
							|  |  |  |         BOOST_TEST(px.unique()); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         px.reset(); | 
					
						
							|  |  |  |         BOOST_TEST(deleted == 0); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         boost::shared_ptr<void> pv; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         pv.reset(static_cast<X*>(0), deleter2); | 
					
						
							|  |  |  |         BOOST_TEST(pv? false: true); | 
					
						
							|  |  |  |         BOOST_TEST(!pv); | 
					
						
							|  |  |  |         BOOST_TEST(pv.get() == 0); | 
					
						
							|  |  |  |         BOOST_TEST(pv.use_count() == 1); | 
					
						
							|  |  |  |         BOOST_TEST(pv.unique()); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         deleted = &pv; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         X x; | 
					
						
							|  |  |  |         pv.reset(&x, deleter2); | 
					
						
							|  |  |  |         BOOST_TEST(deleted == 0); | 
					
						
							|  |  |  |         BOOST_TEST(pv? true: false); | 
					
						
							|  |  |  |         BOOST_TEST(!!pv); | 
					
						
							|  |  |  |         BOOST_TEST(pv.get() == &x); | 
					
						
							|  |  |  |         BOOST_TEST(pv.use_count() == 1); | 
					
						
							|  |  |  |         BOOST_TEST(pv.unique()); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         pv.reset(static_cast<X*>(0), deleter2); | 
					
						
							|  |  |  |         BOOST_TEST(deleted == &x); | 
					
						
							|  |  |  |         BOOST_TEST(pv? false: true); | 
					
						
							|  |  |  |         BOOST_TEST(!pv); | 
					
						
							|  |  |  |         BOOST_TEST(pv.get() == 0); | 
					
						
							|  |  |  |         BOOST_TEST(pv.use_count() == 1); | 
					
						
							|  |  |  |         BOOST_TEST(pv.unique()); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         Y y; | 
					
						
							|  |  |  |         pv.reset(&y, deleter2); | 
					
						
							|  |  |  |         BOOST_TEST(deleted == 0); | 
					
						
							|  |  |  |         BOOST_TEST(pv? true: false); | 
					
						
							|  |  |  |         BOOST_TEST(!!pv); | 
					
						
							|  |  |  |         BOOST_TEST(pv.get() == &y); | 
					
						
							|  |  |  |         BOOST_TEST(pv.use_count() == 1); | 
					
						
							|  |  |  |         BOOST_TEST(pv.unique()); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         pv.reset(static_cast<Y*>(0), deleter2); | 
					
						
							|  |  |  |         BOOST_TEST(deleted == &y); | 
					
						
							|  |  |  |         BOOST_TEST(pv? false: true); | 
					
						
							|  |  |  |         BOOST_TEST(!pv); | 
					
						
							|  |  |  |         BOOST_TEST(pv.get() == 0); | 
					
						
							|  |  |  |         BOOST_TEST(pv.use_count() == 1); | 
					
						
							|  |  |  |         BOOST_TEST(pv.unique()); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         pv.reset(); | 
					
						
							|  |  |  |         BOOST_TEST(deleted == 0); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         boost::shared_ptr<incomplete> px; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         px.reset(p0, deleter2); | 
					
						
							|  |  |  |         BOOST_TEST(px? false: true); | 
					
						
							|  |  |  |         BOOST_TEST(!px); | 
					
						
							|  |  |  |         BOOST_TEST(px.get() == 0); | 
					
						
							|  |  |  |         BOOST_TEST(px.use_count() == 1); | 
					
						
							|  |  |  |         BOOST_TEST(px.unique()); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         deleted = &px; | 
					
						
							|  |  |  |         px.reset(p0, deleter2); | 
					
						
							|  |  |  |         BOOST_TEST(deleted == 0); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  | void test() | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2002-11-21 13:20:46 +00:00
										 |  |  |     plain_reset(); | 
					
						
							|  |  |  |     pointer_reset(); | 
					
						
							|  |  |  |     deleter_reset(); | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } // namespace n_reset
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace n_access | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | struct X | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void test() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         boost::shared_ptr<X> px; | 
					
						
							|  |  |  |         BOOST_TEST(px.get() == 0); | 
					
						
							|  |  |  |         BOOST_TEST(px? false: true); | 
					
						
							|  |  |  |         BOOST_TEST(!px); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #if defined(BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP)
 | 
					
						
							|  |  |  |         using boost::get_pointer; | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         BOOST_TEST(get_pointer(px) == px.get()); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         boost::shared_ptr<X> px(static_cast<X*>(0)); | 
					
						
							|  |  |  |         BOOST_TEST(px.get() == 0); | 
					
						
							|  |  |  |         BOOST_TEST(px? false: true); | 
					
						
							|  |  |  |         BOOST_TEST(!px); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #if defined(BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP)
 | 
					
						
							|  |  |  |         using boost::get_pointer; | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         BOOST_TEST(get_pointer(px) == px.get()); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         boost::shared_ptr<X> px(static_cast<X*>(0), boost::checked_deleter<X>()); | 
					
						
							|  |  |  |         BOOST_TEST(px.get() == 0); | 
					
						
							|  |  |  |         BOOST_TEST(px? false: true); | 
					
						
							|  |  |  |         BOOST_TEST(!px); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #if defined(BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP)
 | 
					
						
							|  |  |  |         using boost::get_pointer; | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         BOOST_TEST(get_pointer(px) == px.get()); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         X * p = new X; | 
					
						
							|  |  |  |         boost::shared_ptr<X> px(p); | 
					
						
							|  |  |  |         BOOST_TEST(px.get() == p); | 
					
						
							|  |  |  |         BOOST_TEST(px? true: false); | 
					
						
							|  |  |  |         BOOST_TEST(!!px); | 
					
						
							|  |  |  |         BOOST_TEST(&*px == px.get()); | 
					
						
							|  |  |  |         BOOST_TEST(px.operator ->() == px.get()); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #if defined(BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP)
 | 
					
						
							|  |  |  |         using boost::get_pointer; | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         BOOST_TEST(get_pointer(px) == px.get()); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         X * p = new X; | 
					
						
							|  |  |  |         boost::shared_ptr<X> px(p, boost::checked_deleter<X>()); | 
					
						
							|  |  |  |         BOOST_TEST(px.get() == p); | 
					
						
							|  |  |  |         BOOST_TEST(px? true: false); | 
					
						
							|  |  |  |         BOOST_TEST(!!px); | 
					
						
							|  |  |  |         BOOST_TEST(&*px == px.get()); | 
					
						
							|  |  |  |         BOOST_TEST(px.operator ->() == px.get()); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #if defined(BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP)
 | 
					
						
							|  |  |  |         using boost::get_pointer; | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         BOOST_TEST(get_pointer(px) == px.get()); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } // namespace n_access
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace n_use_count | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | struct X | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void test() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         boost::shared_ptr<X> px(static_cast<X*>(0)); | 
					
						
							|  |  |  |         BOOST_TEST(px.use_count() == 1); | 
					
						
							|  |  |  |         BOOST_TEST(px.unique()); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         boost::shared_ptr<X> px2(px); | 
					
						
							|  |  |  |         BOOST_TEST(px2.use_count() == 2); | 
					
						
							|  |  |  |         BOOST_TEST(!px2.unique()); | 
					
						
							|  |  |  |         BOOST_TEST(px.use_count() == 2); | 
					
						
							|  |  |  |         BOOST_TEST(!px.unique()); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         boost::shared_ptr<X> px(new X); | 
					
						
							|  |  |  |         BOOST_TEST(px.use_count() == 1); | 
					
						
							|  |  |  |         BOOST_TEST(px.unique()); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         boost::shared_ptr<X> px2(px); | 
					
						
							|  |  |  |         BOOST_TEST(px2.use_count() == 2); | 
					
						
							|  |  |  |         BOOST_TEST(!px2.unique()); | 
					
						
							|  |  |  |         BOOST_TEST(px.use_count() == 2); | 
					
						
							|  |  |  |         BOOST_TEST(!px.unique()); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         boost::shared_ptr<X> px(new X, boost::checked_deleter<X>()); | 
					
						
							|  |  |  |         BOOST_TEST(px.use_count() == 1); | 
					
						
							|  |  |  |         BOOST_TEST(px.unique()); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         boost::shared_ptr<X> px2(px); | 
					
						
							|  |  |  |         BOOST_TEST(px2.use_count() == 2); | 
					
						
							|  |  |  |         BOOST_TEST(!px2.unique()); | 
					
						
							|  |  |  |         BOOST_TEST(px.use_count() == 2); | 
					
						
							|  |  |  |         BOOST_TEST(!px.unique()); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } // namespace n_use_count
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace n_swap | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | struct X | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void test() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         boost::shared_ptr<X> px; | 
					
						
							|  |  |  |         boost::shared_ptr<X> px2; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         px.swap(px2); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         BOOST_TEST(px.get() == 0); | 
					
						
							|  |  |  |         BOOST_TEST(px2.get() == 0); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         using std::swap; | 
					
						
							|  |  |  |         swap(px, px2); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         BOOST_TEST(px.get() == 0); | 
					
						
							|  |  |  |         BOOST_TEST(px2.get() == 0); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         X * p = new X; | 
					
						
							|  |  |  |         boost::shared_ptr<X> px; | 
					
						
							|  |  |  |         boost::shared_ptr<X> px2(p); | 
					
						
							|  |  |  |         boost::shared_ptr<X> px3(px2); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         px.swap(px2); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         BOOST_TEST(px.get() == p); | 
					
						
							|  |  |  |         BOOST_TEST(px.use_count() == 2); | 
					
						
							|  |  |  |         BOOST_TEST(px2.get() == 0); | 
					
						
							|  |  |  |         BOOST_TEST(px3.get() == p); | 
					
						
							|  |  |  |         BOOST_TEST(px3.use_count() == 2); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         using std::swap; | 
					
						
							|  |  |  |         swap(px, px2); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         BOOST_TEST(px.get() == 0); | 
					
						
							|  |  |  |         BOOST_TEST(px2.get() == p); | 
					
						
							|  |  |  |         BOOST_TEST(px2.use_count() == 2); | 
					
						
							|  |  |  |         BOOST_TEST(px3.get() == p); | 
					
						
							|  |  |  |         BOOST_TEST(px3.use_count() == 2); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         X * p1 = new X; | 
					
						
							|  |  |  |         X * p2 = new X; | 
					
						
							|  |  |  |         boost::shared_ptr<X> px(p1); | 
					
						
							|  |  |  |         boost::shared_ptr<X> px2(p2); | 
					
						
							|  |  |  |         boost::shared_ptr<X> px3(px2); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         px.swap(px2); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         BOOST_TEST(px.get() == p2); | 
					
						
							|  |  |  |         BOOST_TEST(px.use_count() == 2); | 
					
						
							|  |  |  |         BOOST_TEST(px2.get() == p1); | 
					
						
							|  |  |  |         BOOST_TEST(px2.use_count() == 1); | 
					
						
							|  |  |  |         BOOST_TEST(px3.get() == p2); | 
					
						
							|  |  |  |         BOOST_TEST(px3.use_count() == 2); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         using std::swap; | 
					
						
							|  |  |  |         swap(px, px2); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         BOOST_TEST(px.get() == p1); | 
					
						
							|  |  |  |         BOOST_TEST(px.use_count() == 1); | 
					
						
							|  |  |  |         BOOST_TEST(px2.get() == p2); | 
					
						
							|  |  |  |         BOOST_TEST(px2.use_count() == 2); | 
					
						
							|  |  |  |         BOOST_TEST(px3.get() == p2); | 
					
						
							|  |  |  |         BOOST_TEST(px3.use_count() == 2); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } // namespace n_swap
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace n_comparison | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | struct X | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     int dummy; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | struct Y | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     int dummy2; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-23 12:59:01 +00:00
										 |  |  | struct Z: public X, public virtual Y | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  | { | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void test() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         boost::shared_ptr<X> px; | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  |         BOOST_TEST(px == px); | 
					
						
							|  |  |  |         BOOST_TEST(!(px != px)); | 
					
						
							|  |  |  |         BOOST_TEST(!(px < px)); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-21 13:20:46 +00:00
										 |  |  |         boost::shared_ptr<X> px2; | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         BOOST_TEST(px.get() == px2.get()); | 
					
						
							|  |  |  |         BOOST_TEST(px == px2); | 
					
						
							|  |  |  |         BOOST_TEST(!(px != px2)); | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  |         BOOST_TEST(!(px < px2 && px2 < px)); | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         boost::shared_ptr<X> px; | 
					
						
							|  |  |  |         boost::shared_ptr<X> px2(px); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-21 13:20:46 +00:00
										 |  |  |         BOOST_TEST(px2 == px2); | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  |         BOOST_TEST(!(px2 != px2)); | 
					
						
							|  |  |  |         BOOST_TEST(!(px2 < px2)); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  |         BOOST_TEST(px.get() == px2.get()); | 
					
						
							|  |  |  |         BOOST_TEST(px == px2); | 
					
						
							|  |  |  |         BOOST_TEST(!(px != px2)); | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  |         BOOST_TEST(!(px < px2 && px2 < px)); | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         boost::shared_ptr<X> px; | 
					
						
							|  |  |  |         boost::shared_ptr<X> px2(new X); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-21 13:20:46 +00:00
										 |  |  |         BOOST_TEST(px2 == px2); | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  |         BOOST_TEST(!(px2 != px2)); | 
					
						
							|  |  |  |         BOOST_TEST(!(px2 < px2)); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  |         BOOST_TEST(px.get() != px2.get()); | 
					
						
							|  |  |  |         BOOST_TEST(px != px2); | 
					
						
							|  |  |  |         BOOST_TEST(!(px == px2)); | 
					
						
							|  |  |  |         BOOST_TEST(px < px2 || px2 < px); | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  |         BOOST_TEST(!(px < px2 && px2 < px)); | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         boost::shared_ptr<X> px(new X); | 
					
						
							|  |  |  |         boost::shared_ptr<X> px2(new X); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         BOOST_TEST(px.get() != px2.get()); | 
					
						
							|  |  |  |         BOOST_TEST(px != px2); | 
					
						
							|  |  |  |         BOOST_TEST(!(px == px2)); | 
					
						
							|  |  |  |         BOOST_TEST(px < px2 || px2 < px); | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  |         BOOST_TEST(!(px < px2 && px2 < px)); | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         boost::shared_ptr<X> px(new X); | 
					
						
							|  |  |  |         boost::shared_ptr<X> px2(px); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-21 13:20:46 +00:00
										 |  |  |         BOOST_TEST(px2 == px2); | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  |         BOOST_TEST(!(px2 != px2)); | 
					
						
							|  |  |  |         BOOST_TEST(!(px2 < px2)); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  |         BOOST_TEST(px.get() == px2.get()); | 
					
						
							|  |  |  |         BOOST_TEST(px == px2); | 
					
						
							|  |  |  |         BOOST_TEST(!(px != px2)); | 
					
						
							|  |  |  |         BOOST_TEST(!(px < px2 || px2 < px)); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         boost::shared_ptr<X> px(new X); | 
					
						
							|  |  |  |         boost::shared_ptr<Y> py(new Y); | 
					
						
							|  |  |  |         boost::shared_ptr<Z> pz(new Z); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         BOOST_TEST(px.get() != pz.get()); | 
					
						
							|  |  |  |         BOOST_TEST(px != pz); | 
					
						
							|  |  |  |         BOOST_TEST(!(px == pz)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         BOOST_TEST(py.get() != pz.get()); | 
					
						
							|  |  |  |         BOOST_TEST(py != pz); | 
					
						
							|  |  |  |         BOOST_TEST(!(py == pz)); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-23 12:59:01 +00:00
										 |  |  |         BOOST_TEST(px < py || py < px); | 
					
						
							|  |  |  |         BOOST_TEST(px < pz || pz < px); | 
					
						
							|  |  |  |         BOOST_TEST(py < pz || pz < py); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         BOOST_TEST(!(px < py && py < px)); | 
					
						
							|  |  |  |         BOOST_TEST(!(px < pz && pz < px)); | 
					
						
							|  |  |  |         BOOST_TEST(!(py < pz && pz < py)); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  |         boost::shared_ptr<void> pvx(px); | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-21 13:20:46 +00:00
										 |  |  |         BOOST_TEST(pvx == pvx); | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  |         BOOST_TEST(!(pvx != pvx)); | 
					
						
							|  |  |  |         BOOST_TEST(!(pvx < pvx)); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  |         boost::shared_ptr<void> pvy(py); | 
					
						
							|  |  |  |         boost::shared_ptr<void> pvz(pz); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         BOOST_TEST(pvx < pvy || pvy < pvx); | 
					
						
							|  |  |  |         BOOST_TEST(pvx < pvz || pvz < pvx); | 
					
						
							|  |  |  |         BOOST_TEST(pvy < pvz || pvz < pvy); | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-21 13:20:46 +00:00
										 |  |  |         BOOST_TEST(!(pvx < pvy && pvy < pvx)); | 
					
						
							|  |  |  |         BOOST_TEST(!(pvx < pvz && pvz < pvx)); | 
					
						
							|  |  |  |         BOOST_TEST(!(pvy < pvz && pvz < pvy)); | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         boost::shared_ptr<Z> pz(new Z); | 
					
						
							|  |  |  |         boost::shared_ptr<X> px(pz); | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-21 13:20:46 +00:00
										 |  |  |         BOOST_TEST(px == px); | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  |         BOOST_TEST(!(px != px)); | 
					
						
							|  |  |  |         BOOST_TEST(!(px < px)); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  |         boost::shared_ptr<Y> py(pz); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         BOOST_TEST(px.get() == pz.get()); | 
					
						
							|  |  |  |         BOOST_TEST(px == pz); | 
					
						
							|  |  |  |         BOOST_TEST(!(px != pz)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         BOOST_TEST(py.get() == pz.get()); | 
					
						
							|  |  |  |         BOOST_TEST(py == pz); | 
					
						
							|  |  |  |         BOOST_TEST(!(py != pz)); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-23 12:59:01 +00:00
										 |  |  |         BOOST_TEST(!(px < py || py < px)); | 
					
						
							|  |  |  |         BOOST_TEST(!(px < pz || pz < px)); | 
					
						
							|  |  |  |         BOOST_TEST(!(py < pz || pz < py)); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  |         boost::shared_ptr<void> pvx(px); | 
					
						
							|  |  |  |         boost::shared_ptr<void> pvy(py); | 
					
						
							|  |  |  |         boost::shared_ptr<void> pvz(pz); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // pvx and pvy aren't equal...
 | 
					
						
							|  |  |  |         BOOST_TEST(pvx.get() != pvy.get()); | 
					
						
							|  |  |  |         BOOST_TEST(pvx != pvy); | 
					
						
							|  |  |  |         BOOST_TEST(!(pvx == pvy)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // ... but they share ownership ...
 | 
					
						
							|  |  |  |         BOOST_TEST(!(pvx < pvy || pvy < pvx)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // ... with pvz
 | 
					
						
							|  |  |  |         BOOST_TEST(!(pvx < pvz || pvz < pvx)); | 
					
						
							|  |  |  |         BOOST_TEST(!(pvy < pvz || pvz < pvy)); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } // namespace n_comparison
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace n_static_cast | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | struct X | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | struct Y: public X | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void test() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         boost::shared_ptr<void> pv; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         boost::shared_ptr<int> pi = boost::static_pointer_cast<int>(pv); | 
					
						
							|  |  |  |         BOOST_TEST(pi.get() == 0); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         boost::shared_ptr<X> px = boost::static_pointer_cast<X>(pv); | 
					
						
							|  |  |  |         BOOST_TEST(px.get() == 0); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         boost::shared_ptr<int> pi(new int); | 
					
						
							|  |  |  |         boost::shared_ptr<void> pv(pi); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         boost::shared_ptr<int> pi2 = boost::static_pointer_cast<int>(pv); | 
					
						
							|  |  |  |         BOOST_TEST(pi.get() == pi2.get()); | 
					
						
							|  |  |  |         BOOST_TEST(!(pi < pi2 || pi2 < pi)); | 
					
						
							|  |  |  |         BOOST_TEST(pi.use_count() == 3); | 
					
						
							|  |  |  |         BOOST_TEST(pv.use_count() == 3); | 
					
						
							|  |  |  |         BOOST_TEST(pi2.use_count() == 3); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         boost::shared_ptr<X> px(new X); | 
					
						
							|  |  |  |         boost::shared_ptr<void> pv(px); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         boost::shared_ptr<X> px2 = boost::static_pointer_cast<X>(pv); | 
					
						
							|  |  |  |         BOOST_TEST(px.get() == px2.get()); | 
					
						
							|  |  |  |         BOOST_TEST(!(px < px2 || px2 < px)); | 
					
						
							|  |  |  |         BOOST_TEST(px.use_count() == 3); | 
					
						
							|  |  |  |         BOOST_TEST(pv.use_count() == 3); | 
					
						
							|  |  |  |         BOOST_TEST(px2.use_count() == 3); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         boost::shared_ptr<X> px(new Y); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         boost::shared_ptr<Y> py = boost::static_pointer_cast<Y>(px); | 
					
						
							|  |  |  |         BOOST_TEST(px.get() == py.get()); | 
					
						
							|  |  |  |         BOOST_TEST(px.use_count() == 2); | 
					
						
							|  |  |  |         BOOST_TEST(py.use_count() == 2); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         boost::shared_ptr<X> px2(py); | 
					
						
							|  |  |  |         BOOST_TEST(!(px < px2 || px2 < px)); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } // namespace n_static_cast
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-07-16 11:51:12 +00:00
										 |  |  | namespace n_const_cast | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | struct X; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void test() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         boost::shared_ptr<void const volatile> px; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         boost::shared_ptr<void> px2 = boost::const_pointer_cast<void>(px); | 
					
						
							|  |  |  |         BOOST_TEST(px2.get() == 0); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         boost::shared_ptr<int const volatile> px; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         boost::shared_ptr<int> px2 = boost::const_pointer_cast<int>(px); | 
					
						
							|  |  |  |         BOOST_TEST(px2.get() == 0); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         boost::shared_ptr<X const volatile> px; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         boost::shared_ptr<X> px2 = boost::const_pointer_cast<X>(px); | 
					
						
							|  |  |  |         BOOST_TEST(px2.get() == 0); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         boost::shared_ptr<void const volatile> px(new int); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         boost::shared_ptr<void> px2 = boost::const_pointer_cast<void>(px); | 
					
						
							|  |  |  |         BOOST_TEST(px.get() == px2.get()); | 
					
						
							|  |  |  |         BOOST_TEST(!(px < px2 || px2 < px)); | 
					
						
							|  |  |  |         BOOST_TEST(px.use_count() == 2); | 
					
						
							|  |  |  |         BOOST_TEST(px2.use_count() == 2); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         boost::shared_ptr<int const volatile> px(new int); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         boost::shared_ptr<int> px2 = boost::const_pointer_cast<int>(px); | 
					
						
							|  |  |  |         BOOST_TEST(px.get() == px2.get()); | 
					
						
							|  |  |  |         BOOST_TEST(!(px < px2 || px2 < px)); | 
					
						
							|  |  |  |         BOOST_TEST(px.use_count() == 2); | 
					
						
							|  |  |  |         BOOST_TEST(px2.use_count() == 2); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } // namespace n_const_cast
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  | namespace n_dynamic_cast | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | struct V | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     virtual ~V() {} | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | struct W: public V | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void test() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         boost::shared_ptr<V> pv; | 
					
						
							|  |  |  |         boost::shared_ptr<W> pw = boost::dynamic_pointer_cast<W>(pv); | 
					
						
							|  |  |  |         BOOST_TEST(pw.get() == 0); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         boost::shared_ptr<V> pv(static_cast<V*>(0)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         boost::shared_ptr<W> pw = boost::dynamic_pointer_cast<W>(pv); | 
					
						
							|  |  |  |         BOOST_TEST(pw.get() == 0); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         boost::shared_ptr<V> pv2(pw); | 
					
						
							|  |  |  |         BOOST_TEST(pv < pv2 || pv2 < pv); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         boost::shared_ptr<V> pv(static_cast<W*>(0)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         boost::shared_ptr<W> pw = boost::dynamic_pointer_cast<W>(pv); | 
					
						
							|  |  |  |         BOOST_TEST(pw.get() == 0); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         boost::shared_ptr<V> pv2(pw); | 
					
						
							|  |  |  |         BOOST_TEST(pv < pv2 || pv2 < pv); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         boost::shared_ptr<V> pv(new V); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         boost::shared_ptr<W> pw = boost::dynamic_pointer_cast<W>(pv); | 
					
						
							|  |  |  |         BOOST_TEST(pw.get() == 0); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         boost::shared_ptr<V> pv2(pw); | 
					
						
							|  |  |  |         BOOST_TEST(pv < pv2 || pv2 < pv); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         boost::shared_ptr<V> pv(new W); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         boost::shared_ptr<W> pw = boost::dynamic_pointer_cast<W>(pv); | 
					
						
							|  |  |  |         BOOST_TEST(pw.get() == pv.get()); | 
					
						
							|  |  |  |         BOOST_TEST(pv.use_count() == 2); | 
					
						
							|  |  |  |         BOOST_TEST(pw.use_count() == 2); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         boost::shared_ptr<V> pv2(pw); | 
					
						
							|  |  |  |         BOOST_TEST(!(pv < pv2 || pv2 < pv)); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } // namespace n_dynamic_cast
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace n_map | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | struct X | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void test() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     std::vector< boost::shared_ptr<int> > vi; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         boost::shared_ptr<int> pi1(new int); | 
					
						
							|  |  |  |         boost::shared_ptr<int> pi2(new int); | 
					
						
							|  |  |  |         boost::shared_ptr<int> pi3(new int); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         vi.push_back(pi1); | 
					
						
							|  |  |  |         vi.push_back(pi1); | 
					
						
							|  |  |  |         vi.push_back(pi1); | 
					
						
							|  |  |  |         vi.push_back(pi2); | 
					
						
							|  |  |  |         vi.push_back(pi1); | 
					
						
							|  |  |  |         vi.push_back(pi2); | 
					
						
							|  |  |  |         vi.push_back(pi1); | 
					
						
							|  |  |  |         vi.push_back(pi3); | 
					
						
							|  |  |  |         vi.push_back(pi3); | 
					
						
							|  |  |  |         vi.push_back(pi2); | 
					
						
							|  |  |  |         vi.push_back(pi1); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     std::vector< boost::shared_ptr<X> > vx; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         boost::shared_ptr<X> px1(new X); | 
					
						
							|  |  |  |         boost::shared_ptr<X> px2(new X); | 
					
						
							|  |  |  |         boost::shared_ptr<X> px3(new X); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         vx.push_back(px2); | 
					
						
							|  |  |  |         vx.push_back(px2); | 
					
						
							|  |  |  |         vx.push_back(px1); | 
					
						
							|  |  |  |         vx.push_back(px2); | 
					
						
							|  |  |  |         vx.push_back(px1); | 
					
						
							|  |  |  |         vx.push_back(px1); | 
					
						
							|  |  |  |         vx.push_back(px1); | 
					
						
							|  |  |  |         vx.push_back(px2); | 
					
						
							|  |  |  |         vx.push_back(px1); | 
					
						
							|  |  |  |         vx.push_back(px3); | 
					
						
							|  |  |  |         vx.push_back(px2); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     std::map< boost::shared_ptr<void>, long > m; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         for(std::vector< boost::shared_ptr<int> >::iterator i = vi.begin(); i != vi.end(); ++i) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             ++m[*i]; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         for(std::vector< boost::shared_ptr<X> >::iterator i = vx.begin(); i != vx.end(); ++i) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             ++m[*i]; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         for(std::map< boost::shared_ptr<void>, long >::iterator i = m.begin(); i != m.end(); ++i) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             BOOST_TEST(i->first.use_count() == i->second + 1); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } // namespace n_map
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace n_transitive | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | struct X | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     X(): next() {} | 
					
						
							|  |  |  |     boost::shared_ptr<X> next; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void test() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     boost::shared_ptr<X> p(new X); | 
					
						
							|  |  |  |     p->next = boost::shared_ptr<X>(new X); | 
					
						
							|  |  |  |     BOOST_TEST(!p->next->next); | 
					
						
							|  |  |  |     p = p->next; | 
					
						
							|  |  |  |     BOOST_TEST(!p->next); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } // namespace n_transitive
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace n_report_1 | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class foo | 
					
						
							|  |  |  | {  | 
					
						
							|  |  |  | public:  | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     foo(): m_self(this) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |     }  | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     void suicide() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         m_self.reset(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | private: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     boost::shared_ptr<foo> m_self; | 
					
						
							|  |  |  | };  | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void test() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     foo * foo_ptr = new foo; | 
					
						
							|  |  |  |     foo_ptr->suicide(); | 
					
						
							|  |  |  | }  | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } // namespace n_report_1
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Test case by Per Kristensen
 | 
					
						
							|  |  |  | namespace n_report_2 | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class foo | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | public: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     void setWeak(boost::shared_ptr<foo> s) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         w = s; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | private: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     boost::weak_ptr<foo> w; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  | class deleter | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | public: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     deleter(): lock(0) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ~deleter() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         BOOST_TEST(lock == 0); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     void operator() (foo * p) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         ++lock; | 
					
						
							|  |  |  |         delete p; | 
					
						
							|  |  |  |         --lock; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  | private: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     int lock; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  | void test() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     boost::shared_ptr<foo> s(new foo, deleter()); | 
					
						
							|  |  |  |     s->setWeak(s); | 
					
						
							|  |  |  |     s.reset(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } // namespace n_report_2
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace n_spt_incomplete | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class file; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | boost::shared_ptr<file> fopen(char const * name, char const * mode); | 
					
						
							|  |  |  | void fread(boost::shared_ptr<file> f, void * data, long size); | 
					
						
							| 
									
										
										
										
											2002-01-25 13:54:30 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  | int file_instances = 0; | 
					
						
							| 
									
										
										
										
											2002-02-01 19:34:31 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  | void test() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     BOOST_TEST(file_instances == 0); | 
					
						
							| 
									
										
										
										
											2002-02-09 12:34:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  |     { | 
					
						
							|  |  |  |         boost::shared_ptr<file> pf = fopen("name", "mode"); | 
					
						
							|  |  |  |         BOOST_TEST(file_instances == 1); | 
					
						
							|  |  |  |         fread(pf, 0, 17041); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2002-02-13 13:16:15 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  |     BOOST_TEST(file_instances == 0); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2002-02-13 13:16:15 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  | } // namespace n_spt_incomplete
 | 
					
						
							| 
									
										
										
										
											2002-02-13 13:16:15 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  | namespace n_spt_pimpl | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2002-02-13 13:16:15 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  | class file | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | private: | 
					
						
							| 
									
										
										
										
											2002-02-12 20:38:31 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  |     class impl; | 
					
						
							|  |  |  |     boost::shared_ptr<impl> pimpl_; | 
					
						
							| 
									
										
										
										
											2002-01-25 13:54:30 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  | public: | 
					
						
							| 
									
										
										
										
											2002-02-09 12:34:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  |     file(char const * name, char const * mode); | 
					
						
							| 
									
										
										
										
											2002-02-09 12:34:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  |     // compiler generated members are fine and useful
 | 
					
						
							| 
									
										
										
										
											2002-01-25 13:54:30 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  |     void read(void * data, long size); | 
					
						
							| 
									
										
										
										
											2002-01-25 13:54:30 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  |     long total_size() const; | 
					
						
							|  |  |  | }; | 
					
						
							| 
									
										
										
										
											2002-01-25 13:54:30 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  | int file_instances = 0; | 
					
						
							| 
									
										
										
										
											2002-01-25 13:54:30 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  | void test() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     BOOST_TEST(file_instances == 0); | 
					
						
							| 
									
										
										
										
											2002-01-25 13:54:30 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  |     { | 
					
						
							|  |  |  |         file f("name", "mode"); | 
					
						
							|  |  |  |         BOOST_TEST(file_instances == 1); | 
					
						
							|  |  |  |         f.read(0, 152); | 
					
						
							| 
									
										
										
										
											2002-02-09 12:34:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  |         file f2(f); | 
					
						
							|  |  |  |         BOOST_TEST(file_instances == 1); | 
					
						
							|  |  |  |         f2.read(0, 894); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         BOOST_TEST(f.total_size() == 152+894); | 
					
						
							| 
									
										
										
										
											2002-02-09 12:34:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-05-01 11:22:22 +00:00
										 |  |  |         { | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  |             file f3("name2", "mode2"); | 
					
						
							|  |  |  |             BOOST_TEST(file_instances == 2); | 
					
						
							| 
									
										
										
										
											2002-05-01 11:22:22 +00:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  |         BOOST_TEST(file_instances == 1); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     BOOST_TEST(file_instances == 0); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } // namespace n_spt_pimpl
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace n_spt_abstract | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class X | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | public: | 
					
						
							| 
									
										
										
										
											2002-07-22 16:36:52 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  |     virtual void f(int) = 0; | 
					
						
							|  |  |  |     virtual int g() = 0; | 
					
						
							| 
									
										
										
										
											2002-07-22 16:36:52 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  | protected: | 
					
						
							| 
									
										
										
										
											2002-07-22 16:36:52 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  |     ~X() {} | 
					
						
							|  |  |  | }; | 
					
						
							| 
									
										
										
										
											2002-07-22 16:36:52 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  | boost::shared_ptr<X> createX(); | 
					
						
							| 
									
										
										
										
											2002-07-22 16:36:52 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  | int X_instances = 0; | 
					
						
							| 
									
										
										
										
											2002-07-22 16:36:52 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  | void test() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     BOOST_TEST(X_instances == 0); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         boost::shared_ptr<X> px = createX(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         BOOST_TEST(X_instances == 1); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         px->f(18); | 
					
						
							|  |  |  |         px->f(152); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         BOOST_TEST(px->g() == 170); | 
					
						
							| 
									
										
										
										
											2002-01-25 13:54:30 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  |     BOOST_TEST(X_instances == 0); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } // namespace n_spt_abstract
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace n_spt_preventing_delete | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | int X_instances = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class X | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | private: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     X() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         ++X_instances; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ~X() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         --X_instances; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     class deleter; | 
					
						
							|  |  |  |     friend class deleter; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     class deleter | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |     public: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         void operator()(X * p) { delete p; } | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | public: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     static boost::shared_ptr<X> create() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         boost::shared_ptr<X> px(new X, X::deleter()); | 
					
						
							|  |  |  |         return px; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void test() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     BOOST_TEST(X_instances == 0); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         boost::shared_ptr<X> px = X::create(); | 
					
						
							|  |  |  |         BOOST_TEST(X_instances == 1); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     BOOST_TEST(X_instances == 0); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } // namespace n_spt_preventing_delete
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace n_spt_array | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | int X_instances = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | struct X | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     X() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         ++X_instances; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ~X() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         --X_instances; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void test() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     BOOST_TEST(X_instances == 0); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         boost::shared_ptr<X> px(new X[4], boost::checked_array_deleter<X>()); | 
					
						
							|  |  |  |         BOOST_TEST(X_instances == 4); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     BOOST_TEST(X_instances == 0); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } // namespace n_spt_array
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace n_spt_static | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class X | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  | public: | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-21 13:20:46 +00:00
										 |  |  |     X() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2002-11-19 16:10:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  | private: | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-28 13:42:44 +00:00
										 |  |  |     void operator delete(void *) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         // Comeau 4.3.0.1 wants a definition
 | 
					
						
							|  |  |  |         BOOST_ERROR("n_spt_static::X::operator delete() called."); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | struct null_deleter | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     void operator()(void const *) const | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static X x; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void test() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     boost::shared_ptr<X> px(&x, null_deleter()); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } // namespace n_spt_static
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace n_spt_intrusive | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-25 13:51:56 +00:00
										 |  |  | int X_instances = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | struct X | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     long count; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     X(): count(0) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         ++X_instances; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ~X() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         --X_instances; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void intrusive_ptr_add_ref(X * p) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     ++p->count; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void intrusive_ptr_release(X * p) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     if(--p->count == 0) delete p; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | template<class T> struct intrusive_deleter | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     void operator()(T * p) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         if(p != 0) intrusive_ptr_release(p); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | boost::shared_ptr<X> make_shared_from_intrusive(X * p) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     if(p != 0) intrusive_ptr_add_ref(p); | 
					
						
							|  |  |  |     boost::shared_ptr<X> px(p, intrusive_deleter<X>()); | 
					
						
							|  |  |  |     return px; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  | void test() | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2002-11-25 13:51:56 +00:00
										 |  |  |     BOOST_TEST(X_instances == 0); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         X * p = new X; | 
					
						
							|  |  |  |         BOOST_TEST(X_instances == 1); | 
					
						
							|  |  |  |         BOOST_TEST(p->count == 0); | 
					
						
							|  |  |  |         boost::shared_ptr<X> px = make_shared_from_intrusive(p); | 
					
						
							|  |  |  |         BOOST_TEST(px.get() == p); | 
					
						
							|  |  |  |         BOOST_TEST(p->count == 1); | 
					
						
							|  |  |  |         boost::shared_ptr<X> px2(px); | 
					
						
							|  |  |  |         BOOST_TEST(px2.get() == p); | 
					
						
							|  |  |  |         BOOST_TEST(p->count == 1); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     BOOST_TEST(X_instances == 0); | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } // namespace n_spt_intrusive
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace n_spt_another_sp | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-21 13:20:46 +00:00
										 |  |  | template<class T> class another_ptr: private boost::shared_ptr<T> | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | private: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     typedef boost::shared_ptr<T> base_type; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | public: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     explicit another_ptr(T * p = 0): base_type(p) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     void reset() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         base_type::reset(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     T * get() const | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         return base_type::get(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class event_handler | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | public: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     virtual ~event_handler() {} | 
					
						
							|  |  |  |     virtual void begin() = 0; | 
					
						
							|  |  |  |     virtual void handle(int event) = 0; | 
					
						
							|  |  |  |     virtual void end() = 0; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | int begin_called = 0; | 
					
						
							|  |  |  | int handle_called = 0; | 
					
						
							|  |  |  | int end_called = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class event_handler_impl: public event_handler | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | public: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     virtual void begin() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         ++begin_called; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     virtual void handle(int event) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         handle_called = event; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     virtual void end() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         ++end_called; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | another_ptr<event_handler> get_event_handler() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     another_ptr<event_handler> p(new event_handler_impl); | 
					
						
							|  |  |  |     return p; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | boost::shared_ptr<event_handler> current_handler; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void install_event_handler(boost::shared_ptr<event_handler> p) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     p->begin(); | 
					
						
							|  |  |  |     current_handler = p; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void handle_event(int event) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     current_handler->handle(event); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void remove_event_handler() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     current_handler->end(); | 
					
						
							|  |  |  |     current_handler.reset(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | template<class P> class smart_pointer_deleter | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | private: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     P p_; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | public: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     smart_pointer_deleter(P const & p): p_(p) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     void operator()(void const *) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         p_.reset(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  | void test() | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2002-11-21 13:20:46 +00:00
										 |  |  |     another_ptr<event_handler> p = get_event_handler(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     boost::shared_ptr<event_handler> q(p.get(), smart_pointer_deleter< another_ptr<event_handler> >(p)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     p.reset(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     BOOST_TEST(begin_called == 0); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     install_event_handler(q); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     BOOST_TEST(begin_called == 1); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     BOOST_TEST(handle_called == 0); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     handle_event(17041); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     BOOST_TEST(handle_called == 17041); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     BOOST_TEST(end_called == 0); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     remove_event_handler(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     BOOST_TEST(end_called == 1); | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } // namespace n_spt_another_sp
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace n_spt_shared_from_this | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class X | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | public: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     virtual void f() = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | protected: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ~X() {} | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class Y | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | public: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     virtual boost::shared_ptr<X> getX() = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | protected: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ~Y() {} | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class impl: public X, public Y | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | private: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     boost::weak_ptr<impl> weak_this; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     impl(impl const &); | 
					
						
							|  |  |  |     impl & operator=(impl const &); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     impl() {} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | public: | 
					
						
							| 
									
										
										
										
											2002-01-25 13:54:30 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  |     static boost::shared_ptr<impl> create() | 
					
						
							| 
									
										
										
										
											2002-11-12 13:14:50 +00:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  |         boost::shared_ptr<impl> pi(new impl); | 
					
						
							|  |  |  |         pi->weak_this = pi; | 
					
						
							|  |  |  |         return pi; | 
					
						
							| 
									
										
										
										
											2002-11-12 13:14:50 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  |     virtual void f() {} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     virtual boost::shared_ptr<X> getX() | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2003-02-10 15:56:36 +00:00
										 |  |  |         boost::shared_ptr<X> px = weak_this.lock(); | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  |         return px; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void test() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     boost::shared_ptr<Y> py = impl::create(); | 
					
						
							|  |  |  |     BOOST_TEST(py.get() != 0); | 
					
						
							|  |  |  |     BOOST_TEST(py.use_count() == 1); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     boost::shared_ptr<X> px = py->getX(); | 
					
						
							|  |  |  |     BOOST_TEST(px.get() != 0); | 
					
						
							|  |  |  |     BOOST_TEST(py.use_count() == 2); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     boost::shared_ptr<Y> py2 = boost::dynamic_pointer_cast<Y>(px); | 
					
						
							|  |  |  |     BOOST_TEST(py.get() == py2.get()); | 
					
						
							|  |  |  |     BOOST_TEST(!(py < py2 || py2 < py)); | 
					
						
							|  |  |  |     BOOST_TEST(py.use_count() == 3); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } // namespace n_spt_shared_from_this
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace n_spt_wrap | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void test() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } // namespace n_spt_wrap
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | int main() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     n_element_type::test(); | 
					
						
							|  |  |  |     n_constructors::test(); | 
					
						
							|  |  |  |     n_assignment::test(); | 
					
						
							|  |  |  |     n_reset::test(); | 
					
						
							|  |  |  |     n_access::test(); | 
					
						
							|  |  |  |     n_use_count::test(); | 
					
						
							|  |  |  |     n_swap::test(); | 
					
						
							|  |  |  |     n_comparison::test(); | 
					
						
							|  |  |  |     n_static_cast::test(); | 
					
						
							| 
									
										
										
										
											2003-07-16 11:51:12 +00:00
										 |  |  |     n_const_cast::test(); | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  |     n_dynamic_cast::test(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     n_map::test(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     n_transitive::test(); | 
					
						
							|  |  |  |     n_report_1::test(); | 
					
						
							|  |  |  |     n_report_2::test(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     n_spt_incomplete::test(); | 
					
						
							|  |  |  |     n_spt_pimpl::test(); | 
					
						
							|  |  |  |     n_spt_abstract::test(); | 
					
						
							|  |  |  |     n_spt_preventing_delete::test(); | 
					
						
							|  |  |  |     n_spt_array::test(); | 
					
						
							|  |  |  |     n_spt_static::test(); | 
					
						
							|  |  |  |     n_spt_intrusive::test(); | 
					
						
							|  |  |  |     n_spt_another_sp::test(); | 
					
						
							|  |  |  |     n_spt_shared_from_this::test(); | 
					
						
							|  |  |  |     n_spt_wrap::test(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-08-16 16:41:16 +00:00
										 |  |  |     return boost::report_errors(); | 
					
						
							| 
									
										
										
										
											2002-01-25 13:54:30 +00:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | namespace n_spt_incomplete | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class file | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | public: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     file(): fread_called(false) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         ++file_instances; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ~file() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         BOOST_TEST(fread_called); | 
					
						
							|  |  |  |         --file_instances; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     bool fread_called; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | boost::shared_ptr<file> fopen(char const *, char const *) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     boost::shared_ptr<file> pf(new file); | 
					
						
							|  |  |  |     return pf; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void fread(boost::shared_ptr<file> pf, void *, long) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     pf->fread_called = true; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } // namespace n_spt_incomplete
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace n_spt_pimpl | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class file::impl | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | private: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     impl(impl const &); | 
					
						
							|  |  |  |     impl & operator=(impl const &); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     long total_size_; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | public: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     impl(char const *, char const *): total_size_(0) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         ++file_instances; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ~impl() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         --file_instances; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     void read(void *, long size) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         total_size_ += size; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     long total_size() const | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         return total_size_; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | file::file(char const * name, char const * mode): pimpl_(new impl(name, mode)) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void file::read(void * data, long size) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     pimpl_->read(data, size); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | long file::total_size() const | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     return pimpl_->total_size(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } // namespace n_spt_pimpl
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace n_spt_abstract | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class X_impl: public X | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | private: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     X_impl(X_impl const &); | 
					
						
							|  |  |  |     X_impl & operator=(X_impl const &); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     int n_; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | public: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     X_impl(): n_(0) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         ++X_instances; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ~X_impl() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         --X_instances; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     virtual void f(int n) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         n_ += n; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     virtual int g() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         return n_; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | boost::shared_ptr<X> createX() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     boost::shared_ptr<X> px(new X_impl); | 
					
						
							|  |  |  |     return px; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } // namespace n_spt_abstract
 |