williamr@2: // williamr@2: // Boost.Pointer Container williamr@2: // williamr@2: // Copyright Thorsten Ottosen 2003-2005. Use, modification and williamr@2: // distribution is subject to the Boost Software License, Version williamr@2: // 1.0. (See accompanying file LICENSE_1_0.txt or copy at williamr@2: // http://www.boost.org/LICENSE_1_0.txt) williamr@2: // williamr@2: // For more information, see http://www.boost.org/libs/ptr_container/ williamr@2: // williamr@2: williamr@2: #ifndef BOOST_PTR_CONTAINER_DETAIL_PTR_MAP_ADAPTER_HPP williamr@2: #define BOOST_PTR_CONTAINER_DETAIL_PTR_MAP_ADAPTER_HPP williamr@2: williamr@2: #if defined(_MSC_VER) && (_MSC_VER >= 1200) williamr@2: # pragma once williamr@2: #endif williamr@2: williamr@2: #include williamr@2: #include williamr@2: #include williamr@2: #include williamr@2: williamr@2: namespace boost williamr@2: { williamr@2: namespace ptr_container_detail williamr@2: { williamr@2: williamr@2: template williamr@2: < williamr@2: class T, williamr@2: class VoidPtrMap williamr@2: > williamr@2: struct map_config williamr@2: { williamr@2: typedef BOOST_DEDUCED_TYPENAME remove_nullable::type williamr@2: U; williamr@2: typedef VoidPtrMap williamr@2: void_container_type; williamr@2: williamr@2: typedef BOOST_DEDUCED_TYPENAME VoidPtrMap::allocator_type williamr@2: allocator_type; williamr@2: williamr@2: typedef BOOST_DEDUCED_TYPENAME VoidPtrMap::key_compare williamr@2: key_compare; williamr@2: williamr@2: typedef BOOST_DEDUCED_TYPENAME VoidPtrMap::value_compare williamr@2: value_compare; williamr@2: williamr@2: typedef BOOST_DEDUCED_TYPENAME VoidPtrMap::key_type williamr@2: key_type; williamr@2: williamr@2: typedef U value_type; williamr@2: williamr@2: typedef ptr_map_iterator< BOOST_DEDUCED_TYPENAME VoidPtrMap::iterator, key_type, U* const > williamr@2: iterator; williamr@2: williamr@2: typedef ptr_map_iterator< BOOST_DEDUCED_TYPENAME VoidPtrMap::const_iterator, key_type, const U* const> williamr@2: const_iterator; williamr@2: williamr@2: template< class Iter > williamr@2: static U* get_pointer( Iter i ) williamr@2: { williamr@2: return i->second; williamr@2: } williamr@2: williamr@2: template< class Iter > williamr@2: static const U* get_const_pointer( Iter i ) williamr@2: { williamr@2: return i->second; williamr@2: } williamr@2: williamr@2: BOOST_STATIC_CONSTANT( bool, allow_null = boost::is_nullable::value ); williamr@2: }; williamr@2: williamr@2: williamr@2: williamr@2: template williamr@2: < williamr@2: class T, williamr@2: class VoidPtrMap, williamr@2: class CloneAllocator williamr@2: > williamr@2: class ptr_map_adapter_base : williamr@2: public ptr_container_detail::associative_ptr_container< map_config, williamr@2: CloneAllocator > williamr@2: { williamr@2: typedef ptr_container_detail::associative_ptr_container< map_config, williamr@2: CloneAllocator > williamr@2: base_type; williamr@2: williamr@2: typedef map_config config; williamr@2: williamr@2: typedef ptr_map_adapter_base this_type; williamr@2: williamr@2: public: williamr@2: williamr@2: typedef BOOST_DEDUCED_TYPENAME base_type::allocator_type williamr@2: allocator_type; williamr@2: typedef BOOST_DEDUCED_TYPENAME base_type::iterator williamr@2: iterator; williamr@2: typedef BOOST_DEDUCED_TYPENAME base_type::const_iterator williamr@2: const_iterator; williamr@2: typedef BOOST_DEDUCED_TYPENAME base_type::size_type williamr@2: size_type; williamr@2: typedef BOOST_DEDUCED_TYPENAME base_type::key_type williamr@2: key_type; williamr@2: typedef BOOST_DEDUCED_TYPENAME base_type::auto_type williamr@2: auto_type; williamr@2: typedef BOOST_DEDUCED_TYPENAME base_type::value_type williamr@2: mapped_type; williamr@2: typedef BOOST_DEDUCED_TYPENAME base_type::reference williamr@2: mapped_reference; williamr@2: typedef BOOST_DEDUCED_TYPENAME base_type::const_reference williamr@2: const_mapped_reference; williamr@2: typedef BOOST_DEDUCED_TYPENAME iterator_value::type williamr@2: value_type; williamr@2: typedef value_type williamr@2: reference; williamr@2: typedef BOOST_DEDUCED_TYPENAME iterator_value::type williamr@2: const_reference; williamr@2: typedef value_type williamr@2: pointer; williamr@2: typedef const_reference williamr@2: const_pointer; williamr@2: williamr@2: private: williamr@2: const_mapped_reference lookup( const key_type& key ) const williamr@2: { williamr@2: const_iterator i = this->find( key ); williamr@2: if( i != this->end() ) williamr@2: return *i->second; williamr@2: else williamr@2: BOOST_PTR_CONTAINER_THROW_EXCEPTION( true, bad_ptr_container_operation, williamr@2: "'ptr_map/multimap::at()' could" williamr@2: " not find key" ); williamr@2: } williamr@2: williamr@2: struct eraser // scope guard williamr@2: { williamr@2: bool released_; williamr@2: VoidPtrMap* m_; williamr@2: const key_type& key_; williamr@2: williamr@2: eraser( VoidPtrMap* m, const key_type& key ) williamr@2: : released_(false), m_(m), key_(key) williamr@2: {} williamr@2: williamr@2: ~eraser() williamr@2: { williamr@2: if( !released_ ) williamr@2: m_->erase(key_); williamr@2: } williamr@2: williamr@2: void release() { released_ = true; } williamr@2: }; williamr@2: williamr@2: mapped_reference insert_lookup( const key_type& key ) williamr@2: { williamr@2: void*& ref = this->c_private()[key]; williamr@2: if( ref ) williamr@2: { williamr@2: return *static_cast(ref); williamr@2: } williamr@2: else williamr@2: { williamr@2: eraser e(&this->c_private(),key); // nothrow williamr@2: mapped_type res = new T(); // strong williamr@2: ref = res; // nothrow williamr@2: e.release(); // nothrow williamr@2: return *res; williamr@2: } williamr@2: } williamr@2: williamr@2: public: williamr@2: williamr@2: ptr_map_adapter_base( const allocator_type& a = allocator_type() ) williamr@2: : base_type(a) williamr@2: { } williamr@2: williamr@2: template< class InputIterator > williamr@2: ptr_map_adapter_base( InputIterator first, InputIterator last, williamr@2: const allocator_type& a = allocator_type() ) williamr@2: : base_type( first, last, a ) williamr@2: { } williamr@2: williamr@2: template< class Compare, class Allocator > williamr@2: explicit ptr_map_adapter_base( const Compare& comp, williamr@2: const Allocator& a ) williamr@2: : base_type( comp, a ) williamr@2: { } williamr@2: williamr@2: template< class PtrContainer > williamr@2: ptr_map_adapter_base( std::auto_ptr clone ) williamr@2: : base_type( clone ) williamr@2: { } williamr@2: williamr@2: template< typename PtrContainer > williamr@2: void operator=( std::auto_ptr clone ) williamr@2: { williamr@2: base_type::operator=( clone ); williamr@2: } williamr@2: williamr@2: iterator find( const key_type& x ) williamr@2: { williamr@2: return iterator( this->c_private().find( x ) ); williamr@2: } williamr@2: williamr@2: const_iterator find( const key_type& x ) const williamr@2: { williamr@2: return const_iterator( this->c_private().find( x ) ); williamr@2: } williamr@2: williamr@2: size_type count( const key_type& x ) const williamr@2: { williamr@2: return this->c_private().count( x ); williamr@2: } williamr@2: williamr@2: iterator lower_bound( const key_type& x ) williamr@2: { williamr@2: return iterator( this->c_private().lower_bound( x ) ); williamr@2: } williamr@2: williamr@2: const_iterator lower_bound( const key_type& x ) const williamr@2: { williamr@2: return const_iterator( this->c_private().lower_bound( x ) ); williamr@2: } williamr@2: williamr@2: iterator upper_bound( const key_type& x ) williamr@2: { williamr@2: return iterator( this->c_private().upper_bound( x ) ); williamr@2: } williamr@2: williamr@2: const_iterator upper_bound( const key_type& x ) const williamr@2: { williamr@2: return const_iterator( this->c_private().upper_bound( x ) ); williamr@2: } williamr@2: williamr@2: iterator_range equal_range( const key_type& x ) williamr@2: { williamr@2: std::pair williamr@2: p = this->c_private().equal_range( x ); williamr@2: return make_iterator_range( iterator( p.first ), iterator( p.second ) ); williamr@2: } williamr@2: williamr@2: iterator_range equal_range( const key_type& x ) const williamr@2: { williamr@2: std::pair williamr@2: p = this->c_private().equal_range( x ); williamr@2: return make_iterator_range( const_iterator( p.first ), williamr@2: const_iterator( p.second ) ); williamr@2: } williamr@2: williamr@2: mapped_reference at( const key_type& key ) williamr@2: { williamr@2: return const_cast( lookup( key ) ); williamr@2: } williamr@2: williamr@2: const_mapped_reference at( const key_type& key ) const williamr@2: { williamr@2: return lookup( key ); williamr@2: } williamr@2: williamr@2: mapped_reference operator[]( const key_type& key ) williamr@2: { williamr@2: return insert_lookup( key ); williamr@2: } williamr@2: williamr@2: auto_type replace( iterator where, mapped_type x ) // strong williamr@2: { williamr@2: BOOST_ASSERT( where != this->end() ); williamr@2: williamr@2: this->enforce_null_policy( x, "Null pointer in 'replace()'" ); williamr@2: williamr@2: auto_type ptr( x ); williamr@2: williamr@2: BOOST_PTR_CONTAINER_THROW_EXCEPTION( this->empty(), williamr@2: bad_ptr_container_operation, williamr@2: "'replace()' on empty container" ); williamr@2: williamr@2: auto_type old( where->second ); // nothrow williamr@2: where.base()->second = ptr.release(); // nothrow, commit williamr@2: return move( old ); williamr@2: } williamr@2: williamr@2: template< class U > williamr@2: auto_type replace( iterator where, std::auto_ptr x ) williamr@2: { williamr@2: return replace( where, x.release() ); williamr@2: } williamr@2: williamr@2: public: // serialization williamr@2: williamr@2: template< class Archive > williamr@2: void save( Archive& ar, const unsigned ) const williamr@2: { williamr@2: ar & ptr_container_detail::serialize_as_const( this->size() ); williamr@2: williamr@2: const_iterator i = this->begin(), e = this->end(); williamr@2: for( ; i != e; ++i ) williamr@2: { williamr@2: ar & i->first; williamr@2: ar & ptr_container_detail::serialize_as_const( i->second ); williamr@2: } williamr@2: } williamr@2: }; williamr@2: williamr@2: } // ptr_container_detail williamr@2: williamr@2: ///////////////////////////////////////////////////////////////////////// williamr@2: // ptr_map_adapter williamr@2: ///////////////////////////////////////////////////////////////////////// williamr@2: williamr@2: template williamr@2: < williamr@2: class T, williamr@2: class VoidPtrMap, williamr@2: class CloneAllocator = heap_clone_allocator williamr@2: > williamr@2: class ptr_map_adapter : williamr@2: public ptr_container_detail::ptr_map_adapter_base williamr@2: { williamr@2: typedef ptr_container_detail::ptr_map_adapter_base williamr@2: base_type; williamr@2: williamr@2: public: williamr@2: typedef BOOST_DEDUCED_TYPENAME base_type::iterator williamr@2: iterator; williamr@2: typedef BOOST_DEDUCED_TYPENAME base_type::const_iterator williamr@2: const_iterator; williamr@2: typedef BOOST_DEDUCED_TYPENAME base_type::size_type williamr@2: size_type; williamr@2: typedef BOOST_DEDUCED_TYPENAME base_type::key_type williamr@2: key_type; williamr@2: typedef BOOST_DEDUCED_TYPENAME base_type::const_reference williamr@2: const_reference; williamr@2: typedef BOOST_DEDUCED_TYPENAME base_type::auto_type williamr@2: auto_type; williamr@2: typedef BOOST_DEDUCED_TYPENAME VoidPtrMap::key_compare williamr@2: key_compare; williamr@2: typedef BOOST_DEDUCED_TYPENAME VoidPtrMap::allocator_type williamr@2: allocator_type; williamr@2: typedef BOOST_DEDUCED_TYPENAME base_type::mapped_type williamr@2: mapped_type; williamr@2: private: williamr@2: williamr@2: void safe_insert( const key_type& key, auto_type ptr ) // strong williamr@2: { williamr@2: std::pair williamr@2: res = williamr@2: this->c_private().insert( std::make_pair( key, ptr.get() ) ); // strong, commit williamr@2: if( res.second ) // nothrow williamr@2: ptr.release(); // nothrow williamr@2: } williamr@2: williamr@2: template< class II > williamr@2: void map_basic_clone_and_insert( II first, II last ) williamr@2: { williamr@2: while( first != last ) williamr@2: { williamr@2: if( this->find( first->first ) == this->end() ) williamr@2: { williamr@2: const_reference p = *first.base(); // nothrow williamr@2: auto_type ptr( this->null_policy_allocate_clone( p.second ) ); williamr@2: // strong williamr@2: this->safe_insert( p.first, ptr_container_detail:: williamr@2: move( ptr ) );// strong, commit williamr@2: } williamr@2: ++first; williamr@2: } williamr@2: } williamr@2: williamr@2: public: williamr@2: williamr@2: explicit ptr_map_adapter( const key_compare& comp = key_compare(), williamr@2: const allocator_type& a = allocator_type() ) williamr@2: : base_type( comp, a ) { } williamr@2: williamr@2: template< class InputIterator > williamr@2: ptr_map_adapter( InputIterator first, InputIterator last, williamr@2: const key_compare& comp = key_compare(), williamr@2: const allocator_type& a = allocator_type() ) williamr@2: : base_type( comp, a ) williamr@2: { williamr@2: map_basic_clone_and_insert( first, last ); williamr@2: } williamr@2: williamr@2: template< class U > williamr@2: ptr_map_adapter( std::auto_ptr r ) : base_type( r ) williamr@2: { } williamr@2: williamr@2: template< class U > williamr@2: void operator=( std::auto_ptr r ) williamr@2: { williamr@2: base_type::operator=( r ); williamr@2: } williamr@2: williamr@2: using base_type::release; williamr@2: williamr@2: template< typename InputIterator > williamr@2: void insert( InputIterator first, InputIterator last ) // basic williamr@2: { williamr@2: map_basic_clone_and_insert( first, last ); williamr@2: } williamr@2: williamr@2: template< class Range > williamr@2: void insert( const Range& r ) williamr@2: { williamr@2: insert( boost::begin(r), boost::end(r) ); williamr@2: } williamr@2: williamr@2: private: williamr@2: std::pair insert_impl( const key_type& key, mapped_type x ) // strong williamr@2: { williamr@2: this->enforce_null_policy( x, "Null pointer in ptr_map_adapter::insert()" ); williamr@2: auto_type ptr( x ); // nothrow williamr@2: williamr@2: std::pair williamr@2: res = this->c_private().insert( std::make_pair( key, x ) ); // strong, commit williamr@2: if( res.second ) // nothrow williamr@2: ptr.release(); // nothrow williamr@2: return std::make_pair( iterator( res.first ), res.second ); // nothrow williamr@2: } williamr@2: williamr@2: public: williamr@2: williamr@2: std::pair insert( key_type& key, mapped_type x ) williamr@2: { williamr@2: return insert_impl( key, x ); williamr@2: } williamr@2: williamr@2: template< class U > williamr@2: std::pair insert( const key_type& key, std::auto_ptr x ) williamr@2: { williamr@2: return insert_impl( key, x.release() ); williamr@2: } williamr@2: williamr@2: template< class PtrMapAdapter > williamr@2: bool transfer( BOOST_DEDUCED_TYPENAME PtrMapAdapter::iterator object, williamr@2: PtrMapAdapter& from ) // strong williamr@2: { williamr@2: return this->single_transfer( object, from ); williamr@2: } williamr@2: williamr@2: template< class PtrMapAdapter > williamr@2: size_type transfer( BOOST_DEDUCED_TYPENAME PtrMapAdapter::iterator first, williamr@2: BOOST_DEDUCED_TYPENAME PtrMapAdapter::iterator last, williamr@2: PtrMapAdapter& from ) // basic williamr@2: { williamr@2: return this->single_transfer( first, last, from ); williamr@2: } williamr@2: williamr@2: #if defined(BOOST_NO_SFINAE) || BOOST_WORKAROUND(__SUNPRO_CC, <= 0x580) williamr@2: #else williamr@2: williamr@2: template< class PtrMapAdapter, class Range > williamr@2: BOOST_DEDUCED_TYPENAME boost::disable_if< boost::is_same< Range, williamr@2: BOOST_DEDUCED_TYPENAME PtrMapAdapter::iterator >, williamr@2: size_type >::type williamr@2: transfer( const Range& r, PtrMapAdapter& from ) // basic williamr@2: { williamr@2: return transfer( boost::begin(r), boost::end(r), from ); williamr@2: } williamr@2: williamr@2: #endif williamr@2: williamr@2: template< class PtrMapAdapter > williamr@2: size_type transfer( PtrMapAdapter& from ) // basic williamr@2: { williamr@2: return transfer( from.begin(), from.end(), from ); williamr@2: } williamr@2: williamr@2: public: // serialization williamr@2: williamr@2: template< class Archive > williamr@2: void load( Archive& ar, const unsigned ) // strong williamr@2: { williamr@2: this->clear(); williamr@2: size_type n; williamr@2: ar & n; williamr@2: williamr@2: for( size_type i = 0u; i != n; ++i ) williamr@2: { williamr@2: key_type key; williamr@2: T* value; williamr@2: ar & key; williamr@2: ar & value; williamr@2: std::pair p = this->insert( key, value ); williamr@2: ar.reset_object_address( &p.first->first, &key ); williamr@2: } williamr@2: } williamr@2: williamr@2: BOOST_SERIALIZATION_SPLIT_MEMBER() williamr@2: williamr@2: }; williamr@2: williamr@2: ///////////////////////////////////////////////////////////////////////// williamr@2: // ptr_multimap_adapter williamr@2: ///////////////////////////////////////////////////////////////////////// williamr@2: williamr@2: template williamr@2: < williamr@2: class T, williamr@2: class VoidPtrMultiMap, williamr@2: class CloneAllocator = heap_clone_allocator williamr@2: > williamr@2: class ptr_multimap_adapter : williamr@2: public ptr_container_detail::ptr_map_adapter_base williamr@2: { williamr@2: typedef ptr_container_detail::ptr_map_adapter_base williamr@2: base_type; williamr@2: williamr@2: public: // typedefs williamr@2: typedef BOOST_DEDUCED_TYPENAME base_type::iterator williamr@2: iterator; williamr@2: typedef BOOST_DEDUCED_TYPENAME base_type::const_iterator williamr@2: const_iterator; williamr@2: typedef BOOST_DEDUCED_TYPENAME base_type::size_type williamr@2: size_type; williamr@2: typedef BOOST_DEDUCED_TYPENAME base_type::key_type williamr@2: key_type; williamr@2: typedef BOOST_DEDUCED_TYPENAME base_type::const_reference williamr@2: const_reference; williamr@2: typedef BOOST_DEDUCED_TYPENAME base_type::mapped_type williamr@2: mapped_type; williamr@2: typedef BOOST_DEDUCED_TYPENAME base_type::auto_type williamr@2: auto_type; williamr@2: typedef BOOST_DEDUCED_TYPENAME VoidPtrMultiMap::key_compare williamr@2: key_compare; williamr@2: typedef BOOST_DEDUCED_TYPENAME VoidPtrMultiMap::allocator_type williamr@2: allocator_type; williamr@2: private: williamr@2: williamr@2: void safe_insert( const key_type& key, auto_type ptr ) // strong williamr@2: { williamr@2: this->c_private().insert( williamr@2: std::make_pair( key, ptr.get() ) ); // strong, commit williamr@2: ptr.release(); // nothrow williamr@2: } williamr@2: williamr@2: template< typename II > williamr@2: void map_basic_clone_and_insert( II first, II last ) williamr@2: { williamr@2: while( first != last ) williamr@2: { williamr@2: const_reference pair = *first.base(); // nothrow williamr@2: auto_type ptr( this->null_policy_allocate_clone( pair.second ) ); williamr@2: // strong williamr@2: safe_insert( pair.first, ptr_container_detail:: williamr@2: move( ptr ) ); // strong, commit williamr@2: ++first; williamr@2: } williamr@2: } williamr@2: williamr@2: public: williamr@2: williamr@2: explicit ptr_multimap_adapter( const key_compare& comp = key_compare(), williamr@2: const allocator_type& a = allocator_type() ) williamr@2: : base_type( comp, a ) { } williamr@2: williamr@2: template< class InputIterator > williamr@2: ptr_multimap_adapter( InputIterator first, InputIterator last, williamr@2: const key_compare& comp = key_compare(), williamr@2: const allocator_type& a = allocator_type() ) williamr@2: : base_type( comp, a ) williamr@2: { williamr@2: map_basic_clone_and_insert( first, last ); williamr@2: } williamr@2: williamr@2: template< class U > williamr@2: ptr_multimap_adapter( std::auto_ptr r ) : base_type( r ) williamr@2: { } williamr@2: williamr@2: template< class U > williamr@2: void operator=( std::auto_ptr r ) williamr@2: { williamr@2: base_type::operator=( r ); williamr@2: } williamr@2: williamr@2: using base_type::release; williamr@2: williamr@2: template< typename InputIterator > williamr@2: void insert( InputIterator first, InputIterator last ) // basic williamr@2: { williamr@2: map_basic_clone_and_insert( first, last ); williamr@2: } williamr@2: williamr@2: template< class Range > williamr@2: void insert( const Range& r ) williamr@2: { williamr@2: insert( boost::begin(r), boost::end(r) ); williamr@2: } williamr@2: williamr@2: iterator insert( key_type& key, mapped_type x ) // strong williamr@2: { williamr@2: this->enforce_null_policy( x, williamr@2: "Null pointer in 'ptr_multimap_adapter::insert()'" ); williamr@2: williamr@2: auto_type ptr( x ); // nothrow williamr@2: BOOST_DEDUCED_TYPENAME base_type::ptr_iterator williamr@2: res = this->c_private().insert( std::make_pair( key, x ) ); williamr@2: // strong, commit williamr@2: ptr.release(); // notrow williamr@2: return iterator( res ); williamr@2: } williamr@2: williamr@2: template< class U > williamr@2: iterator insert( key_type& key, std::auto_ptr x ) williamr@2: { williamr@2: return insert( key, x.release() ); williamr@2: } williamr@2: williamr@2: template< class PtrMapAdapter > williamr@2: void transfer( BOOST_DEDUCED_TYPENAME PtrMapAdapter::iterator object, williamr@2: PtrMapAdapter& from ) // strong williamr@2: { williamr@2: this->multi_transfer( object, from ); williamr@2: } williamr@2: williamr@2: template< class PtrMapAdapter > williamr@2: size_type transfer( BOOST_DEDUCED_TYPENAME PtrMapAdapter::iterator first, williamr@2: BOOST_DEDUCED_TYPENAME PtrMapAdapter::iterator last, williamr@2: PtrMapAdapter& from ) // basic williamr@2: { williamr@2: return this->multi_transfer( first, last, from ); williamr@2: } williamr@2: williamr@2: #if defined(BOOST_NO_SFINAE) || BOOST_WORKAROUND(__SUNPRO_CC, <= 0x580) williamr@2: #else williamr@2: williamr@2: template< class PtrMapAdapter, class Range > williamr@2: BOOST_DEDUCED_TYPENAME boost::disable_if< boost::is_same< Range, williamr@2: BOOST_DEDUCED_TYPENAME PtrMapAdapter::iterator >, williamr@2: size_type >::type williamr@2: transfer( const Range& r, PtrMapAdapter& from ) // basic williamr@2: { williamr@2: return transfer( boost::begin(r), boost::end(r), from ); williamr@2: } williamr@2: williamr@2: #endif williamr@2: template< class PtrMapAdapter > williamr@2: void transfer( PtrMapAdapter& from ) // basic williamr@2: { williamr@2: transfer( from.begin(), from.end(), from ); williamr@2: BOOST_ASSERT( from.empty() ); williamr@2: } williamr@2: williamr@2: public: // serialization williamr@2: williamr@2: template< class Archive > williamr@2: void load( Archive& ar, const unsigned ) // basic williamr@2: { williamr@2: this->clear(); williamr@2: size_type n; williamr@2: ar & n; williamr@2: williamr@2: for( size_type i = 0u; i != n; ++i ) williamr@2: { williamr@2: key_type key; williamr@2: T* value; williamr@2: ar & key; williamr@2: ar & value; williamr@2: iterator p = this->insert( key, value ); williamr@2: ar.reset_object_address( &p->first, &key ); williamr@2: } williamr@2: } williamr@2: williamr@2: BOOST_SERIALIZATION_SPLIT_MEMBER() williamr@2: williamr@2: }; williamr@2: williamr@2: template< class I, class F, class S > williamr@2: inline bool is_null( const ptr_map_iterator& i ) williamr@2: { williamr@2: return i->second == 0; williamr@2: } williamr@2: williamr@2: } // namespace 'boost' williamr@2: williamr@2: #endif