end_aware_iterator.hpp 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  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_fwd.hpp"
  9. #include <iterator>
  10. namespace iterator {
  11. template <typename Iterator>
  12. class end_aware_iterator {
  13. public:
  14. using iter_type = Iterator;
  15. using value_type = typename std::iterator_traits<iter_type>::value_type;
  16. using reference = typename std::iterator_traits<iter_type>::reference;
  17. using pointer = typename std::iterator_traits<iter_type>::pointer;
  18. using difference_type = typename std::iterator_traits<iter_type>::difference_type;
  19. using iterator_category = std::forward_iterator_tag;
  20. public:
  21. end_aware_iterator() = default;
  22. end_aware_iterator(iter_type it, iter_type end) : curr_(it), end_(end) {}
  23. template <typename I>
  24. end_aware_iterator( end_aware_iterator<I> const & other )
  25. : curr_(other.current()), end_(other.end()) {
  26. }
  27. end_aware_iterator & operator++() {
  28. if ( !done() ) { ++curr_; }
  29. return *this;
  30. }
  31. end_aware_iterator operator++(int) {
  32. end_aware_iterator tmp{*this};
  33. operator++();
  34. return tmp;
  35. }
  36. reference operator*() { return *curr_; }
  37. pointer operator->() { return std::addressof(*curr_); }
  38. bool done() const { return curr_ == end_; }
  39. bool operator==(end_aware_iterator const & other) const {
  40. return curr_ == other.curr_ && end_ == other.end_;
  41. }
  42. bool operator!=(end_aware_iterator const & other) {
  43. return !(operator==(other));
  44. }
  45. iter_type current() const { return curr_; }
  46. iter_type end() const { return end_; }
  47. private:
  48. iter_type curr_, end_;
  49. };
  50. }