blob: 7adbfe02f8f64588ebffc6d8bd37054c139d2a02 [file] [log] [blame]
Brian Silverman88678712018-08-04 23:56:48 -07001#ifndef BOOST_SERIALIZATION_TEST_A_HPP
2#define BOOST_SERIALIZATION_TEST_A_HPP
3
4// MS compatible compilers support #pragma once
5#if defined(_MSC_VER)
6# pragma once
7#endif
8
9/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
10// A.hpp simple class test
11
12// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .
13// Use, modification and distribution is subject to the Boost Software
14// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
15// http://www.boost.org/LICENSE_1_0.txt)
16
17// See http://www.boost.org for updates, documentation, and revision history.
18
19#include <cassert>
20#include <cstdlib> // for rand()
21#include <cmath> // for fabs()
22#include <cstddef> // size_t
23#include <boost/math/special_functions/next.hpp>
24
25#include <boost/config.hpp>
26#if defined(BOOST_NO_STDC_NAMESPACE)
27namespace std{
28 using ::rand;
29 using ::fabs;
30 using ::size_t;
31}
32#endif
33
34//#include <boost/test/test_exec_monitor.hpp>
35#include <boost/limits.hpp>
36#include <boost/cstdint.hpp>
37
38#include <boost/detail/workaround.hpp>
39#if BOOST_WORKAROUND(BOOST_DINKUMWARE_STDLIB, == 1)
40#include <boost/archive/dinkumware.hpp>
41#endif
42
43#include <boost/serialization/nvp.hpp>
44#include <boost/serialization/string.hpp>
45#include <boost/serialization/access.hpp>
46
47class A
48{
49private:
50 friend class boost::serialization::access;
51 // note: from an aesthetic perspective, I would much prefer to have this
52 // defined out of line. Unfortunately, this trips a bug in the VC 6.0
53 // compiler. So hold our nose and put it her to permit running of tests.
54 template<class Archive>
55 void serialize(
56 Archive &ar,
57 const unsigned int /* file_version */
58 ){
59 ar & BOOST_SERIALIZATION_NVP(b);
60 #ifndef BOOST_NO_INT64_T
61 ar & BOOST_SERIALIZATION_NVP(f);
62 ar & BOOST_SERIALIZATION_NVP(g);
63 #endif
64 #if BOOST_WORKAROUND(__BORLANDC__, <= 0x551 )
65 int i;
66 if(BOOST_DEDUCED_TYPENAME Archive::is_saving::value){
67 i = l;
68 ar & BOOST_SERIALIZATION_NVP(i);
69 }
70 else{
71 ar & BOOST_SERIALIZATION_NVP(i);
72 l = i;
73 }
74 #else
75 ar & BOOST_SERIALIZATION_NVP(l);
76 #endif
77 ar & BOOST_SERIALIZATION_NVP(m);
78 ar & BOOST_SERIALIZATION_NVP(n);
79 ar & BOOST_SERIALIZATION_NVP(o);
80 ar & BOOST_SERIALIZATION_NVP(p);
81 ar & BOOST_SERIALIZATION_NVP(q);
82 #ifndef BOOST_NO_CWCHAR
83 ar & BOOST_SERIALIZATION_NVP(r);
84 #endif
85 ar & BOOST_SERIALIZATION_NVP(c);
86 ar & BOOST_SERIALIZATION_NVP(s);
87 ar & BOOST_SERIALIZATION_NVP(t);
88 ar & BOOST_SERIALIZATION_NVP(u);
89 ar & BOOST_SERIALIZATION_NVP(v);
90 ar & BOOST_SERIALIZATION_NVP(w);
91 ar & BOOST_SERIALIZATION_NVP(x);
92 ar & BOOST_SERIALIZATION_NVP(y);
93 #ifndef BOOST_NO_STD_WSTRING
94 ar & BOOST_SERIALIZATION_NVP(z);
95 #endif
96 }
97 bool b;
98 #ifndef BOOST_NO_INT64_T
99 boost::int64_t f;
100 boost::uint64_t g;
101 #endif
102 enum h {
103 i = 0,
104 j,
105 k
106 } l;
107 std::size_t m;
108 signed long n;
109 unsigned long o;
110 signed short p;
111 unsigned short q;
112 #ifndef BOOST_NO_CWCHAR
113 wchar_t r;
114 #endif
115 char c;
116 signed char s;
117 unsigned char t;
118 signed int u;
119 unsigned int v;
120 float w;
121 double x;
122 std::string y;
123 #ifndef BOOST_NO_STD_WSTRING
124 std::wstring z;
125 #endif
126public:
127 A();
128 bool operator==(const A &rhs) const;
129 bool operator!=(const A &rhs) const;
130 bool operator<(const A &rhs) const; // used by less
131 // hash function for class A
132 operator std::size_t () const;
133 friend std::ostream & operator<<(std::ostream & os, A const & a);
134 friend std::istream & operator>>(std::istream & is, A & a);
135};
136
137//BOOST_TEST_DONT_PRINT_LOG_VALUE(A);
138
139template<class S>
140void randomize(S &x)
141{
142 assert(0 == x.size());
143 for(;;){
144 unsigned int i = std::rand() % 27;
145 if(0 == i)
146 break;
147 x += static_cast<BOOST_DEDUCED_TYPENAME S::value_type>('a' - 1 + i);
148 }
149}
150
151template<class T>
152void accumulate(std::size_t & s, const T & t){
153 const char * tptr = (const char *)(& t);
154 unsigned int count = sizeof(t);
155 while(count-- > 0){
156 s += *tptr++;
157 }
158}
159
160A::operator std::size_t () const {
161 std::size_t retval = 0;
162 accumulate(retval, b);
163 #ifndef BOOST_NO_INT64_T
164 accumulate(retval, f);
165 accumulate(retval, g);
166 #endif
167 accumulate(retval, l);
168 accumulate(retval, m);
169 accumulate(retval, n);
170 accumulate(retval, o);
171 accumulate(retval, p);
172 accumulate(retval, q);
173 #ifndef BOOST_NO_CWCHAR
174 accumulate(retval, r);
175 #endif
176 accumulate(retval, c);
177 accumulate(retval, s);
178 accumulate(retval, t);
179 accumulate(retval, u);
180 accumulate(retval, v);
181 return retval;
182}
183
184inline A::A() :
185 b(true),
186 #ifndef BOOST_NO_INT64_T
187 f(std::rand() * std::rand()),
188 g(std::rand() * std::rand()),
189 #endif
190 l(static_cast<enum h>(std::rand() % 3)),
191 m(std::rand()),
192 n(std::rand()),
193 o(std::rand()),
194 p(std::rand()),
195 q(std::rand()),
196 #ifndef BOOST_NO_CWCHAR
197 r(std::rand()),
198 #endif
199 c(std::rand()),
200 s(std::rand()),
201 t(std::rand()),
202 u(std::rand()),
203 v(std::rand()),
204 w((float)std::rand()),
205 x((double)std::rand())
206{
207 randomize(y);
208 #ifndef BOOST_NO_STD_WSTRING
209 randomize(z);
210 #endif
211}
212
213inline bool A::operator==(const A &rhs) const
214{
215 if(b != rhs.b)
216 return false;
217 if(l != rhs.l)
218 return false;
219 #ifndef BOOST_NO_INT64_T
220 if(f != rhs.f)
221 return false;
222 if(g != rhs.g)
223 return false;
224 #endif
225 if(m != rhs.m)
226 return false;
227 if(n != rhs.n)
228 return false;
229 if(o != rhs.o)
230 return false;
231 if(p != rhs.p)
232 return false;
233 if(q != rhs.q)
234 return false;
235 #ifndef BOOST_NO_CWCHAR
236 if(r != rhs.r)
237 return false;
238 #endif
239 if(c != rhs.c)
240 return false;
241 if(s != rhs.s)
242 return false;
243 if(t != rhs.t)
244 return false;
245 if(u != rhs.u)
246 return false;
247 if(v != rhs.v)
248 return false;
249 if(std::abs( boost::math::float_distance(w, rhs.w)) > 1)
250 return false;
251 if(std::abs( boost::math::float_distance(x, rhs.x)) > 1)
252 return false;
253 if(0 != y.compare(rhs.y))
254 return false;
255 #ifndef BOOST_NO_STD_WSTRING
256 if(0 != z.compare(rhs.z))
257 return false;
258 #endif
259 return true;
260}
261
262inline bool A::operator!=(const A &rhs) const
263{
264 return ! (*this == rhs);
265}
266
267inline bool A::operator<(const A &rhs) const
268{
269 if(b != rhs.b)
270 return b < rhs.b;
271 #ifndef BOOST_NO_INT64_T
272 if(f != rhs.f)
273 return f < rhs.f;
274 if(g != rhs.g)
275 return g < rhs.g;
276 #endif
277 if(l != rhs.l )
278 return l < rhs.l;
279 if(m != rhs.m )
280 return m < rhs.m;
281 if(n != rhs.n )
282 return n < rhs.n;
283 if(o != rhs.o )
284 return o < rhs.o;
285 if(p != rhs.p )
286 return p < rhs.p;
287 if(q != rhs.q )
288 return q < rhs.q;
289 #ifndef BOOST_NO_CWCHAR
290 if(r != rhs.r )
291 return r < rhs.r;
292 #endif
293 if(c != rhs.c )
294 return c < rhs.c;
295 if(s != rhs.s )
296 return s < rhs.s;
297 if(t != rhs.t )
298 return t < rhs.t;
299 if(u != rhs.u )
300 return u < rhs.u;
301 if(v != rhs.v )
302 return v < rhs.v;
303 if(w != rhs.w )
304 return w < rhs.w;
305 if(x != rhs.x )
306 return x < rhs.x;
307 int i = y.compare(rhs.y);
308 if(i != 0 )
309 return i < 0;
310 #ifndef BOOST_NO_STD_WSTRING
311 int j = z.compare(rhs.z);
312 if(j != 0 )
313 return j < 0;
314 #endif
315 return false;
316}
317
318#endif // BOOST_SERIALIZATION_TEST_A_HPP