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