123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829 |
- op_name, expr_template, result_expr_template) \
- template<::boost::yap::expr_kind Kind, typename Tuple> \
- constexpr auto operator BOOST_YAP_INDIRECT_CALL(op_name)( \
- expr_template<Kind, Tuple> const & x) \
- { \
- using lhs_type = ::boost::yap::detail::operand_type_t< \
- result_expr_template, \
- expr_template<Kind, Tuple> const &>; \
- using tuple_type = ::boost::hana::tuple<lhs_type>; \
- return result_expr_template< \
- ::boost::yap::expr_kind::op_name, \
- tuple_type>{ \
- tuple_type{::boost::yap::detail::make_operand<lhs_type>{}(x)}}; \
- } \
- template<::boost::yap::expr_kind Kind, typename Tuple> \
- constexpr auto operator BOOST_YAP_INDIRECT_CALL(op_name)( \
- expr_template<Kind, Tuple> & x) \
- { \
- using lhs_type = ::boost::yap::detail::operand_type_t< \
- result_expr_template, \
- expr_template<Kind, Tuple> &>; \
- using tuple_type = ::boost::hana::tuple<lhs_type>; \
- return result_expr_template< \
- ::boost::yap::expr_kind::op_name, \
- tuple_type>{ \
- tuple_type{::boost::yap::detail::make_operand<lhs_type>{}(x)}}; \
- } \
- template<::boost::yap::expr_kind Kind, typename Tuple> \
- constexpr auto operator BOOST_YAP_INDIRECT_CALL(op_name)( \
- expr_template<Kind, Tuple> && x) \
- { \
- using tuple_type = ::boost::hana::tuple<expr_template<Kind, Tuple>>; \
- return result_expr_template< \
- ::boost::yap::expr_kind::op_name, \
- tuple_type>{tuple_type{std::move(x)}}; \
- }
- op_name, expr_template, result_expr_template) \
- template<::boost::yap::expr_kind Kind, typename Tuple, typename Expr> \
- constexpr auto operator BOOST_YAP_INDIRECT_CALL(op_name)( \
- expr_template<Kind, Tuple> const & lhs, Expr && rhs) \
- { \
- using lhs_type = ::boost::yap::detail::operand_type_t< \
- result_expr_template, \
- expr_template<Kind, Tuple> const &>; \
- using rhs_type = \
- ::boost::yap::detail::operand_type_t<result_expr_template, Expr>; \
- using tuple_type = ::boost::hana::tuple<lhs_type, rhs_type>; \
- return result_expr_template< \
- ::boost::yap::expr_kind::op_name, \
- tuple_type>{ \
- tuple_type{::boost::yap::detail::make_operand<lhs_type>{}(lhs), \
- ::boost::yap::detail::make_operand<rhs_type>{}( \
- static_cast<Expr &&>(rhs))}}; \
- } \
- template<::boost::yap::expr_kind Kind, typename Tuple, typename Expr> \
- constexpr auto operator BOOST_YAP_INDIRECT_CALL(op_name)( \
- expr_template<Kind, Tuple> & lhs, Expr && rhs) \
- { \
- using lhs_type = ::boost::yap::detail::operand_type_t< \
- result_expr_template, \
- expr_template<Kind, Tuple> &>; \
- using rhs_type = \
- ::boost::yap::detail::operand_type_t<result_expr_template, Expr>; \
- using tuple_type = ::boost::hana::tuple<lhs_type, rhs_type>; \
- return result_expr_template< \
- ::boost::yap::expr_kind::op_name, \
- tuple_type>{ \
- tuple_type{::boost::yap::detail::make_operand<lhs_type>{}(lhs), \
- ::boost::yap::detail::make_operand<rhs_type>{}( \
- static_cast<Expr &&>(rhs))}}; \
- } \
- template<::boost::yap::expr_kind Kind, typename Tuple, typename Expr> \
- constexpr auto operator BOOST_YAP_INDIRECT_CALL(op_name)( \
- expr_template<Kind, Tuple> && lhs, Expr && rhs) \
- { \
- using lhs_type = ::boost::yap::detail::remove_cv_ref_t< \
- expr_template<Kind, Tuple> &&>; \
- using rhs_type = \
- ::boost::yap::detail::operand_type_t<result_expr_template, Expr>; \
- using tuple_type = ::boost::hana::tuple<lhs_type, rhs_type>; \
- return result_expr_template< \
- ::boost::yap::expr_kind::op_name, \
- tuple_type>{ \
- tuple_type{std::move(lhs), \
- ::boost::yap::detail::make_operand<rhs_type>{}( \
- static_cast<Expr &&>(rhs))}}; \
- } \
- template<typename T, ::boost::yap::expr_kind Kind, typename Tuple> \
- constexpr auto operator BOOST_YAP_INDIRECT_CALL(op_name)( \
- T && lhs, expr_template<Kind, Tuple> && rhs) \
- ->::boost::yap::detail::free_binary_op_result_t< \
- result_expr_template, \
- ::boost::yap::expr_kind::op_name, \
- T, \
- expr_template<Kind, Tuple> &&> \
- { \
- using result_types = ::boost::yap::detail::free_binary_op_result< \
- result_expr_template, \
- ::boost::yap::expr_kind::op_name, \
- T, \
- expr_template<Kind, Tuple> &&>; \
- using lhs_type = typename result_types::lhs_type; \
- using rhs_type = typename result_types::rhs_type; \
- using tuple_type = ::boost::hana::tuple<lhs_type, rhs_type>; \
- return {tuple_type{lhs_type{static_cast<T &&>(lhs)}, std::move(rhs)}}; \
- } \
- template<typename T, ::boost::yap::expr_kind Kind, typename Tuple> \
- constexpr auto operator BOOST_YAP_INDIRECT_CALL(op_name)( \
- T && lhs, expr_template<Kind, Tuple> const & rhs) \
- ->::boost::yap::detail::free_binary_op_result_t< \
- result_expr_template, \
- ::boost::yap::expr_kind::op_name, \
- T, \
- expr_template<Kind, Tuple> const &> \
- { \
- using result_types = ::boost::yap::detail::free_binary_op_result< \
- result_expr_template, \
- ::boost::yap::expr_kind::op_name, \
- T, \
- expr_template<Kind, Tuple> const &>; \
- using lhs_type = typename result_types::lhs_type; \
- using rhs_type = typename result_types::rhs_type; \
- using tuple_type = ::boost::hana::tuple<lhs_type, rhs_type>; \
- using rhs_tuple_type = typename result_types::rhs_tuple_type; \
- return {tuple_type{lhs_type{static_cast<T &&>(lhs)}, \
- rhs_type{rhs_tuple_type{std::addressof(rhs)}}}}; \
- } \
- template<typename T, ::boost::yap::expr_kind Kind, typename Tuple> \
- constexpr auto operator BOOST_YAP_INDIRECT_CALL(op_name)( \
- T && lhs, expr_template<Kind, Tuple> & rhs) \
- ->::boost::yap::detail::free_binary_op_result_t< \
- result_expr_template, \
- ::boost::yap::expr_kind::op_name, \
- T, \
- expr_template<Kind, Tuple> &> \
- { \
- using result_types = ::boost::yap::detail::free_binary_op_result< \
- result_expr_template, \
- ::boost::yap::expr_kind::op_name, \
- T, \
- expr_template<Kind, Tuple> &>; \
- using lhs_type = typename result_types::lhs_type; \
- using rhs_type = typename result_types::rhs_type; \
- using tuple_type = ::boost::hana::tuple<lhs_type, rhs_type>; \
- using rhs_tuple_type = typename result_types::rhs_tuple_type; \
- return {tuple_type{lhs_type{static_cast<T &&>(lhs)}, \
- rhs_type{rhs_tuple_type{std::addressof(rhs)}}}}; \
- }
- template< \
- typename Expr, \
- typename = std::enable_if_t< \
- !::boost::yap::detail::copy_or_move<this_type, Expr &&>::value>> \
- constexpr auto operator=(Expr && rhs) const & \
- { \
- using lhs_type = ::boost::yap::detail:: \
- operand_type_t<expr_template, this_type const &>; \
- using rhs_type = \
- ::boost::yap::detail::operand_type_t<expr_template, Expr>; \
- using tuple_type = ::boost::hana::tuple<lhs_type, rhs_type>; \
- return expr_template<::boost::yap::expr_kind::assign, tuple_type>{ \
- tuple_type{::boost::yap::detail::make_operand<lhs_type>{}(*this), \
- ::boost::yap::detail::make_operand<rhs_type>{}( \
- static_cast<Expr &&>(rhs))}}; \
- } \
- template< \
- typename Expr, \
- typename = std::enable_if_t< \
- !::boost::yap::detail::copy_or_move<this_type, Expr &&>::value>> \
- constexpr auto operator=(Expr && rhs) & \
- { \
- using lhs_type = ::boost::yap::detail:: \
- operand_type_t<expr_template, decltype(*this)>; \
- using rhs_type = \
- ::boost::yap::detail::operand_type_t<expr_template, Expr>; \
- using tuple_type = ::boost::hana::tuple<lhs_type, rhs_type>; \
- return expr_template<::boost::yap::expr_kind::assign, tuple_type>{ \
- tuple_type{::boost::yap::detail::make_operand<lhs_type>{}(*this), \
- ::boost::yap::detail::make_operand<rhs_type>{}( \
- static_cast<Expr &&>(rhs))}}; \
- } \
- template< \
- typename Expr, \
- typename = std::enable_if_t< \
- !::boost::yap::detail::copy_or_move<this_type, Expr &&>::value>> \
- constexpr auto operator=(Expr && rhs) && \
- { \
- using rhs_type = \
- ::boost::yap::detail::operand_type_t<expr_template, Expr>; \
- using tuple_type = ::boost::hana::tuple<this_type, rhs_type>; \
- return expr_template<::boost::yap::expr_kind::assign, tuple_type>{ \
- tuple_type{std::move(*this), \
- ::boost::yap::detail::make_operand<rhs_type>{}( \
- static_cast<Expr &&>(rhs))}}; \
- }
- template<typename Expr> \
- constexpr auto operator[](Expr && rhs) const & \
- { \
- using lhs_type = ::boost::yap::detail:: \
- operand_type_t<expr_template, decltype(*this)>; \
- using rhs_type = \
- ::boost::yap::detail::operand_type_t<expr_template, Expr>; \
- using tuple_type = ::boost::hana::tuple<lhs_type, rhs_type>; \
- return expr_template<::boost::yap::expr_kind::subscript, tuple_type>{ \
- tuple_type{::boost::yap::detail::make_operand<lhs_type>{}(*this), \
- ::boost::yap::detail::make_operand<rhs_type>{}( \
- static_cast<Expr &&>(rhs))}}; \
- } \
- template<typename Expr> \
- constexpr auto operator[](Expr && rhs) & \
- { \
- using lhs_type = ::boost::yap::detail:: \
- operand_type_t<expr_template, decltype(*this)>; \
- using rhs_type = \
- ::boost::yap::detail::operand_type_t<expr_template, Expr>; \
- using tuple_type = ::boost::hana::tuple<lhs_type, rhs_type>; \
- return expr_template<::boost::yap::expr_kind::subscript, tuple_type>{ \
- tuple_type{::boost::yap::detail::make_operand<lhs_type>{}(*this), \
- ::boost::yap::detail::make_operand<rhs_type>{}( \
- static_cast<Expr &&>(rhs))}}; \
- } \
- template<typename Expr> \
- constexpr auto operator[](Expr && rhs) && \
- { \
- using lhs_type = \
- ::boost::yap::detail::remove_cv_ref_t<decltype(*this)>; \
- using rhs_type = \
- ::boost::yap::detail::operand_type_t<expr_template, Expr>; \
- using tuple_type = ::boost::hana::tuple<lhs_type, rhs_type>; \
- return expr_template<::boost::yap::expr_kind::subscript, tuple_type>{ \
- tuple_type{std::move(*this), \
- ::boost::yap::detail::make_operand<rhs_type>{}( \
- static_cast<Expr &&>(rhs))}}; \
- }
- template<typename... U> \
- constexpr auto operator()(U &&... u) const & \
- { \
- using lhs_type = ::boost::yap::detail:: \
- operand_type_t<expr_template, decltype(*this)>; \
- using tuple_type = ::boost::hana::tuple< \
- lhs_type, \
- ::boost::yap::detail::operand_type_t<expr_template, U>...>; \
- return expr_template<::boost::yap::expr_kind::call, tuple_type>{ \
- tuple_type{ \
- ::boost::yap::detail::make_operand<lhs_type>{}(*this), \
- ::boost::yap::detail::make_operand< \
- ::boost::yap::detail::operand_type_t<expr_template, U>>{}( \
- static_cast<U &&>(u))...}}; \
- } \
- template<typename... U> \
- constexpr auto operator()(U &&... u) & \
- { \
- using lhs_type = ::boost::yap::detail:: \
- operand_type_t<expr_template, decltype(*this)>; \
- using tuple_type = ::boost::hana::tuple< \
- lhs_type, \
- ::boost::yap::detail::operand_type_t<expr_template, U>...>; \
- return expr_template<::boost::yap::expr_kind::call, tuple_type>{ \
- tuple_type{ \
- ::boost::yap::detail::make_operand<lhs_type>{}(*this), \
- ::boost::yap::detail::make_operand< \
- ::boost::yap::detail::operand_type_t<expr_template, U>>{}( \
- static_cast<U &&>(u))...}}; \
- } \
- template<typename... U> \
- constexpr auto operator()(U &&... u) && \
- { \
- using this_type = \
- ::boost::yap::detail::remove_cv_ref_t<decltype(*this)>; \
- using tuple_type = ::boost::hana::tuple< \
- this_type, \
- ::boost::yap::detail::operand_type_t<expr_template, U>...>; \
- return expr_template<::boost::yap::expr_kind::call, tuple_type>{ \
- tuple_type{ \
- std::move(*this), \
- ::boost::yap::detail::make_operand< \
- ::boost::yap::detail::operand_type_t<expr_template, U>>{}( \
- static_cast<U &&>(u))...}}; \
- }
- ::boost::yap::detail::operand_type_t<expr_template, BOOST_PP_CAT(U, n)>
- ::boost::yap::detail::make_operand<::boost::yap::detail::operand_type_t< \
- expr_template, \
- BOOST_PP_CAT(U, n)>>{}( \
- static_cast<BOOST_PP_CAT(U, n) &&>(BOOST_PP_CAT(u, n)))
- template<BOOST_PP_ENUM_PARAMS(n, typename U)> \
- constexpr auto operator()(BOOST_PP_ENUM_BINARY_PARAMS(n, U, &&u)) const & \
- { \
- using lhs_type = ::boost::yap::detail:: \
- operand_type_t<expr_template, decltype(*this)>; \
- using tuple_type = ::boost::hana::tuple< \
- lhs_type, \
- BOOST_PP_ENUM( \
- n, BOOST_YAP_USER_CALL_OPERATOR_OPERAND_T, expr_template)>; \
- return expr_template<::boost::yap::expr_kind::call, tuple_type>{ \
- tuple_type{::boost::yap::detail::make_operand<lhs_type>{}(*this), \
- BOOST_PP_ENUM( \
- n, \
- BOOST_YAP_USER_CALL_OPERATOR_MAKE_OPERAND, \
- expr_template)}}; \
- } \
- template<BOOST_PP_ENUM_PARAMS(n, typename U)> \
- constexpr auto operator()(BOOST_PP_ENUM_BINARY_PARAMS(n, U, &&u)) & \
- { \
- using lhs_type = ::boost::yap::detail:: \
- operand_type_t<expr_template, decltype(*this)>; \
- using tuple_type = ::boost::hana::tuple< \
- lhs_type, \
- BOOST_PP_ENUM( \
- n, BOOST_YAP_USER_CALL_OPERATOR_OPERAND_T, expr_template)>; \
- return expr_template<::boost::yap::expr_kind::call, tuple_type>{ \
- tuple_type{::boost::yap::detail::make_operand<lhs_type>{}(*this), \
- BOOST_PP_ENUM( \
- n, \
- BOOST_YAP_USER_CALL_OPERATOR_MAKE_OPERAND, \
- expr_template)}}; \
- } \
- template<BOOST_PP_ENUM_PARAMS(n, typename U)> \
- constexpr auto operator()(BOOST_PP_ENUM_BINARY_PARAMS(n, U, &&u)) && \
- { \
- using this_type = \
- ::boost::yap::detail::remove_cv_ref_t<decltype(*this)>; \
- using tuple_type = ::boost::hana::tuple< \
- this_type, \
- BOOST_PP_ENUM( \
- n, BOOST_YAP_USER_CALL_OPERATOR_OPERAND_T, expr_template)>; \
- return expr_template<::boost::yap::expr_kind::call, tuple_type>{ \
- tuple_type{std::move(*this), \
- BOOST_PP_ENUM( \
- n, \
- BOOST_YAP_USER_CALL_OPERATOR_MAKE_OPERAND, \
- expr_template)}}; \
- }
- template<typename Expr1, typename Expr2, typename Expr3> \
- constexpr auto if_else(Expr1 && expr1, Expr2 && expr2, Expr3 && expr3) \
- ->::boost::yap::detail:: \
- ternary_op_result_t<expr_template, Expr1, Expr2, Expr3> \
- { \
- using result_types = ::boost::yap::detail:: \
- ternary_op_result<expr_template, Expr1, Expr2, Expr3>; \
- using cond_type = typename result_types::cond_type; \
- using then_type = typename result_types::then_type; \
- using else_type = typename result_types::else_type; \
- using tuple_type = \
- ::boost::hana::tuple<cond_type, then_type, else_type>; \
- return {tuple_type{::boost::yap::detail::make_operand<cond_type>{}( \
- static_cast<Expr1 &&>(expr1)), \
- ::boost::yap::detail::make_operand<then_type>{}( \
- static_cast<Expr2 &&>(expr2)), \
- ::boost::yap::detail::make_operand<else_type>{}( \
- static_cast<Expr3 &&>(expr3))}}; \
- }
- template<typename Expr1, typename Expr2, typename Expr3> \
- constexpr auto if_else(Expr1 && expr1, Expr2 && expr2, Expr3 && expr3) \
- ->::boost::yap::detail::udt_any_ternary_op_result_t< \
- expr_template, \
- Expr1, \
- Expr2, \
- Expr3, \
- udt_trait> \
- { \
- using result_types = ::boost::yap::detail::udt_any_ternary_op_result< \
- expr_template, \
- Expr1, \
- Expr2, \
- Expr3, \
- udt_trait>; \
- using cond_type = typename result_types::cond_type; \
- using then_type = typename result_types::then_type; \
- using else_type = typename result_types::else_type; \
- using tuple_type = \
- ::boost::hana::tuple<cond_type, then_type, else_type>; \
- return {tuple_type{::boost::yap::detail::make_operand<cond_type>{}( \
- static_cast<Expr1 &&>(expr1)), \
- ::boost::yap::detail::make_operand<then_type>{}( \
- static_cast<Expr2 &&>(expr2)), \
- ::boost::yap::detail::make_operand<else_type>{}( \
- static_cast<Expr3 &&>(expr3))}}; \
- }
- template<typename T> \
- constexpr auto operator BOOST_YAP_INDIRECT_CALL(op_name)(T && x) \
- ->::boost::yap::detail::udt_unary_op_result_t< \
- expr_template, \
- ::boost::yap::expr_kind::op_name, \
- T, \
- udt_trait> \
- { \
- using result_types = ::boost::yap::detail::udt_unary_op_result< \
- expr_template, \
- ::boost::yap::expr_kind::op_name, \
- T, \
- udt_trait>; \
- using x_type = typename result_types::x_type; \
- using tuple_type = ::boost::hana::tuple<x_type>; \
- return {tuple_type{x_type{static_cast<T &&>(x)}}}; \
- }
- op_name, expr_template, t_udt_trait, u_udt_trait) \
- template<typename T, typename U> \
- constexpr auto operator BOOST_YAP_INDIRECT_CALL(op_name)(T && lhs, U && rhs) \
- ->::boost::yap::detail::udt_udt_binary_op_result_t< \
- expr_template, \
- ::boost::yap::expr_kind::op_name, \
- T, \
- U, \
- t_udt_trait, \
- u_udt_trait> \
- { \
- using result_types = ::boost::yap::detail::udt_udt_binary_op_result< \
- expr_template, \
- ::boost::yap::expr_kind::op_name, \
- T, \
- U, \
- t_udt_trait, \
- u_udt_trait>; \
- using lhs_type = typename result_types::lhs_type; \
- using rhs_type = typename result_types::rhs_type; \
- using tuple_type = ::boost::hana::tuple<lhs_type, rhs_type>; \
- return {tuple_type{ \
- lhs_type{static_cast<T &&>(lhs)}, \
- rhs_type{static_cast<U &&>(rhs)}, \
- }}; \
- }
- op_name, expr_template, udt_trait) \
- template<typename T, typename U> \
- constexpr auto operator BOOST_YAP_INDIRECT_CALL(op_name)(T && lhs, U && rhs) \
- ->::boost::yap::detail::udt_any_binary_op_result_t< \
- expr_template, \
- ::boost::yap::expr_kind::op_name, \
- T, \
- U, \
- udt_trait> \
- { \
- using result_types = ::boost::yap::detail::udt_any_binary_op_result< \
- expr_template, \
- ::boost::yap::expr_kind::op_name, \
- T, \
- U, \
- udt_trait>; \
- using lhs_type = typename result_types::lhs_type; \
- using rhs_type = typename result_types::rhs_type; \
- using tuple_type = ::boost::hana::tuple<lhs_type, rhs_type>; \
- return {tuple_type{lhs_type{static_cast<T &&>(lhs)}, \
- rhs_type{static_cast<U &&>(rhs)}}}; \
- }
- template<char... c> \
- constexpr auto operator"" _p() \
- { \
- using i = ::boost::hana::llong< \
- ::boost::hana::ic_detail::parse<sizeof...(c)>({c...})>; \
- static_assert(1 <= i::value, "Placeholders must be >= 1."); \
- return expr_template< \
- ::boost::yap::expr_kind::terminal, \
- ::boost::hana::tuple<::boost::yap::placeholder<i::value>>>{}; \
- }
|