Expression Templates Library (ETL)
selected_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 
13 #pragma once
14 
15 #ifdef ETL_MANUAL_SELECT
16 
17 #include "etl/wrapper_traits.hpp"
18 
19 namespace etl {
20 
24 template <typename Selector, Selector V, typename Expr>
25 struct selected_expr final {
26  using expr_t = Expr;
27  using value_type = value_t<Expr>;
28 
29  using selector_t = Selector;
30 
31  static constexpr selector_t selector_value = V;
32 
33 private:
34  Expr value;
35 
36  friend struct wrapper_traits<selected_expr>;
37 
38 public:
39  //Cannot be constructed with no args
40  selected_expr() = delete;
41 
46  explicit selected_expr(Expr l) : value(std::forward<Expr>(l)) {
47  //Nothing else to init
48  }
49 
50  //Expresison can be copied and moved
51  selected_expr(const selected_expr& e) = default;
52  selected_expr(selected_expr&& e) noexcept = default;
53 
54  //Expressions are invariant
55  selected_expr& operator=(const selected_expr& e) = delete;
56  selected_expr& operator=(selected_expr&& e) = delete;
57 
63  template <typename E>
64  bool alias(const E& other) const noexcept {
65  return value.alias(other);
66  }
67 
68  // Assignment functions
69 
74  template <typename L>
75  void assign_to(L&& lhs) const {
76  decltype(auto) forced = detail::get_forced_impl<selector_t>();
77 
78  auto old_forced = forced;
79 
80  forced.impl = selector_value;
81  forced.forced = true;
82 
83  value.assign_to(lhs);
84 
85  forced = old_forced;
86  }
87 
92  template <typename L>
93  void assign_add_to(L&& lhs) const {
94  decltype(auto) forced = detail::get_forced_impl<selector_t>();
95 
96  auto old_forced = forced;
97 
98  forced.impl = selector_value;
99  forced.forced = true;
100 
101  value.assign_add_to(lhs);
102 
103  forced = old_forced;
104  }
105 
110  template <typename L>
111  void assign_sub_to(L&& lhs) const {
112  decltype(auto) forced = detail::get_forced_impl<selector_t>();
113 
114  auto old_forced = forced;
115 
116  forced.impl = selector_value;
117  forced.forced = true;
118 
119  value.assign_sub_to(lhs);
120 
121  forced = old_forced;
122  }
123 
128  template <typename L>
129  void assign_mul_to(L&& lhs) const {
130  decltype(auto) forced = detail::get_forced_impl<selector_t>();
131 
132  auto old_forced = forced;
133 
134  forced.impl = selector_value;
135  forced.forced = true;
136 
137  value.assign_mul_to(lhs);
138 
139  forced = old_forced;
140  }
141 
146  template <typename L>
147  void assign_div_to(L&& lhs) const {
148  decltype(auto) forced = detail::get_forced_impl<selector_t>();
149 
150  auto old_forced = forced;
151 
152  forced.impl = selector_value;
153  forced.forced = true;
154 
155  value.assign_div_to(lhs);
156 
157  forced = old_forced;
158  }
159 
164  template <typename L>
165  void assign_mod_to(L&& lhs) const {
166  decltype(auto) forced = detail::get_forced_impl<selector_t>();
167 
168  auto old_forced = forced;
169 
170  forced.impl = selector_value;
171  forced.forced = true;
172 
173  value.assign_mod_to(lhs);
174 
175  forced = old_forced;
176  }
177 
184  friend std::ostream& operator<<(std::ostream& os, const selected_expr& expr) {
185  return os << "selected(" << expr.value << ")";
186  }
187 };
188 
193 template <typename Selector, Selector V, typename Expr>
194 struct etl_traits<etl::selected_expr<Selector, V, Expr>> : wrapper_traits<etl::selected_expr<Selector, V, Expr>> {};
195 
196 } //end of namespace etl
197 
198 #endif
void assign_add_to(L &&lhs) const
Add to the given left-hand-side expression.
Definition: dyn_matrix_view.hpp:217
Contains traits for wrapper expressions.
bool alias(const E &rhs) const noexcept
Test if this expression aliases with the given expression.
Definition: dyn_matrix_view.hpp:197
void assign_div_to(L &&lhs) const
Divide the given left-hand-side expression.
Definition: dyn_matrix_view.hpp:244
value_t< sub_type > value_type
The value contained in the expression.
Definition: dyn_matrix_view.hpp:31
void assign_mul_to(L &&lhs) const
Multiply the given left-hand-side expression.
Definition: dyn_matrix_view.hpp:235
void assign_to(L &&lhs) const
Assign to the given left-hand-side expression.
Definition: dyn_matrix_view.hpp:208
Root namespace for the ETL library.
Definition: adapter.hpp:15
void assign_mod_to(L &&lhs) const
Modulo the given left-hand-side expression.
Definition: dyn_matrix_view.hpp:253
void assign_sub_to(L &&lhs) const
Sub from the given left-hand-side expression.
Definition: dyn_matrix_view.hpp:226