]> git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/serialization/test/test_tracking.cpp
add subtree-ish sources for 12.0.3
[ceph.git] / ceph / src / boost / libs / serialization / test / test_tracking.cpp
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
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
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
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