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