18 #ifndef INCLUDE_RCF_TYPETRAITS_HPP 19 #define INCLUDE_RCF_TYPETRAITS_HPP 21 #include <type_traits> 25 typedef std::true_type TrueType;
26 typedef std::false_type FalseType;
28 template<
int N>
using Int = std::integral_constant<int, N>;
29 template<
bool B>
using Bool = std::integral_constant<bool, B>;
30 template<
typename C,
typename T1,
typename T2>
using If = std::conditional<C::value, T1, T2>;
35 template<
typename T1,
typename T2>
class AndImpl;
36 template<>
class AndImpl<TrueType, TrueType> :
public TrueType {};
37 template<>
class AndImpl<TrueType, FalseType> :
public FalseType {};
38 template<>
class AndImpl<FalseType, TrueType> :
public FalseType {};
39 template<>
class AndImpl<FalseType, FalseType> :
public FalseType {};
40 template<
typename T1,
typename T2>
class And :
public AndImpl<typename T1::type, typename T2::type> {};
45 template<
typename T1,
typename T2>
class OrImpl;
46 template<>
class OrImpl<TrueType, TrueType> :
public TrueType {};
47 template<>
class OrImpl<TrueType, FalseType> :
public FalseType {};
48 template<>
class OrImpl<FalseType, TrueType> :
public FalseType {};
49 template<>
class OrImpl<FalseType, FalseType> :
public FalseType {};
50 template<
typename T1,
typename T2>
class Or :
public OrImpl<typename T1::type, typename T2::type> {};
55 template<
typename T1>
class NotImpl;
56 template<>
class NotImpl<TrueType> :
public FalseType {};
57 template<>
class NotImpl<FalseType> :
public TrueType {};
58 template<
typename T1>
class Not :
public NotImpl<typename T1::type> {};
60 template<
typename T>
using IsFundamental = std::is_fundamental<T>;
61 template<
typename T>
using IsConst = std::is_const<T>;
62 template<
typename T>
using IsPointer = std::is_pointer<T>;
63 template<
typename T>
using IsReference = std::is_reference<T>;
64 template<
typename T>
using RemovePointer = std::remove_pointer<T>;
65 template<
typename T>
using RemoveReference = std::remove_reference<T>;
66 template<
typename T>
using RemoveCv = std::remove_cv<T>;
68 template<
typename T>
struct Out {};
70 template<
typename T>
struct RemoveOut {
typedef T type; };
71 template<
typename T>
struct RemoveOut< Out<T> > {
typedef T type; };
73 template<
typename T>
struct IsOut :
public RCF::FalseType {};
74 template<
typename T>
struct IsOut< Out<T> > {
75 typedef TrueType type;
76 enum { value = type::value };
81 #endif // ! INCLUDE_RCF_TYPETRAITS_HPP Definition: AmiIoHandler.hpp:23