Chris@16: // Chris@16: // Boost.Pointer Container Chris@16: // Chris@16: // Copyright Thorsten Ottosen 2003-2005. Use, modification and Chris@16: // distribution is subject to the Boost Software License, Version Chris@16: // 1.0. (See accompanying file LICENSE_1_0.txt or copy at Chris@16: // http://www.boost.org/LICENSE_1_0.txt) Chris@16: // Chris@16: // For more information, see http://www.boost.org/libs/ptr_container/ Chris@16: // Chris@16: Chris@16: #ifndef BOOST_PTR_CONTAINER_MAP_ITERATOR_HPP Chris@16: #define BOOST_PTR_CONTAINER_MAP_ITERATOR_HPP Chris@16: Chris@16: #if defined(_MSC_VER) && (_MSC_VER >= 1200) Chris@16: # pragma once Chris@16: #endif Chris@16: Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: Chris@16: #if defined(BOOST_MSVC) Chris@16: # pragma warning(push) Chris@16: # pragma warning(disable:4512) // Assignment operator could not be generated. Chris@16: #endif Chris@16: Chris@16: namespace boost Chris@16: { Chris@16: namespace ptr_container_detail Chris@16: { Chris@16: template< class F, class S > Chris@16: struct ref_pair Chris@16: { Chris@16: typedef F first_type; Chris@16: typedef S second_type; Chris@16: Chris@16: const F& first; Chris@16: S second; Chris@16: Chris@16: template< class F2, class S2 > Chris@16: ref_pair( const std::pair& p ) Chris@16: : first(p.first), second(static_cast(p.second)) Chris@16: { } Chris@16: Chris@16: template< class RP > Chris@16: ref_pair( const RP* rp ) Chris@16: : first(rp->first), second(rp->second) Chris@16: { } Chris@16: Chris@16: const ref_pair* const operator->() const Chris@16: { Chris@16: return this; Chris@16: } Chris@16: Chris@16: friend inline bool operator==( ref_pair l, ref_pair r ) Chris@16: { Chris@16: return l.first == r.first && Chris@16: boost::equal_pointees( l.second, r.second ); Chris@16: } Chris@16: Chris@16: friend inline bool operator!=( ref_pair l, ref_pair r ) Chris@16: { Chris@16: return !( l == r ); Chris@16: } Chris@16: Chris@16: friend inline bool operator<( ref_pair l, ref_pair r ) Chris@16: { Chris@16: if( l.first == r.first ) Chris@16: return boost::less_pointees( l.second, r.second ); Chris@16: else Chris@16: return l.first < r.first; Chris@16: } Chris@16: Chris@16: friend inline bool operator>( ref_pair l, ref_pair r ) Chris@16: { Chris@16: return r < l; Chris@16: } Chris@16: Chris@16: friend inline bool operator<=( ref_pair l, ref_pair r ) Chris@16: { Chris@16: return !(r < l); Chris@16: } Chris@16: Chris@16: friend inline bool operator>=( ref_pair l, ref_pair r ) Chris@16: { Chris@16: return !(l < r); Chris@16: } Chris@16: Chris@16: }; Chris@16: } Chris@16: Chris@16: template< Chris@16: class I, // base iterator Chris@16: class F, // first type, key type Chris@16: class S // second type, mapped type Chris@16: > Chris@16: class ptr_map_iterator : Chris@16: public boost::iterator_adaptor< ptr_map_iterator, I, Chris@16: ptr_container_detail::ref_pair, Chris@16: use_default, Chris@16: ptr_container_detail::ref_pair > Chris@16: { Chris@16: typedef boost::iterator_adaptor< ptr_map_iterator, I, Chris@16: ptr_container_detail::ref_pair, Chris@16: use_default, Chris@16: ptr_container_detail::ref_pair > Chris@16: base_type; Chris@16: Chris@16: Chris@16: public: Chris@16: ptr_map_iterator() : base_type() Chris@16: { } Chris@16: Chris@16: explicit ptr_map_iterator( const I& i ) : base_type(i) Chris@16: { } Chris@16: Chris@16: template< class I2, class F2, class S2 > Chris@16: ptr_map_iterator( const ptr_map_iterator& r ) Chris@16: : base_type(r.base()) Chris@16: { } Chris@16: Chris@16: }; // class 'ptr_map_iterator' Chris@16: Chris@16: } Chris@16: Chris@16: #if defined(BOOST_MSVC) Chris@16: # pragma warning(pop) Chris@16: #endif Chris@16: Chris@16: #endif