test_shared_ptr_132.cpp
来自「Boost provides free peer-reviewed portab」· C++ 代码 · 共 235 行
CPP
235 行
/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8// test_shared_ptr.cpp// (C) Copyright 2002 Robert Ramey- http://www.rrsd.com - David Tonge . // Use, modification and distribution is 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)//// See http://www.boost.org for updates, documentation, and revision history.#include <cstddef> // NULL#include <fstream>#include <cstdio> // remove#include <boost/config.hpp>#if defined(BOOST_NO_STDC_NAMESPACE)namespace std{ using ::remove;}#endif#include "test_tools.hpp"#include <boost/serialization/shared_ptr_132.hpp>#include <boost/serialization/shared_ptr.hpp>#include <boost/serialization/weak_ptr.hpp>#include <boost/serialization/split_member.hpp>#include <boost/preprocessor/stringize.hpp>#include <boost/serialization/nvp.hpp>#include <boost/serialization/export.hpp>#include <boost/type_traits/broken_compiler_spec.hpp>// This is a simple class. It contains a counter of the number// of objects of this class which have been instantiated.class A{private: friend class boost::serialization::access; int x; template<class Archive> void save(Archive & ar, const unsigned int /* file_version */) const { ar << BOOST_SERIALIZATION_NVP(x); } template<class Archive> void load(Archive & ar, const unsigned int /* file_version */) { ar >> BOOST_SERIALIZATION_NVP(x); } BOOST_SERIALIZATION_SPLIT_MEMBER()public: static int count; bool operator==(const A & rhs) const { return x == rhs.x; } A(){++count;} // default constructor virtual ~A(){--count;} // default destructor};BOOST_BROKEN_COMPILER_TYPE_TRAITS_SPECIALIZATION(A)BOOST_SERIALIZATION_SHARED_PTR(A)// B is a subclass of Aclass B : public A{private: friend class boost::serialization::access; int y; template<class Archive> void save(Archive & ar, const unsigned int /* file_version */ )const { ar << BOOST_SERIALIZATION_BASE_OBJECT_NVP(A); } template<class Archive> void load(Archive & ar, const unsigned int /* file_version */){ ar >> BOOST_SERIALIZATION_BASE_OBJECT_NVP(A); } BOOST_SERIALIZATION_SPLIT_MEMBER()public: static int count; B() : A() {}; virtual ~B() {};};// B needs to be exported because its serialized via a base class pointerBOOST_SHARED_POINTER_EXPORT(B)BOOST_BROKEN_COMPILER_TYPE_TRAITS_SPECIALIZATION(B)BOOST_SERIALIZATION_SHARED_PTR(B)int A::count = 0;template<class T>void save(const char * testfile, const T & spa){ test_ostream os(testfile, TEST_STREAM_FLAGS); test_oarchive oa(os, TEST_ARCHIVE_FLAGS); oa << BOOST_SERIALIZATION_NVP(spa);}template<class T>void load(const char * testfile, T & spa){ test_istream is(testfile, TEST_STREAM_FLAGS); test_iarchive ia(is, TEST_ARCHIVE_FLAGS); ia >> BOOST_SERIALIZATION_NVP(spa);}// trivial testtemplate<class T>void save_and_load(const T & spa){ const char * testfile = boost::archive::tmpnam(NULL); BOOST_REQUIRE(NULL != testfile); save(testfile, spa); // note that we're loading to a current version of shared_ptr // regardless of the orignal saved type - this tests backward // archive compatibility boost::shared_ptr<A> spa1; load(testfile, spa1); BOOST_CHECK( spa.get() == NULL && spa1.get() == NULL || * spa == * spa1 ); std::remove(testfile);}template<class T>void save2( const char * testfile, const T & first, const T & second){ test_ostream os(testfile, TEST_STREAM_FLAGS); test_oarchive oa(os, TEST_ARCHIVE_FLAGS); oa << BOOST_SERIALIZATION_NVP(first); oa << BOOST_SERIALIZATION_NVP(second);}template<class T>void load2( const char * testfile, T & first, T & second){ test_istream is(testfile, TEST_STREAM_FLAGS); test_iarchive ia(is, TEST_ARCHIVE_FLAGS); ia >> BOOST_SERIALIZATION_NVP(first); ia >> BOOST_SERIALIZATION_NVP(second);}// Run tests by serializing two shared_ptrs into an archive,// clearing them (deleting the objects) and then reloading the// objects back from an archive.template<class T>void save_and_load2(T & first, T & second){ const char * testfile = boost::archive::tmpnam(NULL); BOOST_REQUIRE(NULL != testfile); save2(testfile, first, second); // Clear the pointers, thereby destroying the objects they contain first.reset(); second.reset(); boost::shared_ptr<A> first1, second1; load2(testfile, first1, second1); BOOST_CHECK(first1 == second1); std::remove(testfile);}template<class T>void save3( const char * testfile, const T & first, const T & second, const T & third){ test_ostream os(testfile, TEST_STREAM_FLAGS); test_oarchive oa(os, TEST_ARCHIVE_FLAGS); oa << BOOST_SERIALIZATION_NVP(third); oa << BOOST_SERIALIZATION_NVP(first); oa << BOOST_SERIALIZATION_NVP(second);}template<class T>void load3( const char * testfile, T & first, T & second, T & third){ test_istream is(testfile, TEST_STREAM_FLAGS); test_iarchive ia(is, TEST_ARCHIVE_FLAGS); // note that we serialize the weak pointer first ia >> BOOST_SERIALIZATION_NVP(third); // inorder to test that a temporarily solitary weak pointer // correcttly restored. ia >> BOOST_SERIALIZATION_NVP(first); ia >> BOOST_SERIALIZATION_NVP(second);}// This does the testsint test_main(int /* argc */, char * /* argv */[]){ // These are our shared_ptrs boost_132::shared_ptr<A> spa; // trivial test 1 save_and_load(spa); //trivial test 2 spa.reset(); spa = boost_132::shared_ptr<A>(new A); save_and_load(spa); // Try to save and load pointers to As, to a text archive spa = boost_132::shared_ptr<A>(new A); boost_132::shared_ptr<A> spa1 = spa; save_and_load2(spa, spa1); // Try to save and load pointers to Bs, to a text archive spa = boost_132::shared_ptr<A>(new B); save_and_load(spa); spa1 = spa; save_and_load2(spa, spa1); // obj of type B gets destroyed // as smart_ptr goes out of scope return EXIT_SUCCESS;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?