#pragma once #include namespace iterator::recursive { // Type deduction guides for constructing recursive iterators. enum class recursion_type { END, THRU, ASSOC }; // Helpers for condensing type deductions template using value = decltype(std::begin(*std::declval())); template concept associative_value = std::is_const_v; template concept recursive_associative = associative_value && Range; template constexpr auto typeclass = recursive_associative ? recursion_type::ASSOC : (Range ? recursion_type::THRU : recursion_type::END); template constexpr auto iter_typeclass = typeclass>; }