123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135 |
- /////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
- // demo_auto_ptr.cpp
- // (C) Copyright 2002-4 Robert Ramey - http://www.rrsd.com .
- // 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)
- #include <list>
- #include <memory>
- #include <fstream>
- #include <string>
- #include <cstdio> // remove, std::autoptr inteface wrong in dinkumware
- #include <boost/config.hpp>
- #if defined(BOOST_NO_STDC_NAMESPACE)
- namespace std{
- using ::remove;
- }
- #endif
- #include <boost/archive/tmpdir.hpp>
- #include <boost/archive/text_oarchive.hpp>
- #include <boost/archive/text_iarchive.hpp>
- #include <boost/serialization/split_free.hpp>
- namespace boost {
- namespace serialization {
- /////////////////////////////////////////////////////////////
- // implement serialization for auto_ptr< T >
- // note: this must be added to the boost namespace in order to
- // be called by the library
- template<class Archive, class T>
- inline void save(
- Archive & ar,
- const std::auto_ptr< T > &t,
- const unsigned int file_version
- ){
- // only the raw pointer has to be saved
- // the ref count is rebuilt automatically on load
- const T * const tx = t.get();
- ar << tx;
- }
- template<class Archive, class T>
- inline void load(
- Archive & ar,
- std::auto_ptr< T > &t,
- const unsigned int file_version
- ){
- T *pTarget;
- ar >> pTarget;
- // note that the reset automagically maintains the reference count
- #if BOOST_WORKAROUND(BOOST_DINKUMWARE_STDLIB, == 1)
- t.release();
- t = std::auto_ptr< T >(pTarget);
- #else
- t.reset(pTarget);
- #endif
- }
- // split non-intrusive serialization function member into separate
- // non intrusive save/load member functions
- template<class Archive, class T>
- inline void serialize(
- Archive & ar,
- std::auto_ptr< T > &t,
- const unsigned int file_version
- ){
- boost::serialization::split_free(ar, t, file_version);
- }
- } // namespace serialization
- } // namespace boost
- /////////////////////////////////////////////////////////////
- // test auto_ptr serialization
- class A
- {
- private:
- friend class boost::serialization::access;
- int x;
- template<class Archive>
- void serialize(Archive &ar, const unsigned int /* file_version */){
- ar & x;
- }
- public:
- A(){} // default constructor
- ~A(){} // default destructor
- };
- void save(const std::auto_ptr<A> & spa, const char *filename)
- {
- std::ofstream ofs(filename);
- boost::archive::text_oarchive oa(ofs);
- oa << spa;
- }
- void load(std::auto_ptr<A> & spa, const char *filename)
- {
- // open the archive
- std::ifstream ifs(filename);
- boost::archive::text_iarchive ia(ifs);
- // restore the schedule from the archive
- ia >> spa;
- }
- int main(int argc, char *argv[])
- {
- std::string filename = boost::archive::tmpdir();
- filename += "/testfile";
- // create a new auto pointer to ta new object of type A
- std::auto_ptr<A> spa(new A);
- // serialize it
- save(spa, filename.c_str());
- // reset the auto pointer to NULL
- // thereby destroying the object of type A
- // note that the reset automagically maintains the reference count
- #if BOOST_WORKAROUND(BOOST_DINKUMWARE_STDLIB, == 1)
- spa.release();
- #else
- spa.reset();
- #endif
- // restore state to one equivalent to the original
- // creating a new type A object
- load(spa, filename.c_str());
- // obj of type A gets destroyed
- // as auto_ptr goes out of scope
- std::remove(filename.c_str());
- return 0;
- }
|