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