summaryrefslogtreecommitdiffstats
path: root/src/boost/libs/yap/example/transform_terminals.cpp
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-27 18:24:20 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-27 18:24:20 +0000
commit483eb2f56657e8e7f419ab1a4fab8dce9ade8609 (patch)
treee5d88d25d870d5dedacb6bbdbe2a966086a0a5cf /src/boost/libs/yap/example/transform_terminals.cpp
parentInitial commit. (diff)
downloadceph-upstream.tar.xz
ceph-upstream.zip
Adding upstream version 14.2.21.upstream/14.2.21upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'src/boost/libs/yap/example/transform_terminals.cpp')
-rw-r--r--src/boost/libs/yap/example/transform_terminals.cpp72
1 files changed, 72 insertions, 0 deletions
diff --git a/src/boost/libs/yap/example/transform_terminals.cpp b/src/boost/libs/yap/example/transform_terminals.cpp
new file mode 100644
index 00000000..2bab93d6
--- /dev/null
+++ b/src/boost/libs/yap/example/transform_terminals.cpp
@@ -0,0 +1,72 @@
+// 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)
+//[ transform_terminals
+#include <boost/yap/yap.hpp>
+
+
+struct iota_terminal_transform
+{
+ // Base case. Note that we're not treating placeholders specially for this
+ // example (they're easy to special-case if necessary).
+ template<typename T>
+ auto operator()(boost::yap::expr_tag<boost::yap::expr_kind::terminal>, T && t)
+ {
+ // Like the std::iota() algorithm, we create replacement int terminals
+ // with the values index_, index_ + 1, index_ + 2, etc.
+ return boost::yap::make_terminal(index_++);
+ }
+
+ // Recursive case: Match any call expression.
+ template<typename CallableExpr, typename... Arg>
+ auto operator()(boost::yap::expr_tag<boost::yap::expr_kind::call>,
+ CallableExpr callable, Arg &&... arg)
+ {
+ // Even though the callable in a call expression is technically a
+ // terminal, it doesn't make a lot of sense to replace it with an int,
+ // so we'll only transform the argument subexpressions.
+ return boost::yap::make_expression<boost::yap::expr_kind::call>(
+ boost::yap::as_expr(callable),
+ boost::yap::transform(boost::yap::as_expr(arg), *this)...);
+ }
+
+ int index_;
+};
+
+int sum(int a, int b) { return a + b; }
+
+int main()
+{
+ {
+ // This simple sum(8, 8) expression requires both overloads of
+ // iota_terminal_transform.
+ auto expr = boost::yap::make_terminal(sum)(8, 8);
+ assert(evaluate(expr) == 16);
+
+ auto iota_expr = boost::yap::transform(expr, iota_terminal_transform{1});
+ assert(evaluate(iota_expr) == 3);
+ }
+
+ {
+ // This expression requires only the terminal case of
+ // iota_terminal_transform.
+ auto expr = -(boost::yap::make_terminal(8) + 8);
+ assert(evaluate(expr) == -16);
+
+ auto iota_expr = boost::yap::transform(expr, iota_terminal_transform{0});
+ assert(evaluate(iota_expr) == -1);
+ }
+
+ {
+ // Like the first expression above, this expression requires both
+ // overloads of iota_terminal_transform.
+ auto expr = boost::yap::make_terminal(sum)(-(boost::yap::make_terminal(8) + 8), 0);
+ assert(evaluate(expr) == -16);
+
+ auto iota_expr = boost::yap::transform(expr, iota_terminal_transform{0});
+ assert(evaluate(iota_expr) == -3);
+ }
+}
+//]