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 <vector>
14#include <memory>
15#include <string>
16
17namespace hi::inline v1 {
18struct formula_node;
19}
20
21template<typename CharT>
22struct std::formatter<hi::formula_node, CharT> : std::formatter<string_view, CharT> {
23 auto format(hi::formula_node const& t, auto& fc) const
24 -> decltype(std::formatter<string_view, CharT>{}.format(std::string{}, fc));
25};
26
27namespace hi::inline v1 {
28
31
32 parse_location location;
33
34 virtual ~formula_node() {}
35 formula_node() = delete;
36 formula_node(formula_node const&) = delete;
37 formula_node(formula_node&&) = delete;
38 formula_node& operator=(formula_node const&) = delete;
39 formula_node& operator=(formula_node&&) = delete;
40
41 formula_node(parse_location location) : location(location) {}
42
47
52
55 virtual datum evaluate(formula_evaluation_context& context) const = 0;
56
57 datum evaluate_without_output(formula_evaluation_context& context) const
58 {
59 context.disable_output();
60 auto r = evaluate(context);
61 context.enable_output();
62 return r;
63 }
64
68 {
69 throw operation_error(std::format("{}: Expression is not a modifiable value.", location));
70 }
71
72 virtual bool has_evaluate_xvalue() const
73 {
74 return false;
75 }
76
79 virtual datum const& evaluate_xvalue(formula_evaluation_context const& context) const
80 {
81 throw operation_error(std::format("{}: Expression is not a xvalue.", location));
82 }
83
86 virtual datum& assign(formula_evaluation_context& context, datum const& rhs) const
87 {
88 return evaluate_lvalue(context) = rhs;
89 }
90
91 datum& assign_without_output(formula_evaluation_context& context, datum const& rhs) const
92 {
93 context.disable_output();
94 auto& r = assign(context, rhs);
95 context.enable_output();
96 return r;
97 }
98
101 virtual datum call(formula_evaluation_context& context, datum::vector_type const& arguments) const
102 {
103 throw operation_error(std::format("{}: Expression is not callable.", location));
104 }
105
108 virtual std::string get_name() const
109 {
110 throw parse_error(std::format("{}: Expect a name got {})", location, *this));
111 }
112
117 {
118 throw parse_error(std::format("{}: Expect a function definition got {})", location, *this));
119 }
120
121 virtual std::string string() const noexcept = 0;
122
123 friend std::string to_string(formula_node const& rhs) noexcept
124 {
125 return rhs.string();
126 }
127
128 friend std::ostream& operator<<(std::ostream& lhs, formula_node const& rhs) noexcept
129 {
130 return lhs << to_string(rhs);
131 }
132};
133
134} // namespace hi::inline v1
135
136template<typename CharT>
137auto std::formatter<hi::formula_node, CharT>::format(hi::formula_node const& t, auto& fc) const
138 -> decltype(std::formatter<string_view, CharT>{}.format(std::string{}, fc))
139{
140 return std::formatter<string_view, CharT>{}.format(to_string(t), fc);
141}
This file includes required definitions.
STL namespace.
A dynamic data type.
Definition datum.hpp:225
Exception thrown during parsing on an error.
Definition exception.hpp:25
Exception thrown during execution of a dynamic operation.
Definition exception.hpp:37
Definition formula_evaluation_context.hpp:16
Definition formula_node.hpp:29
virtual std::string get_name() const
Get the name of a formula_name_node.
Definition formula_node.hpp:108
virtual void post_process(formula_post_process_context &context)
Resolve function and method pointers.
Definition formula_node.hpp:46
virtual datum call(formula_evaluation_context &context, datum::vector_type const &arguments) const
Call a function with a datum::vector as arguments.
Definition formula_node.hpp:101
virtual datum evaluate(formula_evaluation_context &context) const =0
Evaluate an rvalue.
virtual datum & assign(formula_evaluation_context &context, datum const &rhs) const
Assign to a non-existing or existing lvalue.
Definition formula_node.hpp:86
virtual std::vector< std::string > get_name_and_argument_names() const
Get name and argument names from a function declaration.
Definition formula_node.hpp:116
virtual datum const & evaluate_xvalue(formula_evaluation_context const &context) const
Evaluate an existing xvalue.
Definition formula_node.hpp:79
virtual void resolve_function_pointer(formula_post_process_context &context)
Resolve function and method pointers.
Definition formula_node.hpp:51
virtual datum & evaluate_lvalue(formula_evaluation_context &context) const
Evaluate an existing lvalue.
Definition formula_node.hpp:67
Definition formula_post_process_context.hpp:19
Definition parse_location.hpp:17
T to_string(T... args)