| 15 | |
| 16 | template<typename ... T> |
| 17 | struct Optimizer : T... |
| 18 | { |
| 19 | Optimizer() = default; |
| 20 | explicit Optimizer(T ... t) |
| 21 | : T(std::move(t))... |
| 22 | { |
| 23 | } |
| 24 | |
| 25 | template<typename Tracer> |
| 26 | auto optimize(eval::AST_Node_Impl_Ptr<Tracer> p) { |
| 27 | (void)std::initializer_list<int>{ (p = static_cast<T&>(*this).optimize(std::move(p)), 0)... }; |
| 28 | return p; |
| 29 | } |
| 30 | }; |
| 31 | |
| 32 | template<typename T> |
| 33 | eval::AST_Node_Impl<T> &child_at(eval::AST_Node_Impl<T> &node, const size_t offset) { |