diff --git a/include/boost/iterator/permutation_iterator.hpp b/include/boost/iterator/permutation_iterator.hpp index eb15a5a..73447a3 100644 --- a/include/boost/iterator/permutation_iterator.hpp +++ b/include/boost/iterator/permutation_iterator.hpp @@ -5,8 +5,8 @@ // accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) -#ifndef BOOST_PERMUTATION_ITERATOR_HPP -#define BOOST_PERMUTATION_ITERATOR_HPP +#ifndef BOOST_ITERATOR_PERMUTATION_ITERATOR_HPP_INCLUDED_ +#define BOOST_ITERATOR_PERMUTATION_ITERATOR_HPP_INCLUDED_ #include @@ -17,54 +17,62 @@ namespace boost { namespace iterators { -template< class ElementIterator - , class IndexIterator> -class permutation_iterator - : public iterator_adaptor< - permutation_iterator - , IndexIterator, typename std::iterator_traits::value_type - , use_default, typename std::iterator_traits::reference> +template< typename ElementIterator, typename IndexIterator > +class permutation_iterator : + public iterator_adaptor< + permutation_iterator< ElementIterator, IndexIterator >, + IndexIterator, + typename std::iterator_traits< ElementIterator >::value_type, + use_default, + typename std::iterator_traits< ElementIterator >::reference + > { - typedef iterator_adaptor< - permutation_iterator - , IndexIterator, typename std::iterator_traits::value_type - , use_default, typename std::iterator_traits::reference> super_t; - - friend class iterator_core_access; - -public: - permutation_iterator() : m_elt_iter() {} - - explicit permutation_iterator(ElementIterator x, IndexIterator y) - : super_t(y), m_elt_iter(x) {} - - template - permutation_iterator( - permutation_iterator const& r - , typename enable_if_convertible::type* = 0 - , typename enable_if_convertible::type* = 0 - ) - : super_t(r.base()), m_elt_iter(r.m_elt_iter) - {} + friend class iterator_core_access; + template< typename, typename > + friend class permutation_iterator; private: - typename super_t::reference dereference() const - { return *(m_elt_iter + *this->base()); } + using super_t = iterator_adaptor< + permutation_iterator< ElementIterator, IndexIterator >, + IndexIterator, + typename std::iterator_traits< ElementIterator >::value_type, + use_default, + typename std::iterator_traits< ElementIterator >::reference + >; -#ifndef BOOST_NO_MEMBER_TEMPLATE_FRIENDS - template friend class permutation_iterator; -#else - public: -#endif +public: + permutation_iterator() : + m_elt_iter() + {} + + explicit permutation_iterator(ElementIterator x, IndexIterator y) : + super_t(y), + m_elt_iter(x) + {} + + template< + typename OtherElementIterator, + typename OtherIndexIterator, + typename = enable_if_convertible_t< OtherElementIterator, ElementIterator >, + typename = enable_if_convertible_t< OtherIndexIterator, IndexIterator > + > + permutation_iterator(permutation_iterator< OtherElementIterator, OtherIndexIterator > const& r) : + super_t(r.base()), + m_elt_iter(r.m_elt_iter) + {} + +private: + typename super_t::reference dereference() const { return *(m_elt_iter + *this->base()); } + +private: ElementIterator m_elt_iter; }; -template -inline permutation_iterator -make_permutation_iterator( ElementIterator e, IndexIterator i ) +template< typename ElementIterator, typename IndexIterator > +inline permutation_iterator< ElementIterator, IndexIterator > make_permutation_iterator(ElementIterator e, IndexIterator i) { - return permutation_iterator( e, i ); + return permutation_iterator< ElementIterator, IndexIterator >(e, i); } } // namespace iterators @@ -74,4 +82,4 @@ using iterators::make_permutation_iterator; } // namespace boost -#endif +#endif // BOOST_ITERATOR_PERMUTATION_ITERATOR_HPP_INCLUDED_