57using remove_cvref_t = std::remove_cv_t<std::remove_reference_t<T>>;
63using plain_ref_t = std::remove_cv_t<T>&;
68template<
class T> plain_ref_t<T> decl_plain_ref();
73template<
class T,
class=
void>
74struct get_is_bitwise : std::false_type {};
83 decltype(decl_plain_ref<T>() = std::declval<T>() | std::declval<T>()),
84 decltype(decl_plain_ref<T>() = std::declval<T>() & std::declval<T>()),
85 decltype(decl_plain_ref<T>() = std::declval<T>() ^ std::declval<T>()),
86 decltype(decl_plain_ref<T>() = ~ std::declval<T>())
89 :
public std::true_type {};
103static constexpr bool is_bitwise = get_is_bitwise<T>::value;
104#ifdef UGMISC_USE_CONCEPT_DECLS
119template<
class T,
class R=T>
using uint_only = std::enable_if_t<
120 std::numeric_limits<T>::is_integer
121 && ( ! std::numeric_limits<T>::is_signed ),
125#ifdef UGMISC_USE_CONCEPT_DECLS
133 std::numeric_limits<T>::is_integer
134 && ! std::numeric_limits<T>::is_signed
145 std::numeric_limits<T>::is_integer
146 && ( ! std::numeric_limits<T>::is_signed )
147 && std::numeric_limits<T>::is_modulo
148 && std::is_arithmetic_v<T>,
152#ifdef UGMISC_USE_CONCEPT_DECLS
160 Uint<T> && std::numeric_limits<T>::is_modulo
161 && std::is_arithmetic_v<T>
171template<
class T>
static constexpr bool is_bitwise_uint =
172 std::numeric_limits<T>::is_integer
173 && ( ! std::numeric_limits<T>::is_signed )
174 && ( std::numeric_limits<T>::radix == 2 )
175 && std::numeric_limits<T>::is_modulo
176 && std::is_arithmetic_v<T>
198#ifdef UGMISC_USE_CONCEPT_DECLS
214template<
class T,
class R=T>
using int_only = std::enable_if_t<
215 std::numeric_limits<T>::is_integer,
219#ifdef UGMISC_USE_CONCEPT_DECLS
226template<
class T>
concept Int = std::numeric_limits<T>::is_integer;
Definition sfinae_helpers.hpp:110
Definition sfinae_helpers.hpp:205
Definition sfinae_helpers.hpp:226
Definition sfinae_helpers.hpp:159
Definition sfinae_helpers.hpp:132
std::enable_if_t< std::numeric_limits< T >::is_integer, R > int_only
Definition sfinae_helpers.hpp:214
std::enable_if_t< std::numeric_limits< T >::is_integer &&(! std::numeric_limits< T >::is_signed), R > uint_only
Resolves to R if T is an unsigned integer.
Definition sfinae_helpers.hpp:119
std::enable_if_t< std::numeric_limits< T >::is_integer &&(! std::numeric_limits< T >::is_signed) &&std::numeric_limits< T >::is_modulo &&std::is_arithmetic_v< T >, R > modulo_uint_only
Resolves to R if T is an unsigned integer with modulo arithmetic.
Definition sfinae_helpers.hpp:144
std::enable_if_t< is_bitwise_uint< T >, R > bitwise_uint_only
Definition sfinae_helpers.hpp:194