unkeyed_iterator.hpp 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. //
  2. // unkeyed_iterator.hpp
  3. // iterator
  4. //
  5. // Created by Sam Jaffe on 2/20/17.
  6. //
  7. #pragma once
  8. #include <iterator>
  9. namespace iterator {
  10. template <typename Iterator> class unkeyed_iterator {
  11. private:
  12. using impl_value_type = typename std::iterator_traits<Iterator>::value_type;
  13. using impl_reference = typename std::iterator_traits<Iterator>::reference;
  14. static constexpr std::size_t const value_index =
  15. std::tuple_size<impl_value_type>::value - 1;
  16. public:
  17. using value_type = typename std::remove_reference<decltype(
  18. std::get<value_index>(std::declval<impl_value_type>()))>::type;
  19. using reference =
  20. decltype(std::get<value_index>(std::declval<impl_reference>()));
  21. using pointer = value_type *;
  22. using difference_type =
  23. typename std::iterator_traits<Iterator>::difference_type;
  24. using iterator_category =
  25. typename std::iterator_traits<Iterator>::iterator_category;
  26. unkeyed_iterator() = default;
  27. unkeyed_iterator(Iterator it) : base(it) {}
  28. reference operator*() const { return std::get<value_index>(*base); }
  29. pointer operator->() const { return std::addressof(operator*()); }
  30. unkeyed_iterator & operator++() {
  31. ++base;
  32. return *this;
  33. }
  34. unkeyed_iterator operator++(int) {
  35. unkeyed_iterator tmp{*this};
  36. operator++();
  37. return tmp;
  38. }
  39. unkeyed_iterator & operator--() {
  40. --base;
  41. return *this;
  42. }
  43. unkeyed_iterator operator--(int) {
  44. unkeyed_iterator tmp{*this};
  45. operator--();
  46. return tmp;
  47. }
  48. unkeyed_iterator operator+(difference_type n) const {
  49. return unkeyed_iterator{*this} += n;
  50. }
  51. unkeyed_iterator & operator+=(difference_type n) {
  52. base += n;
  53. return *this;
  54. }
  55. unkeyed_iterator operator-(difference_type n) const {
  56. return unkeyed_iterator{*this} -= n;
  57. }
  58. unkeyed_iterator & operator-=(difference_type n) {
  59. base -= n;
  60. return *this;
  61. }
  62. bool operator==(unkeyed_iterator const & other) const {
  63. return base == other.base;
  64. }
  65. bool operator!=(unkeyed_iterator const & other) const {
  66. return base != other.base;
  67. }
  68. bool operator<(unkeyed_iterator const & other) const {
  69. return base < other.base;
  70. }
  71. bool operator<=(unkeyed_iterator const & other) const {
  72. return !(other < *this);
  73. }
  74. private:
  75. Iterator base;
  76. };
  77. }