// (C) Copyright John Maddock 2005. // Use, modification and distribution are subject to 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) #ifdef TEST_STD_HEADERS #include #else #include #endif #include #include #include #include #include "verify_return.hpp" struct base { char member(); }; struct derived : public base{}; struct derived_deleter { void operator()(derived*b) { delete b; } }; struct abstract_base { virtual ~abstract_base(); }; struct concrete : public abstract_base {}; void noop(){} struct shared_self : public std::tr1::enable_shared_from_this { typedef std::tr1::enable_shared_from_this base_type; shared_self() : base_type(){} shared_self(const shared_self& s) : base_type(s){} ~shared_self(){} // implicit assignment: //shared_self& operator=(const shared_self& s) //{ // return *this; //} }; int main() { // bad_weak_ptr: std::tr1::bad_weak_ptr b; BOOST_STATIC_ASSERT((::boost::is_base_and_derived::value)); // shared_ptr: typedef std::tr1::shared_ptr pderived; typedef std::tr1::shared_ptr pbase; typedef std::tr1::shared_ptr pabase; BOOST_STATIC_ASSERT((::boost::is_same::value)); pderived pd1; pabase pb1(new concrete()); pbase pb2(new derived(), derived_deleter()); pderived pd2(pd1); pbase pb3(pd1); std::tr1::weak_ptr* pweak = 0; pbase pb4(*pweak); std::auto_ptr* pap = 0; pbase pb5(*pap); pb2 = pb3; pb2 = pd1; pb2 = *pap; pb2.swap(pb3); pb2.reset(); pb1.reset(new concrete()); pb2.reset(new derived(), derived_deleter()); verify_return_type(pb2.get(), static_cast(0)); verify_return_type(*pb2, base()); verify_return_type(pb2->member(), char(0)); verify_return_type(pb2.use_count(), long(0)); verify_return_type(pb2.unique(), bool(0)); if(pb2) { noop(); } if(!pb3) { noop(); } if(pb2 && pb3) { noop(); } // heterogeneous compare: verify_return_type(pd1 == pb2, bool()); verify_return_type(pd1 != pb2, bool()); verify_return_type(pd1 < pb2, bool()); std::cout << pb1 << pb2 << std::endl; std::tr1::swap(pb2, pb3); swap(pb2, pb3); // ADL verify_return_type(std::tr1::static_pointer_cast(pb2), pderived()); verify_return_type(std::tr1::dynamic_pointer_cast(pb1), std::tr1::shared_ptr()); verify_return_type(std::tr1::const_pointer_cast(std::tr1::shared_ptr()), std::tr1::shared_ptr()); verify_return_type(std::tr1::get_deleter(pb2), static_cast(0)); // weak_ptr: typedef std::tr1::weak_ptr wpb_t; BOOST_STATIC_ASSERT((::boost::is_same::value)); wpb_t wpb1; wpb_t wpb2(pd1); wpb_t wpb3(wpb1); std::tr1::weak_ptr wpd; wpb_t wpb4(wpd); wpb4 = wpb1; wpb4 = wpd; wpb4 = pd1; wpb4.swap(wpb1); wpb4.reset(); verify_return_type(wpb4.use_count(), long(0)); verify_return_type(wpb4.expired(), bool(0)); verify_return_type(wpb4.lock(), pb2); // enable_shared_from_this: typedef std::tr1::shared_ptr pshared_self; typedef std::tr1::shared_ptr pcshared_self; pshared_self sf1(new shared_self()); pshared_self sf2(new shared_self(*sf1)); *sf2 = *sf1; pcshared_self csf(sf1); verify_return_type(sf1->shared_from_this(), sf1); verify_return_type(csf->shared_from_this(), csf); }