• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1  /////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
2  // test_multiple_inheritance.cpp
3  
4  // (C) Copyright 2009 Robert Ramey.
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  // test of serialization library for multiple inheritence situations
10  
11  #include <cassert>
12  #include <fstream>
13  
14  #include <boost/config.hpp>
15  #include <cstdio> // remove
16  #if defined(BOOST_NO_STDC_NAMESPACE)
17  namespace std{
18      using ::remove;
19  }
20  #endif
21  
22  #include "test_tools.hpp"
23  
24  #include <boost/serialization/access.hpp>
25  #include <boost/serialization/base_object.hpp>
26  #include <boost/serialization/nvp.hpp>
27  #include <boost/serialization/export.hpp>
28  
29  struct Base1 {
30      int m_x;
Base1Base131      Base1(){}
Base1Base132      Base1(int x) : m_x(1 + x) {}
~Base1Base133      virtual ~Base1() {}
operator ==Base134      bool operator==(Base1 & rhs) const {
35          return m_x == rhs.m_x;
36      }
37      // serialize
38      friend class boost::serialization::access;
39      template<class Archive>
serializeBase140      void serialize(Archive & ar, const unsigned int /* file_version */) {
41          ar & BOOST_SERIALIZATION_NVP(m_x);
42      }
43  };
44  
45  //BOOST_CLASS_EXPORT(Base1)
46  
47  struct Base2 {
48      int m_x;
Base2Base249      Base2(){}
Base2Base250      Base2(int x) : m_x(2 + x) {}
~Base2Base251      virtual ~Base2() {}
operator ==Base252      bool operator==(Base2 & rhs) const {
53          return m_x == rhs.m_x;
54      }
55      // serialize
56      friend class boost::serialization::access;
57      template<class Archive>
serializeBase258      void serialize(Archive & ar, const unsigned int /* file_version */) {
59          ar & BOOST_SERIALIZATION_NVP(m_x);
60      }
61  };
62  
63  //BOOST_CLASS_EXPORT(Base2)
64  
65  struct Sub :
66      public Base1,
67      public Base2
68  {
69      int m_x;
SubSub70      Sub(){}
SubSub71      Sub(int x) :
72          Base1(x),
73          Base2(x),
74          m_x(x)
75      {}
operator ==Sub76      bool operator==(Sub & rhs) const {
77          if(! Base2::operator==(rhs))
78              return false;
79          if(! Base1::operator==(rhs))
80              return false;
81          return m_x == rhs.m_x;
82      }
~SubSub83      virtual ~Sub() {}
84  
85      // serialize
86      friend class boost::serialization::access;
87      template<class Archive>
serializeSub88      void serialize(Archive &ar, const unsigned int /* file_version */)
89      {
90          ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(Base1);
91          ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(Base2);
92          ar & BOOST_SERIALIZATION_NVP(m_x);
93      }
94  };
95  
BOOST_CLASS_EXPORT(Sub)96  BOOST_CLASS_EXPORT(Sub)
97  
98  int
99  test_main( int /* argc */, char* /* argv */[] )
100  {
101      const char * testfile = boost::archive::tmpnam(NULL);
102      BOOST_REQUIRE(NULL != testfile);
103      Base2 * pb2;
104      {
105          // serialize
106          pb2 = new Sub(2);
107  
108          test_ostream ofs(testfile);
109          test_oarchive oa(ofs);
110          oa << boost::serialization::make_nvp("Base2", pb2);
111      }
112      Base2 * pb2_1;
113      {
114          // de-serialize
115          test_istream ifs(testfile);
116          test_iarchive ia(ifs);
117          ia >> boost::serialization::make_nvp("Base2", pb2_1);
118      }
119      Sub *s1 = dynamic_cast<Sub *>(pb2);
120      BOOST_CHECK(0 != s1);
121      Sub *s2 = dynamic_cast<Sub *>(pb2_1);
122      BOOST_CHECK(0 != s2);
123      BOOST_CHECK(*s1 == *s2);
124      return EXIT_SUCCESS;
125  }
126