end_aware_iterator.hpp 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. //
  2. // end_aware_iterator.hpp
  3. // iterator
  4. //
  5. // Created by Sam Jaffe on 2/7/17.
  6. //
  7. #pragma once
  8. #include <iterator>
  9. template <typename Iterator>
  10. class end_aware_iterator {
  11. public:
  12. using iter_type = Iterator;
  13. using value_type = typename std::iterator_traits<iter_type>::value_type;
  14. using reference = typename std::iterator_traits<iter_type>::reference;
  15. using pointer = typename std::iterator_traits<iter_type>::pointer;
  16. using difference_type = typename std::iterator_traits<iter_type>::difference_type;
  17. using iterator_category = std::forward_iterator_tag;
  18. public:
  19. end_aware_iterator(iter_type it, iter_type end) : curr_(it), end_(end) {}
  20. template <typename I>
  21. end_aware_iterator( end_aware_iterator<I> const & other )
  22. : curr_(other.current()), end_(other.end()) {
  23. }
  24. end_aware_iterator & operator++() {
  25. if ( !done() ) { ++curr_; }
  26. return *this;
  27. }
  28. end_aware_iterator operator++(int) {
  29. end_aware_iterator tmp{*this};
  30. operator++();
  31. return tmp;
  32. }
  33. reference operator*() { return *curr_; }
  34. pointer operator->() { return std::addressof(*curr_); }
  35. bool done() const { return curr_ == end_; }
  36. bool operator==(end_aware_iterator const & other) const {
  37. return curr_ == other.curr_ && end_ == other.end_;
  38. }
  39. bool operator!=(end_aware_iterator const & other) {
  40. return !(operator==(other));
  41. }
  42. iter_type current() const { return curr_; }
  43. iter_type end() const { return end_; }
  44. private:
  45. iter_type curr_, end_;
  46. };