cascade_iterator.h 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. #pragma once
  2. #include <cstddef>
  3. #include <iterator/concepts.h>
  4. #include <iterator/detail/projection_tuple.h>
  5. #include <iterator/detail/recursive_expander.h>
  6. #include <iterator/end_aware_iterator.h>
  7. #include <iterator/forwards.h>
  8. #include <iterator/recursive_iterator.h>
  9. namespace iterator {
  10. template <typename It, typename Projs, typename MaxDepth>
  11. class cascade_iterator;
  12. template <typename It, typename... Projs, typename MaxDepth>
  13. class cascade_iterator<It, detail::Projections<Projs...>, MaxDepth>
  14. : public recursive_iterator_helper<It, MaxDepth,
  15. detail::Projections<Projs...>>::type,
  16. public facade<
  17. cascade_iterator<It, detail::Projections<Projs...>, MaxDepth>> {
  18. public:
  19. using sentinel_type = sentinel_t;
  20. public:
  21. cascade_iterator() = default;
  22. explicit cascade_iterator(Range auto & range, Projs... projs)
  23. : cascade_iterator(end_aware_iterator(range), projs...) {}
  24. explicit cascade_iterator(Range auto & range, MaxDepth, Projs... projs)
  25. : cascade_iterator(end_aware_iterator(range), projs...) {}
  26. explicit cascade_iterator(end_aware_iterator<It> iter, MaxDepth,
  27. Projs... projs)
  28. : cascade_iterator::recursive_iterator_base(iter, projs...) {}
  29. explicit cascade_iterator(end_aware_iterator<It> iter, Projs... projs)
  30. : cascade_iterator::recursive_iterator_base(iter, projs...) {}
  31. template <typename Ot>
  32. explicit cascade_iterator(end_aware_iterator<Ot> other, Projs... projs)
  33. : cascade_iterator(end_aware_iterator<It>(other), projs...) {}
  34. template <typename Ot>
  35. explicit cascade_iterator(end_aware_iterator<Ot> other, MaxDepth,
  36. Projs... projs)
  37. : cascade_iterator(end_aware_iterator<It>(other), projs...) {}
  38. };
  39. template <Range R, typename... Projs>
  40. cascade_iterator(R, Projs...)
  41. -> cascade_iterator<iterator_t<R>, detail::Projections<Projs...>,
  42. bounded<sizeof...(Projs) + 1>>;
  43. template <typename It, typename... Projs>
  44. cascade_iterator(end_aware_iterator<It>, Projs...)
  45. -> cascade_iterator<It, detail::Projections<Projs...>,
  46. bounded<sizeof...(Projs) + 1>>;
  47. template <Range R, typename... Projs, size_t N>
  48. requires(N > sizeof...(Projs))
  49. cascade_iterator(R, bounded<N>, Projs...)
  50. -> cascade_iterator<iterator_t<R>, detail::Projections<Projs...>,
  51. bounded<N>>;
  52. template <typename It, typename... Projs, size_t N>
  53. requires(N > sizeof...(Projs))
  54. cascade_iterator(end_aware_iterator<It>, bounded<N>, Projs...)
  55. -> cascade_iterator<It, detail::Projections<Projs...>, bounded<N>>;
  56. template <Range R, typename... Projs>
  57. cascade_iterator(R, unbounded, Projs...)
  58. -> cascade_iterator<iterator_t<R>, detail::Projections<Projs...>,
  59. unbounded>;
  60. template <typename It, typename... Projs>
  61. cascade_iterator(end_aware_iterator<It>, unbounded, Projs...)
  62. -> cascade_iterator<It, detail::Projections<Projs...>, unbounded>;
  63. }