• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // demo_shared_ptr.cpp : demonstrates adding serialization to a template
2 
3 // (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . Polymorphic
4 // derived pointer example by David Tonge.
5 
6 // Use, modification and distribution is subject to the Boost Software
7 // License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
8 // http://www.boost.org/LICENSE_1_0.txt)
9 //
10 //  See http://www.boost.org for updates, documentation, and revision history.
11 
12 #include <iomanip>
13 #include <iostream>
14 #include <cstddef> // NULL
15 #include <fstream>
16 #include <string>
17 
18 #include <cstdio> // remove
19 #include <boost/config.hpp>
20 #if defined(BOOST_NO_STDC_NAMESPACE)
21 namespace std{
22     using ::remove;
23 }
24 #endif
25 
26 #include <boost/archive/text_oarchive.hpp>
27 #include <boost/archive/text_iarchive.hpp>
28 #include <boost/archive/tmpdir.hpp>
29 
30 #include <boost/serialization/shared_ptr.hpp>
31 
32 ///////////////////////////
33 // test shared_ptr serialization
34 class A
35 {
36 private:
37     friend class boost::serialization::access;
38     int x;
39     template<class Archive>
serialize(Archive & ar,const unsigned int)40     void serialize(Archive & ar, const unsigned int /* file_version */){
41         ar & x;
42     }
43 public:
44     static int count;
A()45     A(){++count;}    // default constructor
~A()46     virtual ~A(){--count;}   // default destructor
47 };
48 
49 BOOST_SERIALIZATION_SHARED_PTR(A)
50 
51 /////////////////
52 // ADDITION BY DT
53 class B : public A
54 {
55 private:
56     friend class boost::serialization::access;
57     int x;
58     template<class Archive>
serialize(Archive & ar,const unsigned int)59     void serialize(Archive & ar, const unsigned int /* file_version */){
60         ar & boost::serialization::base_object<A>(*this);
61     }
62 public:
63     static int count;
B()64     B() : A() {};
~B()65     virtual ~B() {};
66 };
67 
68 BOOST_SERIALIZATION_SHARED_PTR(B)
69 
70 /////////////////
71 
72 int A::count = 0;
73 
display(boost::shared_ptr<A> & spa,boost::shared_ptr<A> & spa1)74 void display(boost::shared_ptr<A> &spa, boost::shared_ptr<A> &spa1)
75 {
76     std::cout << "a = 0x" << std::hex << spa.get() << " ";
77     if (spa.get()) std::cout << "is a " << typeid(*(spa.get())).name() << "* ";
78     std::cout << "use count = " << std::dec << spa.use_count() << std::endl;
79     std::cout << "a1 = 0x" << std::hex << spa1.get() << " ";
80     if (spa1.get()) std::cout << "is a " << typeid(*(spa1.get())).name() << "* ";
81     std::cout << "use count = " << std::dec << spa1.use_count() << std::endl;
82     std::cout << "unique element count = " << A::count << std::endl;
83 }
84 
main(int,char * [])85 int main(int /* argc */, char * /*argv*/[])
86 {
87     std::string filename(boost::archive::tmpdir());
88     filename += "/testfile";
89 
90     // create  a new shared pointer to ta new object of type A
91     boost::shared_ptr<A> spa(new A);
92     boost::shared_ptr<A> spa1;
93     spa1 = spa;
94     display(spa, spa1);
95     // serialize it
96     {
97         std::ofstream ofs(filename.c_str());
98         boost::archive::text_oarchive oa(ofs);
99         oa << spa;
100         oa << spa1;
101     }
102     // reset the shared pointer to NULL
103     // thereby destroying the object of type A
104     spa.reset();
105     spa1.reset();
106     display(spa, spa1);
107     // restore state to one equivalent to the original
108     // creating a new type A object
109     {
110         // open the archive
111         std::ifstream ifs(filename.c_str());
112         boost::archive::text_iarchive ia(ifs);
113 
114         // restore the schedule from the archive
115         ia >> spa;
116         ia >> spa1;
117     }
118     display(spa, spa1);
119     spa.reset();
120     spa1.reset();
121 
122     std::cout << std::endl;
123     std::cout << std::endl;
124     std::cout << "New tests" << std::endl;
125 
126     /////////////////
127     // ADDITION BY DT
128     // create  a new shared pointer to ta new object of type A
129     spa = boost::shared_ptr<A>(new B);
130     spa1 = spa;
131     display(spa, spa1);
132     // serialize it
133     {
134         std::ofstream ofs(filename.c_str());
135         boost::archive::text_oarchive oa(ofs);
136         oa.register_type(static_cast<B *>(NULL));
137         oa << spa;
138         oa << spa1;
139     }
140     // reset the shared pointer to NULL
141     // thereby destroying the object of type B
142     spa.reset();
143     spa1.reset();
144     display(spa, spa1);
145     // restore state to one equivalent to the original
146     // creating a new type B object
147     {
148         // open the archive
149         std::ifstream ifs(filename.c_str());
150         boost::archive::text_iarchive ia(ifs);
151 
152         // restore the schedule from the archive
153         ia.register_type(static_cast<B *>(NULL));
154         ia >> spa;
155         ia >> spa1;
156     }
157     display(spa, spa1);
158     ///////////////
159     std::remove(filename.c_str());
160 
161     // obj of type A gets destroyed
162     // as smart_ptr goes out of scope
163     return 0;
164 }
165