summaryrefslogtreecommitdiff
path: root/src/third_party/boost-1.56.0/libs/serialization/src/basic_iarchive.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/third_party/boost-1.56.0/libs/serialization/src/basic_iarchive.cpp')
-rw-r--r--src/third_party/boost-1.56.0/libs/serialization/src/basic_iarchive.cpp596
1 files changed, 0 insertions, 596 deletions
diff --git a/src/third_party/boost-1.56.0/libs/serialization/src/basic_iarchive.cpp b/src/third_party/boost-1.56.0/libs/serialization/src/basic_iarchive.cpp
deleted file mode 100644
index 3a246900692..00000000000
--- a/src/third_party/boost-1.56.0/libs/serialization/src/basic_iarchive.cpp
+++ /dev/null
@@ -1,596 +0,0 @@
-/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
-// basic_archive.cpp:
-
-// (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)
-
-// See http://www.boost.org for updates, documentation, and revision history.
-
-#include <boost/config.hpp> // msvc 6.0 needs this to suppress warnings
-
-#include <boost/assert.hpp>
-#include <set>
-#include <list>
-#include <vector>
-#include <cstddef> // size_t, NULL
-
-#include <boost/config.hpp>
-#if defined(BOOST_NO_STDC_NAMESPACE)
-namespace std{
- using ::size_t;
-} // namespace std
-#endif
-
-#include <boost/integer_traits.hpp>
-#include <boost/serialization/state_saver.hpp>
-#include <boost/serialization/throw_exception.hpp>
-#include <boost/serialization/tracking.hpp>
-
-#define BOOST_ARCHIVE_SOURCE
-// include this to prevent linker errors when the
-// same modules are marked export and import.
-#define BOOST_SERIALIZATION_SOURCE
-
-#include <boost/archive/archive_exception.hpp>
-
-#include <boost/archive/detail/decl.hpp>
-#include <boost/archive/basic_archive.hpp>
-#include <boost/archive/detail/basic_iserializer.hpp>
-#include <boost/archive/detail/basic_pointer_iserializer.hpp>
-#include <boost/archive/detail/basic_iarchive.hpp>
-
-#include <boost/archive/detail/auto_link_archive.hpp>
-
-using namespace boost::serialization;
-
-namespace boost {
-namespace archive {
-namespace detail {
-
-class basic_iarchive_impl {
- friend class basic_iarchive;
- library_version_type m_archive_library_version;
- unsigned int m_flags;
-
- //////////////////////////////////////////////////////////////////////
- // information about each serialized object loaded
- // indexed on object_id
- struct aobject
- {
- void * address;
- bool loaded_as_pointer;
- class_id_type class_id;
- aobject(
- void *a,
- class_id_type class_id_
- ) :
- address(a),
- loaded_as_pointer(false),
- class_id(class_id_)
- {}
- aobject() :
- address(NULL),
- loaded_as_pointer(false),
- class_id(-2)
- {}
- };
- typedef std::vector<aobject> object_id_vector_type;
- object_id_vector_type object_id_vector;
-
- //////////////////////////////////////////////////////////////////////
- // used to implement the reset_object_address operation.
- struct moveable_objects {
- object_id_type start;
- object_id_type end;
- object_id_type recent;
- bool is_pointer;
- moveable_objects() :
- start(0),
- end(0),
- recent(0),
- is_pointer(false)
- {}
- } m_moveable_objects;
-
- void reset_object_address(
- const void * new_address,
- const void *old_address
- );
-
- //////////////////////////////////////////////////////////////////////
- // used by load object to look up class id given basic_serializer
- struct cobject_type
- {
- const basic_iserializer * m_bis;
- const class_id_type m_class_id;
- cobject_type(
- std::size_t class_id,
- const basic_iserializer & bis
- ) :
- m_bis(& bis),
- m_class_id(class_id)
- {}
- cobject_type(const cobject_type & rhs) :
- m_bis(rhs.m_bis),
- m_class_id(rhs.m_class_id)
- {}
- // the following cannot be defined because of the const
- // member. This will generate a link error if an attempt
- // is made to assign. This should never be necessary
- cobject_type & operator=(const cobject_type & rhs);
- bool operator<(const cobject_type &rhs) const
- {
- return *m_bis < *(rhs.m_bis);
- }
- };
- typedef std::set<cobject_type> cobject_info_set_type;
- cobject_info_set_type cobject_info_set;
-
- //////////////////////////////////////////////////////////////////////
- // information about each serialized class indexed on class_id
- class cobject_id
- {
- public:
- cobject_id & operator=(const cobject_id & rhs){
- bis_ptr = rhs.bis_ptr;
- bpis_ptr = rhs.bpis_ptr;
- file_version = rhs.file_version;
- tracking_level = rhs.tracking_level;
- initialized = rhs.initialized;
- return *this;
- }
- const basic_iserializer * bis_ptr;
- const basic_pointer_iserializer * bpis_ptr;
- version_type file_version;
- tracking_type tracking_level;
- bool initialized;
-
- cobject_id(const basic_iserializer & bis_) :
- bis_ptr(& bis_),
- bpis_ptr(NULL),
- file_version(0),
- tracking_level(track_never),
- initialized(false)
- {}
- cobject_id(const cobject_id &rhs):
- bis_ptr(rhs.bis_ptr),
- bpis_ptr(rhs.bpis_ptr),
- file_version(rhs.file_version),
- tracking_level(rhs.tracking_level),
- initialized(rhs.initialized)
- {}
- };
- typedef std::vector<cobject_id> cobject_id_vector_type;
- cobject_id_vector_type cobject_id_vector;
-
- //////////////////////////////////////////////////////////////////////
- // address of the most recent object serialized as a poiner
- // whose data itself is now pending serialization
- struct pending {
- void * object;
- const basic_iserializer * bis;
- version_type version;
- pending() :
- object(NULL),
- bis(NULL),
- version(0)
- {}
- } m_pending;
-
- basic_iarchive_impl(unsigned int flags) :
- m_archive_library_version(BOOST_ARCHIVE_VERSION()),
- m_flags(flags)
- {}
- ~basic_iarchive_impl(){}
- void set_library_version(library_version_type archive_library_version){
- m_archive_library_version = archive_library_version;
- }
- bool
- track(
- basic_iarchive & ar,
- void * & t
- );
- void
- load_preamble(
- basic_iarchive & ar,
- cobject_id & co
- );
- class_id_type register_type(
- const basic_iserializer & bis
- );
-
- // redirect through virtual functions to load functions for this archive
- template<class T>
- void load(basic_iarchive & ar, T & t){
- ar.vload(t);
- }
-
-//public:
- void
- next_object_pointer(void * t){
- m_pending.object = t;
- }
- void delete_created_pointers();
- class_id_type register_type(
- const basic_pointer_iserializer & bpis
- );
- void load_object(
- basic_iarchive & ar,
- void * t,
- const basic_iserializer & bis
- );
- const basic_pointer_iserializer * load_pointer(
- basic_iarchive & ar,
- void * & t,
- const basic_pointer_iserializer * bpis,
- const basic_pointer_iserializer * (*finder)(
- const boost::serialization::extended_type_info & type
- )
-
- );
-};
-
-inline void
-basic_iarchive_impl::reset_object_address(
- void const * const new_address,
- void const * const old_address
-){
- if(m_moveable_objects.is_pointer)
- return;
-
- // this code handles a couple of situations.
- // a) where reset_object_address is applied to an untracked object.
- // In such a case the call is really superfluous and its really an
- // an error. But we don't have access to the types here so we can't
- // know that. However, this code will effectively turn this situation
- // into a no-op and every thing will work fine - albeat with a small
- // execution time penalty.
- // b) where the call to reset_object_address doesn't immediatly follow
- // the << operator to which it corresponds. This would be a bad idea
- // but the code may work anyway. Naturally, a bad practice on the part
- // of the programmer but we can't detect it - as above. So maybe we
- // can save a few more people from themselves as above.
- object_id_type i;
- for(i = m_moveable_objects.recent; i < m_moveable_objects.end; ++i){
- if(old_address == object_id_vector[i].address)
- break;
- }
- for(; i < m_moveable_objects.end; ++i){
- void const * const this_address = object_id_vector[i].address;
- // calculate displacement from this level
- // warning - pointer arithmetic on void * is in herently non-portable
- // but expected to work on all platforms in current usage
- if(this_address > old_address){
- std::size_t member_displacement
- = reinterpret_cast<std::size_t>(this_address)
- - reinterpret_cast<std::size_t>(old_address);
- object_id_vector[i].address = reinterpret_cast<void *>(
- reinterpret_cast<std::size_t>(new_address) + member_displacement
- );
- }
- else{
- std::size_t member_displacement
- = reinterpret_cast<std::size_t>(old_address)
- - reinterpret_cast<std::size_t>(this_address);
- object_id_vector[i].address = reinterpret_cast<void *>(
- reinterpret_cast<std::size_t>(new_address) - member_displacement
- );
- }
- }
-}
-
-inline void
-basic_iarchive_impl::delete_created_pointers()
-{
- object_id_vector_type::iterator i;
- for(
- i = object_id_vector.begin();
- i != object_id_vector.end();
- ++i
- ){
- if(i->loaded_as_pointer){
- // borland complains without this minor hack
- const int j = i->class_id;
- const cobject_id & co = cobject_id_vector[j];
- //const cobject_id & co = cobject_id_vector[i->class_id];
- // with the appropriate input serializer,
- // delete the indicated object
- co.bis_ptr->destroy(i->address);
- }
- }
-}
-
-inline class_id_type
-basic_iarchive_impl::register_type(
- const basic_iserializer & bis
-){
- class_id_type cid(cobject_info_set.size());
- cobject_type co(cid, bis);
- std::pair<cobject_info_set_type::const_iterator, bool>
- result = cobject_info_set.insert(co);
-
- if(result.second){
- cobject_id_vector.push_back(cobject_id(bis));
- BOOST_ASSERT(cobject_info_set.size() == cobject_id_vector.size());
- }
- cid = result.first->m_class_id;
- // borland complains without this minor hack
- const int tid = cid;
- cobject_id & coid = cobject_id_vector[tid];
- coid.bpis_ptr = bis.get_bpis_ptr();
- return cid;
-}
-
-void
-basic_iarchive_impl::load_preamble(
- basic_iarchive & ar,
- cobject_id & co
-){
- if(! co.initialized){
- if(co.bis_ptr->class_info()){
- class_id_optional_type cid(class_id_type(0));
- load(ar, cid); // to be thrown away
- load(ar, co.tracking_level);
- load(ar, co.file_version);
- }
- else{
- // override tracking with indicator from class information
- co.tracking_level = co.bis_ptr->tracking(m_flags);
- co.file_version = version_type(
- co.bis_ptr->version()
- );
- }
- co.initialized = true;
- }
-}
-
-bool
-basic_iarchive_impl::track(
- basic_iarchive & ar,
- void * & t
-){
- object_id_type oid;
- load(ar, oid);
-
- // if its a reference to a old object
- if(object_id_type(object_id_vector.size()) > oid){
- // we're done
- t = object_id_vector[oid].address;
- return false;
- }
- return true;
-}
-
-inline void
-basic_iarchive_impl::load_object(
- basic_iarchive & ar,
- void * t,
- const basic_iserializer & bis
-){
- m_moveable_objects.is_pointer = false;
- serialization::state_saver<bool> ss_is_pointer(m_moveable_objects.is_pointer);
- // if its been serialized through a pointer and the preamble's been done
- if(t == m_pending.object && & bis == m_pending.bis){
- // read data
- (bis.load_object_data)(ar, t, m_pending.version);
- return;
- }
-
- const class_id_type cid = register_type(bis);
- const int i = cid;
- cobject_id & co = cobject_id_vector[i];
-
- load_preamble(ar, co);
-
- // save the current move stack position in case we want to truncate it
- boost::serialization::state_saver<object_id_type> ss_start(m_moveable_objects.start);
-
- // note: extra line used to evade borland issue
- const bool tracking = co.tracking_level;
-
- object_id_type this_id;
- m_moveable_objects.start =
- this_id = object_id_type(object_id_vector.size());
-
- // if we tracked this object when the archive was saved
- if(tracking){
- // if it was already read
- if(!track(ar, t))
- // we're done
- return;
- // add a new enty into the tracking list
- object_id_vector.push_back(aobject(t, cid));
- // and add an entry for this object
- m_moveable_objects.end = object_id_type(object_id_vector.size());
- }
- // read data
- (bis.load_object_data)(ar, t, co.file_version);
- m_moveable_objects.recent = this_id;
-}
-
-inline const basic_pointer_iserializer *
-basic_iarchive_impl::load_pointer(
- basic_iarchive &ar,
- void * & t,
- const basic_pointer_iserializer * bpis_ptr,
- const basic_pointer_iserializer * (*finder)(
- const boost::serialization::extended_type_info & type_
- )
-){
- m_moveable_objects.is_pointer = true;
- serialization::state_saver<bool> w(m_moveable_objects.is_pointer);
-
- class_id_type cid;
- load(ar, cid);
-
- if(NULL_POINTER_TAG == cid){
- t = NULL;
- return bpis_ptr;
- }
-
- // if its a new class type - i.e. never been registered
- if(class_id_type(cobject_info_set.size()) <= cid){
- // if its either abstract
- if(NULL == bpis_ptr
- // or polymorphic
- || bpis_ptr->get_basic_serializer().is_polymorphic()){
- // is must have been exported
- char key[BOOST_SERIALIZATION_MAX_KEY_SIZE];
- class_name_type class_name(key);
- load(ar, class_name);
- // if it has a class name
- const serialization::extended_type_info *eti = NULL;
- if(0 != key[0])
- eti = serialization::extended_type_info::find(key);
- if(NULL == eti)
- boost::serialization::throw_exception(
- archive_exception(archive_exception::unregistered_class)
- );
- bpis_ptr = (*finder)(*eti);
- }
- BOOST_ASSERT(NULL != bpis_ptr);
- // class_id_type new_cid = register_type(bpis_ptr->get_basic_serializer());
- BOOST_VERIFY(register_type(bpis_ptr->get_basic_serializer()) == cid);
- int i = cid;
- cobject_id_vector[i].bpis_ptr = bpis_ptr;
- }
- int i = cid;
- cobject_id & co = cobject_id_vector[i];
- bpis_ptr = co.bpis_ptr;
-
- load_preamble(ar, co);
-
- // extra line to evade borland issue
- const bool tracking = co.tracking_level;
- // if we're tracking and the pointer has already been read
- if(tracking && ! track(ar, t))
- // we're done
- return bpis_ptr;
-
- // save state
- serialization::state_saver<object_id_type> w_start(m_moveable_objects.start);
-
- // allocate space on the heap for the object - to be constructed later
- t = bpis_ptr->heap_allocation();
- BOOST_ASSERT(NULL != t);
-
- if(! tracking){
- bpis_ptr->load_object_ptr(ar, t, co.file_version);
- }
- else{
- serialization::state_saver<void *> x(m_pending.object);
- serialization::state_saver<const basic_iserializer *> y(m_pending.bis);
- serialization::state_saver<version_type> z(m_pending.version);
-
- m_pending.bis = & bpis_ptr->get_basic_serializer();
- m_pending.version = co.file_version;
-
- // predict next object id to be created
- const unsigned int ui = object_id_vector.size();
-
- serialization::state_saver<object_id_type> w_end(m_moveable_objects.end);
-
-
- // add to list of serialized objects so that we can properly handle
- // cyclic strucures
- object_id_vector.push_back(aobject(t, cid));
-
- // remember that that the address of these elements could change
- // when we make another call so don't use the address
- bpis_ptr->load_object_ptr(
- ar,
- t,
- m_pending.version
- );
- object_id_vector[ui].loaded_as_pointer = true;
- }
-
- return bpis_ptr;
-}
-
-} // namespace detail
-} // namespace archive
-} // namespace boost
-
-//////////////////////////////////////////////////////////////////////
-// implementation of basic_iarchive functions
-namespace boost {
-namespace archive {
-namespace detail {
-
-BOOST_ARCHIVE_DECL(void)
-basic_iarchive::next_object_pointer(void *t){
- pimpl->next_object_pointer(t);
-}
-
-BOOST_ARCHIVE_DECL(BOOST_PP_EMPTY())
-basic_iarchive::basic_iarchive(unsigned int flags) :
- pimpl(new basic_iarchive_impl(flags))
-{}
-
-BOOST_ARCHIVE_DECL(BOOST_PP_EMPTY())
-basic_iarchive::~basic_iarchive()
-{
- delete pimpl;
-}
-
-BOOST_ARCHIVE_DECL(void)
-basic_iarchive::set_library_version(library_version_type archive_library_version){
- pimpl->set_library_version(archive_library_version);
-}
-
-BOOST_ARCHIVE_DECL(void)
-basic_iarchive::reset_object_address(
- const void * new_address,
- const void * old_address
-){
- pimpl->reset_object_address(new_address, old_address);
-}
-
-BOOST_ARCHIVE_DECL(void)
-basic_iarchive::load_object(
- void *t,
- const basic_iserializer & bis
-){
- pimpl->load_object(*this, t, bis);
-}
-
-// load a pointer object
-BOOST_ARCHIVE_DECL(const basic_pointer_iserializer *)
-basic_iarchive::load_pointer(
- void * &t,
- const basic_pointer_iserializer * bpis_ptr,
- const basic_pointer_iserializer * (*finder)(
- const boost::serialization::extended_type_info & type_
- )
-
-){
- return pimpl->load_pointer(*this, t, bpis_ptr, finder);
-}
-
-BOOST_ARCHIVE_DECL(void)
-basic_iarchive::register_basic_serializer(const basic_iserializer & bis){
- pimpl->register_type(bis);
-}
-
-BOOST_ARCHIVE_DECL(void)
-basic_iarchive::delete_created_pointers()
-{
- pimpl->delete_created_pointers();
-}
-
-BOOST_ARCHIVE_DECL(boost::archive::library_version_type)
-basic_iarchive::get_library_version() const{
- return pimpl->m_archive_library_version;
-}
-
-BOOST_ARCHIVE_DECL(unsigned int)
-basic_iarchive::get_flags() const{
- return pimpl->m_flags;
-}
-
-} // namespace detail
-} // namespace archive
-} // namespace boost