5#ifndef UGMISC_SFINAE_HELPERS_HPP
6#define UGMISC_SFINAE_HELPERS_HPP
39using remove_cvref_t = std::remove_cv_t<std::remove_reference_t<T>>;
45using plain_ref_t = std::remove_cv_t<T>&;
50template<
class T> plain_ref_t<T> decl_plain_ref();
57template<
class T,
class=
void>
58struct get_is_bitwise : std::false_type {};
67 decltype(decl_plain_ref<T>() = std::declval<T>() | std::declval<T>()),
68 decltype(decl_plain_ref<T>() = std::declval<T>() & std::declval<T>()),
69 decltype(decl_plain_ref<T>() = std::declval<T>() ^ std::declval<T>()),
70 decltype(decl_plain_ref<T>() = ~ std::declval<T>())
73 :
public std::true_type {};
91static constexpr bool is_bitwise = _sfinae::get_is_bitwise<T>::value;
92#ifdef UGMISC_USE_CONCEPT_DECLS
107template<
class T,
class R=T>
using uint_only = std::enable_if_t<
108 std::numeric_limits<T>::is_integer
109 && ( ! std::numeric_limits<T>::is_signed ),
113#ifdef UGMISC_USE_CONCEPT_DECLS
121 std::numeric_limits<T>::is_integer
122 && ! std::numeric_limits<T>::is_signed
128# define UGMISC_UINT_RETURN(T, R) R requires ::ugmisc::Uint<T>
130# define UGMISC_UINT_RETURN(T, R) ::ugmisc::uint_only<T, R>
140 std::numeric_limits<T>::is_integer
141 && ( ! std::numeric_limits<T>::is_signed )
142 && std::numeric_limits<T>::is_modulo,
146#ifdef UGMISC_USE_CONCEPT_DECLS
154 Uint<T> && std::numeric_limits<T>::is_modulo;
163template<
class T>
static constexpr bool is_bitwise_uint =
164 std::numeric_limits<T>::is_integer
165 && ( ! std::numeric_limits<T>::is_signed )
166 && ( std::numeric_limits<T>::radix == 2 )
167 && std::numeric_limits<T>::is_modulo
189#ifdef UGMISC_USE_CONCEPT_DECLS
201# define UGMISC_BITWISE_UINT_RETURN(T, R) R requires ::ugmisc::BitwiseUint<T>
203# define UGMISC_BITWISE_UINT_RETURN(T, R) ::ugmisc::bitwise_uint_only<T, R>
212template<
class T,
class R=T>
using int_only = std::enable_if_t<
213 std::numeric_limits<T>::is_integer,
217#ifdef UGMISC_USE_CONCEPT_DECLS
224template<
class T>
concept Int = std::numeric_limits<T>::is_integer;
Definition sfinae_helpers.hpp:98
Definition sfinae_helpers.hpp:196
Definition sfinae_helpers.hpp:224
Definition sfinae_helpers.hpp:153
Definition sfinae_helpers.hpp:120
std::enable_if_t< std::numeric_limits< T >::is_integer, R > int_only
Definition sfinae_helpers.hpp:212
std::enable_if_t< std::numeric_limits< T >::is_integer &&(! std::numeric_limits< T >::is_signed) &&std::numeric_limits< T >::is_modulo, R > modulo_uint_only
Resolves to R if T is an unsigned integer with modulo arithmetic.
Definition sfinae_helpers.hpp:139
std::enable_if_t< is_bitwise_uint< T >, R > bitwise_uint_only
Definition sfinae_helpers.hpp:185
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:107