Skip to content

Commit 5eeeb31

Browse files
committed
fmtlib#2954: Provide std::conjunction and std::disjunction substitutes
1 parent c12b4c0 commit 5eeeb31

File tree

1 file changed

+26
-0
lines changed

1 file changed

+26
-0
lines changed

include/fmt/core.h

+26
Original file line numberDiff line numberDiff line change
@@ -292,6 +292,32 @@ template <typename T> using type_identity_t = typename type_identity<T>::type;
292292
template <typename T>
293293
using underlying_t = typename std::underlying_type<T>::type;
294294

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+
295321
struct monostate {
296322
constexpr monostate() {}
297323
};

0 commit comments

Comments
 (0)