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)
17namespace 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) \
27class 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 } \
34public: \
35 static unsigned int count; \
36}; \
37unsigned int N::count = 0;\
38BOOST_CLASS_TRACKING(N, TRACKING)
39
40TEST_CLASS(AN, ::boost::serialization::track_never)
41TEST_CLASS(AS, ::boost::serialization::track_selectively)
42TEST_CLASS(AA, ::boost::serialization::track_always)
43
44// test pointers
45TEST_CLASS(PAN, ::boost::serialization::track_never)
46TEST_CLASS(PAS, ::boost::serialization::track_selectively)
47TEST_CLASS(PAA, ::boost::serialization::track_always)
48
49void 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
78void 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
119int
120test_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(filename: testfile);
128 return EXIT_SUCCESS;
129}
130
131

source code of boost/libs/serialization/test/test_tracking.cpp