reverse_iterator.hpp 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. // (C) Copyright David Abrahams 2002.
  2. // (C) Copyright Jeremy Siek 2002.
  3. // (C) Copyright Thomas Witt 2002.
  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_REVERSE_ITERATOR_23022003THW_HPP
  8. #define BOOST_ITERATOR_REVERSE_ITERATOR_23022003THW_HPP
  9. #include <boost/iterator/iterator_adaptor.hpp>
  10. #include <boost/iterator/enable_if_convertible.hpp>
  11. namespace boost {
  12. namespace iterators {
  13. template< typename Iterator >
  14. class reverse_iterator :
  15. public iterator_adaptor< reverse_iterator< Iterator >, Iterator >
  16. {
  17. friend class iterator_core_access;
  18. private:
  19. using super_t = iterator_adaptor< reverse_iterator< Iterator >, Iterator >;
  20. public:
  21. reverse_iterator() = default;
  22. explicit reverse_iterator(Iterator x) :
  23. super_t(x)
  24. {}
  25. template<
  26. typename OtherIterator,
  27. typename = enable_if_convertible_t< OtherIterator, Iterator >
  28. >
  29. reverse_iterator(reverse_iterator< OtherIterator > const& r) :
  30. super_t(r.base())
  31. {}
  32. private:
  33. typename super_t::reference dereference() const
  34. {
  35. Iterator it = this->base_reference();
  36. --it;
  37. return *it;
  38. }
  39. void increment() { --this->base_reference(); }
  40. void decrement() { ++this->base_reference(); }
  41. void advance(typename super_t::difference_type n)
  42. {
  43. this->base_reference() -= n;
  44. }
  45. template< typename OtherIterator >
  46. typename super_t::difference_type distance_to(reverse_iterator< OtherIterator > const& y) const
  47. {
  48. return this->base_reference() - y.base();
  49. }
  50. };
  51. template< typename Iterator >
  52. inline reverse_iterator< Iterator > make_reverse_iterator(Iterator x)
  53. {
  54. return reverse_iterator< Iterator >(x);
  55. }
  56. } // namespace iterators
  57. using iterators::reverse_iterator;
  58. using iterators::make_reverse_iterator;
  59. } // namespace boost
  60. #endif // BOOST_ITERATOR_REVERSE_ITERATOR_23022003THW_HPP