.. _program_listing_file__tmp_ws_src_proxsuite_include_proxsuite_linalg_veg_internal_macros.hpp: Program Listing for File macros.hpp =================================== |exhale_lsh| :ref:`Return to documentation for file ` (``/tmp/ws/src/proxsuite/include/proxsuite/linalg/veg/internal/macros.hpp``) .. |exhale_lsh| unicode:: U+021B0 .. UPWARDS ARROW WITH TIP LEFTWARDS .. code-block:: cpp #ifndef VEG_MACROS_HPP_HSTLSKZXS #define VEG_MACROS_HPP_HSTLSKZXS #include "proxsuite/linalg/veg/internal/external/hedley.ext.hpp" #include "proxsuite/linalg/veg/internal/typedefs.hpp" #include "proxsuite/linalg/veg/internal/preprocessor.hpp" #include "proxsuite/linalg/veg/internal/prologue.hpp" #include #if _MSC_VER #define PROXSUITE_PRETTY_FUNCTION __FUNCSIG__ #else #define PROXSUITE_PRETTY_FUNCTION __PRETTY_FUNCTION__ #endif #define PROXSUITE_THROW_PRETTY(condition, exception, message) \ if (condition) { \ std::ostringstream ss; \ ss << "From file: " << __FILE__ << "\n"; \ ss << "in function: " << PROXSUITE_PRETTY_FUNCTION << "\n"; \ ss << "at line: " << __LINE__ << "\n"; \ ss << message << "\n"; \ throw exception(ss.str()); \ } #define PROXSUITE_CHECK_ARGUMENT_SIZE(size, expected_size, message) \ if (size != expected_size) { \ std::ostringstream oss; \ oss << "wrong argument size: expected " << expected_size << ", got " \ << size << "\n"; \ oss << "hint: " << message << std::endl; \ PROXSUITE_THROW_PRETTY(true, std::invalid_argument, oss.str()); \ } #if HEDLEY_MSVC_VERSION_CHECK(14, 0, 0) || \ HEDLEY_INTEL_CL_VERSION_CHECK(2021, 1, 0) #define VEG_DEPRECATED(Reason) __declspec(deprecated(Reason)) #elif HEDLEY_HAS_EXTENSION(attribute_deprecated_with_message) || \ HEDLEY_GCC_VERSION_CHECK(4, 5, 0) || HEDLEY_INTEL_VERSION_CHECK(13, 0, 0) || \ HEDLEY_ARM_VERSION_CHECK(5, 6, 0) || \ HEDLEY_SUNPRO_VERSION_CHECK(5, 13, 0) || \ HEDLEY_PGI_VERSION_CHECK(17, 10, 0) || HEDLEY_TI_VERSION_CHECK(18, 1, 0) || \ HEDLEY_TI_ARMCL_VERSION_CHECK(18, 1, 0) || \ HEDLEY_TI_CL6X_VERSION_CHECK(8, 3, 0) || \ HEDLEY_TI_CL7X_VERSION_CHECK(1, 2, 0) || \ HEDLEY_TI_CLPRU_VERSION_CHECK(2, 3, 0) #define VEG_DEPRECATED(Reason) __attribute__((__deprecated__(Reason))) #elif defined(VEG_WITH_CXX14_SUPPORT) #define VEG_DEPRECATED(Reason) \ HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[deprecated(Reason)]]) #elif HEDLEY_HAS_ATTRIBUTE(deprecated) || HEDLEY_GCC_VERSION_CHECK(3, 1, 0) || \ HEDLEY_ARM_VERSION_CHECK(4, 1, 0) || HEDLEY_TI_VERSION_CHECK(15, 12, 0) || \ (HEDLEY_TI_ARMCL_VERSION_CHECK(4, 8, 0) && \ defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ HEDLEY_TI_ARMCL_VERSION_CHECK(5, 2, 0) || \ (HEDLEY_TI_CL2000_VERSION_CHECK(6, 0, 0) && \ defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ HEDLEY_TI_CL2000_VERSION_CHECK(6, 4, 0) || \ (HEDLEY_TI_CL430_VERSION_CHECK(4, 0, 0) && \ defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ HEDLEY_TI_CL430_VERSION_CHECK(4, 3, 0) || \ (HEDLEY_TI_CL6X_VERSION_CHECK(7, 2, 0) && \ defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ HEDLEY_TI_CL6X_VERSION_CHECK(7, 5, 0) || \ HEDLEY_TI_CL7X_VERSION_CHECK(1, 2, 0) || \ HEDLEY_TI_CLPRU_VERSION_CHECK(2, 1, 0) #define VEG_DEPRECATED(Reason) __attribute__((__deprecated__)) #elif HEDLEY_MSVC_VERSION_CHECK(13, 10, 0) || \ HEDLEY_PELLES_VERSION_CHECK(6, 50, 0) || \ HEDLEY_INTEL_CL_VERSION_CHECK(2021, 1, 0) #define VEG_DEPRECATED(Reason) __declspec(deprecated) #elif HEDLEY_IAR_VERSION_CHECK(8, 0, 0) #define VEG_DEPRECATED(Reason) _Pragma("deprecated") #else #define VEG_DEPRECATED(Reason) #endif #define VEG_UNUSED_VARIABLE(var) (void)(var) #ifdef NDEBUG #define VEG_ONLY_USED_FOR_DEBUG(var) VEG_UNUSED_VARIABLE(var) #else #define VEG_ONLY_USED_FOR_DEBUG(var) #endif #if defined(__clang__) #define VEG_WRAP_SILENCE_WARNING(...) \ HEDLEY_DIAGNOSTIC_PUSH _Pragma( \ "clang diagnostic ignored \"-Wc++17-extensions\"") \ __VA_ARGS__ HEDLEY_DIAGNOSTIC_POP #else #define VEG_WRAP_SILENCE_WARNING(...) __VA_ARGS__ #endif #ifndef VEG_HAS_NO_UNIQUE_ADDRESS #define VEG_HAS_NO_UNIQUE_ADDRESS 0 #endif #if VEG_HAS_NO_UNIQUE_ADDRESS #ifdef _MSC_VER #define VEG_NO_UNIQUE_ADDRESS [[msvc::no_unique_address]] #else #define VEG_NO_UNIQUE_ADDRESS [[no_unique_address]] #endif #else #define VEG_NO_UNIQUE_ADDRESS #endif #ifndef VEG_INLINE #if defined(NDEBUG) || defined(__OPTIMIZE__) #define VEG_INLINE HEDLEY_ALWAYS_INLINE #else #define VEG_INLINE inline #endif #endif #define VEG_NO_INLINE HEDLEY_NEVER_INLINE #if defined(__cpp_concepts) && __cpp_concepts >= 201907L #define VEG_HAS_CONCEPTS 1 #else #define VEG_HAS_CONCEPTS 0 #endif #if defined(VEG_WITH_CXX17_SUPPORT) #define VEG_DECLVAL(...) (static_cast<__VA_ARGS__ (*)() noexcept>(nullptr)()) #else #define VEG_DECLVAL(...) \ (::proxsuite::linalg::veg::_detail::_meta::declval<__VA_ARGS__>()) #endif #if defined(__clang__) #define VEG_ARROW(...) \ __attribute__((always_inline)) noexcept(noexcept((__VA_ARGS__))) \ ->decltype((__VA_ARGS__)) \ { \ return __VA_ARGS__; \ } #elif defined(__GNUC__) && (__GNUC__ >= 9) #define VEG_ARROW(...) \ noexcept(noexcept((__VA_ARGS__))) __attribute__((always_inline)) \ ->decltype((__VA_ARGS__)) \ { \ return __VA_ARGS__; \ } #else #define VEG_ARROW(...) \ noexcept(noexcept((__VA_ARGS__)))->decltype((__VA_ARGS__)) \ { \ return __VA_ARGS__; \ } #endif #define VEG_LAZY_BY_REF(...) [&]() VEG_ARROW(__VA_ARGS__) #define VEG_LIFT(...) \ [&](auto&&... args) VEG_ARROW((__VA_ARGS__)(VEG_FWD(args)...)) #define VEG_DEDUCE_RET(...) \ noexcept(noexcept(__VA_ARGS__))->decltype(__VA_ARGS__) \ { \ return __VA_ARGS__; \ } \ VEG_NOM_SEMICOLON #if defined(VEG_WITH_CXX17_SUPPORT) #define VEG_HAS_FOLD_EXPR 1 #define VEG_ALL_OF(...) (__VA_ARGS__ && ... && true) #define VEG_ANY_OF(...) (__VA_ARGS__ || ... || false) #elif defined(__clang__) #define VEG_HAS_FOLD_EXPR 1 #define VEG_ALL_OF(...) VEG_WRAP_SILENCE_WARNING((__VA_ARGS__ && ... && true)) #define VEG_ANY_OF(...) VEG_WRAP_SILENCE_WARNING((__VA_ARGS__ || ... || false)) #else #define VEG_HAS_FOLD_EXPR 0 #define VEG_ALL_OF(...) \ ::proxsuite::linalg::veg::meta::and_test< \ ::proxsuite::linalg::veg::meta::make_index_sequence< \ ::proxsuite::linalg::veg::meta::pack_size::value>, \ ::proxsuite::linalg::veg::meta::bool_constant<(__VA_ARGS__)>...>::value #define VEG_ANY_OF(...) \ ::proxsuite::linalg::veg::meta::or_test< \ ::proxsuite::linalg::veg::meta::make_index_sequence< \ ::proxsuite::linalg::veg::meta::pack_size::value>, \ ::proxsuite::linalg::veg::meta::bool_constant<(__VA_ARGS__)>...>::value #endif #define VEG_EVAL_ALL(...) \ ((void)(::proxsuite::linalg::veg::_detail::EmptyArr{ \ ::proxsuite::linalg::veg::_detail::Empty{}, \ ((void)(__VA_ARGS__), ::proxsuite::linalg::veg::_detail::Empty{})... })) #if VEG_HAS_CONCEPTS #define __VEG_IMPL_AND(_, Param) &&__VEG_PP_UNWRAP(Param) #define __VEG_IMPL_OR(_, Param) || __VEG_PP_UNWRAP(Param) #define __VEG_IMPL_CONJUNCTION(First, ...) \ (__VEG_PP_UNWRAP(First) \ __VEG_PP_TUPLE_FOR_EACH(__VEG_IMPL_AND, _, (__VA_ARGS__))) #define __VEG_IMPL_DISJUNCTION(First, ...) \ (__VEG_PP_UNWRAP(First) \ __VEG_PP_TUPLE_FOR_EACH(__VEG_IMPL_OR, _, (__VA_ARGS__))) #define VEG_DEF_CONCEPT(Tpl, Name, ...) \ template<__VEG_PP_REMOVE_PAREN1(Tpl)> \ concept Name = __VA_ARGS__; \ VEG_NOM_SEMICOLON #define VEG_CHECK_CONCEPT_MACRO(Namespace, ...) \ static_assert(Namespace::__VA_ARGS__, \ __VEG_PP_STRINGIZE(__VA_ARGS__) " failed") #define VEG_CONCEPT_MACRO(Namespace, ...) Namespace::__VA_ARGS__ #define VEG_DEF_CONCEPT_CONJUNCTION(Tpl, Name, Terms) \ VEG_DEF_CONCEPT(Tpl, Name, __VEG_IMPL_CONJUNCTION Terms) #define VEG_DEF_CONCEPT_DISJUNCTION(Tpl, Name, Terms) \ VEG_DEF_CONCEPT(Tpl, Name, __VEG_IMPL_DISJUNCTION Terms) #define VEG_CONCEPT_EXPR(Tpl, TplNames, Name, Expr, ...) \ namespace _veg_detail { \ template \ concept test_return_##Name = __VA_ARGS__; \ } \ template<__VEG_PP_REMOVE_PAREN1(Tpl)> \ concept Name = \ _veg_detail::test_return_##Name; \ template<__VEG_PP_REMOVE_PAREN1(Tpl)> \ concept xnothrow_##Name = noexcept(Expr); \ template<__VEG_PP_REMOVE_PAREN1(Tpl)> \ concept nothrow_##Name = noexcept(Expr); \ VEG_NOM_SEMICOLON #else #if defined(VEG_WITH_CXX14_SUPPORT) #define __VEG_IMPL_DEF_CONCEPT(Tpl, Name, Value, ...) \ namespace _ { \ template<__VEG_PP_REMOVE_PAREN1(Tpl)> \ struct Name : __VA_ARGS__ \ {}; \ } \ namespace { \ template<__VEG_PP_REMOVE_PAREN1(Tpl)> \ constexpr bool const& Name = \ ::proxsuite::linalg::veg::meta::bool_constant::value; \ } \ VEG_NOM_SEMICOLON #else #define __VEG_IMPL_DEF_CONCEPT(Tpl, Name, Value, ...) \ template<__VEG_PP_REMOVE_PAREN1(Tpl)> \ struct Name : __VA_ARGS__ \ {} #endif #ifdef __clang__ #define __VEG_NO_WARNING_PRAGMA_PUSH \ HEDLEY_DIAGNOSTIC_PUSH _Pragma("clang diagnostic ignored \"-Wconversion\"") #define __VEG_NO_WARNING_PRAGMA_POP HEDLEY_DIAGNOSTIC_POP #else #define __VEG_NO_WARNING_PRAGMA_PUSH #define __VEG_NO_WARNING_PRAGMA_POP #endif #define VEG_CONCEPT_EXPR(Tpl, TplNames, Name, Expr, ...) \ namespace _veg_detail { \ template \ struct test_sfinae_##Name \ { \ using TestExpr = ::proxsuite::linalg::veg::meta::false_type; \ using NothrowTestExpr = ::proxsuite::linalg::veg::meta::false_type; \ }; \ template<__VEG_PP_REMOVE_PAREN1(Tpl)> \ struct test_sfinae_##Name< \ ::proxsuite::linalg::veg::meta::void_t, \ __VEG_PP_REMOVE_PAREN1(TplNames)> \ { \ using ExprType = decltype((Expr)); \ using TestExpr = \ ::proxsuite::linalg::veg::meta::bool_constant<__VA_ARGS__>; \ using NothrowTestExpr = ::proxsuite::linalg::veg::meta::bool_constant< \ (TestExpr::value) && __VEG_NO_WARNING_PRAGMA_PUSH noexcept(Expr) \ __VEG_NO_WARNING_PRAGMA_POP>; \ }; \ } \ VEG_DEF_CONCEPT( \ Tpl, \ Name, \ _veg_detail::test_sfinae_##Name:: \ TestExpr::value); \ VEG_DEF_CONCEPT(Tpl, nothrow_##Name, noexcept(Expr)); \ VEG_DEF_CONCEPT( \ Tpl, \ xnothrow_##Name, \ _veg_detail::test_sfinae_##Name:: \ NothrowTestExpr::value); \ VEG_NOM_SEMICOLON #if defined(VEG_WITH_CXX14_SUPPORT) #define VEG_CONCEPT_MACRO(Namespace, ...) Namespace::__VA_ARGS__ #define __VEG_IMPL_ADD_VALUE(I, _, Param) (Param) #define __VEG_IMPL_TRAIT(Param) __VEG_PP_HEAD Param _::__VEG_PP_TAIL Param #else #define VEG_CONCEPT_MACRO(Namespace, ...) Namespace::__VA_ARGS__::value #define __VEG_IMPL_ADD_VALUE(I, _, Param) \ ((__VEG_PP_REMOVE_PAREN(Param)::value)) #define __VEG_IMPL_TRAIT(Param) __VEG_PP_UNWRAP(Param) #endif #define __VEG_IMPL_PUT_TRAIT(I, _, Param) __VEG_IMPL_TRAIT(Param) #define VEG_CHECK_CONCEPT_MACRO(Namespace, ...) \ static_assert(decltype(Namespace::check_##__VA_ARGS__())::value, \ __VEG_PP_STRINGIZE(__VA_ARGS__) " failed") #define VEG_DEF_CONCEPT(Tpl, Name, ...) \ __VEG_IMPL_DEF_CONCEPT( \ Tpl, \ Name, \ (__VA_ARGS__), \ ::proxsuite::linalg::veg::meta::bool_constant<__VA_ARGS__>); \ VEG_TEMPLATE(Tpl, \ requires(__VA_ARGS__), \ constexpr auto check_##Name, \ (_ = 0, int)) noexcept \ -> ::proxsuite::linalg::veg::meta::true_type #define __VEG_IMPL_SFINAE(_, Param) \ , ::proxsuite::linalg::veg::meta:: \ enable_if_t<__VEG_PP_ID(__VEG_PP_UNWRAP Param), int> = 0 #define __VEG_IMPL_OVERLOAD(Name_Tpl, Param) \ template<__VEG_PP_REMOVE_PAREN(__VEG_PP_TAIL Name_Tpl), \ typename ::proxsuite::linalg::veg::_detail::_meta:: \ enable_if<__VEG_PP_ID(__VEG_PP_UNWRAP Param), int>::type = 0> \ auto __VEG_PP_CAT(check_, __VEG_PP_HEAD Name_Tpl)() noexcept \ -> ::proxsuite::linalg::veg::meta::true_type; #define VEG_DEF_CONCEPT_BOOL_CONJUNCTION_IMPL(Tpl, Name, Base, Seq) \ __VEG_IMPL_DEF_CONCEPT(Tpl, \ Name, \ (__VEG_PP_REMOVE_PAREN1(Base)::value), \ __VEG_PP_REMOVE_PAREN1(Base)); \ template<__VEG_PP_REMOVE_PAREN(Tpl) \ __VEG_PP_TUPLE_FOR_EACH(__VEG_IMPL_SFINAE, _, Seq)> \ auto check_##Name() noexcept -> ::proxsuite::linalg::veg::meta::true_type #define VEG_DEF_CONCEPT_BOOL_DISJUNCTION_IMPL(Tpl, Name, Base, Seq) \ __VEG_IMPL_DEF_CONCEPT(Tpl, \ Name, \ (__VEG_PP_REMOVE_PAREN1(Base)::value), \ __VEG_PP_REMOVE_PAREN1(Base)); \ __VEG_PP_TUPLE_FOR_EACH(__VEG_IMPL_OVERLOAD, (Name, Tpl), Seq) \ VEG_NOM_SEMICOLON #define VEG_DEF_CONCEPT_CONJUNCTION(Tpl, Name, Terms) \ VEG_DEF_CONCEPT_BOOL_CONJUNCTION_IMPL( \ Tpl, \ Name, \ (__VEG_IMPL_CONJUNCTION(Terms)), \ __VEG_PP_TUPLE_TRANSFORM_I(__VEG_IMPL_ADD_VALUE, _, Terms)) #define VEG_DEF_CONCEPT_DISJUNCTION(Tpl, Name, Terms) \ VEG_DEF_CONCEPT_BOOL_DISJUNCTION_IMPL( \ Tpl, \ Name, \ (__VEG_IMPL_DISJUNCTION(Terms)), \ __VEG_PP_TUPLE_TRANSFORM_I(__VEG_IMPL_ADD_VALUE, _, Terms)) #define __VEG_IMPL_CONJUNCTION(Tuple) \ ::proxsuite::linalg::veg::meta::conjunction<__VEG_PP_REMOVE_PAREN( \ __VEG_PP_TUPLE_TRANSFORM_I(__VEG_IMPL_PUT_TRAIT, _, Tuple))> #define __VEG_IMPL_DISJUNCTION(Tuple) \ ::proxsuite::linalg::veg::meta::disjunction<__VEG_PP_REMOVE_PAREN( \ __VEG_PP_TUPLE_TRANSFORM_I(__VEG_IMPL_PUT_TRAIT, _, Tuple))> #endif #define VEG_TEMPLATE(TParams, Constraint, Attr_Name, ...) \ __VEG_IMPL_TEMPLATE(Attr_Name, \ TParams, \ __VEG_PP_CAT2(__VEG_IMPL_PREFIX_, Constraint), \ __VA_ARGS__) #if VEG_HAS_CONCEPTS #define VEG_CONSTRAINED_MEMBER_FN(Constraint, Attr_Name, Params, ...) \ Attr_Name __VEG_PP_TUPLE_TRANSFORM_I(__VEG_IMPL_PARAM_EXPAND, _, Params) \ __VA_ARGS__ \ requires __VEG_PP_CAT2(__VEG_IMPL_PREFIX_, Constraint) #define VEG_TEMPLATE_CVT(TParams, Constraint, Attr, ...) \ template<__VEG_PP_REMOVE_PAREN(TParams)> \ Constraint Attr operator __VA_ARGS__() #else #define VEG_CONSTRAINED_MEMBER_FN(Constraint, Attr_Name, Params, ...) \ VEG_TEMPLATE( \ (int _ = 0), \ requires(__VEG_PP_CAT2(__VEG_IMPL_PREFIX_, Constraint) && \ ::proxsuite::linalg::veg::meta::bool_constant<(_ == 0)>::value), \ Attr_Name, \ __VEG_PP_REMOVE_PAREN(Params)) \ __VA_ARGS__ #define VEG_TEMPLATE_CVT(TParams, Constraint, Attr, ...) \ template<__VEG_PP_REMOVE_PAREN(TParams)> \ Attr operator ::proxsuite::linalg::veg::meta::enable_if_t< \ (__VEG_PP_CAT2(__VEG_IMPL_PREFIX_, Constraint)), \ __VA_ARGS__>() #endif #if VEG_HAS_CONCEPTS && defined(__cpp_conditional_explicit) && \ (__cpp_conditional_explicit >= 201806L) #define VEG_TEMPLATE_EXPLICIT( \ TParams, Constraint, Explicit_Cond, Attr_Name, Params, ...) \ VEG_TEMPLATE(TParams, \ Constraint, \ Explicit_Cond Attr_Name, \ __VEG_PP_REMOVE_PAREN(Params)) \ __VA_ARGS__ #define VEG_TEMPLATE_CVT_EXPLICIT( \ TParams, Constraint, Explicit_Cond, Attr, Type, ...) \ template<__VEG_PP_REMOVE_PAREN(TParams)> \ Constraint Explicit_Cond Attr operator __VEG_PP_REMOVE_PAREN(Type)() \ __VA_ARGS__ #else #define VEG_TEMPLATE_EXPLICIT( \ TParams, Constraint, Explicit_Cond, Attr_Name, Params, ...) \ VEG_TEMPLATE( \ (__VEG_PP_REMOVE_PAREN TParams, \ ::proxsuite::linalg::veg::meta:: \ enable_if_t<(__VEG_PP_CAT2(__VEG_IMPL_PREFIX_, Explicit_Cond)), int> = \ 0), \ Constraint, \ explicit Attr_Name, \ __VEG_PP_REMOVE_PAREN(Params)) \ __VA_ARGS__ \ VEG_TEMPLATE((__VEG_PP_REMOVE_PAREN TParams, \ ::proxsuite::linalg::veg::meta::enable_if_t< \ !(__VEG_PP_CAT2(__VEG_IMPL_PREFIX_, Explicit_Cond)), \ unsigned> = 0), \ Constraint, \ Attr_Name, \ __VEG_PP_REMOVE_PAREN(Params)) \ __VA_ARGS__ #define VEG_TEMPLATE_CVT_EXPLICIT( \ TParams, Constraint, Explicit_Cond, Attr, Type, ...) \ VEG_TEMPLATE_CVT( \ (__VEG_PP_REMOVE_PAREN TParams, \ ::proxsuite::linalg::veg::meta:: \ enable_if_t<(__VEG_PP_CAT2(__VEG_IMPL_PREFIX_, Explicit_Cond)), int> = \ 0), \ Constraint, \ explicit Attr, \ __VEG_PP_REMOVE_PAREN(Type)) \ __VA_ARGS__ \ \ VEG_TEMPLATE_CVT((__VEG_PP_REMOVE_PAREN TParams, \ ::proxsuite::linalg::veg::meta::enable_if_t< \ !(__VEG_PP_CAT2(__VEG_IMPL_PREFIX_, Explicit_Cond)), \ unsigned> = 0), \ Constraint, \ Attr, \ __VEG_PP_REMOVE_PAREN(Type)) \ __VA_ARGS__ #endif #define __VEG_IMPL_PREFIX_requires #define __VEG_IMPL_PREFIX_explicit #define __VEG_IMPL_PARAM_EXPAND(I, _, Param) \ __VEG_PP_TAIL Param __VEG_PP_HEAD Param #if VEG_HAS_CONCEPTS #define __VEG_IMPL_TEMPLATE(Attr_Name, TParams, Constraint, ...) \ template<__VEG_PP_REMOVE_PAREN(TParams)> \ requires Constraint \ Attr_Name __VEG_PP_TUPLE_TRANSFORM_I( \ __VEG_IMPL_PARAM_EXPAND, _, (__VA_ARGS__)) #else #define __VEG_IMPL_TEMPLATE2_HELPER_0(Constraint, Param) \ __VEG_PP_TAIL Param __VEG_PP_HEAD Param #define __VEG_IMPL_TEMPLATE2_HELPER_1(Constraint, Param) \ ::proxsuite::linalg::veg::meta::enable_if_t<(Constraint), \ __VEG_PP_TAIL Param> \ __VEG_PP_HEAD Param #define __VEG_IMPL_TEMPLATE2_HELPER(I, Constraint, Param) \ __VEG_PP_CAT2(__VEG_IMPL_TEMPLATE2_HELPER_, \ __VEG_IMPL_PP_IS_1(__VEG_IMPL_PP_INC(I))) \ (Constraint, Param) #define __VEG_IMPL_TEMPLATE(Attr_Name, TParams, Constraint, ...) \ template<__VEG_PP_REMOVE_PAREN(TParams)> \ Attr_Name __VEG_PP_TUPLE_TRANSFORM_I( \ __VEG_IMPL_TEMPLATE2_HELPER, Constraint, (__VA_ARGS__)) #endif #if defined(VEG_WITH_CXX17_SUPPORT) #define VEG_INLINE_VAR(Name, Obj) \ inline constexpr auto const& Name = \ ::proxsuite::linalg::veg::meta::static_const::value; \ static_assert((void(Name), true), ".") #define VEG_INLINE_VAR_TEMPLATE(Tpl, Name, ...) /* NOLINT */ \ template<__VEG_PP_REMOVE_PAREN(Tpl)> \ inline constexpr auto const& Name = \ ::proxsuite::linalg::veg::meta::static_const<__VA_ARGS__>::value; \ VEG_NOM_SEMICOLON /* NOLINT */ #else #define VEG_INLINE_VAR(Name, Obj) \ namespace /* NOLINT */ { \ constexpr auto const& Name = \ ::proxsuite::linalg::veg::meta::static_const::value; \ } \ static_assert((void(Name), true), ".") #if defined(VEG_WITH_CXX14_SUPPORT) #define VEG_INLINE_VAR_TEMPLATE(Tpl, Name, ...) /* NOLINT */ \ namespace /* NOLINT */ { /* NOLINT */ \ template<__VEG_PP_REMOVE_PAREN(Tpl)> \ constexpr auto const& Name = /* NOLINT */ \ ::proxsuite::linalg::veg::meta::static_const< \ __VA_ARGS__>::value; /* NOLINT \ */ \ } \ VEG_NOM_SEMICOLON /* NOLINT */ #else #define VEG_INLINE_VAR_TEMPLATE(Tpl, Name, ...) VEG_NOM_SEMICOLON #endif #endif #define VEG_NIEBLOID(Name) VEG_INLINE_VAR(Name, nb::Name) // NOLINT #define VEG_NIEBLOID_TEMPLATE(Tpl, Name, ...) \ VEG_INLINE_VAR_TEMPLATE(Tpl, Name, nb::Name<__VA_ARGS__>) // NOLINT #define VEG_TAG(Name, Type) \ namespace _ { \ template \ struct Type \ { \ explicit Type() = default; \ }; \ } \ using Type = _::Type<0>; \ VEG_INLINE_VAR(Name, Type) #define VEG_TAG_TEMPLATE(Tpl, Name, Type, ...) \ template<__VEG_PP_REMOVE_PAREN(Tpl)> \ struct Type \ { \ explicit Type() = default; \ }; \ VEG_INLINE_VAR_TEMPLATE(Tpl, Name, Type<__VA_ARGS__>) #define VEG_FWD(X) static_cast(X) #define VEG_FWD2(X) static_cast(static_cast(X)) // disallows moving const rvalues #define VEG_MOV(X) \ static_cast&&>(X) #ifdef VEG_NO_INSTANTIATE #define VEG_INSTANTIATE(Fn, ...) VEG_NOM_SEMICOLON #define VEG_INSTANTIATE_CLASS(Class, ...) VEG_NOM_SEMICOLON #else #define VEG_INSTANTIATE(Fn, ...) \ __VEG_IMPL_INSTANTIATE( \ Fn, \ __VEG_PP_CAT(__VEG_PP_CAT(_dummy_explicit_instantiation, __LINE__), \ __VEG_PP_CAT(_, __COUNTER__)), \ __VA_ARGS__) #define __VEG_IMPL_INSTANTIATE(Fn, Name, ...) \ template \ struct Name \ { \ void apply(Ts&&... args) \ { \ Fn(VEG_FWD(args)...); \ } \ }; \ template struct Name<__VA_ARGS__> #define VEG_INSTANTIATE_CLASS(Class, ...) template struct Class<__VA_ARGS__> #endif #define VEG_NOM_SEMICOLON static_assert(true, ".") #define VEG_ID(id) __VEG_PP_CAT(id, __COUNTER__) namespace proxsuite { namespace linalg { namespace veg { template struct Slice; namespace meta { template using void_t = void; } // namespace meta namespace _detail { template struct Wrapper { T inner; }; namespace _meta { template struct enable_if { using type = T; }; template struct enable_if {}; template using discard_1st = V; template struct uncvlref; template struct uncvlref { using type = T; }; template struct uncvlref { using type = T; }; template struct uncvlref { using type = T; }; template struct uncvlref { using type = T; }; template struct unref; template struct unref { using type = T; }; template auto declval() VEG_ALWAYS_NOEXCEPT->T; } // namespace _meta } // namespace _detail namespace meta { template struct static_const { static constexpr T value{}; }; template constexpr T static_const::value; // NOLINT(readability-redundant-declaration) } // namespace meta template struct incomplete_t; template auto print_types_halt(Args&&...) -> incomplete_t; template VEG_DEPRECATED("") VEG_CPP14(constexpr) void print_types(Args&&... /*unused*/) { } namespace nb { struct unused { template VEG_CPP14(constexpr) void operator()(Ts const&... /*unused*/) const VEG_NOEXCEPT { } }; } // namespace nb VEG_NIEBLOID(unused); using usize = decltype(sizeof(0)); namespace _detail { template struct EmptyI {}; using Empty = EmptyI<0>; using EmptyArr = Empty[]; namespace _meta { template struct integer_sequence; #if VEG_HAS_BUILTIN(__make_integer_seq) template using make_integer_sequence = __make_integer_seq; #elif __GNUC__ >= 8 template using make_integer_sequence = integer_sequence; #else namespace _detail { template struct _merge; template struct _merge_p1; template struct _merge, integer_sequence> { using type = integer_sequence; }; template struct _merge_p1, integer_sequence> { using type = integer_sequence; }; template struct _make_integer_sequence { using type = typename _merge::type, typename _make_integer_sequence::type>::type; }; template struct _make_integer_sequence { using type = typename _merge_p1::type, typename _make_integer_sequence::type>::type; }; template struct _make_integer_sequence { using type = integer_sequence; }; template struct _make_integer_sequence { using type = integer_sequence; }; } // namespace _detail template using make_integer_sequence = typename _detail::_make_integer_sequence::type; #endif #define VEG_DEF_CONCEPT_BUILTIN_OR_INTERNAL(Tpl, Name, ...) \ VEG_DEF_CONCEPT( \ Tpl, \ Name, \ VEG_HAS_BUILTIN_OR(__is_##Name, \ __is_##Name(__VA_ARGS__), \ (_detail::_meta::is_##Name<__VA_ARGS__>::value))) template using make_index_sequence = make_integer_sequence; template struct type_sequence; } // namespace _meta template struct SimpleLeaf { T inner; }; template struct SimpleITuple; template struct SimpleITuple<_meta::integer_sequence, Ts...> : SimpleLeaf... { #if !defined(VEG_WITH_CXX17_SUPPORT) constexpr SimpleITuple(Ts... args) noexcept : SimpleLeaf{ Ts(VEG_FWD(args)) }... { } #endif }; template using SimpleTuple = SimpleITuple<_meta::make_index_sequence, Ts...>; template constexpr auto make_simple_tuple(Empty /*dummy*/, Ts... args) noexcept -> SimpleTuple { #if !defined(VEG_WITH_CXX17_SUPPORT) return { Ts(VEG_FWD(args))... }; #else return { { Ts(VEG_FWD(args)) }... }; #endif } template struct mem_ptr_type; template struct mem_ptr_type { using Type = Mem; }; constexpr auto all_of_slice(bool const* arr, usize size) VEG_NOEXCEPT->bool { return size == 0 ? true : (arr[0] && _detail::all_of_slice(arr + 1, size - 1)); } template inline constexpr auto all_of(bool const (&lst)[N]) VEG_NOEXCEPT->bool { return _detail::all_of_slice(lst, N); } template struct member_extract_access { template struct DetectImpl { static constexpr bool value = false; using Type = void; }; template struct DetectImpl { static constexpr bool value = true; using Type = typename U::_veglib_impl_member_extract; }; using Detect = DetectImpl; static constexpr bool value = Detect::value; using Type = typename Detect::Type; }; } // namespace _detail namespace meta { template using enable_if_t = _detail::_meta::discard_1st::type, T>; template using uncvref_t = typename _detail::_meta::uncvlref::type; } // namespace meta using meta::uncvref_t; namespace meta { template struct constant { static constexpr T value = Value; }; template constexpr T constant::value; template using bool_constant = constant; using true_type = bool_constant; using false_type = bool_constant; } // namespace meta namespace _detail { namespace _meta { struct wrapper_base { static auto test(...) -> meta::false_type; }; template struct wrapper : wrapper_base { using wrapper_base::test; static auto test(wrapper*) -> meta::true_type; }; template using is_same = decltype(wrapper::test(static_cast*>(nullptr))); } // namespace _meta } // namespace _detail namespace concepts { VEG_DEF_CONCEPT_BUILTIN_OR_INTERNAL((typename T, typename U), same, T, U); } // namespace concepts enum struct CharUnit : unsigned char { SPACE = 0x20, EXCLAMATION_MARK = 0x21, DOUBLE_QUOTE = 0x22, NUMBER = 0x23, DOLLAR = 0x24, PERCENT = 0x25, AMPERSAND = 0x26, SINGLE_QUOTE = 0x27, LEFT_PARENTHESIS = 0x28, RIGHT_PARENTHESIS = 0x29, ASTERISK = 0x2A, PLUS = 0x2B, COMMA = 0x2C, MINUS = 0x2D, PERIOD = 0x2E, SLASH = 0x2F, ZERO = 0x30, ONE = 0x31, TWO = 0x32, THREE = 0x33, FOUR = 0x34, FIVE = 0x35, SIX = 0x36, SEVEN = 0x37, EIGHT = 0x38, NINE = 0x39, COLON = 0x3A, SEMICOLON = 0x3B, LESS_THAN = 0x3C, EQUALITY_SIGN = 0x3D, GREATER_THAN = 0x3E, QUESTION_MARK = 0x3F, AT_SIGN = 0x40, UPPERCASE_A = 0x41, UPPERCASE_B = 0x42, UPPERCASE_C = 0x43, UPPERCASE_D = 0x44, UPPERCASE_E = 0x45, UPPERCASE_F = 0x46, UPPERCASE_G = 0x47, UPPERCASE_H = 0x48, UPPERCASE_I = 0x49, UPPERCASE_J = 0x4A, UPPERCASE_K = 0x4B, UPPERCASE_L = 0x4C, UPPERCASE_M = 0x4D, UPPERCASE_N = 0x4E, UPPERCASE_O = 0x4F, UPPERCASE_P = 0x50, UPPERCASE_Q = 0x51, UPPERCASE_R = 0x52, UPPERCASE_S = 0x53, UPPERCASE_T = 0x54, UPPERCASE_U = 0x55, UPPERCASE_V = 0x56, UPPERCASE_W = 0x57, UPPERCASE_X = 0x58, UPPERCASE_Y = 0x59, UPPERCASE_Z = 0x5A, LEFT_SQUARE_BRACKET = 0x5B, BACKSLASH = 0x5C, RIGHT_SQUARE_BRACKET = 0x5D, CARET = 0x5F, GRAVE = 0x60, LOWERCASE_A = 0x61, LOWERCASE_B = 0x62, LOWERCASE_C = 0x63, LOWERCASE_D = 0x64, LOWERCASE_E = 0x65, LOWERCASE_F = 0x66, LOWERCASE_G = 0x67, LOWERCASE_H = 0x68, LOWERCASE_I = 0x69, LOWERCASE_J = 0x6A, LOWERCASE_K = 0x6B, LOWERCASE_L = 0x6C, LOWERCASE_M = 0x6D, LOWERCASE_N = 0x6E, LOWERCASE_O = 0x6F, LOWERCASE_P = 0x70, LOWERCASE_Q = 0x71, LOWERCASE_R = 0x72, LOWERCASE_S = 0x73, LOWERCASE_T = 0x74, LOWERCASE_U = 0x75, LOWERCASE_V = 0x76, LOWERCASE_W = 0x77, LOWERCASE_X = 0x78, LOWERCASE_Y = 0x79, LOWERCASE_Z = 0x7A, LEFT_CURLY_BRACKET = 0x7B, VERTICAL_BAR = 0x7C, RIGHT_CURLY_BRACKET = 0x7D, TILDE = 0x7E, }; inline namespace tags { VEG_TAG(from_raw_parts, FromRawParts); VEG_TAG(safe, Safe); VEG_TAG(unsafe, Unsafe); } // namespace tags struct Str { private: struct { CharUnit const* ptr; isize len; } _ = {}; public: VEG_INLINE constexpr Str(Unsafe /*unsafe*/, FromRawParts /*from_raw_parts*/, CharUnit const* ptr, isize len) noexcept : _{ ptr, len } {}; VEG_INLINE constexpr auto as_slice() const noexcept -> Slice; }; template struct StrLiteralConstant { private: static constexpr CharUnit literal[sizeof...(Cs)] = { Cs... }; public: VEG_INLINE constexpr auto as_slice() const noexcept -> Slice; VEG_INLINE constexpr auto as_str() const noexcept -> Str { return { unsafe, from_raw_parts, literal, isize{ sizeof...(Cs) } }; } }; template constexpr CharUnit StrLiteralConstant::literal[sizeof...(Cs)]; namespace _detail { using NativeChar8 = meta::uncvref_t; template struct Array_ { T _[N]; }; template constexpr auto assert_complete() noexcept -> bool { static_assert(sizeof(T) != 0, "."); return true; } } // namespace _detail } // namespace veg } // namespace linalg } // namespace proxsuite #if defined(__clang__) || (defined(VEG_WITH_CXX14_SUPPORT) && defined(__GNUC__)) HEDLEY_DIAGNOSTIC_PUSH #pragma GCC diagnostic ignored "-Wpedantic" #ifdef __clang__ #pragma clang diagnostic ignored "-Wgnu-string-literal-operator-template" #endif template constexpr auto operator""__veglib_const_literal_gnuc() noexcept // NOLINT -> proxsuite::linalg::veg::StrLiteralConstant< proxsuite::linalg::veg::CharUnit(Cs)...> { return {}; } HEDLEY_DIAGNOSTIC_POP #define __VEG_IMPL_UTF8_CONST(Literal) /* NOLINT */ \ (u8##Literal##__veglib_const_literal_gnuc) #elif (defined(__clang__) && defined(VEG_WITH_CXX20_SUPPORT)) || \ (defined(__cpp_nontype_template_args) && \ (__cpp_nontype_template_args >= 201911L)) namespace proxsuite { namespace linalg { namespace veg { namespace _detail { template struct StrLiteralImpl { proxsuite::linalg::veg::CharUnit _[N]; template constexpr StrLiteralImpl(Char const* s) { for (isize i = 0; i < N; ++i) { _[i] = proxsuite::linalg::veg::CharUnit(s[i]); } } }; template StrLiteralImpl(Char const (&)[N]) -> StrLiteralImpl; template struct StrLiteralLen; template struct StrLiteralLen> { static constexpr usize value{ N }; }; template struct StrLiteralLen const> { static constexpr usize value{ N }; }; template struct StrLiteralExpand; template(sizeof...(Is))> L> struct StrLiteralExpand<_meta::integer_sequence, L> { using Type = StrLiteralConstant; }; } // namespace _detail } // namespace veg } // namespace linalg } // namespace proxsuite template constexpr auto operator""__veglib_const_literal_cpp20() noexcept -> typename proxsuite::linalg::veg::_detail::StrLiteralExpand< // proxsuite::linalg::veg::_detail::_meta::make_index_sequence< proxsuite::linalg::veg::_detail::StrLiteralLen::value>, S>::Type { return {}; } #define __VEG_IMPL_UTF8_CONST(Literal) \ (u8##Literal##__veglib_const_literal_cpp20) #else namespace proxsuite { namespace linalg { namespace veg { namespace _detail { template struct ExtractCharsImpl; template struct ExtractCharsImpl> { using Type = StrLiteralConstant; }; template struct ExtractCharsImplExpr; template struct ExtractCharsImplExpr> { using Type = StrLiteralConstant; }; template auto extract_chars(LiteralType /*unused*/) -> typename ExtractCharsImpl< LiteralType, _meta::make_index_sequence>::Type { return {}; } template auto extract_chars_expr(LiteralType /*unused*/) -> typename ExtractCharsImplExpr< LiteralType, _meta::make_index_sequence>::Type { return {}; } } // namespace _detail } // namespace veg } // namespace linalg } // namespace proxsuite #define __VEG_IMPL_UTF8_CONST(Literal) \ (::proxsuite::linalg::veg::_detail::extract_chars_expr( \ []() /* NOLINT */ noexcept { \ struct __VEG_PP_CAT(_veglib_type, __LINE__) \ { \ static constexpr auto value() noexcept -> decltype(Literal) \ { \ return Literal; \ } \ using Size = ::proxsuite::linalg::veg::meta::constant< \ ::proxsuite::linalg::veg::usize, \ sizeof(value()) / sizeof(value()[0]) - 1>; \ }; \ return __VEG_PP_CAT(_veglib_type, __LINE__){}; \ }())) #endif #define VEG_DECLTYPE_VOID(...) decltype(void(__VA_ARGS__)) #define VEG_BOOL_NOEXCEPT(...) \ ::proxsuite::linalg::veg::meta::bool_constant #define VEG_CHECK_CONCEPT(...) \ VEG_CHECK_CONCEPT_MACRO(::proxsuite::linalg::veg::concepts, __VA_ARGS__) #define VEG_CONCEPT(...) \ VEG_CONCEPT_MACRO(::proxsuite::linalg::veg::concepts, __VA_ARGS__) #define __VEG_IMPL_GET_MEMBER_PTR(_, MemberPtr) /* NOLINT */ , &Type::MemberPtr #define __VEG_IMPL_GET_MEMBER_NAME_PTR(_, MemberPtr) /* NOLINT */ \ static_cast<::proxsuite::linalg::veg::_detail::NativeChar8 const*>( \ __VEG_PP_CAT(u8, __VEG_PP_STRINGIZE(MemberPtr))), #define __VEG_IMPL_GET_MEMBER_NAME_LEN(_, MemberPtr) /* NOLINT */ \ (sizeof(__VEG_PP_CAT(u8, __VEG_PP_STRINGIZE(MemberPtr))) - 1), #define __VEG_IMPL_STRUCT_SETUP(PClass, ...) /* NOLINT */ \ void _veg_lib_name_test()&& noexcept \ { \ static_assert( \ VEG_CONCEPT(same), \ "struct mismatch in VEG_REFLECT"); \ } \ struct _veglib_impl_member_extract \ { \ using Type = __VEG_PP_REMOVE_PAREN(PClass); \ using MemberTuple = \ decltype(::proxsuite::linalg::veg::_detail::make_simple_tuple( \ ::proxsuite::linalg::veg::_detail::Empty { \ } __VEG_PP_TUPLE_FOR_EACH(__VEG_IMPL_GET_MEMBER_PTR, \ _, \ (__VA_ARGS__)))); \ static constexpr auto member_pointers() noexcept -> MemberTuple \ { \ return ::proxsuite::linalg::veg::_detail::make_simple_tuple( \ ::proxsuite::linalg::veg::_detail::Empty {} __VEG_PP_TUPLE_FOR_EACH( \ __VEG_IMPL_GET_MEMBER_PTR, _, (__VA_ARGS__))); \ } \ static constexpr auto class_name_ptr() noexcept \ -> ::proxsuite::linalg::veg::_detail::NativeChar8 const* \ { \ return __VEG_PP_CAT(u8, \ __VEG_PP_STRINGIZE(__VEG_PP_REMOVE_PAREN(PClass))); \ } \ static constexpr auto class_name_len() noexcept \ -> ::proxsuite::linalg::veg::usize \ { \ return sizeof(__VEG_PP_CAT( \ u8, __VEG_PP_STRINGIZE(__VEG_PP_REMOVE_PAREN(PClass)))) - \ 1; \ } \ static constexpr auto member_name_ptrs() noexcept \ -> ::proxsuite::linalg::veg::_detail::Array_< \ ::proxsuite::linalg::veg::_detail::NativeChar8 const*, \ __VEG_PP_TUPLE_SIZE((__VA_ARGS__))> \ { \ return { { __VEG_PP_TUPLE_FOR_EACH( \ __VEG_IMPL_GET_MEMBER_NAME_PTR, _, (__VA_ARGS__)) } }; \ } \ static constexpr auto member_name_lens() noexcept \ -> ::proxsuite::linalg::veg::_detail::Array_< \ ::proxsuite::linalg::veg::usize, \ __VEG_PP_TUPLE_SIZE((__VA_ARGS__))> \ { \ return { { __VEG_PP_TUPLE_FOR_EACH( \ __VEG_IMPL_GET_MEMBER_NAME_LEN, _, (__VA_ARGS__)) } }; \ } \ }; \ friend struct ::proxsuite::linalg::veg::_detail::member_extract_access< \ __VEG_PP_REMOVE_PAREN(PClass)>; \ VEG_NOM_SEMICOLON #define VEG_REFLECT(PClass, ...) __VEG_IMPL_STRUCT_SETUP(PClass, __VA_ARGS__) #include "proxsuite/linalg/veg/internal/epilogue.hpp" #endif /* end of include guard VEG_MACROS_HPP_HSTLSKZXS */