Files
serialization/test/test_class_info_load.cpp
Robert Ramey c7761f2335 improvements in serialization library
a) fixed up CMake Build so it does everything the B2 Build does.  They give the same results.
b) made adjustments so that any code which depends upon serialization depends only upon files in the serialization folder/namespace.  This should permit one to add serialization to his library without ending up importing the whole damn world.
2020-06-19 00:04:31 -07:00

92 lines
2.8 KiB
C++

/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
// test_class_info_load.cpp: test implementation level trait
// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .
// 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 implementation level "object_class_info"
// should pass compilation and execution
#include <string>
#include <fstream>
#include <boost/archive/tmpdir.hpp>
#include <boost/preprocessor/stringize.hpp>
#include "test_tools.hpp"
#include <boost/static_assert.hpp>
#include <boost/serialization/level.hpp>
#include <boost/serialization/tracking.hpp>
#include <boost/serialization/nvp.hpp>
class A
{
friend class boost::serialization::access;
template<class Archive>
void serialize(Archive & /*ar*/, const unsigned int file_version){
// class that don't save class info always have a version number of 0
BOOST_CHECK(file_version == 0);
BOOST_STATIC_ASSERT(0 == ::boost::serialization::version<A>::value);
++count;
}
public:
unsigned int count;
A() : count(0) {}
};
BOOST_CLASS_IMPLEMENTATION(A, ::boost::serialization::object_serializable)
BOOST_CLASS_TRACKING(A, ::boost::serialization::track_never)
// second case : serialize WITH class information
class B
{
friend class boost::serialization::access;
template<class Archive>
void serialize(Archive & /*ar*/, const unsigned int file_version){
// verify at execution that the version number corresponds to the saved
// one
BOOST_CHECK(file_version == 2);
++count;
}
public:
unsigned int count;
B() : count(0) {}
};
BOOST_CLASS_IMPLEMENTATION(B, ::boost::serialization::object_class_info)
BOOST_CLASS_TRACKING(B, ::boost::serialization::track_never)
BOOST_CLASS_VERSION(B, 4)
void in(const char *testfile, A & a, B & b)
{
test_istream is(testfile, TEST_STREAM_FLAGS);
test_iarchive ia(is, TEST_ARCHIVE_FLAGS);
ia >> BOOST_SERIALIZATION_NVP(a);
ia >> BOOST_SERIALIZATION_NVP(a);
BOOST_CHECK(a.count == 2); // no tracking => redundant loads
ia >> BOOST_SERIALIZATION_NVP(b);
ia >> BOOST_SERIALIZATION_NVP(b);
// note: archive was saved with tracking so that is what determines
// whether tracking is perform on load - regardless of the latest
// tracking setting.
BOOST_CHECK(b.count == 1);
}
int
test_main( int /* argc */, char* /* argv */[] )
{
A a;
B b;
std::string filename;
filename += boost::archive::tmpdir();
filename += '/';
filename += BOOST_PP_STRINGIZE(testfile_);
filename += BOOST_PP_STRINGIZE(BOOST_ARCHIVE_TEST);
in(filename.c_str(), a, b);
return EXIT_SUCCESS;
}
// EOF