maomao90's Library
A C++20 library for competitive programming.
Loading...
Searching...
No Matches
type_traits.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <limits>
4#include <type_traits>
5#include <utility>
6
8using namespace std;
9#define ENABLE_VALUE(x) template <typename T> constexpr bool x##_v = x<T>::value
10#define ENABLE_TYPE(x) template <typename T> using x##_t = typename x<T>::type
11
12template <typename T>
13using is_broadly_signed = disjunction<is_signed<T>, is_same<T, __int128>>;
15
16template <typename T>
18 disjunction<is_unsigned<T>, is_same<T, unsigned __int128>>;
20
21template <typename T>
22using is_broadly_integral = disjunction<is_integral<T>, is_same<T, __int128>,
23 is_same<T, unsigned __int128>>;
25
26template <typename T>
28 conjunction<is_broadly_signed<T>, is_broadly_integral<T>>;
30
31template <typename T>
33 conjunction<is_broadly_unsigned<T>, is_broadly_integral<T>>;
35
36template <typename T>
37using is_32bit_or_less = bool_constant<numeric_limits<T>::max() <=
38 numeric_limits<unsigned int>::max()>;
40
41template <typename T>
43 bool_constant<numeric_limits<T>::max() <=
44 numeric_limits<unsigned long long>::max()>;
46
47template <typename T>
49 conditional<is_32bit_or_less_v<T>, unsigned long long, unsigned __int128>;
51
52template <typename T>
54 conditional<is_32bit_or_less_v<T>, long long, __int128>;
56
57template <typename T>
59 conditional<is_signed_v<T>, safely_multipliable_signed_t<T>,
60 safely_multipliable_unsigned_t<T>>;
62
63template <typename> struct is_pair : false_type {};
64template <typename T, typename U> struct is_pair<pair<T, U>> : true_type {};
66
67#undef ENABLE_VALUE
68#undef ENABLE_TYPE
69} // namespace maomao90::internal::type_traits
Definition type_traits.hpp:7
bool_constant< numeric_limits< T >::max()<= numeric_limits< unsigned int >::max()> is_32bit_or_less
Definition type_traits.hpp:37
bool_constant< numeric_limits< T >::max()<= numeric_limits< unsigned long long >::max()> is_64bit_or_less
Definition type_traits.hpp:42
conjunction< is_broadly_signed< T >, is_broadly_integral< T > > is_broadly_signed_integral
Definition type_traits.hpp:27
conditional< is_32bit_or_less_v< T >, unsigned long long, unsigned __int128 > safely_multipliable_unsigned
Definition type_traits.hpp:48
disjunction< is_integral< T >, is_same< T, __int128 >, is_same< T, unsigned __int128 > > is_broadly_integral
Definition type_traits.hpp:22
conditional< is_signed_v< T >, safely_multipliable_signed_t< T >, safely_multipliable_unsigned_t< T > > safely_multipliable
Definition type_traits.hpp:58
conjunction< is_broadly_unsigned< T >, is_broadly_integral< T > > is_broadly_unsigned_integral
Definition type_traits.hpp:32
disjunction< is_signed< T >, is_same< T, __int128 > > is_broadly_signed
Definition type_traits.hpp:13
disjunction< is_unsigned< T >, is_same< T, unsigned __int128 > > is_broadly_unsigned
Definition type_traits.hpp:17
conditional< is_32bit_or_less_v< T >, long long, __int128 > safely_multipliable_signed
Definition type_traits.hpp:53
Definition type_traits.hpp:63
#define ENABLE_TYPE(x)
Definition type_traits.hpp:10
#define ENABLE_VALUE(x)
Definition type_traits.hpp:9