#pragma once #include #include #include #include #include #include #include namespace iterator { template class ProjectingRecursiveIterator, MaxDepth> : public RecursiveHelper>::type, public Facade, MaxDepth>> { public: using sentinel_type = sentinel_t; public: ProjectingRecursiveIterator() = default; explicit ProjectingRecursiveIterator(Range auto & range, Projs... projs) : ProjectingRecursiveIterator(EndAwareIterator(range), projs...) {} explicit ProjectingRecursiveIterator(Range auto & range, MaxDepth, Projs... projs) : ProjectingRecursiveIterator(EndAwareIterator(range), projs...) {} explicit ProjectingRecursiveIterator(EndAwareIterator iter, MaxDepth, Projs... projs) : ProjectingRecursiveIterator::RecursiveBase(iter, projs...) {} explicit ProjectingRecursiveIterator(EndAwareIterator iter, Projs... projs) : ProjectingRecursiveIterator::RecursiveBase(iter, projs...) {} template explicit ProjectingRecursiveIterator(EndAwareIterator other, Projs... projs) : ProjectingRecursiveIterator(EndAwareIterator(other), projs...) {} template explicit ProjectingRecursiveIterator(EndAwareIterator other, MaxDepth, Projs... projs) : ProjectingRecursiveIterator(EndAwareIterator(other), projs...) {} }; template ProjectingRecursiveIterator(R, Projs...) -> ProjectingRecursiveIterator, detail::Projections, bounded>; template ProjectingRecursiveIterator(EndAwareIterator, Projs...) -> ProjectingRecursiveIterator, bounded>; template requires(N > sizeof...(Projs)) ProjectingRecursiveIterator(R, bounded, Projs...) -> ProjectingRecursiveIterator, detail::Projections, bounded>; template requires(N > sizeof...(Projs)) ProjectingRecursiveIterator(EndAwareIterator, bounded, Projs...) -> ProjectingRecursiveIterator, bounded>; template ProjectingRecursiveIterator(R, unbounded, Projs...) -> ProjectingRecursiveIterator, detail::Projections, unbounded>; template ProjectingRecursiveIterator(EndAwareIterator, unbounded, Projs...) -> ProjectingRecursiveIterator, unbounded>; }