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_MAP_ITERATOR_HPP williamr@2: #define BOOST_PTR_CONTAINER_MAP_ITERATOR_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: williamr@2: namespace boost williamr@2: { williamr@2: namespace ptr_container_detail williamr@2: { williamr@2: template< class F, class S > williamr@2: struct ref_pair williamr@2: { williamr@2: typedef F first_type; williamr@2: typedef S second_type; williamr@2: williamr@2: const F& first; williamr@2: S second; williamr@2: williamr@2: template< class F2, class S2 > williamr@2: ref_pair( const std::pair& p ) williamr@2: : first(p.first), second(static_cast(p.second)) williamr@2: { } williamr@2: williamr@2: template< class RP > williamr@2: ref_pair( const RP* rp ) williamr@2: : first(rp->first), second(rp->second) williamr@2: { } williamr@2: williamr@2: const ref_pair* const operator->() const williamr@2: { williamr@2: return this; williamr@2: } williamr@2: }; williamr@2: } williamr@2: williamr@2: template< williamr@2: class I, // base iterator williamr@2: class F, // first type, key type williamr@2: class S // second type, mapped type williamr@2: > williamr@2: class ptr_map_iterator : williamr@2: public boost::iterator_adaptor< ptr_map_iterator, I, williamr@2: ptr_container_detail::ref_pair, williamr@2: use_default, williamr@2: ptr_container_detail::ref_pair > williamr@2: { williamr@2: typedef boost::iterator_adaptor< ptr_map_iterator, I, williamr@2: ptr_container_detail::ref_pair, williamr@2: use_default, williamr@2: ptr_container_detail::ref_pair > williamr@2: base_type; williamr@2: williamr@2: williamr@2: public: williamr@2: ptr_map_iterator() : base_type() williamr@2: { } williamr@2: williamr@2: explicit ptr_map_iterator( const I& i ) : base_type(i) williamr@2: { } williamr@2: williamr@2: template< class I2, class F2, class S2 > williamr@2: ptr_map_iterator( const ptr_map_iterator& r ) williamr@2: : base_type(r.base()) williamr@2: { } williamr@2: williamr@2: }; // class 'ptr_map_iterator' williamr@2: williamr@2: } williamr@2: williamr@2: #endif