7#ifndef CHAISCRIPT_OPTIMIZER_HPP_
8#define CHAISCRIPT_OPTIMIZER_HPP_
16 template<
typename ...
T>
25 template<
typename Tracer>
27 (void)std::initializer_list<int>{ (p =
static_cast<T&
>(*this).optimize(std::move(p)), 0)... };
68 template<
typename T,
typename Callable>
80 && !p->children.empty())
82 auto &last_child = p->children.back();
84 auto &block_last_child = last_child->children.back();
86 if (block_last_child->children.size() == 1) {
87 last_child->children.back() = std::move(block_last_child->children[0]);
106 for (
size_t i = 0; i <
num; ++i) {
107 const auto &child =
child_at(node, i);
126 if (node->children.size() == 1) {
127 return std::move(node->children[0]);
130 std::move(node->children));
144 std::vector<size_t> keepers;
145 const auto num_children = node->children.size();
146 keepers.reserve(num_children);
148 for (
size_t i = 0; i < num_children; ++i) {
149 const auto &child = *node->children[i];
153 || i == num_children - 1) {
154 keepers.push_back(i);
158 if (keepers.size() == num_children) {
161 const auto new_children = [&](){
162 std::vector<eval::AST_Node_Impl_Ptr<T>> retval;
163 for (
const auto x : keepers)
165 retval.push_back(std::move(node->children[x]));
183 && !node->children.empty())
185 for (
size_t i = 0; i < node->children.size()-1; ++i) {
186 auto child = node->children[i].get();
189 std::move(child->children));
200 for (
size_t i = 0; i < num_sub_children; ++i) {
201 auto &sub_child =
child_at(child, i);
217 && node->children.size() == 2
221 std::vector<eval::AST_Node_Impl_Ptr<T>> new_children;
222 new_children.push_back(std::move(node->children[0]->children[0]));
223 new_children.push_back(std::move(node->children[1]));
225 node->location, std::move(new_children) );
237 && node->children.size() >= 2
241 if (condition.get_type_info().bare_equal_type_info(
typeid(
bool))) {
243 return std::move(node->children[1]);
244 }
else if (node->children.size() == 3) {
245 return std::move(node->children[2]);
260 && node->children.size() == 2
265 const auto &oper = node->text;
269 if (rhs.get_type_info().is_arithmetic()) {
271 std::move(node->children), rhs);
274 }
catch (
const std::exception &) {
288 && node->children.size() == 1
292 const auto &oper = node->text;
295 const auto match = oper + node->children[0]->text;
300 }
else if (lhs.get_type_info().bare_equal_type_info(
typeid(
bool)) && oper ==
"!") {
303 }
catch (
const std::exception &) {
307 && node->children.size() == 2
314 if (lhs.get_type_info().bare_equal_type_info(
typeid(
bool)) && rhs.get_type_info().bare_equal_type_info(
typeid(
bool))) {
315 const auto match = node->children[0]->text +
" " + node->text +
" " + node->children[1]->text;
323 }
catch (
const std::exception &) {
327 && node->children.size() == 2
332 const auto &oper = node->text;
337 if (lhs.get_type_info().is_arithmetic() && rhs.get_type_info().is_arithmetic()) {
339 const auto match = node->children[0]->text +
" " + oper +
" " + node->children[1]->text;
343 }
catch (
const std::exception &) {
347 && node->children.size() == 2
350 && node->children[1]->children.size() == 1
354 if (
arg.get_type_info().is_arithmetic()) {
355 const auto &fun_name = node->children[0]->text;
357 const auto make_constant = [&node, &fun_name](
auto val){
358 const auto match = fun_name +
"(" + node->children[1]->children[0]->text +
")";
362 if (fun_name ==
"double") {
364 }
else if (fun_name ==
"int") {
366 }
else if (fun_name ==
"float") {
368 }
else if (fun_name ==
"long") {
370 }
else if (fun_name ==
"size_t") {
391 const auto &eq_node =
child_at(*for_node, 0);
392 const auto &binary_node =
child_at(*for_node, 1);
393 const auto &prefix_node =
child_at(*for_node, 2);
401 && binary_node.text ==
"<"
407 && prefix_node.text ==
"++"
424 std::vector<eval::AST_Node_Impl_Ptr<T>> body_vector;
425 auto body_child = std::move(for_node->children[3]);
426 for_node->children.pop_back();
427 body_vector.emplace_back(std::move(body_child));
431 assert(children.size() == 1);
438 for (; i < end_int; ++i) {
441 children[0]->eval(t_ss);
float arg(Complex z)
Definition GameApi_pl.cc:31413
Represents any numeric type, generically. Used internally for generic operations between POD values.
Definition boxed_number.hpp:66
static Boxed_Value do_oper(Operators::Opers t_oper, const Boxed_Value &t_lhs, const Boxed_Value &t_rhs)
Definition boxed_number.hpp:893
A wrapper for holding any valid C++ type. All types in ChaiScript are Boxed_Value objects.
Definition boxed_value.hpp:28
Definition dispatchkit.hpp:1513
void add_object(const std::string &t_name, Boxed_Value obj) const
Definition dispatchkit.hpp:1546
typename std::unique_ptr< AST_Node_Impl< T > > AST_Node_Impl_Ptr
Definition chaiscript_eval.hpp:50
Definition chaiscript_optimizer.hpp:14
auto make_compiled_node(eval::AST_Node_Impl_Ptr< T > original_node, std::vector< eval::AST_Node_Impl_Ptr< T > > children, Callable callable)
Definition chaiscript_optimizer.hpp:69
bool contains_var_decl_in_scope(const eval::AST_Node_Impl< T > &node)
Definition chaiscript_optimizer.hpp:98
auto child_count(const eval::AST_Node_Impl< T > &node)
Definition chaiscript_optimizer.hpp:60
eval::AST_Node_Impl< T > & child_at(eval::AST_Node_Impl< T > &node, const size_t offset)
Definition chaiscript_optimizer.hpp:33
Optimizer< optimizer::Partial_Fold, optimizer::Unused_Return, optimizer::Constant_Fold, optimizer::If, optimizer::Return, optimizer::Dead_Code, optimizer::Block, optimizer::For_Loop, optimizer::Assign_Decl > Optimizer_Default
Definition chaiscript_optimizer.hpp:465
Namespace chaiscript contains every API call that the average user will be concerned with.
constexpr Type_Info user_type(const T &)
Creates a Type_Info object representing the type passed in.
Definition type_info.hpp:221
Boxed_Value void_var()
Definition boxed_value.hpp:466
decltype(auto) boxed_cast(const Boxed_Value &bv, const Type_Conversions_State *t_conversions=nullptr)
Function for extracting a value stored in a Boxed_Value object.
Definition boxed_cast.hpp:76
std::unique_ptr< B > make_unique(Arg &&... arg)
Definition chaiscript_defines.hpp:97
Boxed_Value var(T &&t)
Creates a Boxed_Value. If the object passed in is a value type, it is copied. If it is a pointer,...
Definition boxed_value.hpp:387
@ Lambda
Definition chaiscript_common.hpp:67
@ Assign_Decl
Definition chaiscript_common.hpp:65
@ Noop
Definition chaiscript_common.hpp:69
@ Var_Decl
Definition chaiscript_common.hpp:65
@ For
Definition chaiscript_common.hpp:67
@ While
Definition chaiscript_common.hpp:67
@ Id
Definition chaiscript_common.hpp:65
@ Scopeless_Block
Definition chaiscript_common.hpp:67
@ Compiled
Definition chaiscript_common.hpp:69
@ Logical_And
Definition chaiscript_common.hpp:69
@ Reference
Definition chaiscript_common.hpp:69
@ Binary
Definition chaiscript_common.hpp:69
@ Prefix
Definition chaiscript_common.hpp:67
@ If
Definition chaiscript_common.hpp:67
@ Arg_List
Definition chaiscript_common.hpp:65
@ Logical_Or
Definition chaiscript_common.hpp:69
@ Ranged_For
Definition chaiscript_common.hpp:67
@ Return
Definition chaiscript_common.hpp:67
@ Equation
Definition chaiscript_common.hpp:65
@ Fun_Call
Definition chaiscript_common.hpp:65
@ Constant
Definition chaiscript_common.hpp:69
@ Def
Definition chaiscript_common.hpp:67
@ Block
Definition chaiscript_common.hpp:67
Boxed_Value const_var(const T &t)
Takes an object and returns an immutable Boxed_Value. If the object is a std::reference or pointer ty...
Definition boxed_value.hpp:461
const std::string text
Definition chaiscript_common.hpp:500
const AST_Node_Type identifier
Definition chaiscript_common.hpp:499
@ bitwise_and
Definition chaiscript_algebraic.hpp:33
@ invalid
Definition chaiscript_algebraic.hpp:36
static Opers to_operator(const std::string &t_str, bool t_is_unary=false)
Definition chaiscript_algebraic.hpp:58
Definition chaiscript_eval.hpp:112
std::vector< AST_Node_Impl_Ptr< T > > children
Definition chaiscript_eval.hpp:147
Definition chaiscript_eval.hpp:564
Definition chaiscript_eval.hpp:738
Definition chaiscript_eval.hpp:158
AST_Node_Impl_Ptr< T > m_original_node
Definition chaiscript_eval.hpp:171
Definition chaiscript_eval.hpp:266
Boxed_Value m_value
Definition chaiscript_eval.hpp:283
Definition chaiscript_eval.hpp:176
Definition chaiscript_eval.hpp:724
Definition chaiscript_eval.hpp:367
Special type indicating a call to 'break'.
Definition chaiscript_common.hpp:657
Special type indicating a call to 'continue'.
Definition chaiscript_common.hpp:663
Creates a new scope then pops it on destruction.
Definition chaiscript_common.hpp:670
Definition chaiscript_optimizer.hpp:212
auto optimize(eval::AST_Node_Impl_Ptr< T > node)
Definition chaiscript_optimizer.hpp:214
Definition chaiscript_optimizer.hpp:119
auto optimize(eval::AST_Node_Impl_Ptr< T > node)
Definition chaiscript_optimizer.hpp:121
Definition chaiscript_optimizer.hpp:283
auto optimize(eval::AST_Node_Impl_Ptr< T > node)
Definition chaiscript_optimizer.hpp:285
Definition chaiscript_optimizer.hpp:139
auto optimize(eval::AST_Node_Impl_Ptr< T > node)
Definition chaiscript_optimizer.hpp:141
Definition chaiscript_optimizer.hpp:383
auto optimize(eval::AST_Node_Impl_Ptr< T > for_node)
Definition chaiscript_optimizer.hpp:385
Definition chaiscript_optimizer.hpp:233
auto optimize(eval::AST_Node_Impl_Ptr< T > node)
Definition chaiscript_optimizer.hpp:235
Optimizer(T ... t)
Definition chaiscript_optimizer.hpp:20
auto optimize(eval::AST_Node_Impl_Ptr< Tracer > p)
Definition chaiscript_optimizer.hpp:26
Definition chaiscript_optimizer.hpp:254
auto optimize(eval::AST_Node_Impl_Ptr< T > node)
Definition chaiscript_optimizer.hpp:256
Definition chaiscript_optimizer.hpp:75
auto optimize(eval::AST_Node_Impl_Ptr< T > p)
Definition chaiscript_optimizer.hpp:77
Definition chaiscript_optimizer.hpp:178
auto optimize(eval::AST_Node_Impl_Ptr< T > node)
Definition chaiscript_optimizer.hpp:180
num
Definition view.php:2821