williamr@2: // (C) Copyright David Abrahams 2002. williamr@2: // (C) Copyright Jeremy Siek 2002. williamr@2: // (C) Copyright Thomas Witt 2002. williamr@2: // Distributed under the Boost Software License, Version 1.0. (See williamr@2: // accompanying file LICENSE_1_0.txt or copy at williamr@2: // http://www.boost.org/LICENSE_1_0.txt) williamr@2: #ifndef BOOST_INDIRECT_ITERATOR_23022003THW_HPP williamr@2: #define BOOST_INDIRECT_ITERATOR_23022003THW_HPP williamr@2: williamr@2: #include williamr@2: #include williamr@2: williamr@2: #include williamr@2: #include williamr@2: #include williamr@2: williamr@2: #include williamr@2: williamr@2: #include williamr@2: #include williamr@2: williamr@2: #include williamr@2: #include williamr@2: #include williamr@2: #include williamr@2: #include williamr@2: williamr@2: #ifdef BOOST_MPL_CFG_NO_HAS_XXX williamr@2: # include williamr@2: # include williamr@2: # include williamr@2: # include williamr@2: #endif williamr@2: williamr@2: #include // must be last #include williamr@2: williamr@2: namespace boost williamr@2: { williamr@2: template williamr@2: class indirect_iterator; williamr@2: williamr@2: namespace detail williamr@2: { williamr@2: template williamr@2: struct indirect_base williamr@2: { williamr@2: typedef typename iterator_traits::value_type dereferenceable; williamr@2: williamr@2: typedef iterator_adaptor< williamr@2: indirect_iterator williamr@2: , Iter williamr@2: , typename ia_dflt_help< williamr@2: Value, pointee williamr@2: >::type williamr@2: , Category williamr@2: , typename ia_dflt_help< williamr@2: Reference williamr@2: , mpl::eval_if< williamr@2: is_same williamr@2: , indirect_reference williamr@2: , add_reference williamr@2: > williamr@2: >::type williamr@2: , Difference williamr@2: > type; williamr@2: }; williamr@2: williamr@2: template <> williamr@2: struct indirect_base {}; williamr@2: } // namespace detail williamr@2: williamr@2: williamr@2: template < williamr@2: class Iterator williamr@2: , class Value = use_default williamr@2: , class Category = use_default williamr@2: , class Reference = use_default williamr@2: , class Difference = use_default williamr@2: > williamr@2: class indirect_iterator williamr@2: : public detail::indirect_base< williamr@2: Iterator, Value, Category, Reference, Difference williamr@2: >::type williamr@2: { williamr@2: typedef typename detail::indirect_base< williamr@2: Iterator, Value, Category, Reference, Difference williamr@2: >::type super_t; williamr@2: williamr@2: friend class iterator_core_access; williamr@2: williamr@2: public: williamr@2: indirect_iterator() {} williamr@2: williamr@2: indirect_iterator(Iterator iter) williamr@2: : super_t(iter) {} williamr@2: williamr@2: template < williamr@2: class Iterator2, class Value2, class Category2 williamr@2: , class Reference2, class Difference2 williamr@2: > williamr@2: indirect_iterator( williamr@2: indirect_iterator< williamr@2: Iterator2, Value2, Category2, Reference2, Difference2 williamr@2: > const& y williamr@2: , typename enable_if_convertible::type* = 0 williamr@2: ) williamr@2: : super_t(y.base()) williamr@2: {} williamr@2: williamr@2: private: williamr@2: typename super_t::reference dereference() const williamr@2: { williamr@2: # if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x551)) williamr@2: return const_cast(**this->base()); williamr@2: # else williamr@2: return **this->base(); williamr@2: # endif williamr@2: } williamr@2: }; williamr@2: williamr@2: template williamr@2: inline williamr@2: indirect_iterator make_indirect_iterator(Iter x) williamr@2: { williamr@2: return indirect_iterator(x); williamr@2: } williamr@2: williamr@2: template williamr@2: inline williamr@2: indirect_iterator make_indirect_iterator(Iter x, Traits* = 0) williamr@2: { williamr@2: return indirect_iterator(x); williamr@2: } williamr@2: williamr@2: } // namespace boost williamr@2: williamr@2: #include williamr@2: williamr@2: #endif // BOOST_INDIRECT_ITERATOR_23022003THW_HPP