/*! @file @id $Id$ */ // 1 2 3 4 5 6 7 8 // 45678901234567890123456789012345678901234567890123456789012345678901234567890 #include #include #include #include #include #include #include using namespace cryptoki; template class SharedPointerInside: public SharedPointer { public: SharedPointerInside() {} SharedPointerInside(const SharedPointerInside& o): SharedPointer(o) {} SharedPointerInside(T* p): SharedPointer(p) {} ~SharedPointerInside() { SmartResource::destruct(); } SharedPointerInside& operator=(const SharedPointerInside& o) { return reset(o), *this; } SharedPointerInside& operator=(T* p) { return reset(p), *this; } int cnt() { return SharedPointer::cnt(); } static int freed() { return _free; } protected: void free() { ++_free; SharedPointer::free(); } private: static int _free; }; template int SharedPointerInside::_free(0); class SharedPointerTest: public CppUnit::TestFixture { public: void check() { { SharedPointerInside i, j(new int); CPPUNIT_ASSERT_EQUAL(0, SharedPointerInside::freed()); CPPUNIT_ASSERT_EQUAL(1, i.cnt()); CPPUNIT_ASSERT_EQUAL(1, j.cnt()); i = j; CPPUNIT_ASSERT_EQUAL(1, SharedPointerInside::freed()); CPPUNIT_ASSERT_EQUAL(i.get(), j.get()); CPPUNIT_ASSERT_EQUAL(2, i.cnt()); CPPUNIT_ASSERT_EQUAL(2, j.cnt()); *i = 5; CPPUNIT_ASSERT_EQUAL(1, SharedPointerInside::freed()); CPPUNIT_ASSERT_EQUAL(5, *j); CPPUNIT_ASSERT_EQUAL(2, i.cnt()); CPPUNIT_ASSERT_EQUAL(2, j.cnt()); int* old(j.get()); i = new int(6); CPPUNIT_ASSERT_EQUAL(1, SharedPointerInside::freed()); CPPUNIT_ASSERT_EQUAL(5, *j); CPPUNIT_ASSERT_EQUAL(6, *i); CPPUNIT_ASSERT(i.get()!=j.get()); CPPUNIT_ASSERT_EQUAL(1, i.cnt()); CPPUNIT_ASSERT_EQUAL(1, j.cnt()); i = new int(8); CPPUNIT_ASSERT_EQUAL(2, SharedPointerInside::freed()); CPPUNIT_ASSERT_EQUAL(5, *j); CPPUNIT_ASSERT_EQUAL(8, *i); CPPUNIT_ASSERT(i.get()!=j.get()); CPPUNIT_ASSERT_EQUAL(1, i.cnt()); CPPUNIT_ASSERT_EQUAL(1, j.cnt()); { SharedPointerInside k(j); CPPUNIT_ASSERT_EQUAL(1, i.cnt()); CPPUNIT_ASSERT_EQUAL(2, j.cnt()); CPPUNIT_ASSERT_EQUAL(2, k.cnt()); } CPPUNIT_ASSERT_EQUAL(2, SharedPointerInside::freed()); CPPUNIT_ASSERT_EQUAL(1, i.cnt()); CPPUNIT_ASSERT_EQUAL(1, j.cnt()); } CPPUNIT_ASSERT_EQUAL(4, SharedPointerInside::freed()); } CPPUNIT_TEST_SUITE(SharedPointerTest); CPPUNIT_TEST(check); CPPUNIT_TEST_SUITE_END(); }; CPPUNIT_TEST_SUITE_REGISTRATION(SharedPointerTest); int main(int argc, char** argv) try { std::ofstream ofs((*argv+std::string(".xml")).c_str()); CppUnit::TextUi::TestRunner runner; runner.setOutputter(new CppUnit::XmlOutputter(&runner.result(), ofs)); runner.addTest(CppUnit::TestFactoryRegistry::getRegistry().makeTest()); return runner.run() ? 0 : 1; } catch (std::exception& e) { std::cerr<<"***Exception: "<