@@ -292,6 +292,32 @@ template <typename T> using type_identity_t = typename type_identity<T>::type;
292
292
template <typename T>
293
293
using underlying_t = typename std::underlying_type<T>::type;
294
294
295
+ template <typename ...>
296
+ struct disjunction ;
297
+ template <>
298
+ struct disjunction <> : std::false_type {};
299
+ template <typename P>
300
+ struct disjunction <P> : P {};
301
+ template <typename P1, typename P2>
302
+ struct disjunction <P1, P2> : std::conditional<P1::value, P1, P2>::type {};
303
+ template <typename P1, typename P2, typename P3, typename ... Pn>
304
+ struct disjunction <P1, P2, P3, Pn...>
305
+ : std::conditional<P1::value, P1, disjunction<P2, P3, Pn...>>::type {
306
+ };
307
+
308
+ template <typename ...>
309
+ struct conjunction ;
310
+ template <>
311
+ struct conjunction <> : std::true_type {};
312
+ template <typename P>
313
+ struct conjunction <P> : P {};
314
+ template <typename P1, typename P2>
315
+ struct conjunction <P1, P2> : std::conditional<P1::value, P2, P1>::type {};
316
+ template <typename P1, typename P2, typename P3, typename ... Pn>
317
+ struct conjunction <P1, P2, P3, Pn...>
318
+ : std::conditional<P1::value, conjunction<P2, P3, Pn...>, P1>::type {
319
+ };
320
+
295
321
struct monostate {
296
322
constexpr monostate () {}
297
323
};
0 commit comments