2
0
mirror of https://github.com/boostorg/yap.git synced 2026-02-22 16:02:10 +00:00

Add reference qualified overloaded value(), left(), and right() expression members, and free versions of same.

This commit is contained in:
Zach Laine
2016-11-19 13:29:47 -06:00
parent 5b7cd4c71e
commit 514fd94b1e

View File

@@ -66,7 +66,7 @@ namespace boost::proto17 {
{ return eval_expression_as(*this, hana::basic_type<R>{}); }
#endif
decltype(auto) value () const
decltype(auto) value () const &
{
using namespace hana::literals;
static_assert(
@@ -76,7 +76,27 @@ namespace boost::proto17 {
return elements[0_c];
}
decltype(auto) left () const
decltype(auto) value () &
{
using namespace hana::literals;
static_assert(
decltype(hana::size(elements))::value == 1UL,
"value() is only defined for unary expressions."
);
return elements[0_c];
}
decltype(auto) value () &&
{
using namespace hana::literals;
static_assert(
decltype(hana::size(elements))::value == 1UL,
"value() is only defined for unary expressions."
);
return static_cast<tuple_type &&>(elements)[0_c];
}
decltype(auto) left () const &
{
using namespace hana::literals;
static_assert(
@@ -86,7 +106,27 @@ namespace boost::proto17 {
return elements[0_c];
}
decltype(auto) right () const
decltype(auto) left () &
{
using namespace hana::literals;
static_assert(
decltype(hana::size(elements))::value == 2UL,
"left() and right() are only defined for binary expressions."
);
return elements[0_c];
}
decltype(auto) left () &&
{
using namespace hana::literals;
static_assert(
decltype(hana::size(elements))::value == 2UL,
"left() and right() are only defined for binary expressions."
);
return static_cast<tuple_type &&>(elements)[0_c];
}
decltype(auto) right () const &
{
using namespace hana::literals;
static_assert(
@@ -96,6 +136,26 @@ namespace boost::proto17 {
return elements[1_c];
}
decltype(auto) right () &
{
using namespace hana::literals;
static_assert(
decltype(hana::size(elements))::value == 2UL,
"left() and right() are only defined for binary expressions."
);
return elements[1_c];
}
decltype(auto) right () &&
{
using namespace hana::literals;
static_assert(
decltype(hana::size(elements))::value == 2UL,
"left() and right() are only defined for binary expressions."
);
return static_cast<tuple_type &&>(elements)[1_c];
}
#define BOOST_PROTO17_UNARY_MEMBER_OPERATOR(op, op_name) \
auto operator op const & \
{ \
@@ -213,6 +273,105 @@ namespace boost::proto17 {
}
};
template <typename Expr>
decltype(auto) value (Expr const & expr)
{
using namespace hana::literals;
static_assert(
decltype(hana::size(expr.elements))::value == 1UL,
"value() is only defined for unary expressions."
);
return expr.elements[0_c];
}
template <typename Expr>
decltype(auto) value (Expr & expr)
{
using namespace hana::literals;
static_assert(
decltype(hana::size(expr.elements))::value == 1UL,
"value() is only defined for unary expressions."
);
return expr.elements[0_c];
}
template <typename Expr>
decltype(auto) value (std::remove_reference_t<Expr> && expr)
{
using namespace hana::literals;
static_assert(
decltype(hana::size(expr.elements))::value == 1UL,
"value() is only defined for unary expressions."
);
return static_cast<decltype(expr.elements) &&>(expr.elements)[0_c];
}
template <typename Expr>
decltype(auto) left (Expr const & expr)
{
using namespace hana::literals;
static_assert(
decltype(hana::size(expr.elements))::value == 2UL,
"left() and right() are only defined for binary expressions."
);
return expr.elements[0_c];
}
template <typename Expr>
decltype(auto) left (Expr & expr)
{
using namespace hana::literals;
static_assert(
decltype(hana::size(expr.elements))::value == 2UL,
"left() and right() are only defined for binary expressions."
);
return expr.elements[0_c];
}
template <typename Expr>
decltype(auto) left (std::remove_reference_t<Expr> && expr)
{
using namespace hana::literals;
static_assert(
decltype(hana::size(expr.elements))::value == 2UL,
"left() and right() are only defined for binary expressions."
);
return static_cast<decltype(expr.elements) &&>(expr.elements)[0_c];
}
template <typename Expr>
decltype(auto) right (Expr const & expr)
{
using namespace hana::literals;
static_assert(
decltype(hana::size(expr.elements))::value == 2UL,
"left() and right() are only defined for binary expressions."
);
return expr.elements[1_c];
}
template <typename Expr>
decltype(auto) right (Expr & expr)
{
using namespace hana::literals;
static_assert(
decltype(hana::size(expr.elements))::value == 2UL,
"left() and right() are only defined for binary expressions."
);
return expr.elements[1_c];
}
template <typename Expr>
decltype(auto) right (std::remove_reference_t<Expr> && expr)
{
using namespace hana::literals;
static_assert(
decltype(hana::size(expr.elements))::value == 2UL,
"left() and right() are only defined for binary expressions."
);
return static_cast<decltype(expr.elements) &&>(expr.elements)[1_c];
}
namespace detail {
template <expr_kind OpKind, typename T, typename U,