1 /////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
2 // test_tracking_save.cpp
3 
4 // (C) Copyright 2002 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 // should pass compilation and execution
10 
11 #include <cstddef> // NULL
12 #include <fstream>
13 
14 #include <boost/config.hpp>
15 #include <cstdio> // remove
16 #if defined(BOOST_NO_STDC_NAMESPACE)
17 namespace std{
18     using ::remove;
19 }
20 #endif
21 
22 #include "test_tools.hpp"
23 #include <boost/serialization/tracking.hpp>
24 #include <boost/serialization/nvp.hpp>
25 
26 #define TEST_CLASS(N, TRACKING) \
27 class N \
28 { \
29     friend class boost::serialization::access; \
30     template<class Archive> \
31     void serialize(Archive & /* ar */, const unsigned int /* file_version */){ \
32         ++count; \
33     } \
34 public: \
35     static unsigned int count; \
36 }; \
37 unsigned int N::count = 0;\
38 BOOST_CLASS_TRACKING(N, TRACKING)
39 
TEST_CLASS(AN,::boost::serialization::track_never)40 TEST_CLASS(AN, ::boost::serialization::track_never)
41 TEST_CLASS(AS, ::boost::serialization::track_selectively)
42 TEST_CLASS(AA, ::boost::serialization::track_always)
43 
44 // test pointers
45 TEST_CLASS(PAN, ::boost::serialization::track_never)
46 TEST_CLASS(PAS, ::boost::serialization::track_selectively)
47 TEST_CLASS(PAA, ::boost::serialization::track_always)
48 
49 void out(const char *testfile)
50 {
51     test_ostream os(testfile, TEST_STREAM_FLAGS);
52     test_oarchive oa(os, TEST_ARCHIVE_FLAGS);
53     // write object twice to check tracking
54     AN an;
55     AS as;
56     AA aa;
57     oa << BOOST_SERIALIZATION_NVP(an) << BOOST_SERIALIZATION_NVP(an);
58     BOOST_CHECK(an.count == 2);
59     oa << BOOST_SERIALIZATION_NVP(as) << BOOST_SERIALIZATION_NVP(as);
60     BOOST_CHECK(as.count == 2);
61     oa << BOOST_SERIALIZATION_NVP(aa) << BOOST_SERIALIZATION_NVP(aa);
62     BOOST_CHECK(aa.count == 1);
63 
64     PAN *pan = new PAN;
65     PAS *pas = new PAS;
66     PAA *paa = new PAA;
67     oa << BOOST_SERIALIZATION_NVP(pan) << BOOST_SERIALIZATION_NVP(pan);
68     BOOST_CHECK(pan->count == 2);
69     oa << BOOST_SERIALIZATION_NVP(pas) << BOOST_SERIALIZATION_NVP(pas);
70     BOOST_CHECK(pas->count == 1);
71     oa << BOOST_SERIALIZATION_NVP(paa) << BOOST_SERIALIZATION_NVP(paa);
72     BOOST_CHECK(paa->count == 1);
73     delete pan;
74     delete pas;
75     delete paa;
76 }
77 
in(const char * testfile)78 void in(const char *testfile)
79 {
80     test_istream is(testfile, TEST_STREAM_FLAGS);
81     test_iarchive ia(is, TEST_ARCHIVE_FLAGS);
82     // read object twice to check tracking
83     AN an;
84     AS as;
85     AA aa;
86 
87     AN::count = 0;
88     AS::count = 0;
89     AA::count = 0;
90 
91     ia >> BOOST_SERIALIZATION_NVP(an) >> BOOST_SERIALIZATION_NVP(an);
92     BOOST_CHECK(an.count == 2);
93     ia >> BOOST_SERIALIZATION_NVP(as) >> BOOST_SERIALIZATION_NVP(as);
94     BOOST_CHECK(as.count == 2);
95     ia >> BOOST_SERIALIZATION_NVP(aa) >> BOOST_SERIALIZATION_NVP(aa);
96     BOOST_CHECK(aa.count == 1);
97 
98     PAN::count = 0;
99     PAS::count = 0;
100     PAA::count = 0;
101 
102     PAN *pan = NULL;
103     PAS *pas = NULL;
104     PAA *paa = NULL;
105     ia >> BOOST_SERIALIZATION_NVP(pan);
106     ia >> BOOST_SERIALIZATION_NVP(pan);
107     BOOST_CHECK(pan->count == 2);
108     ia >> BOOST_SERIALIZATION_NVP(pas);
109     ia >> BOOST_SERIALIZATION_NVP(pas);
110     BOOST_CHECK(pas->count == 1);
111     ia >> BOOST_SERIALIZATION_NVP(paa);
112     ia >> BOOST_SERIALIZATION_NVP(paa);
113     BOOST_CHECK(paa->count == 1);
114     delete pan;
115     delete pas;
116     delete paa;
117 }
118 
119 int
test_main(int,char * [])120 test_main( int /* argc */, char* /* argv */[] )
121 {
122     const char * testfile = boost::archive::tmpnam(NULL);
123     BOOST_REQUIRE(NULL != testfile);
124 
125     out(testfile);
126     in(testfile);
127     std::remove(testfile);
128     return EXIT_SUCCESS;
129 }
130 
131