...one of the most highly
regarded and expertly designed C++ library projects in the
world.
— Herb Sutter and Andrei
Alexandrescu, C++
Coding Standards
namespace boost { namespace yap { template<typename Expr> struct expression_function; template<typename Expr> decltype(auto) constexpr deref(Expr &&); template<typename T> decltype(auto) constexpr value(T &&); template<typename Expr, typename I> decltype(auto) constexpr get(Expr &&, I const &); template<long long I, typename Expr> decltype(auto) constexpr get_c(Expr &&); template<typename Expr> decltype(auto) constexpr left(Expr &&); template<typename Expr> decltype(auto) constexpr right(Expr &&); template<typename Expr> decltype(auto) constexpr cond(Expr &&); template<typename Expr> decltype(auto) constexpr then(Expr &&); template<typename Expr> decltype(auto) constexpr else_(Expr &&); template<typename Expr> decltype(auto) constexpr callable(Expr &&); template<long long I, typename Expr> decltype(auto) constexpr argument(Expr &&, hana::llong< I >); template<template< expr_kind, class > class ExprTemplate, expr_kind Kind, typename... T> constexpr auto make_expression(T &&...); template<template< expr_kind, class > class ExprTemplate, typename T> constexpr auto make_terminal(T &&); template<template< expr_kind, class > class ExprTemplate, typename T> decltype(auto) constexpr as_expr(T &&); template<typename Expr> constexpr auto make_expression_function(Expr &&); template<typename... T> constexpr auto replacements(T &&...); template<typename Expr, typename... T> decltype(auto) constexpr replace_placeholders(Expr &&, T &&...); template<typename... T> constexpr auto evaluation(T &&...); template<typename Expr, typename... T> decltype(auto) constexpr evaluate(Expr &&, T &&...); template<typename Expr, typename Transform, typename... Transforms> decltype(auto) constexpr transform(Expr &&, Transform &&, Transforms &&...); template<typename Expr, typename Transform, typename... Transforms> decltype(auto) constexpr transform_strict(Expr &&, Transform &&, Transforms &&...); } }
namespace boost { namespace yap { template<expr_kind Kind> struct expr_tag; template<typename Expr> struct is_expr; template<expr_kind Kind, typename Tuple> struct minimal_expr; template<long long I> struct placeholder; enum expr_kind; typedef expr_template< expr_kind::terminal, hana::tuple< T > > terminal; typedef expr_template< expr_kind::expr_ref, hana::tuple< std::remove_reference_t< T > * > > expression_ref; namespace literals { template<char... c> constexpr auto operator""_p(); } } }
namespace boost { namespace yap { template<expr_kind Kind, typename Tuple> struct expression; template<typename T> struct expression<expr_kind::terminal, hana::tuple< T >>; template<typename Expr> constexpr auto operator+(Expr &&); template<typename Expr> constexpr auto operator-(Expr &&); template<typename Expr> constexpr auto operator*(Expr &&); template<typename Expr> constexpr auto operator~(Expr &&); template<typename Expr> constexpr auto operator&(Expr &&); template<typename Expr> constexpr auto operator!(Expr &&); template<typename Expr> constexpr auto operator++(Expr &&); template<typename Expr> constexpr auto operator--(Expr &&); template<typename Expr> constexpr auto operator++(Expr &&, int); template<typename Expr> constexpr auto operator--(Expr &&, int); template<typename LExpr, typename RExpr> constexpr auto operator<<(LExpr &&, RExpr &&); template<typename LExpr, typename RExpr> constexpr auto operator>>(LExpr &&, RExpr &&); template<typename LExpr, typename RExpr> constexpr auto operator*(LExpr &&, RExpr &&); template<typename LExpr, typename RExpr> constexpr auto operator/(LExpr &&, RExpr &&); template<typename LExpr, typename RExpr> constexpr auto operator%(LExpr &&, RExpr &&); template<typename LExpr, typename RExpr> constexpr auto operator+(LExpr &&, RExpr &&); template<typename LExpr, typename RExpr> constexpr auto operator-(LExpr &&, RExpr &&); template<typename LExpr, typename RExpr> constexpr auto operator<(LExpr &&, RExpr &&); template<typename LExpr, typename RExpr> constexpr auto operator>(LExpr &&, RExpr &&); template<typename LExpr, typename RExpr> constexpr auto operator<=(LExpr &&, RExpr &&); template<typename LExpr, typename RExpr> constexpr auto operator>=(LExpr &&, RExpr &&); template<typename LExpr, typename RExpr> constexpr auto operator==(LExpr &&, RExpr &&); template<typename LExpr, typename RExpr> constexpr auto operator!=(LExpr &&, RExpr &&); template<typename LExpr, typename RExpr> constexpr auto operator||(LExpr &&, RExpr &&); template<typename LExpr, typename RExpr> constexpr auto operator&&(LExpr &&, RExpr &&); template<typename LExpr, typename RExpr> constexpr auto operator&(LExpr &&, RExpr &&); template<typename LExpr, typename RExpr> constexpr auto operator|(LExpr &&, RExpr &&); template<typename LExpr, typename RExpr> constexpr auto operator^(LExpr &&, RExpr &&); template<typename Expr1, typename Expr2, typename Expr3> constexpr auto if_else(Expr1 &&, Expr2 &&, Expr3 &&); template<expr_kind Kind, typename... T> constexpr auto make_expression(T &&...); template<typename T> constexpr auto make_terminal(T &&); template<typename T> decltype(auto) constexpr as_expr(T &&); } }
namespace boost { namespace yap { constexpr char const * op_string(expr_kind); template<typename Expr> std::ostream & print(std::ostream &, Expr const &); } }
BOOST_YAP_USER_UNARY_OPERATOR(op_name, expr_template, result_expr_template) BOOST_YAP_USER_BINARY_OPERATOR(op_name, expr_template, result_expr_template) BOOST_YAP_USER_ASSIGN_OPERATOR(this_type, expr_template) BOOST_YAP_USER_SUBSCRIPT_OPERATOR(expr_template) BOOST_YAP_USER_CALL_OPERATOR(expr_template) BOOST_YAP_USER_CALL_OPERATOR_N(expr_template, n) BOOST_YAP_USER_EXPR_IF_ELSE(expr_template) BOOST_YAP_USER_UDT_ANY_IF_ELSE(expr_template, udt_trait) BOOST_YAP_USER_UDT_UNARY_OPERATOR(op_name, expr_template, udt_trait) BOOST_YAP_USER_UDT_UDT_BINARY_OPERATOR(op_name, expr_template, t_udt_trait, u_udt_trait) BOOST_YAP_USER_UDT_ANY_BINARY_OPERATOR(op_name, expr_template, udt_trait) BOOST_YAP_USER_LITERAL_PLACEHOLDER_OPERATOR(expr_template)