Expression Templates Library (ETL)
optimized_expr.hpp
Go to the documentation of this file.
1 //=======================================================================
2 // Copyright (c) 2014-2023 Baptiste Wicht
3 // Distributed under the terms of the MIT License.
4 // (See accompanying file LICENSE or copy at
5 // http://opensource.org/licenses/MIT)
6 //=======================================================================
7 
15 #pragma once
16 
17 #include "etl/wrapper_traits.hpp"
18 
19 namespace etl {
20 
24 template <typename Expr>
25 struct optimized_expr final {
26  using expr_t = Expr;
28 
29 private:
30  Expr value;
31 
32  friend struct wrapper_traits<optimized_expr>;
33 
34 public:
35  //Cannot be constructed with no args
36  optimized_expr() = delete;
37 
42  explicit optimized_expr(Expr l) : value(std::forward<Expr>(l)) {
43  //Nothing else to init
44  }
45 
46  //Expresison can be copied and moved
47  optimized_expr(const optimized_expr& e) = default;
48  optimized_expr(optimized_expr&& e) noexcept = default;
49 
50  //Expressions are invariant
51  optimized_expr& operator=(const optimized_expr& e) = delete;
52  optimized_expr& operator=(optimized_expr&& e) = delete;
53 
59  template <typename E>
60  bool alias(const E& other) const noexcept {
61  return value.alias(other);
62  }
63 
64  // Assignment functions
65 
70  template <typename L>
71  void assign_to(L&& lhs) const {
72  //Note: This is more than ugly...
73  optimized_forward(value, [&lhs](auto&& optimized) mutable { optimized.assign_to(lhs); });
74  }
75 
80  template <typename L>
81  void assign_add_to(L&& lhs) const {
82  //Note: This is more than ugly...
83  optimized_forward(value, [&lhs](auto&& optimized) mutable { optimized.assign_add_to(lhs); });
84  }
85 
90  template <typename L>
91  void assign_sub_to(L&& lhs) const {
92  //Note: This is more than ugly...
93  optimized_forward(value, [&lhs](auto&& optimized) mutable { optimized.assign_sub_to(lhs); });
94  }
95 
100  template <typename L>
101  void assign_mul_to(L&& lhs) const {
102  //Note: This is more than ugly...
103  optimized_forward(value, [&lhs](auto&& optimized) mutable { optimized.assign_mul_to(lhs); });
104  }
105 
110  template <typename L>
111  void assign_div_to(L&& lhs) const {
112  //Note: This is more than ugly...
113  optimized_forward(value, [&lhs](auto&& optimized) mutable { optimized.assign_div_to(lhs); });
114  }
115 
120  template <typename L>
121  void assign_mod_to(L&& lhs) const {
122  //Note: This is more than ugly...
123  optimized_forward(value, [&lhs](auto&& optimized) mutable { optimized.assign_mod_to(lhs); });
124  }
125 
132  friend std::ostream& operator<<(std::ostream& os, const optimized_expr& expr) {
133  return os << "OPT(" << expr.value << ")";
134  }
135 };
136 
141 template <typename Expr>
142 struct etl_traits<etl::optimized_expr<Expr>> : wrapper_traits<etl::optimized_expr<Expr>> {};
143 
144 } //end of namespace etl
Contains traits for wrapper expressions.
optimized_expr(Expr l)
Construt a new optimized expression around the given ETL expression.
Definition: optimized_expr.hpp:42
void assign_to(L &&lhs) const
Assign to the given left-hand-side expression.
Definition: optimized_expr.hpp:71
void optimized_forward(Expr &expr, Result result)
Optimize an expression and pass the optimized expression to the given functor.
Definition: optimizer.hpp:434
value_t< Expr > value_type
The value type.
Definition: optimized_expr.hpp:27
friend std::ostream & operator<<(std::ostream &os, const optimized_expr &expr)
Prints the type of the optimized expression to the stream.
Definition: optimized_expr.hpp:132
void assign_sub_to(L &&lhs) const
Sub from the given left-hand-side expression.
Definition: optimized_expr.hpp:91
void assign_mul_to(L &&lhs) const
Multiply the given left-hand-side expression.
Definition: optimized_expr.hpp:101
Traits to get information about ETL types.
Definition: tmp.hpp:68
Root namespace for the ETL library.
Definition: adapter.hpp:15
A wrapper for expressions that need to be optimized.
Definition: optimized_expr.hpp:25
Expr expr_t
The wrapped expression type.
Definition: optimized_expr.hpp:26
bool alias(const E &other) const noexcept
Test if this expression aliases with the given expression.
Definition: optimized_expr.hpp:60
void assign_add_to(L &&lhs) const
Add to the given left-hand-side expression.
Definition: optimized_expr.hpp:81
void assign_div_to(L &&lhs) const
Divide the given left-hand-side expression.
Definition: optimized_expr.hpp:111
typename decay_traits< E >::value_type value_t
Traits to extract the value type out of an ETL type.
Definition: tmp.hpp:81
Traits for wrapper expressions.
Definition: wrapper_traits.hpp:21
void assign_mod_to(L &&lhs) const
Modulo the given left-hand-side expression.
Definition: optimized_expr.hpp:121