The Battle for Wesnoth  1.17.0-dev
formula.hpp
Go to the documentation of this file.
1 /*
2  Copyright (C) 2003 - 2021
3  by David White <dave@whitevine.net>
4  Part of the Battle for Wesnoth Project https://www.wesnoth.org/
5 
6  This program is free software; you can redistribute it and/or modify
7  it under the terms of the GNU General Public License as published by
8  the Free Software Foundation; either version 2 of the License, or
9  (at your option) any later version.
10  This program is distributed in the hope that it will be useful,
11  but WITHOUT ANY WARRANTY.
12 
13  See the COPYING file for more details.
14 */
15 
16 #pragma once
17 
18 #include "formula/debugger_fwd.hpp"
19 #include "formula/formula_fwd.hpp"
20 #include "formula/tokenizer.hpp"
21 #include "formula/variant.hpp"
22 #include <memory>
23 
24 namespace wfl
25 {
26 class formula_expression;
27 class function_symbol_table;
28 
29 using expression_ptr = std::shared_ptr<formula_expression>;
30 
31 // Namespace alias for shorter typing
32 namespace tk = tokenizer;
33 
34 class formula
35 {
36 public:
37  formula(const std::string& str, function_symbol_table* symbols = nullptr);
38  formula(const tk::token* i1, const tk::token* i2, function_symbol_table* symbols = nullptr);
39 
40  static variant evaluate(
41  const const_formula_ptr& f,
42  const formula_callable& variables,
43  formula_debugger* fdb = nullptr,
44  variant default_res = variant(0))
45  {
46  if(f) {
47  return f->evaluate(variables, fdb);
48  } else {
49  return default_res;
50  }
51  }
52 
53  static formula_ptr create_optional_formula(const std::string& str, function_symbol_table* symbols = nullptr);
54 
55  variant evaluate(const formula_callable& variables, formula_debugger* fdb = nullptr) const
56  {
57  if(fdb != nullptr) {
58  return evaluate_formula_callback(*fdb, *this, variables);
59  } else {
60  return execute(variables, fdb);
61  }
62  }
63 
64  variant evaluate(formula_debugger* fdb = nullptr) const
65  {
66  if(fdb != nullptr) {
67  return evaluate_formula_callback(*fdb,*this);
68  } else {
69  return execute(fdb);
70  }
71  }
72 
73  const std::string& str() const { return str_; }
74 
75  static const char* const id_chars;
76 
77 private:
78  variant execute(const formula_callable& variables, formula_debugger* fdb = nullptr) const;
79  variant execute(formula_debugger* fdb) const;
80 
82  std::string str_;
83  // Can't be a unique_ptr because function_symbol_table is an incomplete type,
84  // and the header it's declared in depends on this one.
85  const std::shared_ptr<function_symbol_table> managed_symbols_;
87 
88  friend class formula_debugger;
89 };
90 
91 struct formula_error : public game::error
92 {
94  : error()
95  , type()
96  , formula()
97  , filename()
98  , line(0)
99  {}
100 
101  formula_error(const std::string& type, const std::string& formula,
102  const std::string& file, int line);
103 
104  ~formula_error() noexcept {}
105 
106  std::string type;
107  std::string formula;
108  std::string filename;
109  int line;
110 };
111 
112 } // namespace wfl
static variant evaluate(const const_formula_ptr &f, const formula_callable &variables, formula_debugger *fdb=nullptr, variant default_res=variant(0))
Definition: formula.hpp:40
std::string formula
Definition: formula.hpp:107
Abstract baseclass for the tokenizer.
Definition: tokenizer.hpp:56
static l_noret error(LoadState *S, const char *why)
Definition: lundump.cpp:40
std::string filename
Definition: formula.hpp:108
variant evaluate(const formula_callable &variables, formula_debugger *fdb=nullptr) const
Definition: formula.hpp:55
const std::string & str() const
Definition: formula.hpp:73
Formula AI debugger, forward.
std::shared_ptr< formula_expression > expression_ptr
Definition: formula.hpp:29
std::string str_
Definition: formula.hpp:82
static formula_ptr create_optional_formula(const std::string &str, function_symbol_table *symbols=nullptr)
Definition: formula.cpp:251
function_symbol_table * symbols_
Definition: formula.hpp:86
std::string type
Definition: formula.hpp:106
variant evaluate_formula_callback(formula_debugger &fdb, const formula &f, const formula_callable &variables)
~formula_error() noexcept
Definition: formula.hpp:104
const std::shared_ptr< function_symbol_table > managed_symbols_
Definition: formula.hpp:85
std::shared_ptr< const formula > const_formula_ptr
Definition: formula_fwd.hpp:24
formula(const std::string &str, function_symbol_table *symbols=nullptr)
Definition: formula.cpp:100
static const char *const id_chars
Definition: formula.hpp:75
expression_ptr expr_
Definition: formula.hpp:81
#define f
Definition: contexts.hpp:44
variant evaluate(formula_debugger *fdb=nullptr) const
Definition: formula.hpp:64
Base class for all the errors encountered by the engine.
Definition: exceptions.hpp:28
variant execute(const formula_callable &variables, formula_debugger *fdb=nullptr) const
Definition: formula.cpp:260
std::shared_ptr< formula > formula_ptr
Definition: formula_fwd.hpp:22