permutation_iterator.hpp 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. // (C) Copyright Toon Knapen 2001.
  2. // (C) Copyright David Abrahams 2003.
  3. // (C) Copyright Roland Richter 2003.
  4. // Distributed under the Boost Software License, Version 1.0. (See
  5. // accompanying file LICENSE_1_0.txt or copy at
  6. // http://www.boost.org/LICENSE_1_0.txt)
  7. #ifndef BOOST_ITERATOR_PERMUTATION_ITERATOR_HPP_INCLUDED_
  8. #define BOOST_ITERATOR_PERMUTATION_ITERATOR_HPP_INCLUDED_
  9. #include <iterator>
  10. #include <boost/core/use_default.hpp>
  11. #include <boost/iterator/iterator_adaptor.hpp>
  12. #include <boost/iterator/enable_if_convertible.hpp>
  13. namespace boost {
  14. namespace iterators {
  15. template< typename ElementIterator, typename IndexIterator >
  16. class permutation_iterator :
  17. public iterator_adaptor<
  18. permutation_iterator< ElementIterator, IndexIterator >,
  19. IndexIterator,
  20. typename std::iterator_traits< ElementIterator >::value_type,
  21. use_default,
  22. typename std::iterator_traits< ElementIterator >::reference
  23. >
  24. {
  25. friend class iterator_core_access;
  26. template< typename, typename >
  27. friend class permutation_iterator;
  28. private:
  29. using super_t = iterator_adaptor<
  30. permutation_iterator< ElementIterator, IndexIterator >,
  31. IndexIterator,
  32. typename std::iterator_traits< ElementIterator >::value_type,
  33. use_default,
  34. typename std::iterator_traits< ElementIterator >::reference
  35. >;
  36. public:
  37. permutation_iterator() :
  38. m_elt_iter()
  39. {}
  40. explicit permutation_iterator(ElementIterator x, IndexIterator y) :
  41. super_t(y),
  42. m_elt_iter(x)
  43. {}
  44. template<
  45. typename OtherElementIterator,
  46. typename OtherIndexIterator,
  47. typename = enable_if_convertible_t< OtherElementIterator, ElementIterator >,
  48. typename = enable_if_convertible_t< OtherIndexIterator, IndexIterator >
  49. >
  50. permutation_iterator(permutation_iterator< OtherElementIterator, OtherIndexIterator > const& r) :
  51. super_t(r.base()),
  52. m_elt_iter(r.m_elt_iter)
  53. {}
  54. private:
  55. typename super_t::reference dereference() const { return *(m_elt_iter + *this->base()); }
  56. private:
  57. ElementIterator m_elt_iter;
  58. };
  59. template< typename ElementIterator, typename IndexIterator >
  60. inline permutation_iterator< ElementIterator, IndexIterator > make_permutation_iterator(ElementIterator e, IndexIterator i)
  61. {
  62. return permutation_iterator< ElementIterator, IndexIterator >(e, i);
  63. }
  64. } // namespace iterators
  65. using iterators::permutation_iterator;
  66. using iterators::make_permutation_iterator;
  67. } // namespace boost
  68. #endif // BOOST_ITERATOR_PERMUTATION_ITERATOR_HPP_INCLUDED_