reverse_iterator.hpp 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  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_REVERSE_ITERATOR_23022003THW_HPP
  8. #define BOOST_REVERSE_ITERATOR_23022003THW_HPP
  9. #include <boost/iterator.hpp>
  10. #include <boost/utility.hpp>
  11. #include <boost/iterator/iterator_adaptor.hpp>
  12. namespace boost
  13. {
  14. //
  15. //
  16. //
  17. template <class Iterator>
  18. class reverse_iterator
  19. : public iterator_adaptor< reverse_iterator<Iterator>, Iterator >
  20. {
  21. typedef iterator_adaptor< reverse_iterator<Iterator>, Iterator > super_t;
  22. friend class iterator_core_access;
  23. public:
  24. reverse_iterator() {}
  25. explicit reverse_iterator(Iterator x)
  26. : super_t(x) {}
  27. template<class OtherIterator>
  28. reverse_iterator(
  29. reverse_iterator<OtherIterator> const& r
  30. , typename enable_if_convertible<OtherIterator, Iterator>::type* = 0
  31. )
  32. : super_t(r.base())
  33. {}
  34. private:
  35. typename super_t::reference dereference() const { return *boost::prior(this->base()); }
  36. void increment() { --this->base_reference(); }
  37. void decrement() { ++this->base_reference(); }
  38. void advance(typename super_t::difference_type n)
  39. {
  40. this->base_reference() += -n;
  41. }
  42. template <class OtherIterator>
  43. typename super_t::difference_type
  44. distance_to(reverse_iterator<OtherIterator> const& y) const
  45. {
  46. return this->base_reference() - y.base();
  47. }
  48. };
  49. template <class BidirectionalIterator>
  50. reverse_iterator<BidirectionalIterator> make_reverse_iterator(BidirectionalIterator x)
  51. {
  52. return reverse_iterator<BidirectionalIterator>(x);
  53. }
  54. } // namespace boost
  55. #endif // BOOST_REVERSE_ITERATOR_23022003THW_HPP