Rivet API documentation

Rivet 4.1.3
TypeTraits.hh
1// -*- C++ -*-
2#ifndef RIVET_TypeTraits_HH
3#define RIVET_TypeTraits_HH
4
5#include <iterator>
6#include <type_traits>
7
8namespace Rivet {
9
10
18
20
21 struct RefType { };
22
23 struct PtrType { };
24
25 template <typename T>
26 struct TypeTraits;
27
28 template <typename U>
29 struct TypeTraits<const U&> {
30 using ArgType = RefType;
31 };
32
33 template <typename U>
34 struct TypeTraits<const U*> {
35 using ArgType = PtrType;
36 };
37
38 template <typename T>
39 struct TypeIdentity {
40 using type = T;
41 };
42
43
45 template <typename T>
46 using sign_if_integral = std::conditional_t<(std::is_integral_v<T> && !std::is_same_v<T, bool>),
47 std::make_signed<T>,
48 TypeIdentity<T>>;
49 //
50 template <typename T>
51 using sign_if_integral_t = typename sign_if_integral<T>::type;
52
54 template <typename... Args>
55 using all_unsigned = std::conjunction<std::is_unsigned<Args>...>;
56
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>...>>;
62
63
65 template <typename T, typename = void>
66 struct Derefable : std::false_type { };
67 //
68 template <typename T>
69 struct Derefable<T, std::void_t<decltype(*std::declval<T>())>> : std::true_type { };
70
71
75 template <typename T, typename = void>
76 struct Iterable : std::false_type { };
77 //
78 template <typename T>
79 struct Iterable<T,
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 {
82 };
83
84 template <typename T>
85 inline constexpr bool is_iterable_v = Iterable<T>::value;
86
87 //template<typename... T>
88 //inline constexpr bool isIterable = std::conjunction<Iterable<T>...>::value;
89 template <typename T>
90 using isIterable = std::enable_if_t<Iterable<T>::value>;
91
92
93 // SFINAE struct to check for const_iterator concept
94 template <typename T, typename = void>
95 struct CIterable : std::false_type { };
96
97 template <typename T>
98 struct CIterable<T, std::void_t<decltype(std::declval<typename std::decay_t<T>::const_iterator>())>>
99 : std::true_type { };
100
101 template <typename T>
102 inline constexpr bool is_citerable_v = CIterable<T>::value;
103
104 //template<typename... T>
105 //inline constexpr bool isCIterable = std::conjunction<CIterable<T>...>::value;
106 template <typename... Args>
107 using isCIterable = std::enable_if_t<(CIterable<Args>::value && ...)>;
108
109 // SFINAE struct to check for cstr
110 template <typename T>
111 struct isCString : std::false_type { };
112
113 template <>
114 struct isCString<char[]> : std::true_type { };
115
116 template <size_t N>
117 struct isCString<char[N]> : std::true_type { };
118
119 template <typename T>
120 inline constexpr bool is_cstring_v = isCString<T>::value;
121
122
124 template <typename T, typename = void>
125 struct hasBinning : std::false_type { };
126 //
127 template <typename T>
128 struct hasBinning<T, std::void_t<decltype(std::declval<T>().binning())>> : std::true_type { };
129
130
132 template <typename T, typename = void>
133 struct isFillable : std::false_type { };
134 //
135 template <typename T>
136 struct isFillable<T, std::void_t<decltype(typename T::FillType{})>> : std::true_type { };
137
138
139 // SFINAE struct to check if U can be used as an argument of T
140 template <typename T, typename U, typename = void>
141 struct isArgumentOf : std::false_type { };
142 //
143 template <typename T, typename U>
144 struct isArgumentOf<T, U, std::void_t<decltype(T(std::declval<U>()))>> : std::true_type { };
145
147 template <typename T, typename... Us>
148 using allArgumentsOf = typename std::conjunction<isArgumentOf<T, Us>...>;
149
151 template <typename T, typename = void>
152 struct HasXYZ : std::false_type { };
153 template <typename T>
154 struct HasXYZ<T,
155 std::void_t<decltype(std::declval<T>().x() + std::declval<T>().y() + std::declval<T>().z())>>
156 : std::true_type { };
157
158
160 template <typename T, typename = void>
161 struct HasXYZT : std::false_type { };
162 template <typename T>
163 struct HasXYZT<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 { };
166
167
169
170}
171
172#endif
Definition LHCbCommon.hh:9