1/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
2// test_split.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 <cstdio> // remove
13#include <fstream>
14
15#include <boost/config.hpp>
16#if defined(BOOST_NO_STDC_NAMESPACE)
17namespace std{
18 using ::remove;
19}
20#endif
21
22#include "test_tools.hpp"
23
24#include <boost/serialization/split_member.hpp>
25#include <boost/serialization/split_free.hpp>
26
27class A
28{
29 friend class boost::serialization::access;
30 template<class Archive>
31 void save(
32 Archive & /* ar */,
33 const unsigned int /* file_version */
34 ) const {
35 ++(const_cast<A &>(*this).count);
36 }
37 template<class Archive>
38 void load(
39 Archive & /* ar */,
40 const unsigned int /* file_version */
41 ){
42 --count;
43 }
44 BOOST_SERIALIZATION_SPLIT_MEMBER()
45 int count;
46public:
47 A() : count(0) {}
48 ~A() {
49 BOOST_CHECK(0 == count);
50 }
51};
52
53class B
54{
55 friend class boost::serialization::access;
56 template<class Archive>
57 void save(
58 Archive & /* ar */,
59 const unsigned int /* file_version */
60 ) const {
61 ++(const_cast<B &>(*this).count);
62 }
63 template<class Archive>
64 void load(
65 Archive & /* ar */,
66 const unsigned int /* file_version */
67 ){
68 --count;
69 }
70 int count;
71public:
72 B() : count(0) {}
73 ~B() {
74 BOOST_CHECK(0 == count);
75 }
76};
77
78// function specializations must be defined in the appropriate
79// namespace - boost::serialization
80namespace boost {
81namespace serialization {
82
83template<class Archive>
84void serialize(
85 Archive & ar,
86 B & b,
87 const unsigned int file_version
88){
89 boost::serialization::split_member(ar, b, file_version);
90}
91
92} // serialization
93} // namespace boost
94
95class C
96{
97public:
98 int count;
99 C() : count(0) {}
100 ~C() {
101 BOOST_CHECK(0 == count);
102 }
103};
104
105namespace boost {
106namespace serialization {
107
108template<class Archive>
109void save(
110 Archive & /* ar */,
111 const C & c,
112 const unsigned int /* file_version */
113){
114 ++(const_cast<C &>(c).count);
115}
116
117template<class Archive>
118void load(
119 Archive & /* ar */,
120 C & c,
121 const unsigned int /* file_version */
122){
123 --c.count;
124}
125
126} // serialization
127} // namespace boost
128
129BOOST_SERIALIZATION_SPLIT_FREE(C)
130
131void out(const char *testfile, A & a, B & b, C & c)
132{
133 test_ostream os(testfile, TEST_STREAM_FLAGS);
134 test_oarchive oa(os, TEST_ARCHIVE_FLAGS);
135 oa << BOOST_SERIALIZATION_NVP(a);
136 oa << BOOST_SERIALIZATION_NVP(b);
137 oa << BOOST_SERIALIZATION_NVP(c);
138}
139
140void in(const char *testfile, A & a, B & b, C & c)
141{
142 test_istream is(testfile, TEST_STREAM_FLAGS);
143 test_iarchive ia(is, TEST_ARCHIVE_FLAGS);
144 ia >> BOOST_SERIALIZATION_NVP(a);
145 ia >> BOOST_SERIALIZATION_NVP(b);
146 ia >> BOOST_SERIALIZATION_NVP(c);
147}
148
149int
150test_main( int /* argc */, char* /* argv */[] )
151{
152 const char * testfile = boost::archive::tmpnam(NULL);
153 BOOST_REQUIRE(NULL != testfile);
154
155 A a;
156 B b;
157 C c;
158
159 out(testfile, a, b, c);
160 in(testfile, a, b, c);
161 std::remove(filename: testfile);
162 return EXIT_SUCCESS;
163}
164
165// EOF
166

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