13#include <libassert/assert.hpp>
28constexpr bool in_range(
auto&& val,
auto&& low,
auto&& high) {
29 return val >= low && val <= high;
32template <
typename Type>
34 return static_cast<std::add_pointer_t<Type>
>((overloaded));
39template <
typename Ret,
typename... ExtraArgs>
41 return [&cfunc](
char c, ExtraArgs... other_args) -> Ret {
42 return static_cast<Ret
>(std::invoke(cfunc,
static_cast<unsigned char>(c), other_args...));
56 return c += (
'a' -
'A');
63 return c -= (
'a' -
'A');
69 return c >=
'0' && c <=
'9';
88 return c <=
'\x1F' || c ==
'\x7F';
100 return c ==
'\t' || c ==
' ';
117#define CCTYPE_IMPL(name, ret_type) \
118 constexpr ret_type name(char c) { \
119 if (std::is_constant_evaluated()) { \
120 return detail::cctype::name(c); \
122 return detail::cctype::make_safe_wrapper<ret_type>(std::name)(c); \
144 requires std::is_arithmetic_v<T>
146 if (std::is_constant_evaluated()) {
147 if constexpr (std::integral<T> && std::is_signed_v<T>) {
148 ASSERT(val != std::numeric_limits<T>::min(),
"abs of signed minimum would be UB");
150 return (val < 0 ? -val : val);
153 return std::abs(val);
156template <
typename BaseT, std::
unsigned_
integral ExpT>
157 requires std::is_arithmetic_v<BaseT>
158constexpr std::common_type_t<BaseT, ExpT>
pow(BaseT base, ExpT exp) {
159 if (std::is_constant_evaluated()) {
167 return std::pow(base, exp);
#define CCTYPE_IMPL(name, ret_type)
Definition cconstexpr.hpp:117
constexpr bool isupper(char c)
Definition cconstexpr.hpp:50
constexpr char tolower(char c)
Definition cconstexpr.hpp:54
constexpr bool isalnum(char c)
Definition cconstexpr.hpp:80
constexpr bool isprint(char c)
Definition cconstexpr.hpp:95
constexpr bool isalpha(char c)
Definition cconstexpr.hpp:76
constexpr bool isdigit(char c)
Definition cconstexpr.hpp:68
consteval auto make_safe_wrapper(int(&cfunc)(int, ExtraArgs...))
Definition cconstexpr.hpp:40
constexpr bool ispunct(char c)
Definition cconstexpr.hpp:107
constexpr bool isspace(char c)
Definition cconstexpr.hpp:103
constexpr bool isxdigit(char c)
Definition cconstexpr.hpp:72
constexpr bool isblank(char c)
Definition cconstexpr.hpp:99
constexpr bool isgraph(char c)
Definition cconstexpr.hpp:91
constexpr char toupper(char c)
Definition cconstexpr.hpp:61
constexpr bool islower(char c)
Definition cconstexpr.hpp:46
constexpr bool iscntrl(char c)
Definition cconstexpr.hpp:87
consteval decltype(auto) resolve_overload(auto &&overloaded)
Definition cconstexpr.hpp:33
constexpr bool in_range(auto &&val, auto &&low, auto &&high)
inclusive
Definition cconstexpr.hpp:28
Definition asm_buffer.hpp:20
constexpr T abs(T val)
Definition cconstexpr.hpp:145
constexpr std::common_type_t< BaseT, ExpT > pow(BaseT base, ExpT exp)
Definition cconstexpr.hpp:158