// Copyright (C) 2016-2018 T. Zachary Laine // // Distributed under the Boost Software License, Version 1.0. (See // accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) #include template using term = boost::yap::terminal; template using ref = boost::yap::expression_ref; namespace yap = boost::yap; namespace bh = boost::hana; void compile_term_plus_expr() { // values { term unity{1.0}; term i = {1}; yap::expression< yap::expr_kind::plus, bh::tuple &>, ref &>>> expr = unity + i; yap::expression< yap::expr_kind::plus, bh::tuple< ref &>, ref &>, ref &>>> &>>> unevaluated_expr = unity + expr; (void)unevaluated_expr; } { term unity{1.0}; term i = {1}; yap::expression< yap::expr_kind::plus, bh::tuple &>, ref &>>> expr = unity + i; yap::expression< yap::expr_kind::plus, bh::tuple< ref &>, ref &>, ref &>>> &>>> unevaluated_expr = unity + expr; (void)unevaluated_expr; } { term unity{1.0}; term i = {1}; yap::expression< yap::expr_kind::plus, bh::tuple &>, term>> expr = unity + std::move(i); yap::expression< yap::expr_kind::plus, bh::tuple< ref &>, ref &>, term>> &>>> unevaluated_expr = unity + expr; (void)unevaluated_expr; } // const value terminals/expressions { term unity{1.0}; term const i = {1}; yap::expression< yap::expr_kind::plus, bh::tuple &>, ref const &>>> const expr = unity + i; yap::expression< yap::expr_kind::plus, bh::tuple< ref &>, ref &>, ref const &>>> const &>>> unevaluated_expr = unity + expr; (void)unevaluated_expr; } { term unity{1.0}; term i = {1}; yap::expression< yap::expr_kind::plus, bh::tuple &>, ref &>>> const expr = unity + i; yap::expression< yap::expr_kind::plus, bh::tuple< ref &>, ref &>, ref &>>> const &>>> unevaluated_expr = unity + expr; (void)unevaluated_expr; } // lvalue refs { term unity{1.0}; int i_ = 1; term i{i_}; yap::expression< yap::expr_kind::plus, bh::tuple &>, ref &>>> expr = unity + i; yap::expression< yap::expr_kind::plus, bh::tuple< ref &>, ref &>, ref &>>> &>>> unevaluated_expr = unity + expr; (void)unevaluated_expr; } { term unity{1.0}; int i_ = 1; term i{i_}; yap::expression< yap::expr_kind::plus, bh::tuple &>, ref &>>> expr = unity + i; yap::expression< yap::expr_kind::plus, bh::tuple< ref &>, ref &>, ref &>>> &>>> unevaluated_expr = unity + expr; (void)unevaluated_expr; } { term unity{1.0}; int i_ = 1; term i{i_}; yap::expression< yap::expr_kind::plus, bh::tuple &>, term>> expr = unity + std::move(i); yap::expression< yap::expr_kind::plus, bh::tuple< ref &>, ref &>, term>> &>>> unevaluated_expr = unity + expr; (void)unevaluated_expr; } { term unity{1.0}; int i_ = 1; term i{i_}; yap::expression< yap::expr_kind::plus, bh::tuple &>, ref &>>> expr = unity + i; yap::expression< yap::expr_kind::plus, bh::tuple< ref &>, yap::expression< yap::expr_kind::plus, bh::tuple &>, ref &>>>>> unevaluated_expr = unity + std::move(expr); (void)unevaluated_expr; } { term unity{1.0}; int i_ = 1; term i{i_}; yap::expression< yap::expr_kind::plus, bh::tuple &>, ref &>>> expr = unity + i; yap::expression< yap::expr_kind::plus, bh::tuple< ref &>, yap::expression< yap::expr_kind::plus, bh::tuple &>, ref &>>>>> unevaluated_expr = unity + std::move(expr); (void)unevaluated_expr; } { term unity{1.0}; int i_ = 1; term i{i_}; yap::expression< yap::expr_kind::plus, bh::tuple &>, term>> expr = unity + std::move(i); yap::expression< yap::expr_kind::plus, bh::tuple< ref &>, yap::expression< yap::expr_kind::plus, bh::tuple &>, term>>>> unevaluated_expr = unity + std::move(expr); (void)unevaluated_expr; } // rvalue refs { term unity{1.0}; int i_ = 1; term i{std::move(i_)}; yap::expression< yap::expr_kind::plus, bh::tuple &>, term>> expr = unity + std::move(i); yap::expression< yap::expr_kind::plus, bh::tuple< ref &>, yap::expression< yap::expr_kind::plus, bh::tuple &>, term>>>> unevaluated_expr = unity + std::move(expr); (void)unevaluated_expr; } { term unity{1.0}; int i_ = 1; term i{std::move(i_)}; yap::expression< yap::expr_kind::plus, bh::tuple &>, term>> expr = unity + std::move(i); yap::expression< yap::expr_kind::plus, bh::tuple< ref &>, yap::expression< yap::expr_kind::plus, bh::tuple &>, term>>>> unevaluated_expr = unity + std::move(expr); (void)unevaluated_expr; } { term unity{1.0}; int i_ = 1; term i{std::move(i_)}; yap::expression< yap::expr_kind::plus, bh::tuple &>, term>> expr = unity + std::move(i); yap::expression< yap::expr_kind::plus, bh::tuple< ref &>, yap::expression< yap::expr_kind::plus, bh::tuple &>, term>>>> unevaluated_expr = unity + std::move(expr); (void)unevaluated_expr; } { term unity{1.0}; int i_ = 1; term i{std::move(i_)}; yap::expression< yap::expr_kind::plus, bh::tuple &>, term>> expr = unity + std::move(i); yap::expression< yap::expr_kind::plus, bh::tuple< ref &>, yap::expression< yap::expr_kind::plus, bh::tuple &>, term>>>> unevaluated_expr = unity + std::move(expr); (void)unevaluated_expr; } }