// Tests for boost::signals2::deconstruct_ptr and friends // Copyright Frank Mori Hess 2007-2008. // 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) // See http://www.boost.org/libs/signals2 for library home page. #include #include #include #include #include class X: public boost::signals2::postconstructible { public: X(): _postconstructed(false) {} ~X() { BOOST_CHECK(_postconstructed); } protected: virtual void postconstruct() { BOOST_CHECK(!_postconstructed); _postconstructed = true; } bool _postconstructed; }; class Y: public boost::signals2::predestructible { public: Y(): _predestructed(false) {} ~Y() { BOOST_CHECK(_predestructed); } protected: virtual void predestruct() { _predestructed = true; } bool _predestructed; }; class Z: public X, public Y {}; class by_deconstruct_only: public boost::signals2::postconstructible { public: ~by_deconstruct_only() { BOOST_CHECK(_postconstructed); } int value; protected: virtual void postconstruct() { BOOST_CHECK(!_postconstructed); _postconstructed = true; } bool _postconstructed; private: friend class boost::signals2::deconstruct_access; by_deconstruct_only(int value_in): value(value_in), _postconstructed(false) {} }; namespace mytest { class A { public: template friend void adl_postconstruct(const boost::shared_ptr &sp, A *p) { BOOST_CHECK(!p->_postconstructed); p->_postconstructed = true; } template friend void adl_postconstruct(const boost::shared_ptr &sp, A *p, int val) { p->value = val; BOOST_CHECK(!p->_postconstructed); p->_postconstructed = true; } friend void adl_predestruct(A *p) { p->_predestructed = true; } ~A() { BOOST_CHECK(_postconstructed); BOOST_CHECK(_predestructed); } int value; private: friend class boost::signals2::deconstruct_access; A(int value_in = 0): value(value_in), _postconstructed(false), _predestructed(false) {} bool _postconstructed; bool _predestructed; }; } void deconstruct_ptr_test() { { boost::shared_ptr x = boost::signals2::deconstruct_ptr(new X); } { boost::shared_ptr x = boost::signals2::deconstruct_ptr(new Y); } { boost::shared_ptr z = boost::signals2::deconstruct_ptr(new Z); } } class deconstructed_esft : public boost::enable_shared_from_this { friend void adl_postconstruct(boost::shared_ptr, deconstructed_esft *) {} int x; }; void deconstruct_test() { { boost::shared_ptr x = boost::signals2::deconstruct(); } { boost::shared_ptr x = boost::signals2::deconstruct(); } { boost::shared_ptr z = boost::signals2::deconstruct(); } { boost::shared_ptr a = boost::signals2::deconstruct(1); BOOST_CHECK(a->value == 1); } { boost::shared_ptr a = boost::signals2::deconstruct(1); BOOST_CHECK(a->value == 1); } {// deconstruct const type boost::shared_ptr a = boost::signals2::deconstruct(3); BOOST_CHECK(a->value == 3); } {// passing arguments to postconstructor boost::shared_ptr a = boost::signals2::deconstruct().postconstruct(2); BOOST_CHECK(a->value == 2); } {// enable_shared_from_this with deconstruct boost::shared_ptr a = boost::signals2::deconstruct(); BOOST_CHECK(!(a->shared_from_this() < a || a < a->shared_from_this())); } } int test_main(int, char*[]) { deconstruct_ptr_test(); deconstruct_test(); return 0; }