1 /////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
2 // demo_auto_ptr.cpp
3
4 // (C) Copyright 2002-4 Robert Ramey - http://www.rrsd.com .
5 // Use, modification and distribution is subject to the Boost Software
6 // License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
7 // http://www.boost.org/LICENSE_1_0.txt)
8
9 #include <list>
10 #include <memory>
11 #include <fstream>
12 #include <string>
13
14 #include <cstdio> // remove, std::autoptr inteface wrong in dinkumware
15 #include <boost/config.hpp>
16 #if defined(BOOST_NO_STDC_NAMESPACE)
17 namespace std{
18 using ::remove;
19 }
20 #endif
21
22 #include <boost/archive/tmpdir.hpp>
23 #include <boost/archive/text_oarchive.hpp>
24 #include <boost/archive/text_iarchive.hpp>
25
26 #include <boost/serialization/split_free.hpp>
27
28 namespace boost {
29 namespace serialization {
30
31 /////////////////////////////////////////////////////////////
32 // implement serialization for auto_ptr< T >
33 // note: this must be added to the boost namespace in order to
34 // be called by the library
35 template<class Archive, class T>
save(Archive & ar,const std::auto_ptr<T> & t,const unsigned int file_version)36 inline void save(
37 Archive & ar,
38 const std::auto_ptr< T > &t,
39 const unsigned int file_version
40 ){
41 // only the raw pointer has to be saved
42 // the ref count is rebuilt automatically on load
43 const T * const tx = t.get();
44 ar << tx;
45 }
46
47 template<class Archive, class T>
load(Archive & ar,std::auto_ptr<T> & t,const unsigned int file_version)48 inline void load(
49 Archive & ar,
50 std::auto_ptr< T > &t,
51 const unsigned int file_version
52 ){
53 T *pTarget;
54 ar >> pTarget;
55 // note that the reset automagically maintains the reference count
56 #if BOOST_WORKAROUND(BOOST_DINKUMWARE_STDLIB, == 1)
57 t.release();
58 t = std::auto_ptr< T >(pTarget);
59 #else
60 t.reset(pTarget);
61 #endif
62 }
63
64 // split non-intrusive serialization function member into separate
65 // non intrusive save/load member functions
66 template<class Archive, class T>
serialize(Archive & ar,std::auto_ptr<T> & t,const unsigned int file_version)67 inline void serialize(
68 Archive & ar,
69 std::auto_ptr< T > &t,
70 const unsigned int file_version
71 ){
72 boost::serialization::split_free(ar, t, file_version);
73 }
74
75 } // namespace serialization
76 } // namespace boost
77
78 /////////////////////////////////////////////////////////////
79 // test auto_ptr serialization
80 class A
81 {
82 private:
83 friend class boost::serialization::access;
84 int x;
85 template<class Archive>
serialize(Archive & ar,const unsigned int)86 void serialize(Archive &ar, const unsigned int /* file_version */){
87 ar & x;
88 }
89 public:
A()90 A(){} // default constructor
~A()91 ~A(){} // default destructor
92 };
93
save(const std::auto_ptr<A> & spa,const char * filename)94 void save(const std::auto_ptr<A> & spa, const char *filename)
95 {
96 std::ofstream ofs(filename);
97 boost::archive::text_oarchive oa(ofs);
98 oa << spa;
99 }
100
load(std::auto_ptr<A> & spa,const char * filename)101 void load(std::auto_ptr<A> & spa, const char *filename)
102 {
103 // open the archive
104 std::ifstream ifs(filename);
105 boost::archive::text_iarchive ia(ifs);
106
107 // restore the schedule from the archive
108 ia >> spa;
109 }
110
main(int argc,char * argv[])111 int main(int argc, char *argv[])
112 {
113 std::string filename = boost::archive::tmpdir();
114 filename += "/testfile";
115
116 // create a new auto pointer to ta new object of type A
117 std::auto_ptr<A> spa(new A);
118 // serialize it
119 save(spa, filename.c_str());
120 // reset the auto pointer to NULL
121 // thereby destroying the object of type A
122 // note that the reset automagically maintains the reference count
123 #if BOOST_WORKAROUND(BOOST_DINKUMWARE_STDLIB, == 1)
124 spa.release();
125 #else
126 spa.reset();
127 #endif
128 // restore state to one equivalent to the original
129 // creating a new type A object
130 load(spa, filename.c_str());
131 // obj of type A gets destroyed
132 // as auto_ptr goes out of scope
133 std::remove(filename.c_str());
134 return 0;
135 }
136