#pragma once #include #include namespace clice { namespace ranges = std::ranges; namespace views = std::views; enum class RangeKind { Map = 0, Set, Sequence, Invalid, }; template constexpr inline RangeKind range_kind = [] { if constexpr(std::same_as>>) { return RangeKind::Invalid; } else if constexpr(requires { typename Range::key_type; }) { if constexpr(requires { typename Range::mapped_type; }) { return RangeKind::Map; } else { return RangeKind::Set; } } else { return RangeKind::Sequence; } }(); template concept map_range = ranges::input_range && range_kind == RangeKind::Map; template concept set_range = ranges::input_range && range_kind == RangeKind::Set; template concept sequence_range = ranges::input_range && range_kind == RangeKind::Sequence; } // namespace clice