Expression Templates Library (ETL)
parallel_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 
17 #pragma once
18 
19 #include "etl/wrapper_traits.hpp"
20 
21 namespace etl {
22 
27 template <typename Expr>
28 struct parallel_expr final {
29  using expr_t = Expr;
31 
32 private:
33  Expr value;
34 
35  friend struct wrapper_traits<parallel_expr>;
36 
37 public:
38  //Cannot be constructed with no args
39  parallel_expr() = delete;
40 
45  explicit parallel_expr(Expr l) : value(std::forward<Expr>(l)) {
46  //Nothing else to init
47  }
48 
49  //Expresison can be copied and moved
50  parallel_expr(const parallel_expr& e) = default;
51  parallel_expr(parallel_expr&& e) noexcept = default;
52 
53  //Expressions are invariant
54  parallel_expr& operator=(const parallel_expr& e) = delete;
55  parallel_expr& operator=(parallel_expr&& e) = delete;
56 
62  template <typename E>
63  bool alias(const E& other) const noexcept {
64  return value.alias(other);
65  }
66 
67  // Assignment functions
68 
73  template <typename L>
74  void assign_to(L&& lhs) const {
75  auto old_parallel = local_context().parallel;
76 
77  local_context().parallel = true;
78 
79  value.assign_to(lhs);
80 
81  local_context().parallel = old_parallel;
82  }
83 
88  template <typename L>
89  void assign_add_to(L&& lhs) const {
90  auto old_parallel = local_context().parallel;
91 
92  local_context().parallel = true;
93 
94  value.assign_add_to(lhs);
95 
96  local_context().parallel = old_parallel;
97  }
98 
103  template <typename L>
104  void assign_sub_to(L&& lhs) const {
105  auto old_parallel = local_context().parallel;
106 
107  local_context().parallel = true;
108 
109  value.assign_sub_to(lhs);
110 
111  local_context().parallel = old_parallel;
112  }
113 
118  template <typename L>
119  void assign_mul_to(L&& lhs) const {
120  auto old_parallel = local_context().parallel;
121 
122  local_context().parallel = true;
123 
124  value.assign_mul_to(lhs);
125 
126  local_context().parallel = old_parallel;
127  }
128 
133  template <typename L>
134  void assign_div_to(L&& lhs) const {
135  auto old_parallel = local_context().parallel;
136 
137  local_context().parallel = true;
138 
139  value.assign_div_to(lhs);
140 
141  local_context().parallel = old_parallel;
142  }
143 
148  template <typename L>
149  void assign_mod_to(L&& lhs) const {
150  auto old_parallel = local_context().parallel;
151 
152  local_context().parallel = true;
153 
154  value.assign_mod_to(lhs);
155 
156  local_context().parallel = old_parallel;
157  }
158 
165  friend std::ostream& operator<<(std::ostream& os, const parallel_expr& expr) {
166  return os << "parallel(" << expr.value << ")";
167  }
168 };
169 
174 template <typename Expr>
175 struct etl_traits<etl::parallel_expr<Expr>> : wrapper_traits<etl::parallel_expr<Expr>> {};
176 
177 } //end of namespace etl
friend std::ostream & operator<<(std::ostream &os, const parallel_expr &expr)
Prints the type of the optimized expression to the stream.
Definition: parallel_expr.hpp:165
Contains traits for wrapper expressions.
void assign_to(L &&lhs) const
Assign to the given left-hand-side expression.
Definition: parallel_expr.hpp:74
parallel_expr(Expr l)
Construt a new optimized expression around the given ETL expression.
Definition: parallel_expr.hpp:45
bool parallel
Force parallel execution.
Definition: context.hpp:28
Traits to get information about ETL types.
Definition: tmp.hpp:68
Root namespace for the ETL library.
Definition: adapter.hpp:15
context & local_context()
Return the configuration context of the current thread.
Definition: context.hpp:50
A wrapper for expressions that is to be executed in parallel.
Definition: parallel_expr.hpp:28
void assign_add_to(L &&lhs) const
Add to the given left-hand-side expression.
Definition: parallel_expr.hpp:89
void assign_sub_to(L &&lhs) const
Sub from the given left-hand-side expression.
Definition: parallel_expr.hpp:104
void assign_div_to(L &&lhs) const
Divide the given left-hand-side expression.
Definition: parallel_expr.hpp:134
void assign_mod_to(L &&lhs) const
Modulo the given left-hand-side expression.
Definition: parallel_expr.hpp:149
value_t< Expr > value_type
The value type.
Definition: parallel_expr.hpp:30
Expr expr_t
The wrapped expression type.
Definition: parallel_expr.hpp:29
typename decay_traits< E >::value_type value_t
Traits to extract the value type out of an ETL type.
Definition: tmp.hpp:81
bool alias(const E &other) const noexcept
Test if this expression aliases with the given expression.
Definition: parallel_expr.hpp:63
Traits for wrapper expressions.
Definition: wrapper_traits.hpp:21
void assign_mul_to(L &&lhs) const
Multiply the given left-hand-side expression.
Definition: parallel_expr.hpp:119