1 /////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
2 // test_cyclic_ptrs.cpp
4 // (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .
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)
9 // should pass compilation and execution
11 #include <cstddef> // NULL
14 #include <cstdio> // remove
15 #include <boost/config.hpp>
16 #if defined(BOOST_NO_STDC_NAMESPACE)
22 #include "test_tools.hpp"
23 #include <boost/detail/no_exceptions_support.hpp>
25 #include <boost/serialization/nvp.hpp>
26 #include <boost/serialization/version.hpp>
27 #include <boost/serialization/base_object.hpp>
32 ///////////////////////////////////////////////////////
33 // class with a member which refers to itself
37 friend class boost::serialization::access;
38 template<class Archive>
39 void serialize(Archive &ar, const unsigned int /* file_version */){
40 ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(A);
41 ar & BOOST_SERIALIZATION_NVP(j);
44 bool operator==(const J &rhs) const;
50 BOOST_CLASS_VERSION(J, 6)
52 bool J::operator==(const J &rhs) const
54 return static_cast<const A &>(*this) == static_cast<const A &>(rhs);
57 ///////////////////////////////////////////////////////
58 // class with members that refer to each other
59 // this is an example of a class that, as written, cannot
60 // be serialized with this system. The problem is that the
61 // serialization of the first member - j1 , provokes serialization
62 // of those objects which it points to either directly or indirectly.
63 // When those objects are subsequently serialized, it is discovered
64 // that have already been serialized through pointers. This is
65 // detected by the system and an exception - pointer_conflict -
66 // is thrown. Permiting this to go undetected would result in the
67 // creation of multiple equal objects rather than the original
74 friend class boost::serialization::access;
75 template<class Archive>
78 const unsigned int /* file_version */
80 ar & BOOST_SERIALIZATION_NVP(j1);
81 ar & BOOST_SERIALIZATION_NVP(j2);
82 ar & BOOST_SERIALIZATION_NVP(j3);
85 bool operator==(const K &rhs) const;
90 : j1(&j2), j2(&j3), j3(&j1)
94 bool K::operator==(const K &rhs) const
106 int test_main( int /* argc */, char* /* argv */[] )
108 const char * testfile = boost::archive::tmpnam(NULL);
109 BOOST_REQUIRE(NULL != testfile);
112 boost::archive::archive_exception exception(
113 boost::archive::archive_exception::no_exception
116 test_ostream os(testfile, TEST_STREAM_FLAGS);
117 test_oarchive oa(os, TEST_ARCHIVE_FLAGS);
119 oa << BOOST_SERIALIZATION_NVP(k);
121 BOOST_CATCH (boost::archive::archive_exception ae){
126 exception.code == boost::archive::archive_exception::pointer_conflict
129 // if exception wasn't invoked
130 if(exception.code == boost::archive::archive_exception::no_exception){
131 // try to read the archive
132 test_istream is(testfile, TEST_STREAM_FLAGS);
133 test_iarchive ia(is, TEST_ARCHIVE_FLAGS);
134 exception = boost::archive::archive_exception(
135 boost::archive::archive_exception::no_exception
138 ia >> BOOST_SERIALIZATION_NVP(k);
140 BOOST_CATCH (boost::archive::archive_exception ae){
145 exception.code == boost::archive::archive_exception::pointer_conflict
148 std::remove(testfile);