X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Utils%2Fintrusive_refcount.test.cc;h=ca05e18437d378341c30235dd141edf830f39162;hb=81ffa1c459b96dd44472bcef37e1e373934ee138;hp=8ed8772090bbd9a2b7942096706bfaaf69cf1e8f;hpb=ac6a813d9d99f7add4e13aff7a4bcd314d5604a6;p=senf.git diff --git a/Utils/intrusive_refcount.test.cc b/Utils/intrusive_refcount.test.cc index 8ed8772..ca05e18 100644 --- a/Utils/intrusive_refcount.test.cc +++ b/Utils/intrusive_refcount.test.cc @@ -1,6 +1,6 @@ // $Id$ // -// Copyright (C) 2006 +// Copyright (C) 2006 // Fraunhofer Institut fuer offene Kommunikationssysteme (FOKUS) // Kompetenzzentrum fuer Satelitenkommunikation (SatCom) // Stefan Bund @@ -36,7 +36,7 @@ ///////////////////////////////cc.p//////////////////////////////////////// namespace { - struct Tester + struct Tester : public senf::intrusive_refcount { typedef boost::intrusive_ptr ptr; @@ -48,6 +48,25 @@ namespace { }; unsigned Tester::counter = 0; + + struct TesterCustom + : public senf::intrusive_refcount_t + { + typedef boost::intrusive_ptr ptr; + typedef senf::intrusive_refcount_t super; + + TesterCustom() { ++counter; } + ~TesterCustom() { --counter; } + + void add_ref() { super::add_ref(); ++refs; } + bool release() { --refs; super::release(); return false; } + + static unsigned counter; + static unsigned refs; + }; + + unsigned TesterCustom::counter = 0; + unsigned TesterCustom::refs = 0; } BOOST_AUTO_UNIT_TEST(intrusive_refcount) @@ -65,7 +84,7 @@ BOOST_AUTO_UNIT_TEST(intrusive_refcount) BOOST_CHECK_EQUAL(p->refcount(),2u); BOOST_CHECK_EQUAL(p->is_shared(),true); } - + BOOST_CHECK_EQUAL(Tester::counter,1u); BOOST_CHECK_EQUAL(p->refcount(),1u); BOOST_CHECK_EQUAL(p->is_shared(),false); @@ -74,11 +93,52 @@ BOOST_AUTO_UNIT_TEST(intrusive_refcount) BOOST_CHECK_EQUAL(Tester::counter,0u); } +BOOST_AUTO_UNIT_TEST(intrusive_refcount_t) +{ + BOOST_CHECK_EQUAL(TesterCustom::counter,0u); + BOOST_CHECK_EQUAL(TesterCustom::refs,0u); + + TesterCustom::ptr p (new TesterCustom); + BOOST_CHECK_EQUAL(TesterCustom::counter,1u); + BOOST_CHECK_EQUAL(p->refcount(),1u); + BOOST_CHECK_EQUAL(p->is_shared(),false); + BOOST_CHECK_EQUAL(TesterCustom::refs,1u); + + + { + TesterCustom::ptr pp (p); + BOOST_CHECK_EQUAL(TesterCustom::counter,1u); + BOOST_CHECK_EQUAL(p->refcount(),2u); + BOOST_CHECK_EQUAL(p->is_shared(),true); + BOOST_CHECK_EQUAL(TesterCustom::refs,2u); + } + + BOOST_CHECK_EQUAL(TesterCustom::counter,1u); + BOOST_CHECK_EQUAL(p->refcount(),1u); + BOOST_CHECK_EQUAL(p->is_shared(),false); + BOOST_CHECK_EQUAL(TesterCustom::refs,1u); + + { + TesterCustom * pp (p.get()); + p = 0; + BOOST_CHECK_EQUAL(TesterCustom::counter,1u); + BOOST_CHECK_EQUAL(TesterCustom::refs,0u); + // The TesterCustom leaks ... + delete pp; + BOOST_CHECK_EQUAL(TesterCustom::counter,0u); + } +} + ///////////////////////////////cc.e//////////////////////////////////////// #undef prefix_ // Local Variables: // mode: c++ +// fill-column: 100 // c-file-style: "senf" +// indent-tabs-mode: nil +// ispell-local-dictionary: "american" +// compile-command: "scons -u test" +// comment-column: 40 // End: