4de1aa686c
[SVN r66419]
136 lines
3.5 KiB
C++
136 lines
3.5 KiB
C++
/////////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;
|
|
}
|