recursive_iterator.hpp 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262
  1. //
  2. // recursive_iterator.hpp
  3. // iterator
  4. //
  5. // Created by Sam Jaffe on 2/17/17.
  6. //
  7. #pragma once
  8. #include "iterator_fwd.hpp"
  9. namespace iterator {
  10. namespace detail {
  11. // template <typename Iterator>
  12. // using recursive_iterator_base = end_aware_iterator< Iterator >;
  13. template <typename Iterator, typename = void>
  14. class recursive_iterator_base : public end_aware_iterator<Iterator> {
  15. private:
  16. using super = end_aware_iterator<Iterator>;
  17. public:
  18. using super::super;
  19. };
  20. template <typename Iterator>
  21. class recursive_iterator_base<Iterator, typename std::enable_if<std::is_const<typename end_aware_iterator<Iterator>::value_type::first_type>::value>::type> : public end_aware_iterator<Iterator> {
  22. private:
  23. using super = end_aware_iterator<Iterator>;
  24. using first_type = typename super::value_type::first_type;
  25. using second_type = typename super::value_type::second_type;
  26. public:
  27. using value_type = std::tuple<first_type, second_type>;
  28. using reference = std::tuple<first_type &, second_type &>;
  29. public:
  30. using super::super;
  31. };
  32. template <typename Iterator, typename = void>
  33. class recursive_iterator_terminal : public recursive_iterator_base< Iterator > {
  34. private:
  35. using layer = recursive_iterator_base< Iterator >;
  36. public:
  37. recursive_iterator_terminal() = default;
  38. recursive_iterator_terminal(layer v) : layer(v) {}
  39. typename layer::reference operator*() {
  40. return layer::operator*();
  41. }
  42. typename layer::pointer operator->() {
  43. return layer::operator->();
  44. }
  45. protected:
  46. void next() {
  47. layer::operator++();
  48. }
  49. void assign(layer eat) {
  50. static_cast<layer&>(*this) = eat;
  51. }
  52. bool done() const { return layer::done(); }
  53. };
  54. template <typename Iterator, typename RecursiveIterator_NextLayer>
  55. class recursive_iterator_layer :
  56. public recursive_iterator_base< Iterator >,
  57. public RecursiveIterator_NextLayer {
  58. private:
  59. using next_layer = RecursiveIterator_NextLayer;
  60. using layer = recursive_iterator_base< Iterator >;
  61. public:
  62. using value_type = typename next_layer::value_type;
  63. using reference = typename next_layer::reference;
  64. using pointer = typename next_layer::pointer;
  65. using difference_type = typename next_layer::difference_type;
  66. using iterator_category = typename next_layer::iterator_category;
  67. public:
  68. recursive_iterator_layer() = default;
  69. recursive_iterator_layer(layer v) : layer(v), next_layer() {
  70. if ( !v.done() ) {
  71. next_layer::assign({ std::begin(*v), std::end(*v) });
  72. }
  73. }
  74. reference operator*() {
  75. return next_layer::operator*();
  76. }
  77. pointer operator->() {
  78. return next_layer::operator->();
  79. }
  80. bool operator==(recursive_iterator_layer const & other) const {
  81. return layer::operator==(other) && next_layer::operator==(other);
  82. }
  83. protected:
  84. void next() {
  85. layer & self = static_cast<layer&>(*this);
  86. next_layer::next();
  87. while ( next_layer::done() && !(++self).done() ) {
  88. next_layer::assign({ std::begin(*self), std::end(*self) });
  89. }
  90. }
  91. void assign(layer eat) {
  92. static_cast<layer&>(*this) = eat;
  93. }
  94. bool done() const { return layer::done(); }
  95. };
  96. template <typename Iterator, typename RecursiveIterator_NextLayer>
  97. class flatten_iterator_layer :
  98. recursive_iterator_base< Iterator >,
  99. RecursiveIterator_NextLayer {
  100. private:
  101. using next_layer = RecursiveIterator_NextLayer;
  102. using layer = recursive_iterator_base< Iterator >;
  103. using key_type = typename std::tuple_element<0, typename layer::value_type>::type;
  104. public:
  105. using value_type = decltype(std::tuple_cat(std::make_tuple(std::declval<key_type>()), std::declval<typename next_layer::value_type>()));
  106. using reference = decltype(std::tuple_cat(std::tie(std::declval<key_type>()), std::declval<typename next_layer::reference>()));
  107. using pointer = void;
  108. using difference_type = typename next_layer::difference_type;
  109. using iterator_category = typename next_layer::iterator_category;
  110. public:
  111. flatten_iterator_layer() = default;
  112. flatten_iterator_layer(layer v) : layer(v), next_layer() {
  113. if ( !v.done() ) {
  114. next_layer::assign({ std::begin(v->second), std::end(v->second) });
  115. }
  116. }
  117. reference operator*() {
  118. return std::tuple_cat(std::forward_as_tuple(layer::operator*().first), next_layer::operator*());
  119. }
  120. pointer operator->();
  121. // pointer operator->() {
  122. // return next_layer::operator->();
  123. // }
  124. bool operator==(flatten_iterator_layer const & other) const {
  125. return layer::operator==(other) && next_layer::operator==(other);
  126. }
  127. protected:
  128. void next() {
  129. layer & self = static_cast<layer&>(*this);
  130. next_layer::next();
  131. while ( next_layer::done() && !(++self).done() ) {
  132. next_layer::assign({ std::begin(self->second), std::end(self->second) });
  133. }
  134. }
  135. void assign(layer eat) {
  136. static_cast<layer&>(*this) = eat;
  137. }
  138. bool done() const { return layer::done(); }
  139. };
  140. template <typename Iterator, std::size_t N, std::size_t Max, typename = void>
  141. class bounded_recursive_iterator_impl :
  142. public recursive_iterator_terminal< Iterator > {
  143. private:
  144. using super = recursive_iterator_terminal< Iterator >;
  145. public:
  146. using super::super;
  147. };
  148. template <typename Iterator, std::size_t N, std::size_t Max>
  149. class bounded_recursive_iterator_impl< Iterator, N, Max, typename std::enable_if<N < Max, typename void_t<value_iterator<Iterator>>::type>::type > :
  150. public recursive_iterator_layer< Iterator , bounded_recursive_iterator_impl< value_iterator<Iterator>, N+1, Max > > {
  151. private:
  152. using next_layer = bounded_recursive_iterator_impl< value_iterator<Iterator>, N+1, Max >;
  153. using super = recursive_iterator_layer< Iterator, next_layer >;
  154. public:
  155. using super::super;
  156. };
  157. template <typename Iterator, typename = void>
  158. class recursive_iterator_impl : public recursive_iterator_terminal< Iterator > {
  159. private:
  160. using super = recursive_iterator_terminal< Iterator >;
  161. public:
  162. using super::super;
  163. };
  164. template <typename Iterator>
  165. class recursive_iterator_impl< Iterator, typename void_t<value_iterator<Iterator>>::type > :
  166. public recursive_iterator_layer< Iterator, recursive_iterator_impl< value_iterator<Iterator> > > {
  167. private:
  168. using next_layer = recursive_iterator_impl< value_iterator<Iterator> >;
  169. using super = recursive_iterator_layer< Iterator, next_layer >;
  170. public:
  171. using super::super;
  172. };
  173. template <typename Iterator, std::size_t N, std::size_t Max>
  174. class bounded_recursive_iterator_impl< Iterator, N, Max, typename std::enable_if<N < Max, typename void_t<mapped_iterator<Iterator>>::type>::type > :
  175. public flatten_iterator_layer< Iterator , bounded_recursive_iterator_impl< mapped_iterator<Iterator>, N+1, Max > > {
  176. private:
  177. using next_layer = bounded_recursive_iterator_impl< mapped_iterator<Iterator>, N+1, Max >;
  178. using super = flatten_iterator_layer< Iterator, next_layer >;
  179. public:
  180. using super::super;
  181. };
  182. template <typename Iterator>
  183. class recursive_iterator_impl< Iterator, typename void_t<mapped_iterator<Iterator>>::type > :
  184. public flatten_iterator_layer< Iterator, recursive_iterator_impl< mapped_iterator<Iterator> > > {
  185. private:
  186. using next_layer = recursive_iterator_impl< mapped_iterator<Iterator> >;
  187. using super = flatten_iterator_layer< Iterator, next_layer >;
  188. public:
  189. using super::super;
  190. };
  191. }
  192. template <typename Iterator>
  193. class recursive_iterator : public detail::recursive_iterator_impl< Iterator > {
  194. private:
  195. using super = detail::recursive_iterator_impl< Iterator >;
  196. public:
  197. using super::super;
  198. recursive_iterator & operator++() {
  199. (void) super::next();
  200. return *this;
  201. }
  202. recursive_iterator operator++(int) {
  203. recursive_iterator tmp{*this};
  204. (void) super::next();
  205. return tmp;
  206. }
  207. bool operator!=(recursive_iterator const & other) { return !(operator==(other)); }
  208. };
  209. template <typename Iterator, std::size_t N>
  210. class recursive_iterator_n : public detail::bounded_recursive_iterator_impl< Iterator, 1, N > {
  211. private:
  212. using super = detail::bounded_recursive_iterator_impl< Iterator, 1, N >;
  213. public:
  214. using super::super;
  215. recursive_iterator_n & operator++() {
  216. (void) super::next();
  217. return *this;
  218. }
  219. recursive_iterator_n operator++(int) {
  220. recursive_iterator_n tmp{*this};
  221. (void) super::next();
  222. return tmp;
  223. }
  224. bool operator!=(recursive_iterator_n const & other) { return !(operator==(other)); }
  225. };
  226. }