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

Support moves in transform().

This commit is contained in:
Zach Laine
2016-11-17 21:54:44 -06:00
parent cb4d68f817
commit 96927a994c
5 changed files with 148 additions and 19 deletions

View File

@@ -2,8 +2,6 @@
#include <gtest/gtest.h>
#include <sstream>
template <typename T>
using term = boost::proto17::terminal<T>;
@@ -25,9 +23,6 @@ namespace user {
friend number operator* (number lhs, number rhs)
{ return number{lhs.value * rhs.value}; }
friend std::ostream & operator<< (std::ostream & os, number x) // TODO
{ return os << x.value; }
};
number naxpy (number a, number x, number y)
@@ -103,11 +98,6 @@ namespace user {
}
// TODO: Add a unit test for moved expressions and expressions containing
// move-only types or rvalue refs.
// TODO: Use move-only type in other tests that test moves as well.
TEST(user_expression_transform_3, test_user_expression_transform_3)
{
term<user::number> a{{1.0}};
@@ -211,3 +201,38 @@ TEST(user_expression_transform_3, test_user_expression_transform_3)
}
}
}
auto double_to_float (term<double> expr)
{ return term<float>{(float)expr.value()}; }
auto check_unique_ptrs_equal_7 (term<std::unique_ptr<int>> && expr)
{
using namespace boost::hana::literals;
EXPECT_EQ(*expr.elements[0_c], 7);
return std::move(expr);
}
TEST(move_only, test_user_expression_transform_3)
{
term<double> unity{1.0};
term<std::unique_ptr<int>> i{new int{7}};
bp17::expression<
bp17::expr_kind::plus,
term<double>,
term<std::unique_ptr<int>>
> expr_1 = unity + std::move(i);
bp17::expression<
bp17::expr_kind::plus,
term<double>,
bp17::expression<
bp17::expr_kind::plus,
term<double>,
term<std::unique_ptr<int>>
>
> expr_2 = unity + std::move(expr_1);
auto transformed_expr = transform(std::move(expr_2), double_to_float);
transform(std::move(transformed_expr), check_unique_ptrs_equal_7);
}