2#ifndef RIVET_TypeTraits_HH
3#define RIVET_TypeTraits_HH
29 struct TypeTraits<const U&> {
30 using ArgType = RefType;
34 struct TypeTraits<const U*> {
35 using ArgType = PtrType;
46 using sign_if_integral = std::conditional_t<(std::is_integral_v<T> && !std::is_same_v<T, bool>),
51 using sign_if_integral_t =
typename sign_if_integral<T>::type;
54 template <
typename... Args>
55 using all_unsigned = std::conjunction<std::is_unsigned<Args>...>;
58 template <
typename... Args>
59 using signed_if_mixed_t = std::conditional_t<all_unsigned<Args...>::value,
60 std::common_type_t<Args...>,
61 std::common_type_t<sign_if_integral_t<Args>...>>;
65 template <
typename T,
typename =
void>
66 struct Derefable : std::false_type { };
69 struct Derefable<T, std::void_t<decltype(*std::declval<T>())>> : std::true_type { };
75 template <
typename T,
typename =
void>
76 struct Iterable : std::false_type { };
80 std::void_t<std::decay_t<decltype(std::begin(std::declval<const T&>()))>,
81 std::decay_t<decltype(std::end(std::declval<const T&>()))>>> : std::true_type {
85 inline constexpr bool is_iterable_v = Iterable<T>::value;
90 using isIterable = std::enable_if_t<Iterable<T>::value>;
94 template <
typename T,
typename =
void>
95 struct CIterable : std::false_type { };
98 struct CIterable<T, std::void_t<decltype(std::declval<typename std::decay_t<T>::const_iterator>())>>
101 template <
typename T>
102 inline constexpr bool is_citerable_v = CIterable<T>::value;
106 template <
typename... Args>
107 using isCIterable = std::enable_if_t<(CIterable<Args>::value && ...)>;
110 template <
typename T>
111 struct isCString : std::false_type { };
114 struct isCString<char[]> : std::true_type { };
117 struct isCString<char[N]> : std::true_type { };
119 template <
typename T>
120 inline constexpr bool is_cstring_v = isCString<T>::value;
124 template <
typename T,
typename =
void>
125 struct hasBinning : std::false_type { };
127 template <
typename T>
128 struct hasBinning<T, std::void_t<decltype(std::declval<T>().binning())>> : std::true_type { };
132 template <
typename T,
typename =
void>
133 struct isFillable : std::false_type { };
135 template <
typename T>
136 struct isFillable<T, std::void_t<decltype(typename T::FillType{})>> : std::true_type { };
140 template <
typename T,
typename U,
typename =
void>
141 struct isArgumentOf : std::false_type { };
143 template <
typename T,
typename U>
144 struct isArgumentOf<T, U, std::void_t<decltype(T(std::declval<U>()))>> : std::true_type { };
147 template <
typename T,
typename... Us>
148 using allArgumentsOf =
typename std::conjunction<isArgumentOf<T, Us>...>;
151 template <
typename T,
typename =
void>
152 struct HasXYZ : std::false_type { };
153 template <
typename T>
155 std::void_t<decltype(std::declval<T>().x() + std::declval<T>().y() + std::declval<T>().z())>>
156 : std::true_type { };
160 template <
typename T,
typename =
void>
161 struct HasXYZT : std::false_type { };
162 template <
typename T>
164 std::void_t<decltype(std::declval<T>().x() + std::declval<T>().y() + std::declval<T>().z()
165 + std::declval<T>().t())>> : std::true_type { };
Definition LHCbCommon.hh:9