#pragma once #include #include namespace mcc::traits { template concept mcc_char_view = std::ranges::view && std::same_as, char>; // input range of char/const char template concept mcc_input_char_range = std::ranges::input_range && std::is_same_v>, CharT>; // output range of char/const char template concept mcc_output_char_range = std::ranges::output_range && std::same_as>, CharT>; template concept mcc_view_or_output_char_range = mcc_char_view || mcc_output_char_range; template concept mcc_range_of_input_char_range = std::ranges::range && traits::mcc_input_char_range>; // https://stackoverflow.com/questions/72430369/how-to-check-that-a-type-is-formattable-using-type-traits-concepts) template concept mcc_formattable = requires(T v, std::format_context ctx) { std::formatter>().format(v, ctx); }; } // namespace mcc::traits