1#ifndef NNGN_UTILS_CONCEPTS_FUNDAMENTAL_H
2#define NNGN_UTILS_CONCEPTS_FUNDAMENTAL_H
14 std::is_integral_v<T>;
20concept unsigned_integral =
22 std::is_integral_v<T> && !std::is_signed_v<T>;
24 std::unsigned_integral<T>;
28concept arithmetic = std::is_arithmetic_v<T>;
35 std::make_signed_t<std::remove_cv_t<T>>>;
38concept byte_type = std::is_same_v<std::byte, std::remove_cv_t<T>>;
41concept pointer = std::is_pointer_v<T>;
44concept byte_pointer = pointer<T> && (
45 byte_type<std::remove_pointer_t<T>>
46 || char_type<std::remove_pointer_t<T>>
50concept member_pointer = std::is_member_object_pointer_v<T>;
53concept function = std::is_function_v<T>;
56concept c_function_pointer =
58 && function<std::remove_pointer_t<T>>;
61concept member_function_pointer = std::is_member_function_pointer_v<T>;
64concept function_pointer = c_function_pointer<T> || member_function_pointer<T>;
67concept lvalue_ref = std::is_lvalue_reference_v<T>;
70concept rvalue_ref = std::is_rvalue_reference_v<T>;
73concept enum_ = std::is_enum_v<T>;
76concept c_enum = enum_<T> && std::convertible_to<T, int>;
79concept scoped_enum = enum_<T> && !std::convertible_to<T, int>;
86template<
typename R,
typename T,
typename ...Args>
88 std::convertible_to<
T, R(*)(Args...)>;
93concept stateless_lambda =
requires {
constexpr bool is_stateless_lambda
Definition: fundamental.h:84