• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1  /////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
2  // test_simple_class.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 <fstream>
12  
13  #include <cstdlib> // for rand()
14  #include <cstdio> // remove
15  #include <boost/config.hpp>
16  #if defined(BOOST_NO_STDC_NAMESPACE)
17  namespace std{
18      using ::rand;
19      using ::remove;
20  }
21  #endif
22  
23  #include "../test/test_tools.hpp"
24  #include <boost/preprocessor/stringize.hpp>
25  // #include <boost/preprocessor/cat.hpp>
26  // the following fails with (only!) gcc 3.4
27  // #include BOOST_PP_STRINGIZE(BOOST_PP_CAT(../test/,BOOST_ARCHIVE_TEST))
28  // just copy over the files from the test directory
29  #include BOOST_PP_STRINGIZE(BOOST_ARCHIVE_TEST)
30  
31  #include <boost/serialization/nvp.hpp>
32  #include <boost/serialization/binary_object.hpp>
33  
34  class A {
35      friend class boost::serialization::access;
36      char data[150];
37      // note: from an aesthetic perspective, I would much prefer to have this
38      // defined out of line.  Unfortunately, this trips a bug in the VC 6.0
39      // compiler. So hold our nose and put it her to permit running of tests.
40      template<class Archive>
serialize(Archive & ar,const unsigned int)41      void serialize(Archive & ar, const unsigned int /* file_version */){
42          ar & boost::serialization::make_nvp(
43              "data",
44              boost::serialization::make_binary_object(data, sizeof(data))
45          );
46      }
47  
48  public:
49      A();
50      bool operator==(const A & rhs) const;
51  };
52  
A()53  A::A(){
54      int i = sizeof(data);
55      while(i-- > 0)
56          data[i] = 0xff & std::rand();
57  }
58  
operator ==(const A & rhs) const59  bool A::operator==(const A & rhs) const {
60      int i = sizeof(data);
61      while(i-- > 0)
62          if(data[i] != rhs.data[i])
63              return false;
64      return true;
65  }
66  
test_main(int,char * [])67  int test_main( int /* argc */, char* /* argv */[] )
68  {
69      const char * testfile = boost::archive::tmpnam(NULL);
70      BOOST_REQUIRE(NULL != testfile);
71  
72      const A a;
73      A a1;
74      const int i = 12345;
75      int i1 = 34790;
76      {
77          test_ostream os(testfile, TEST_STREAM_FLAGS);
78          test_oarchive oa(os, TEST_ARCHIVE_FLAGS);
79          oa << BOOST_SERIALIZATION_NVP(a);
80          // note: add a little bit on the end of the archive to detect
81          // failure of text mode binary.
82          oa << BOOST_SERIALIZATION_NVP(i);
83      }
84      {
85          test_istream is(testfile, TEST_STREAM_FLAGS);
86          test_iarchive ia(is, TEST_ARCHIVE_FLAGS);
87          ia >> BOOST_SERIALIZATION_NVP(a1);
88          ia >> BOOST_SERIALIZATION_NVP(i1);
89      }
90      BOOST_CHECK(i == i1);
91      BOOST_CHECK(a == a1);
92      std::remove(testfile);
93      return EXIT_SUCCESS;
94  }
95  
96  // EOF
97