recursive_iterator.hpp 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307
  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. struct terminal_layer_tag_t;
  12. struct continue_layer_tag_t;
  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. protected:
  18. using recursive_category = terminal_layer_tag_t;
  19. public:
  20. using super::super;
  21. };
  22. template <typename Iterator>
  23. 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> {
  24. private:
  25. using super = end_aware_iterator<Iterator>;
  26. using first_type = decltype((std::declval<Iterator>()->first));
  27. using second_type = decltype((std::declval<Iterator>()->second));
  28. protected:
  29. using recursive_category = continue_layer_tag_t;
  30. public:
  31. using value_type = std::tuple<first_type, second_type>;
  32. using reference = std::tuple<first_type &, second_type &>;
  33. public:
  34. reference operator*() {
  35. auto & pair = super::operator*();
  36. return std::tie(pair.first, pair.second);
  37. }
  38. using super::super;
  39. };
  40. template <typename Iterator, typename = void>
  41. class recursive_iterator_terminal : public recursive_iterator_base< Iterator > {
  42. private:
  43. using layer = recursive_iterator_base< Iterator >;
  44. public:
  45. recursive_iterator_terminal() = default;
  46. recursive_iterator_terminal(layer v) : layer(v) {}
  47. typename layer::reference operator*() {
  48. return layer::operator*();
  49. }
  50. typename layer::pointer operator->() {
  51. return layer::operator->();
  52. }
  53. protected:
  54. void next() {
  55. layer::operator++();
  56. }
  57. void assign(layer eat) {
  58. static_cast<layer&>(*this) = eat;
  59. }
  60. bool done() const { return layer::done(); }
  61. };
  62. template <typename Iterator, typename RecursiveIterator_NextLayer>
  63. class recursive_iterator_layer :
  64. public recursive_iterator_base< Iterator >,
  65. public RecursiveIterator_NextLayer {
  66. private:
  67. using next_layer = RecursiveIterator_NextLayer;
  68. using layer = recursive_iterator_base< Iterator >;
  69. protected:
  70. using recursive_category = continue_layer_tag_t;
  71. public:
  72. using value_type = typename next_layer::value_type;
  73. using reference = typename next_layer::reference;
  74. using pointer = typename next_layer::pointer;
  75. using difference_type = typename next_layer::difference_type;
  76. using iterator_category = typename next_layer::iterator_category;
  77. public:
  78. recursive_iterator_layer() = default;
  79. recursive_iterator_layer(layer v) : recursive_iterator_layer() {
  80. assign(v);
  81. }
  82. reference operator*() {
  83. return next_layer::operator*();
  84. }
  85. pointer operator->() {
  86. return next_layer::operator->();
  87. }
  88. bool operator==(recursive_iterator_layer const & other) const {
  89. return layer::operator==(other) && next_layer::operator==(other);
  90. }
  91. protected:
  92. void next() {
  93. layer & self = static_cast<layer&>(*this);
  94. next_layer::next();
  95. while ( next_layer::done() && !(++self).done() ) {
  96. next_layer::assign({ std::begin(*self), std::end(*self) });
  97. }
  98. }
  99. void assign(layer v) {
  100. static_cast<layer&>(*this) = v;
  101. if (!v.done()) {
  102. next_layer::assign({ std::begin(*v), std::end(*v) });
  103. }
  104. }
  105. bool done() const { return layer::done(); }
  106. };
  107. template <typename V, typename Tag>
  108. struct next_layer_type { using type = std::tuple<V>; };
  109. template <typename V>
  110. struct next_layer_type<V, continue_layer_tag_t> { using type = V; };
  111. template <typename Iterator, typename RecursiveIterator_NextLayer>
  112. class flatten_iterator_layer :
  113. recursive_iterator_base< Iterator >,
  114. RecursiveIterator_NextLayer {
  115. private:
  116. using next_layer = RecursiveIterator_NextLayer;
  117. using layer = recursive_iterator_base< Iterator >;
  118. using key_type = typename std::tuple_element<0, typename layer::value_type>::type;
  119. protected:
  120. using recursive_category = continue_layer_tag_t;
  121. using next_value_type = typename next_layer_type<typename next_layer::value_type, typename next_layer::recursive_category>::type;
  122. using next_reference = typename next_layer_type<typename next_layer::reference, typename next_layer::recursive_category>::type;
  123. public:
  124. using value_type = decltype(std::tuple_cat(std::make_tuple(std::declval<key_type>()),
  125. std::declval<next_value_type>()));
  126. using reference = decltype(std::tuple_cat(std::tie(std::declval<key_type>()),
  127. std::declval<next_reference>()));
  128. using pointer = void;
  129. using difference_type = typename next_layer::difference_type;
  130. using iterator_category = typename next_layer::iterator_category;
  131. public:
  132. flatten_iterator_layer() = default;
  133. flatten_iterator_layer(layer v) : flatten_iterator_layer() {
  134. assign(v);
  135. }
  136. reference operator*() {
  137. return std::tuple_cat(std::forward_as_tuple(std::get<0>(layer::operator*())),
  138. next_reference(next_layer::operator*()));
  139. }
  140. pointer operator->();
  141. // pointer operator->() {
  142. // return next_layer::operator->();
  143. // }
  144. bool operator==(flatten_iterator_layer const & other) const {
  145. return layer::operator==(other) && next_layer::operator==(other);
  146. }
  147. protected:
  148. void next() {
  149. layer & self = static_cast<layer&>(*this);
  150. next_layer::next();
  151. while ( next_layer::done() && !(++self).done() ) {
  152. next_layer::assign({ std::begin(self->second), std::end(self->second) });
  153. }
  154. }
  155. void assign(layer v) {
  156. static_cast<layer&>(*this) = v;
  157. if ( !v.done() ) {
  158. next_layer::assign({ std::begin(v->second), std::end(v->second) });
  159. }
  160. }
  161. bool done() const { return layer::done(); }
  162. };
  163. template <typename Iterator, std::size_t N, std::size_t Max, typename = void>
  164. class bounded_recursive_iterator_impl :
  165. public recursive_iterator_terminal< Iterator > {
  166. private:
  167. using super = recursive_iterator_terminal< Iterator >;
  168. public:
  169. using super::super;
  170. };
  171. template <typename Iterator, std::size_t N, std::size_t Max>
  172. class bounded_recursive_iterator_impl< Iterator, N, Max, typename std::enable_if<N < Max, typename void_t<value_iterator<Iterator>>::type>::type > :
  173. public recursive_iterator_layer< Iterator , bounded_recursive_iterator_impl< value_iterator<Iterator>, N+1, Max > > {
  174. private:
  175. using next_layer = bounded_recursive_iterator_impl< value_iterator<Iterator>, N+1, Max >;
  176. using super = recursive_iterator_layer< Iterator, next_layer >;
  177. public:
  178. using super::super;
  179. };
  180. template <typename Iterator, typename = void>
  181. class recursive_iterator_impl : public recursive_iterator_terminal< Iterator > {
  182. private:
  183. using super = recursive_iterator_terminal< Iterator >;
  184. public:
  185. using super::super;
  186. };
  187. template <typename Iterator>
  188. class recursive_iterator_impl< Iterator, typename void_t<value_iterator<Iterator>>::type > :
  189. public recursive_iterator_layer< Iterator, recursive_iterator_impl< value_iterator<Iterator> > > {
  190. private:
  191. using next_layer = recursive_iterator_impl< value_iterator<Iterator> >;
  192. using super = recursive_iterator_layer< Iterator, next_layer >;
  193. public:
  194. using super::super;
  195. };
  196. template <typename Iterator, std::size_t N, std::size_t Max>
  197. class bounded_recursive_iterator_impl< Iterator, N, Max, typename std::enable_if<N < Max, typename void_t<mapped_iterator<Iterator>>::type>::type > :
  198. public flatten_iterator_layer< Iterator , bounded_recursive_iterator_impl< mapped_iterator<Iterator>, N+1, Max > > {
  199. private:
  200. using next_layer = bounded_recursive_iterator_impl< mapped_iterator<Iterator>, N+1, Max >;
  201. using super = flatten_iterator_layer< Iterator, next_layer >;
  202. public:
  203. using super::super;
  204. };
  205. template <typename Iterator>
  206. class recursive_iterator_impl< Iterator, typename void_t<mapped_iterator<Iterator>>::type > :
  207. public flatten_iterator_layer< Iterator, recursive_iterator_impl< mapped_iterator<Iterator> > > {
  208. private:
  209. using next_layer = recursive_iterator_impl< mapped_iterator<Iterator> >;
  210. using super = flatten_iterator_layer< Iterator, next_layer >;
  211. public:
  212. using super::super;
  213. };
  214. }
  215. template <typename Iterator>
  216. class recursive_iterator : public detail::recursive_iterator_impl< Iterator > {
  217. private:
  218. using super = detail::recursive_iterator_impl< Iterator >;
  219. public:
  220. using super::super;
  221. recursive_iterator & operator++() {
  222. (void) super::next();
  223. return *this;
  224. }
  225. recursive_iterator operator++(int) {
  226. recursive_iterator tmp{*this};
  227. (void) super::next();
  228. return tmp;
  229. }
  230. bool operator!=(recursive_iterator const & other) { return !(super::operator==(other)); }
  231. };
  232. template <typename Iterator, std::size_t N>
  233. class recursive_iterator_n : public detail::bounded_recursive_iterator_impl< Iterator, 1, N > {
  234. private:
  235. using super = detail::bounded_recursive_iterator_impl< Iterator, 1, N >;
  236. public:
  237. using super::super;
  238. recursive_iterator_n & operator++() {
  239. (void) super::next();
  240. return *this;
  241. }
  242. recursive_iterator_n operator++(int) {
  243. recursive_iterator_n tmp{*this};
  244. (void) super::next();
  245. return tmp;
  246. }
  247. bool operator!=(recursive_iterator_n const & other) { return !(super::operator==(other)); }
  248. };
  249. }
  250. template <typename C>
  251. auto make_recursive_iterator(C & collect) -> iterator::recursive_iterator<decltype(std::begin(collect))> {
  252. return {{ std::begin(collect), std::end(collect) }};
  253. }
  254. template <typename C>
  255. auto make_recursive_iterator(C const & collect) -> iterator::recursive_iterator<decltype(std::begin(collect))> {
  256. return {{ std::begin(collect), std::end(collect) }};
  257. }
  258. template <std::size_t Max, typename C>
  259. auto make_recursive_iterator(C & collect) -> iterator::recursive_iterator_n<decltype(std::begin(collect)), Max> {
  260. return {{ std::begin(collect), std::end(collect) }};
  261. }
  262. template <std::size_t Max, typename C>
  263. auto make_recursive_iterator(C const & collect) -> iterator::recursive_iterator_n<decltype(std::begin(collect)), Max> {
  264. return {{ std::begin(collect), std::end(collect) }};
  265. }