Chris@16: // (C) Copyright Toon Knapen 2001. Chris@16: // (C) Copyright David Abrahams 2003. Chris@16: // (C) Copyright Roland Richter 2003. 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: Chris@16: #ifndef BOOST_PERMUTATION_ITERATOR_HPP Chris@16: #define BOOST_PERMUTATION_ITERATOR_HPP Chris@16: Chris@16: #include Chris@16: Chris@16: #include Chris@16: Chris@16: Chris@101: namespace boost { Chris@101: namespace iterators { Chris@16: Chris@16: template< class ElementIterator Chris@16: , class IndexIterator> Chris@16: class permutation_iterator Chris@101: : public iterator_adaptor< Chris@16: permutation_iterator Chris@101: , IndexIterator, typename boost::detail::iterator_traits::value_type Chris@101: , use_default, typename boost::detail::iterator_traits::reference> Chris@16: { Chris@101: typedef iterator_adaptor< Chris@16: permutation_iterator Chris@101: , IndexIterator, typename boost::detail::iterator_traits::value_type Chris@101: , use_default, typename boost::detail::iterator_traits::reference> super_t; Chris@16: Chris@16: friend class iterator_core_access; Chris@16: Chris@16: public: Chris@16: permutation_iterator() : m_elt_iter() {} Chris@16: Chris@101: explicit permutation_iterator(ElementIterator x, IndexIterator y) Chris@16: : super_t(y), m_elt_iter(x) {} Chris@16: Chris@16: template Chris@16: permutation_iterator( Chris@16: permutation_iterator const& r Chris@16: , typename enable_if_convertible::type* = 0 Chris@16: , typename enable_if_convertible::type* = 0 Chris@16: ) Chris@16: : super_t(r.base()), m_elt_iter(r.m_elt_iter) Chris@16: {} Chris@16: Chris@16: private: Chris@16: typename super_t::reference dereference() const Chris@16: { return *(m_elt_iter + *this->base()); } Chris@16: Chris@16: #ifndef BOOST_NO_MEMBER_TEMPLATE_FRIENDS Chris@16: template friend class permutation_iterator; Chris@16: #else Chris@16: public: Chris@101: #endif Chris@16: ElementIterator m_elt_iter; Chris@16: }; Chris@16: Chris@16: Chris@16: template Chris@101: inline permutation_iterator Chris@16: make_permutation_iterator( ElementIterator e, IndexIterator i ) Chris@16: { Chris@16: return permutation_iterator( e, i ); Chris@16: } Chris@16: Chris@101: } // namespace iterators Chris@101: Chris@101: using iterators::permutation_iterator; Chris@101: using iterators::make_permutation_iterator; Chris@16: Chris@16: } // namespace boost Chris@16: Chris@16: #endif