HikoGUI
A low latency retained GUI
Loading...
Searching...
No Matches
formula_member_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_binary_operator_node.hpp"
8
9namespace tt {
10
13 formula_name_node* rhs_name;
14
17 {
18 rhs_name = dynamic_cast<formula_name_node*>(this->rhs.get());
19 if (rhs_name == nullptr) {
20 throw parse_error("{}: Expecting a name token on the right hand side of a member accessor. got {}.", location, rhs);
21 }
22 }
23
25 method = context.get_method(rhs_name->name);
26 if (!method) {
27 throw parse_error("{}: Could not find method .{}().", location, rhs_name->name);
28 }
29 }
30
31 datum evaluate(formula_evaluation_context& context) const override {
32 if (lhs->has_evaluate_xvalue()) {
33 ttlet &lhs_ = lhs->evaluate_xvalue(context);
34
35 if (!lhs_.contains(rhs_name->name)) {
36 throw operation_error("{}: Unknown attribute .{}", location, rhs_name->name);
37 }
38 try {
39 return lhs_[rhs_name->name];
40 } catch (std::exception const &e) {
41 throw operation_error("{}: Can not evaluate member selection.\n{}", location, e.what());
42 }
43
44 } else {
45 ttlet lhs_ = lhs->evaluate(context);
46
47 if (!lhs_.contains(rhs_name->name)) {
48 throw operation_error("{}: Unknown attribute .{}", location, rhs_name->name);
49 }
50 try {
51 return lhs_[rhs_name->name];
52 } catch (std::exception const &e) {
53 throw operation_error("{}: Can not evaluate member selection.\n{}", location, e.what());
54 }
55 }
56 }
57
59 auto &lhs_ = lhs->evaluate_lvalue(context);
60 try {
61 return lhs_[rhs_name->name];
62 } catch (std::exception const &e) {
63 throw operation_error("{}: Can not evaluate member-selection.\n{}", location, e.what());
64 }
65 }
66
67 datum call(formula_evaluation_context& context, datum::vector const &arguments) const override {
68 auto &lhs_ = lhs->evaluate_lvalue(context);
69 try {
70 return method(context, lhs_, arguments);
71 } catch (std::exception const &e) {
72 throw operation_error("{}: Can not evaluate call-of-method.\n{}", location, e.what());
73 }
74 }
75
76 std::string string() const noexcept override {
77 return fmt::format("({} . {})", *lhs, *rhs);
78 }
79};
80
81}
Exception thrown during parsing on an error.
Definition exception.hpp:26
Exception thrown during execution of a dynamic operation.
Definition exception.hpp:42
Definition formula_binary_operator_node.hpp:11
Definition formula_evaluation_context.hpp:16
Definition formula_member_node.hpp:11
void resolve_function_pointer(formula_post_process_context &context) override
Resolve function and method pointers.
Definition formula_member_node.hpp:24
datum & evaluate_lvalue(formula_evaluation_context &context) const override
Evaluate an existing lvalue.
Definition formula_member_node.hpp:58
datum evaluate(formula_evaluation_context &context) const override
Evaluate an rvalue.
Definition formula_member_node.hpp:31
datum call(formula_evaluation_context &context, datum::vector const &arguments) const override
Call a function with a datum::vector as arguments.
Definition formula_member_node.hpp:67
Definition formula_name_node.hpp:11
Definition formula_post_process_context.hpp:18
Definition parse_location.hpp:16
T get(T... args)
T move(T... args)
T what(T... args)