1 | /////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8 |
2 | // test_non_default_ctor2.cpp |
3 | |
4 | // (C) Copyright 2002 Martin Ecker. |
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 | // this tests complex usage of non-default constructor. Specifically |
12 | // the case where a constructor serializes a pointer member. |
13 | |
14 | #include <fstream> |
15 | |
16 | #include <boost/config.hpp> |
17 | |
18 | #include "test_tools.hpp" |
19 | |
20 | class IntValueHolder |
21 | { |
22 | public: |
23 | IntValueHolder() |
24 | : value(0) |
25 | {} |
26 | |
27 | IntValueHolder(int newvalue) |
28 | : value(newvalue) |
29 | {} |
30 | |
31 | int GetValue() const { return value; } |
32 | |
33 | private: |
34 | int value; |
35 | |
36 | friend class boost::serialization::access; |
37 | |
38 | template <class ArchiveT> |
39 | void serialize(ArchiveT& ar, const unsigned int /* file_version */) |
40 | { |
41 | ar & BOOST_SERIALIZATION_NVP(value); |
42 | } |
43 | }; |
44 | |
45 | class FloatValueHolder |
46 | { |
47 | public: |
48 | FloatValueHolder() |
49 | : value(0) |
50 | {} |
51 | |
52 | FloatValueHolder(float newvalue) |
53 | : value(newvalue) |
54 | {} |
55 | |
56 | float GetValue() const { return value; } |
57 | |
58 | private: |
59 | float value; |
60 | |
61 | friend class boost::serialization::access; |
62 | |
63 | template <class ArchiveT> |
64 | void serialize(ArchiveT& ar, const unsigned int /* file_version */) |
65 | { |
66 | ar & BOOST_SERIALIZATION_NVP(value); |
67 | } |
68 | }; |
69 | |
70 | class A |
71 | { |
72 | public: |
73 | A(const IntValueHolder& initialValue) |
74 | : value(initialValue), floatValue(new FloatValueHolder(10.0f)) |
75 | {} |
76 | |
77 | ~A() |
78 | { |
79 | delete floatValue; |
80 | } |
81 | |
82 | IntValueHolder value; |
83 | FloatValueHolder* floatValue; |
84 | |
85 | private: |
86 | friend class boost::serialization::access; |
87 | |
88 | template <class ArchiveT> |
89 | void serialize(ArchiveT& ar, const unsigned int /* file_version */) |
90 | { |
91 | ar & BOOST_SERIALIZATION_NVP(floatValue); |
92 | } |
93 | }; |
94 | |
95 | namespace boost { |
96 | namespace serialization { |
97 | |
98 | template <class ArchiveT> |
99 | void save_construct_data( |
100 | ArchiveT& archive, |
101 | const A* p, |
102 | const unsigned int /*version*/ |
103 | ){ |
104 | archive & boost::serialization::make_nvp(n: "initialValue" , v: p->value); |
105 | } |
106 | |
107 | template <class ArchiveT> |
108 | void load_construct_data( |
109 | ArchiveT& archive, |
110 | A* p, |
111 | const unsigned int /*version*/ |
112 | ){ |
113 | IntValueHolder initialValue; |
114 | archive & boost::serialization::make_nvp(n: "initialValue" , v&: initialValue); |
115 | |
116 | ::new (p) A(initialValue); |
117 | } |
118 | |
119 | } // serialization |
120 | } // namespace boost |
121 | |
122 | int test_main( int /* argc */, char* /* argv */[] ) |
123 | { |
124 | const char * testfile = boost::archive::tmpnam(NULL); |
125 | BOOST_REQUIRE(NULL != testfile); |
126 | A* a = new A(5); |
127 | |
128 | { |
129 | test_ostream os(testfile, TEST_STREAM_FLAGS); |
130 | test_oarchive oa(os, TEST_ARCHIVE_FLAGS); |
131 | oa << BOOST_SERIALIZATION_NVP(a); |
132 | } |
133 | |
134 | A* a_new; |
135 | |
136 | { |
137 | test_istream is(testfile, TEST_STREAM_FLAGS); |
138 | test_iarchive ia(is, TEST_ARCHIVE_FLAGS); |
139 | ia >> BOOST_SERIALIZATION_NVP(a_new); |
140 | } |
141 | delete a; |
142 | delete a_new; |
143 | return EXIT_SUCCESS; |
144 | } |
145 | |