summaryrefslogtreecommitdiffstats
path: root/src/boost/libs/yap/test/comma.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/boost/libs/yap/test/comma.cpp')
-rw-r--r--src/boost/libs/yap/test/comma.cpp126
1 files changed, 126 insertions, 0 deletions
diff --git a/src/boost/libs/yap/test/comma.cpp b/src/boost/libs/yap/test/comma.cpp
new file mode 100644
index 00000000..af3814cf
--- /dev/null
+++ b/src/boost/libs/yap/test/comma.cpp
@@ -0,0 +1,126 @@
+// 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 <boost/yap/expression.hpp>
+
+#include <boost/mpl/assert.hpp>
+
+#include <boost/test/minimal.hpp>
+
+#include <sstream>
+
+
+template<typename T>
+using term = boost::yap::terminal<boost::yap::expression, T>;
+
+template<typename T>
+using term_ref = boost::yap::expression_ref<boost::yap::expression, term<T> &>;
+
+template<typename T>
+using term_cref =
+ boost::yap::expression_ref<boost::yap::expression, term<T> const &>;
+
+namespace yap = boost::yap;
+namespace bh = boost::hana;
+
+
+struct void_callable
+{
+ void operator()() { *called_ = (*call_count_)++; }
+ int * call_count_;
+ int * called_;
+};
+
+struct int_callable
+{
+ int operator()()
+ {
+ *called_ = (*call_count_)++;
+ return 42;
+ }
+ int * call_count_;
+ int * called_;
+};
+
+struct double_callable
+{
+ double operator()()
+ {
+ *called_ = (*call_count_)++;
+ return 13.0;
+ }
+ int * call_count_;
+ int * called_;
+};
+
+
+int test_main(int, char * [])
+{
+{
+ {
+ int call_count = 0;
+ int int_called = -1;
+ int double_called = -1;
+
+ auto int_double_expr =
+ (term<int_callable>{{&call_count, &int_called}}(),
+ term<double_callable>{{&call_count, &double_called}}());
+
+ BOOST_CHECK(evaluate(int_double_expr) == 13.0);
+ BOOST_CHECK(int_called == 0);
+ BOOST_CHECK(double_called == 1);
+ }
+
+ {
+ int call_count = 0;
+ int int_called = -1;
+ int double_called = -1;
+
+ auto double_int_expr =
+ (term<double_callable>{{&call_count, &double_called}}(),
+ term<int_callable>{{&call_count, &int_called}}());
+
+ BOOST_CHECK(evaluate(double_int_expr) == 42);
+ BOOST_CHECK(int_called == 1);
+ BOOST_CHECK(double_called == 0);
+ }
+}
+
+{
+ {
+ int call_count = 0;
+ int void_called = -1;
+ int int_called = -1;
+
+ auto void_int_expr =
+ (term<void_callable>{{&call_count, &void_called}}(),
+ term<int_callable>{{&call_count, &int_called}}());
+
+ BOOST_CHECK(evaluate(void_int_expr) == 42);
+ BOOST_CHECK(void_called == 0);
+ BOOST_CHECK(int_called == 1);
+ }
+
+ {
+ int call_count = 0;
+ int void_called = -1;
+ int int_called = -1;
+
+ auto int_void_expr =
+ (term<int_callable>{{&call_count, &int_called}}(),
+ term<void_callable>{{&call_count, &void_called}}());
+
+ using eval_type = decltype(evaluate(int_void_expr));
+ BOOST_MPL_ASSERT(
+ (std::is_same<void, eval_type>));
+
+ evaluate(int_void_expr);
+ BOOST_CHECK(void_called == 1);
+ BOOST_CHECK(int_called == 0);
+ }
+}
+
+return 0;
+}