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