@@ -359,6 +359,27 @@ struct reference : public allow_raw_pointers {};
359359
360360namespace internal {
361361
362+ #if __cplusplus >= 201703L
363+ template <typename ... Args> using conjunction = std::conjunction<Args...>;
364+ template <typename ... Args> using disjunction = std::disjunction<Args...>;
365+ #else
366+ // Helper available in C++14.
367+ template <bool _Test, class _T1 , class _T2 >
368+ using conditional_t = typename std::conditional<_Test, _T1, _T2>::type;
369+
370+ template <class ...> struct conjunction : std::true_type {};
371+ template <class B1 > struct conjunction <B1> : B1 {};
372+ template <class B1 , class ... Bn>
373+ struct conjunction <B1, Bn...>
374+ : conditional_t <bool (B1::value), conjunction<Bn...>, B1> {};
375+
376+ template <class ...> struct disjunction : std::false_type {};
377+ template <class B1 > struct disjunction <B1> : B1 {};
378+ template <class B1 , class ... Bn>
379+ struct disjunction <B1, Bn...>
380+ : conditional_t <bool (B1::value), disjunction<Bn...>, B1> {};
381+ #endif
382+
362383template <typename ... Policies>
363384struct isPolicy ;
364385
@@ -428,40 +449,10 @@ struct GetReturnValuePolicy<ReturnType, T, Rest...> {
428449};
429450
430451template <typename ... Policies>
431- struct isAsync ;
432-
433- template <typename ... Rest>
434- struct isAsync <async, Rest...> {
435- static constexpr bool value = true ;
436- };
437-
438- template <typename T, typename ... Rest>
439- struct isAsync <T, Rest...> {
440- static constexpr bool value = isAsync<Rest...>::value;
441- };
442-
443- template <>
444- struct isAsync <> {
445- static constexpr bool value = false ;
446- };
452+ using isAsync = disjunction<std::is_same<async, Policies>...>;
447453
448454template <typename ... Policies>
449- struct isNonnullReturn ;
450-
451- template <typename ... Rest>
452- struct isNonnullReturn <nonnull<ret_val>, Rest...> {
453- static constexpr bool value = true ;
454- };
455-
456- template <typename T, typename ... Rest>
457- struct isNonnullReturn <T, Rest...> {
458- static constexpr bool value = isNonnullReturn<Rest...>::value;
459- };
460-
461- template <>
462- struct isNonnullReturn <> {
463- static constexpr bool value = false ;
464- };
455+ using isNonnullReturn = disjunction<std::is_same<nonnull<ret_val>, Policies>...>;
465456
466457}
467458
@@ -985,18 +976,6 @@ struct SetterPolicy<PropertyTag<Setter, SetterArgumentType>> {
985976 }
986977};
987978
988- // Helper available in C++14.
989- template <bool _Test, class _T1 , class _T2 >
990- using conditional_t = typename std::conditional<_Test, _T1, _T2>::type;
991-
992- // Conjunction is available in C++17
993- template <class ...> struct conjunction : std::true_type {};
994- template <class B1 > struct conjunction <B1> : B1 {};
995- template <class B1 , class ... Bn>
996- struct conjunction <B1, Bn...>
997- : conditional_t <bool (B1::value), conjunction<Bn...>, B1> {};
998-
999-
1000979class noncopyable {
1001980protected:
1002981 noncopyable () {}
0 commit comments