#pragma once #include #include #include #include #include #include #include namespace iterator { template class cascade_iterator; template class cascade_iterator, MaxDepth> : public recursive_iterator_helper>::type, public facade< cascade_iterator, MaxDepth>> { public: using sentinel_type = sentinel_t; public: cascade_iterator() = default; explicit cascade_iterator(Range auto & range, Projs... projs) : cascade_iterator(end_aware_iterator(range), projs...) {} explicit cascade_iterator(Range auto & range, MaxDepth, Projs... projs) : cascade_iterator(end_aware_iterator(range), projs...) {} explicit cascade_iterator(end_aware_iterator iter, MaxDepth, Projs... projs) : cascade_iterator::recursive_iterator_base(iter, projs...) {} explicit cascade_iterator(end_aware_iterator iter, Projs... projs) : cascade_iterator::recursive_iterator_base(iter, projs...) {} template explicit cascade_iterator(end_aware_iterator other, Projs... projs) : cascade_iterator(end_aware_iterator(other), projs...) {} template explicit cascade_iterator(end_aware_iterator other, MaxDepth, Projs... projs) : cascade_iterator(end_aware_iterator(other), projs...) {} }; template cascade_iterator(R, Projs...) -> cascade_iterator, detail::Projections, bounded>; template cascade_iterator(end_aware_iterator, Projs...) -> cascade_iterator, bounded>; template requires(N > sizeof...(Projs)) cascade_iterator(R, bounded, Projs...) -> cascade_iterator, detail::Projections, bounded>; template requires(N > sizeof...(Projs)) cascade_iterator(end_aware_iterator, bounded, Projs...) -> cascade_iterator, bounded>; template cascade_iterator(R, unbounded, Projs...) -> cascade_iterator, detail::Projections, unbounded>; template cascade_iterator(end_aware_iterator, unbounded, Projs...) -> cascade_iterator, unbounded>; }