18 #include <type_traits> 21 #define __has_builtin(x) 0 26 #if defined(__clang__) && not defined(__APPLE__) 27 #define PUSHMI_PP_IGNORE_CXX2A_COMPAT_BEGIN \ 28 _Pragma("GCC diagnostic push") \ 29 _Pragma("GCC diagnostic ignored \"-Wunknown-pragmas\"") \ 30 _Pragma("GCC diagnostic ignored \"-Wpragmas\"") \ 31 _Pragma("GCC diagnostic ignored \"-Wc++2a-compat\"") \ 32 _Pragma("GCC diagnostic ignored \"-Wfloat-equal\"") \ 34 #define PUSHMI_PP_IGNORE_CXX2A_COMPAT_END \ 35 _Pragma("GCC diagnostic pop") 36 #elif defined(__clang__) && defined(__APPLE__) 37 #define PUSHMI_PP_IGNORE_CXX2A_COMPAT_BEGIN \ 38 _Pragma("GCC diagnostic push") \ 39 _Pragma("GCC diagnostic ignored \"-Wunknown-pragmas\"") \ 40 _Pragma("GCC diagnostic ignored \"-Wpragmas\"") \ 41 _Pragma("GCC diagnostic ignored \"-Wfloat-equal\"") \ 43 #define PUSHMI_PP_IGNORE_CXX2A_COMPAT_END \ 44 _Pragma("GCC diagnostic pop") 47 #define PUSHMI_PP_IGNORE_CXX2A_COMPAT_BEGIN 48 #define PUSHMI_PP_IGNORE_CXX2A_COMPAT_END 57 #if __cpp_inline_variables >= 201606 58 #define PUSHMI_INLINE_VAR inline 60 #define PUSHMI_INLINE_VAR 64 #define PUSHMI_PP_IS_SAME(...) __is_same(__VA_ARGS__) 65 #elif defined(__GNUC__) && __GNUC__ >= 6 && !defined(__NVCC__) 66 #define PUSHMI_PP_IS_SAME(...) __is_same_as(__VA_ARGS__) 68 #define PUSHMI_PP_IS_SAME(...) std::is_same<__VA_ARGS__>::value 72 #define PUSHMI_PP_IS_CONSTRUCTIBLE(...) __is_constructible(__VA_ARGS__) 73 #elif defined(__GNUC__) && __GNUC__ >= 8 74 #define PUSHMI_PP_IS_CONSTRUCTIBLE(...) __is_constructible(__VA_ARGS__) 76 #define PUSHMI_PP_IS_CONSTRUCTIBLE(...) std::is_constructible<__VA_ARGS__>::value 79 #if __COUNTER__ != __COUNTER__ 80 #define PUSHMI_COUNTER __COUNTER__ 82 #define PUSHMI_COUNTER __LINE__ 85 #define PUSHMI_PP_CHECK(...) PUSHMI_PP_CHECK_N(__VA_ARGS__, 0,) 86 #define PUSHMI_PP_CHECK_N(x, n, ...) n 87 #define PUSHMI_PP_PROBE(x) x, 1, 90 #ifndef PUSHMI_CXX_VA_OPT 91 #if __cplusplus > 201703L 92 #define PUSHMI_CXX_VA_OPT_(...) PUSHMI_PP_CHECK(__VA_OPT__(,) 1) 93 #define PUSHMI_CXX_VA_OPT PUSHMI_CXX_VA_OPT_(~) 95 #define PUSHMI_CXX_VA_OPT 0 97 #endif // PUSHMI_CXX_VA_OPT 99 #define PUSHMI_PP_CAT_(X, ...) X ## __VA_ARGS__ 100 #define PUSHMI_PP_CAT(X, ...) PUSHMI_PP_CAT_(X, __VA_ARGS__) 101 #define PUSHMI_PP_CAT2_(X, ...) X ## __VA_ARGS__ 102 #define PUSHMI_PP_CAT2(X, ...) PUSHMI_PP_CAT2_(X, __VA_ARGS__) 104 #define PUSHMI_PP_EVAL(X, ...) X(__VA_ARGS__) 105 #define PUSHMI_PP_EVAL2(X, ...) X(__VA_ARGS__) 107 #define PUSHMI_PP_EXPAND(...) __VA_ARGS__ 108 #define PUSHMI_PP_EAT(...) 110 #define PUSHMI_PP_IS_PAREN(x) PUSHMI_PP_CHECK(PUSHMI_PP_IS_PAREN_PROBE x) 111 #define PUSHMI_PP_IS_PAREN_PROBE(...) PUSHMI_PP_PROBE(~) 113 #define PUSHMI_PP_COUNT(...) \ 114 PUSHMI_PP_COUNT_(__VA_ARGS__, \ 115 50,49,48,47,46,45,44,43,42,41,40,39,38,37,36,35,34,33,32,31, \ 116 30,29,28,27,26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11, \ 117 10,9,8,7,6,5,4,3,2,1,) \ 119 #define PUSHMI_PP_COUNT_( \ 120 _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, \ 121 _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, \ 122 _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, \ 123 _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, \ 124 _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, N, ...) \ 128 #define PUSHMI_PP_IIF(BIT) PUSHMI_PP_CAT_(PUSHMI_PP_IIF_, BIT) 129 #define PUSHMI_PP_IIF_0(TRUE, ...) __VA_ARGS__ 130 #define PUSHMI_PP_IIF_1(TRUE, ...) TRUE 132 #define PUSHMI_PP_EMPTY() 133 #define PUSHMI_PP_COMMA() , 134 #define PUSHMI_PP_COMMA_IIF(X) \ 135 PUSHMI_PP_IIF(X)(PUSHMI_PP_EMPTY, PUSHMI_PP_COMMA)() 137 #define PUSHMI_CONCEPT_ASSERT(...) \ 138 static_assert((bool) (__VA_ARGS__), \ 139 "Concept assertion failed : " #__VA_ARGS__) 156 #define PUSHMI_CONCEPT_DEF(DECL, ...) \ 158 PUSHMI_PP_DECL_DEF, \ 159 PUSHMI_PP_CAT(PUSHMI_PP_DEF_DECL_, DECL), \ 162 #define PUSHMI_PP_DECL_DEF_NAME(...) \ 163 PUSHMI_PP_CAT(PUSHMI_PP_DEF_, __VA_ARGS__), \ 165 #define PUSHMI_PP_DECL_DEF(TPARAM, NAME, ...) \ 166 PUSHMI_PP_CAT(PUSHMI_PP_DECL_DEF_, PUSHMI_PP_IS_PAREN(NAME))( \ 175 #define PUSHMI_PP_DECL_DEF_1(TPARAM, NAME, ...) \ 177 PUSHMI_PP_DECL_DEF_IMPL, \ 179 PUSHMI_PP_DECL_DEF_NAME NAME, \ 187 #define PUSHMI_PP_DECL_DEF_0(TPARAM, NAME, ...) \ 188 PUSHMI_PP_DECL_DEF_IMPL( \ 190 PUSHMI_PP_CAT(PUSHMI_PP_DEF_, NAME), \ 191 (PUSHMI_PP_CAT(PUSHMI_PP_AUX_, TPARAM)), \ 209 #define PUSHMI_PP_DEF_IMPL_0(...) \ 213 #define PUSHMI_PP_DEF_IMPL_1(...) \ 214 PUSHMI_PP_CAT(PUSHMI_PP_DEF_IMPL_1_, __VA_ARGS__) \ 216 #define PUSHMI_PP_DEF_IMPL_1_requires \ 217 requires PUSHMI_PP_DEF_IMPL_1_REQUIRES \ 219 #define PUSHMI_PP_DEF_IMPL_1_REQUIRES(...) \ 220 (__VA_ARGS__) PUSHMI_PP_DEF_IMPL_1_REQUIRES_BODY \ 222 #define PUSHMI_PP_DEF_IMPL_1_REQUIRES_BODY(...) \ 225 #define PUSHMI_PP_DECL_DEF_IMPL(TPARAM, NAME, ARGS, ...) \ 226 inline namespace _eager_ { \ 227 PUSHMI_PP_CAT(PUSHMI_PP_DEF_, TPARAM) \ 228 concept bool NAME = PUSHMI_PP_DEF_IMPL(__VA_ARGS__)(__VA_ARGS__); \ 230 namespace lazy = _eager_; \ 234 #define PUSHMI_PP_DEF_IMPL_0(...) \ 235 () -> std::enable_if_t<bool(__VA_ARGS__), int> \ 238 #define PUSHMI_PP_DEF_IMPL_1(...) \ 239 PUSHMI_PP_CAT(PUSHMI_PP_DEF_IMPL_1_, __VA_ARGS__) ), int> \ 241 #define PUSHMI_PP_DEF_IMPL_1_requires \ 242 PUSHMI_PP_DEF_IMPL_1_REQUIRES \ 244 #define PUSHMI_PP_DEF_IMPL_1_REQUIRES(...) \ 245 (__VA_ARGS__) -> std::enable_if_t<bool( \ 246 ::folly::pushmi::concepts::detail::requires_ \ 247 PUSHMI_PP_DEF_REQUIRES_BODY \ 249 #define PUSHMI_PP_DEF_REQUIRES_BODY(...) \ 250 <decltype(__VA_ARGS__, void())>() \ 252 #define PUSHMI_PP_DECL_DEF_IMPL(TPARAM, NAME, ARGS, ...) \ 253 struct PUSHMI_PP_CAT(NAME, Concept) { \ 254 using Concept = PUSHMI_PP_CAT(NAME, Concept); \ 255 PUSHMI_PP_IGNORE_CXX2A_COMPAT_BEGIN \ 256 PUSHMI_PP_CAT(PUSHMI_PP_DEF_, TPARAM) \ 257 static auto Requires_ PUSHMI_PP_DEF_IMPL(__VA_ARGS__)(__VA_ARGS__) { \ 260 PUSHMI_PP_IGNORE_CXX2A_COMPAT_END \ 261 PUSHMI_PP_CAT(PUSHMI_PP_DEF_, TPARAM) \ 263 template <class C_ = Concept> \ 264 static constexpr decltype(::folly::pushmi::concepts::detail::gcc_bugs( \ 265 &C_::template Requires_<PUSHMI_PP_EXPAND ARGS>)) \ 266 impl(int) noexcept { \ 269 static constexpr bool impl(long) noexcept { \ 272 explicit constexpr operator bool() const noexcept { \ 273 return Eval::impl(0); \ 276 class PMThis = Concept, \ 278 class = std::enable_if_t<PMB == (bool)PMThis{}>> \ 279 constexpr operator std::integral_constant<bool, PMB>() const noexcept { \ 282 constexpr auto operator!() const noexcept { \ 283 return ::folly::pushmi::concepts::detail::Not<Eval>{}; \ 285 template <class That> \ 286 constexpr auto operator&&(That) const noexcept { \ 287 return ::folly::pushmi::concepts::detail::And<Eval, That>{}; \ 289 template <class That> \ 290 constexpr auto operator||(That) const noexcept { \ 291 return ::folly::pushmi::concepts::detail::Or<Eval, That>{}; \ 296 PUSHMI_PP_CAT(PUSHMI_PP_DEF_, TPARAM) \ 297 PUSHMI_INLINE_VAR constexpr auto NAME = \ 298 PUSHMI_PP_CAT(NAME, Concept)::Eval<PUSHMI_PP_EXPAND ARGS>{}; \ 300 PUSHMI_PP_CAT(PUSHMI_PP_DEF_, TPARAM) \ 301 PUSHMI_INLINE_VAR constexpr bool NAME = \ 302 (bool)PUSHMI_PP_CAT(NAME, Concept)::Eval<PUSHMI_PP_EXPAND ARGS> {} \ 306 #define PUSHMI_PP_REQUIRES_PROBE_requires \ 309 #define PUSHMI_PP_DEF_IMPL(REQUIRES, ...) \ 311 PUSHMI_PP_DEF_IMPL_, \ 312 PUSHMI_PP_CHECK(PUSHMI_PP_CAT(PUSHMI_PP_REQUIRES_PROBE_, REQUIRES))) \ 314 #define PUSHMI_PP_DEF_DECL_template(...) \ 315 template(__VA_ARGS__), \ 317 #define PUSHMI_PP_DEF_template(...) \ 318 template<__VA_ARGS__> \ 320 #define PUSHMI_PP_DEF_concept 321 #define PUSHMI_PP_DEF_class 322 #define PUSHMI_PP_DEF_typename 323 #define PUSHMI_PP_DEF_int 324 #define PUSHMI_PP_DEF_bool 325 #define PUSHMI_PP_DEF_size_t 326 #define PUSHMI_PP_DEF_unsigned 327 #define PUSHMI_PP_AUX_template(...) \ 330 PUSHMI_PP_COUNT(__VA_ARGS__))(__VA_ARGS__) \ 332 #define PUSHMI_PP_TPARAM_1(_1) \ 333 PUSHMI_PP_CAT2(PUSHMI_PP_DEF_, _1) 334 #define PUSHMI_PP_TPARAM_2(_1, ...) \ 335 PUSHMI_PP_CAT2(PUSHMI_PP_DEF_, _1), PUSHMI_PP_TPARAM_1(__VA_ARGS__) 336 #define PUSHMI_PP_TPARAM_3(_1, ...) \ 337 PUSHMI_PP_CAT2(PUSHMI_PP_DEF_, _1), PUSHMI_PP_TPARAM_2(__VA_ARGS__) 338 #define PUSHMI_PP_TPARAM_4(_1, ...) \ 339 PUSHMI_PP_CAT2(PUSHMI_PP_DEF_, _1), PUSHMI_PP_TPARAM_3(__VA_ARGS__) 340 #define PUSHMI_PP_TPARAM_5(_1, ...) \ 341 PUSHMI_PP_CAT2(PUSHMI_PP_DEF_, _1), PUSHMI_PP_TPARAM_4(__VA_ARGS__) 356 #define PUSHMI_TEMPLATE(...) \ 357 template<__VA_ARGS__> PUSHMI_TEMPLATE_AUX_ \ 359 #define PUSHMI_TEMPLATE_AUX_(...) \ 360 PUSHMI_TEMPLATE_AUX_4(PUSHMI_PP_CAT(PUSHMI_TEMPLATE_AUX_3_, __VA_ARGS__)) \ 362 #define PUSHMI_TEMPLATE_AUX_3_requires 363 #define PUSHMI_TEMPLATE_AUX_4(...) \ 364 PUSHMI_TEMPLATE_AUX_5(__VA_ARGS__)(__VA_ARGS__) \ 366 #define PUSHMI_TEMPLATE_AUX_5(REQUIRES, ...) \ 368 PUSHMI_TEMPLATE_AUX_5_, \ 369 PUSHMI_PP_CHECK(PUSHMI_PP_CAT(PUSHMI_PP_REQUIRES_PROBE_, REQUIRES))) \ 372 #define PUSHMI_TEMPLATE_AUX_5_0(...) \ 373 requires __VA_ARGS__ \ 376 #define PUSHMI_TEMPLATE_AUX_5_1(...) \ 377 PUSHMI_PP_CAT(PUSHMI_TEMPLATE_AUX_6_, __VA_ARGS__) \ 379 #define PUSHMI_TEMPLATE_AUX_6_requires(...)\ 380 requires requires { __VA_ARGS__; } 382 #define PUSHMI_TEMPLATE(...) \ 383 template<__VA_ARGS__ PUSHMI_TEMPLATE_AUX_ 384 #define PUSHMI_TEMPLATE_AUX_(...) , \ 385 int (*PUSHMI_PP_CAT(_pushmi_concept_unique_, __LINE__))[ \ 386 PUSHMI_COUNTER] = nullptr, \ 387 std::enable_if_t<PUSHMI_PP_CAT(_pushmi_concept_unique_, __LINE__) || \ 388 bool(PUSHMI_TEMPLATE_AUX_4(PUSHMI_PP_CAT( \ 389 PUSHMI_TEMPLATE_AUX_3_, __VA_ARGS__))), int> = 0> \ 391 #define PUSHMI_TEMPLATE_AUX_3_requires 392 #define PUSHMI_TEMPLATE_AUX_4(...) \ 393 PUSHMI_TEMPLATE_AUX_5(__VA_ARGS__)(__VA_ARGS__) \ 395 #define PUSHMI_TEMPLATE_AUX_5(REQUIRES, ...) \ 397 PUSHMI_TEMPLATE_AUX_5_, \ 398 PUSHMI_PP_CHECK(PUSHMI_PP_CAT(PUSHMI_PP_REQUIRES_PROBE_, REQUIRES))) \ 401 #define PUSHMI_TEMPLATE_AUX_5_0(...) \ 404 #define PUSHMI_TEMPLATE_AUX_5_1(...) \ 405 PUSHMI_PP_CAT(PUSHMI_TEMPLATE_AUX_6_, __VA_ARGS__) \ 407 #define PUSHMI_TEMPLATE_AUX_6_requires(...) \ 408 ::folly::pushmi::concepts::detail::requires_<decltype(__VA_ARGS__)>() \ 414 #define PUSHMI_BROKEN_SUBSUMPTION(...) 415 #define PUSHMI_TYPE_CONSTRAINT(...) __VA_ARGS__ 416 #define PUSHMI_EXP(...) __VA_ARGS__ 417 #define PUSHMI_AND && 419 #define PUSHMI_BROKEN_SUBSUMPTION(...) __VA_ARGS__ 420 #define PUSHMI_TYPE_CONSTRAINT(...) class 423 #define PUSHMI_EXP(...) bool(::folly::pushmi::expAnd(__VA_ARGS__)) 429 #define PUSHMI_PP_CONSTRAINED_USING(REQUIRES, NAME, ...) \ 431 using NAME __VA_ARGS__ \ 434 #define PUSHMI_PP_CONSTRAINED_USING(REQUIRES, NAME, ...) \ 435 using NAME std::enable_if_t<bool(REQUIRES), __VA_ARGS__> \ 443 using bool_ = std::integral_constant<bool, B>;
454 template <
class T,
class U>
456 template <
class T,
class U>
466 operator std::integral_constant<bool, B>()
const noexcept {
472 template <
class That>
476 template <
class That>
482 template <
class T,
class U>
484 explicit constexpr
operator bool()
const noexcept {
489 operator std::integral_constant<bool, B>()
const noexcept {
495 template <
class That>
499 template <
class That>
505 template <
class T,
class U>
507 explicit constexpr
operator bool()
const noexcept {
512 operator std::integral_constant<bool, B>()
const noexcept {
518 template <
class That>
522 template <
class That>
533 constexpr
auto expAnd(T0&& t0) {
536 template <
class T0,
class... TN>
537 constexpr
auto expAnd(T0&&, TN&&... tn) {
543 template <
class... TN>
544 constexpr
auto expAnd(TN&&... tn) {
constexpr auto expAnd(T0 &&t0)
constexpr bool implicitly_convertible_to(T)
constexpr auto operator!() const noexcept
—— Concurrent Priority Queue Implementation ——
requires E e noexcept(noexcept(s.error(std::move(e))))
constexpr bool requires_()
constexpr auto expAnd(TN &&...tn)
bool_constant< true > true_type
#define PUSHMI_PP_IGNORE_CXX2A_COMPAT_BEGIN
constexpr auto operator&&(That) const noexcept
#define PUSHMI_INLINE_VAR
std::integral_constant< bool, B > bool_
requires requires(detail::apply_impl(std::declval< F >(), std::declval< Tuple >(), detail::tupidxs< Tuple >{}))) const expr decltype(auto) apply(F &&f
PUSHMI_TEMPLATE(class E=std::exception_ptr, class Wrapped)(requires Sender< detail
#define PUSHMI_PP_IGNORE_CXX2A_COMPAT_END
bool_constant< false > false_type
constexpr auto operator||(That) const noexcept