Skip to content

Commit df22009

Browse files
authored
[embind] Use std::disjunction for checking policy arguments. (#22603)
This is a little cleaner than having to define a recursive template for each of these `is<SomePolicy>`. std::disjunction isn't available until c++17, so I also added a polyfill. I also changed conjunction to use std::conjunction when it is available and polyfill otherwise.
1 parent a756ff0 commit df22009

File tree

1 file changed

+23
-44
lines changed
  • system/include/emscripten

1 file changed

+23
-44
lines changed

system/include/emscripten/bind.h

Lines changed: 23 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -359,6 +359,27 @@ struct reference : public allow_raw_pointers {};
359359

360360
namespace 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+
362383
template<typename... Policies>
363384
struct isPolicy;
364385

@@ -428,40 +449,10 @@ struct GetReturnValuePolicy<ReturnType, T, Rest...> {
428449
};
429450

430451
template<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

448454
template<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-
1000979
class noncopyable {
1001980
protected:
1002981
noncopyable() {}

0 commit comments

Comments
 (0)