forked from boostorg/iterator
		
	
		
			
				
	
	
		
			73 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			73 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
// (C) Copyright Toon Knapen    2001.
 | 
						|
// (C) Copyright David Abrahams 2003.
 | 
						|
// (C) Copyright Roland Richter 2003.
 | 
						|
// Distributed under the Boost Software License, Version 1.0. (See
 | 
						|
// 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
 | 
						|
 | 
						|
#include <iterator>
 | 
						|
 | 
						|
#include <boost/iterator/iterator_adaptor.hpp>
 | 
						|
 | 
						|
 | 
						|
namespace boost
 | 
						|
{
 | 
						|
 | 
						|
template< class ElementIterator
 | 
						|
        , class IndexIterator>
 | 
						|
class permutation_iterator
 | 
						|
  : public iterator_adaptor< 
 | 
						|
             permutation_iterator<ElementIterator, IndexIterator>
 | 
						|
           , IndexIterator, typename detail::iterator_traits<ElementIterator>::value_type
 | 
						|
           , use_default, typename detail::iterator_traits<ElementIterator>::reference>
 | 
						|
{
 | 
						|
  typedef iterator_adaptor< 
 | 
						|
            permutation_iterator<ElementIterator, IndexIterator>
 | 
						|
          , IndexIterator, typename detail::iterator_traits<ElementIterator>::value_type
 | 
						|
          , use_default, typename detail::iterator_traits<ElementIterator>::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<class OtherElementIterator, class OtherIndexIterator>
 | 
						|
  permutation_iterator(
 | 
						|
      permutation_iterator<OtherElementIterator, OtherIndexIterator> const& r
 | 
						|
      , typename enable_if_convertible<OtherElementIterator, ElementIterator>::type* = 0
 | 
						|
      , typename enable_if_convertible<OtherIndexIterator, IndexIterator>::type* = 0
 | 
						|
      )
 | 
						|
    : super_t(r.base()), m_elt_iter(r.m_elt_iter)
 | 
						|
  {}
 | 
						|
 | 
						|
private:
 | 
						|
    typename super_t::reference dereference() const
 | 
						|
        { return *(m_elt_iter + *this->base()); }
 | 
						|
 | 
						|
#ifndef BOOST_NO_MEMBER_TEMPLATE_FRIENDS
 | 
						|
    template <class,class> friend class permutation_iterator;
 | 
						|
#else
 | 
						|
 public:
 | 
						|
#endif 
 | 
						|
    ElementIterator m_elt_iter;
 | 
						|
};
 | 
						|
 | 
						|
 | 
						|
template <class ElementIterator, class IndexIterator>
 | 
						|
permutation_iterator<ElementIterator, IndexIterator> 
 | 
						|
make_permutation_iterator( ElementIterator e, IndexIterator i )
 | 
						|
{
 | 
						|
    return permutation_iterator<ElementIterator, IndexIterator>( e, i );
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
} // namespace boost
 | 
						|
 | 
						|
#endif
 |