#include <cstddef>
#include <fstream>
#include <cstdio>
#include <boost/config.hpp>
#if defined(BOOST_NO_STDC_NAMESPACE)
namespace std{
using ::remove;
}
#endif
#include "test_tools.hpp"
#include <boost/serialization/shared_ptr_132.hpp>
#include <boost/serialization/shared_ptr.hpp>
#include <boost/serialization/weak_ptr.hpp>
#include <boost/serialization/split_member.hpp>
#include <boost/preprocessor/stringize.hpp>
#include <boost/serialization/nvp.hpp>
#include <boost/serialization/export.hpp>
class A
{
private:
friend class boost::serialization::access;
int x;
template<class Archive>
void save(Archive & ar, const unsigned int ) const {
ar << BOOST_SERIALIZATION_NVP(x);
}
template<class Archive>
void load(Archive & ar, const unsigned int ) {
ar >> BOOST_SERIALIZATION_NVP(x);
}
BOOST_SERIALIZATION_SPLIT_MEMBER()
public:
static int count;
bool operator==(const A & rhs) const {
return x == rhs.x;
}
A(){++count;} virtual ~A(){--count;} };
BOOST_SERIALIZATION_SHARED_PTR(A)
class B : public A
{
private:
friend class boost::serialization::access;
template<class Archive>
void save(Archive & ar, const unsigned int )const {
ar << BOOST_SERIALIZATION_BASE_OBJECT_NVP(A);
}
template<class Archive>
void load(Archive & ar, const unsigned int ){
ar >> BOOST_SERIALIZATION_BASE_OBJECT_NVP(A);
}
BOOST_SERIALIZATION_SPLIT_MEMBER()
public:
static int count;
B() : A() {};
virtual ~B() {};
};
BOOST_SHARED_POINTER_EXPORT(B)
BOOST_SERIALIZATION_SHARED_PTR(B)
int A::count = 0;
template<class T>
void save(const char * testfile, const T & spa)
{
test_ostream os(testfile, TEST_STREAM_FLAGS);
test_oarchive oa(os, TEST_ARCHIVE_FLAGS);
oa << BOOST_SERIALIZATION_NVP(spa);
}
template<class T>
void load(const char * testfile, T & spa)
{
test_istream is(testfile, TEST_STREAM_FLAGS);
test_iarchive ia(is, TEST_ARCHIVE_FLAGS);
ia >> BOOST_SERIALIZATION_NVP(spa);
}
template<class T>
void save_and_load(const T & spa)
{
const char * testfile = boost::archive::tmpnam(NULL);
BOOST_REQUIRE(NULL != testfile);
save(testfile, spa);
boost::shared_ptr<A> spa1;
load(testfile, spa1);
BOOST_CHECK(
(spa.get() == NULL && spa1.get() == NULL)
|| * spa == * spa1
);
std::remove(testfile);
}
template<class T>
void save2(
const char * testfile,
const T & first,
const T & second
){
test_ostream os(testfile, TEST_STREAM_FLAGS);
test_oarchive oa(os, TEST_ARCHIVE_FLAGS);
oa << BOOST_SERIALIZATION_NVP(first);
oa << BOOST_SERIALIZATION_NVP(second);
}
template<class T>
void load2(
const char * testfile,
T & first,
T & second)
{
test_istream is(testfile, TEST_STREAM_FLAGS);
test_iarchive ia(is, TEST_ARCHIVE_FLAGS);
ia >> BOOST_SERIALIZATION_NVP(first);
ia >> BOOST_SERIALIZATION_NVP(second);
}
template<class T>
void save_and_load2(T & first, T & second)
{
const char * testfile = boost::archive::tmpnam(NULL);
BOOST_REQUIRE(NULL != testfile);
save2(testfile, first, second);
first.reset();
second.reset();
boost::shared_ptr<A> first1, second1;
load2(testfile, first1, second1);
BOOST_CHECK(first1 == second1);
std::remove(testfile);
}
template<class T>
void save3(
const char * testfile,
const T & first,
const T & second,
const T & third
){
test_ostream os(testfile, TEST_STREAM_FLAGS);
test_oarchive oa(os, TEST_ARCHIVE_FLAGS);
oa << BOOST_SERIALIZATION_NVP(third);
oa << BOOST_SERIALIZATION_NVP(first);
oa << BOOST_SERIALIZATION_NVP(second);
}
template<class T>
void load3(
const char * testfile,
T & first,
T & second,
T & third
){
test_istream is(testfile, TEST_STREAM_FLAGS);
test_iarchive ia(is, TEST_ARCHIVE_FLAGS);
ia >> BOOST_SERIALIZATION_NVP(third);
ia >> BOOST_SERIALIZATION_NVP(first);
ia >> BOOST_SERIALIZATION_NVP(second);
}
int test_main(int , char * [])
{
boost_132::shared_ptr<A> spa;
save_and_load(spa);
spa.reset();
spa = boost_132::shared_ptr<A>(new A);
save_and_load(spa);
spa = boost_132::shared_ptr<A>(new A);
boost_132::shared_ptr<A> spa1 = spa;
save_and_load2(spa, spa1);
spa = boost_132::shared_ptr<A>(new B);
save_and_load(spa);
spa1 = spa;
save_and_load2(spa, spa1);
return EXIT_SUCCESS;
}