123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125 |
- /////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
- // test_multiple_inheritance.cpp
- // (C) Copyright 2009 Robert Ramey.
- // Use, modification and distribution is subject to the Boost Software
- // License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
- // http://www.boost.org/LICENSE_1_0.txt)
- // test of serialization library for multiple inheritence situations
- #include <cassert>
- #include <fstream>
- #include <boost/config.hpp>
- #include <cstdio> // remove
- #if defined(BOOST_NO_STDC_NAMESPACE)
- namespace std{
- using ::remove;
- }
- #endif
- #include "test_tools.hpp"
- #include <boost/serialization/access.hpp>
- #include <boost/serialization/base_object.hpp>
- #include <boost/serialization/nvp.hpp>
- #include <boost/serialization/export.hpp>
- struct Base1 {
- int m_x;
- Base1(){}
- Base1(int x) : m_x(1 + x) {}
- virtual ~Base1() {}
- bool operator==(Base1 & rhs) const {
- return m_x == rhs.m_x;
- }
- // serialize
- friend class boost::serialization::access;
- template<class Archive>
- void serialize(Archive & ar, const unsigned int /* file_version */) {
- ar & BOOST_SERIALIZATION_NVP(m_x);
- }
- };
- //BOOST_CLASS_EXPORT(Base1)
- struct Base2 {
- int m_x;
- Base2(){}
- Base2(int x) : m_x(2 + x) {}
- virtual ~Base2() {}
- bool operator==(Base2 & rhs) const {
- return m_x == rhs.m_x;
- }
- // serialize
- friend class boost::serialization::access;
- template<class Archive>
- void serialize(Archive & ar, const unsigned int /* file_version */) {
- ar & BOOST_SERIALIZATION_NVP(m_x);
- }
- };
- //BOOST_CLASS_EXPORT(Base2)
- struct Sub :
- public Base1,
- public Base2
- {
- int m_x;
- Sub(){}
- Sub(int x) :
- Base1(x),
- Base2(x),
- m_x(x)
- {}
- bool operator==(Sub & rhs) const {
- if(! Base2::operator==(rhs))
- return false;
- if(! Base1::operator==(rhs))
- return false;
- return m_x == rhs.m_x;
- }
- virtual ~Sub() {}
- // serialize
- friend class boost::serialization::access;
- template<class Archive>
- void serialize(Archive &ar, const unsigned int /* file_version */)
- {
- ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(Base1);
- ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(Base2);
- ar & BOOST_SERIALIZATION_NVP(m_x);
- }
- };
- BOOST_CLASS_EXPORT(Sub)
- int
- test_main( int /* argc */, char* /* argv */[] )
- {
- const char * testfile = boost::archive::tmpnam(NULL);
- BOOST_REQUIRE(NULL != testfile);
- Base2 * pb2;
- {
- // serialize
- pb2 = new Sub(2);
- test_ostream ofs(testfile);
- test_oarchive oa(ofs);
- oa << boost::serialization::make_nvp("Base2", pb2);
- }
- Base2 * pb2_1;
- {
- // de-serialize
- test_istream ifs(testfile);
- test_iarchive ia(ifs);
- ia >> boost::serialization::make_nvp("Base2", pb2_1);
- }
- Sub *s1 = dynamic_cast<Sub *>(pb2);
- BOOST_CHECK(0 != s1);
- Sub *s2 = dynamic_cast<Sub *>(pb2_1);
- BOOST_CHECK(0 != s2);
- BOOST_CHECK(*s1 == *s2);
- return EXIT_SUCCESS;
- }
|