HikoGUI
A low latency retained GUI
Loading...
Searching...
No Matches
formula_node.hpp
1// Copyright Take Vos 2020.
2// Distributed under the Boost Software License, Version 1.0.
3// (See accompanying file LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt)
4
5#pragma once
6
7#include "formula_post_process_context.hpp"
8#include "formula_evaluation_context.hpp"
9#include "../required.hpp"
10#include "../parse_location.hpp"
11#include "../datum.hpp"
12#include "../exception.hpp"
13#include "../error_info.hpp"
14#include <vector>
15#include <memory>
16#include <string>
17
18namespace tt {
19
22
23 parse_location location;
24
25 formula_node(parse_location location) : location(location) {}
26
27 virtual ~formula_node() {}
28
33
38
41 virtual datum evaluate(formula_evaluation_context& context) const = 0;
42
43 datum evaluate_without_output(formula_evaluation_context& context) const {
44 context.disable_output();
45 auto r = evaluate(context);
46 context.enable_output();
47 return r;
48 }
49
53 tt_error_info().set<"parse_location">(location);
54 throw operation_error("Expression is not a modifiable value.");
55 }
56
57 virtual bool has_evaluate_xvalue() const {
58 return false;
59 }
60
63 virtual datum const &evaluate_xvalue(formula_evaluation_context const& context) const {
64 tt_error_info().set<"parse_location">(location);
65 throw operation_error("Expression is not a xvalue.");
66 }
67
70 virtual datum &assign(formula_evaluation_context& context, datum const &rhs) const {
71 return evaluate_lvalue(context) = rhs;
72 }
73
74 datum &assign_without_output(formula_evaluation_context& context, datum const &rhs) const {
75 context.disable_output();
76 auto &r = assign(context, rhs);
77 context.enable_output();
78 return r;
79 }
80
83 virtual datum call(formula_evaluation_context& context, datum::vector const &arguments) const {
84 tt_error_info().set<"parse_location">(location);
85 throw operation_error("Expression is not callable.");
86 }
87
90 virtual std::string get_name() const {
91 tt_error_info().set<"parse_location">(location);
92 throw parse_error("Expect a name got {})", *this);
93 }
94
99 tt_error_info().set<"parse_location">(location);
100 throw parse_error("Expect a function definition got {})", *this);
101 }
102
103 virtual std::string string() const noexcept = 0;
104
105 friend std::string to_string(formula_node const& rhs) noexcept {
106 return rhs.string();
107 }
108
109 friend std::ostream& operator<<(std::ostream& lhs, formula_node const& rhs) noexcept {
110 return lhs << to_string(rhs);
111 }
112};
113
114}
STL namespace.
Exception thrown during parsing on an error.
Definition exception.hpp:21
Exception thrown during execution of a dynamic operation.
Definition exception.hpp:37
Definition formula_evaluation_context.hpp:16
Definition formula_node.hpp:20
virtual void resolve_function_pointer(formula_post_process_context &context)
Resolve function and method pointers.
Definition formula_node.hpp:37
virtual datum & assign(formula_evaluation_context &context, datum const &rhs) const
Assign to a non-existing or existing lvalue.
Definition formula_node.hpp:70
virtual datum const & evaluate_xvalue(formula_evaluation_context const &context) const
Evaluate an existing xvalue.
Definition formula_node.hpp:63
virtual datum evaluate(formula_evaluation_context &context) const =0
Evaluate an rvalue.
virtual datum & evaluate_lvalue(formula_evaluation_context &context) const
Evaluate an existing lvalue.
Definition formula_node.hpp:52
virtual std::string get_name() const
Get the name of a formula_name_node.
Definition formula_node.hpp:90
virtual datum call(formula_evaluation_context &context, datum::vector const &arguments) const
Call a function with a datum::vector as arguments.
Definition formula_node.hpp:83
virtual void post_process(formula_post_process_context &context)
Resolve function and method pointers.
Definition formula_node.hpp:32
virtual std::vector< std::string > get_name_and_argument_names() const
Get name and argument names from a function declaration.
Definition formula_node.hpp:98
Definition formula_post_process_context.hpp:18
Definition parse_location.hpp:16