Index: boost/archive/basic_archive.hpp =================================================================== --- boost/archive/basic_archive.hpp (revision 27067) +++ boost/archive/basic_archive.hpp (working copy) @@ -210,6 +210,36 @@ } }; +struct tracking_level_type { + int t; + explicit tracking_level_type(const int t_ = 0) + : t(t_) + {}; + tracking_level_type(const tracking_level_type & t_) + : t(t_.t) + {} + operator int () const { + return t; + }; + operator int & () { + return t; + }; + tracking_level_type & operator=(const int t_){ + t = t_; + return *this; + } + bool operator==(const tracking_level_type & rhs) const { + return t == rhs.t; + } + bool operator==(const int & rhs) const { + return t == rhs; + } + tracking_level_type & operator=(const tracking_level_type & rhs){ + t = rhs.t; + return *this; + } +}; + struct class_name_type : private boost::noncopyable { Index: boost/archive/detail/basic_iserializer.hpp =================================================================== --- boost/archive/detail/basic_iserializer.hpp (revision 27067) +++ boost/archive/detail/basic_iserializer.hpp (working copy) @@ -57,7 +57,7 @@ #endif ~basic_iserializer(); public: - bool serialized_as_pointer() const { + bool maybe_serialized_as_pointer() const { return m_bpis != NULL; } void set_bpis(basic_pointer_iserializer *bpis){ @@ -73,8 +73,8 @@ ) const = 0; // returns true if class_info should be saved virtual bool class_info() const = 0 ; - // returns true if objects should be tracked - virtual bool tracking(const unsigned int) const = 0 ; + // returns the tracking level + virtual int tracking() const = 0 ; // returns class version virtual version_type version() const = 0 ; // returns true if this class is polymorphic Index: boost/archive/detail/basic_oserializer.hpp =================================================================== --- boost/archive/detail/basic_oserializer.hpp (revision 27067) +++ boost/archive/detail/basic_oserializer.hpp (working copy) @@ -58,7 +58,7 @@ #endif ~basic_oserializer(); public: - bool serialized_as_pointer() const { + bool maybe_serialized_as_pointer() const { return m_bpos != NULL; } void set_bpos(basic_pointer_oserializer *bpos){ @@ -72,8 +72,8 @@ ) const = 0; // returns true if class_info should be saved virtual bool class_info() const = 0; - // returns true if objects should be tracked - virtual bool tracking(const unsigned int flags) const = 0; + // returns the tracking level + virtual int tracking() const = 0; // returns class version virtual version_type version() const = 0; // returns true if this class is polymorphic Index: boost/archive/detail/iserializer.hpp =================================================================== --- boost/archive/detail/iserializer.hpp (revision 27067) +++ boost/archive/detail/iserializer.hpp (working copy) @@ -142,12 +142,8 @@ return boost::serialization::implementation_level< T >::value >= boost::serialization::object_class_info; } - virtual bool tracking(const unsigned int /* flags */) const { - return boost::serialization::tracking_level< T >::value - == boost::serialization::track_always - || ( boost::serialization::tracking_level< T >::value - == boost::serialization::track_selectively - && serialized_as_pointer()); + virtual int tracking() const { + return boost::serialization::tracking_level< T >::value; } virtual version_type version() const { return version_type(::boost::serialization::version< T >::value); Index: boost/archive/detail/oserializer.hpp =================================================================== --- boost/archive/detail/oserializer.hpp (revision 27067) +++ boost/archive/detail/oserializer.hpp (working copy) @@ -119,10 +119,8 @@ return boost::serialization::implementation_level< T >::value >= boost::serialization::object_class_info; } - virtual bool tracking(const unsigned int /* flags */) const { - return boost::serialization::tracking_level< T >::value == boost::serialization::track_always - || (boost::serialization::tracking_level< T >::value == boost::serialization::track_selectively - && serialized_as_pointer()); + virtual int tracking() const { + return boost::serialization::tracking_level< T >::value; } virtual version_type version() const { return version_type(::boost::serialization::version< T >::value); Index: libs/serialization/src/basic_iarchive.cpp =================================================================== --- libs/serialization/src/basic_iarchive.cpp (revision 27067) +++ libs/serialization/src/basic_iarchive.cpp (working copy) @@ -135,7 +135,7 @@ const basic_iserializer * bis_ptr; const basic_pointer_iserializer * bpis_ptr; version_type file_version; - tracking_type tracking_level; + tracking_level_type tracking_level; bool initialized; cobject_id(const basic_iserializer & bis_) : @@ -318,13 +318,17 @@ 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); + load(ar, cid); // to be thrown away + + tracking_type tracking; + load(ar, tracking); + co.tracking_level = tracking ? track_always : track_never; + + load(ar, co.file_version); } else{ // override tracking with indicator from class information - co.tracking_level = co.bis_ptr->tracking(m_flags); + co.tracking_level = co.bis_ptr->tracking(); co.file_version = version_type( co.bis_ptr->version() ); @@ -373,7 +377,7 @@ boost::serialization::state_saver w(moveable_objects_start); // note: extra line used to evade borland issue - const bool tracking = co.tracking_level; + const bool tracking = co.tracking_level == tracking_level_type(track_always); object_id_type this_id; moveable_objects_start = @@ -446,7 +450,7 @@ load_preamble(ar, co); // extra line to evade borland issue - const bool tracking = co.tracking_level; + const bool tracking = co.tracking_level != tracking_level_type(track_never); // if we're tracking and the pointer has already been read if(tracking && ! track(ar, t)) // we're done Index: libs/serialization/src/basic_oarchive.cpp =================================================================== --- libs/serialization/src/basic_oarchive.cpp (revision 27067) +++ libs/serialization/src/basic_oarchive.cpp (working copy) @@ -181,8 +181,8 @@ BOOST_ASSERT(false); return false; } - // returns true if objects should be tracked - bool tracking(const unsigned int) const { + // returns the tracking level + int tracking() const { BOOST_ASSERT(false); return false; } @@ -255,19 +255,24 @@ return; } + const tracking_type tracking( + bos.tracking() == track_selectively && bos.maybe_serialized_as_pointer() + || bos.tracking() == track_always + ); + // get class information for this object const cobject_type & co = register_type(bos); if(bos.class_info()){ if( ! co.m_initialized){ ar.vsave(class_id_optional_type(co.m_class_id)); - ar.vsave(tracking_type(bos.tracking(m_flags))); + ar.vsave(tracking); ar.vsave(version_type(bos.version())); (const_cast(co)).m_initialized = true; } } // we're not tracking this type of object - if(! bos.tracking(m_flags)){ + if(!tracking){ // just windup the preamble - no object id to write ar.end_preamble(); // and save the data @@ -317,6 +322,12 @@ const basic_oserializer & bos = bpos_ptr->get_basic_serializer(); std::size_t original_count = cobject_info_set.size(); const cobject_type & co = register_type(bos); + + const tracking_type tracking( + bos.tracking() == track_selectively && bos.maybe_serialized_as_pointer() + || bos.tracking() == track_always + ); + if(! co.m_initialized){ ar.vsave(co.m_class_id); // if its a previously unregistered class @@ -343,7 +354,7 @@ } } if(bos.class_info()){ - ar.vsave(tracking_type(bos.tracking(m_flags))); + ar.vsave(tracking); ar.vsave(version_type(bos.version())); } (const_cast(co)).m_initialized = true; @@ -353,7 +364,7 @@ } // if we're not tracking - if(! bos.tracking(m_flags)){ + if(!tracking){ // just save the data itself ar.end_preamble(); serialization::state_saver x(pending_object);