// Copyright (c) 2018-2025 Jean-Louis Leroy // 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) // clang-format off // tag::ast[] #include #include #include #include #include using boost::openmethod::unique_virtual_ptr; using boost::openmethod::make_unique_virtual; struct Node { virtual ~Node() {} }; struct Literal : Node { Literal(int value) : value(value) {} int value; }; struct Plus : Node { Plus(unique_virtual_ptr left, unique_virtual_ptr right) : left(std::move(left)), right(std::move(right)) {} unique_virtual_ptr left, right; }; struct Negate : Node { Negate(unique_virtual_ptr node) : child(std::move(node)) {} unique_virtual_ptr child; }; BOOST_OPENMETHOD(value, (virtual_ptr), int); BOOST_OPENMETHOD_OVERRIDE(value, (virtual_ptr node), int) { return node->value; } BOOST_OPENMETHOD_OVERRIDE(value, (virtual_ptr node), int) { return value(node->left) + value(node->right); } BOOST_OPENMETHOD_OVERRIDE(value, (virtual_ptr node), int) { return -value(node->child); } BOOST_OPENMETHOD_CLASSES(Node, Literal, Plus, Negate); int main() { boost::openmethod::initialize(); auto expr = make_unique_virtual( make_unique_virtual( make_unique_virtual(1), make_unique_virtual(2))); std::cout << value(expr) << "\n"; // -3 return 0; } // end::ast[]