Expression Templates Library (ETL)
expression_helpers.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 namespace etl::detail {
16 
23 template <typename T>
24 using build_type = std::conditional_t<is_etl_value<T>, const std::decay_t<T>&, std::decay_t<T>>;
25 
32 template <typename T>
33 using build_identity_type = std::conditional_t<is_etl_value<T>,
34  std::conditional_t<std::is_const_v<std::remove_reference_t<T>>, const std::decay_t<T>&, std::decay_t<T>&>,
35  std::decay_t<T>>;
36 
40 template <typename T>
41 using wrap_scalar_t = std::conditional_t<etl::is_etl_expr<T>, T, etl::scalar<std::decay_t<T>>>;
42 
49 template <typename H, typename T>
50 using smart_wrap_scalar_t = std::conditional_t<etl::is_etl_expr<T>, T, etl::scalar<etl::value_t<H>>>;
51 
52 template <typename T>
54 
58 template <typename T>
59 requires(etl_expr<T>)
60 struct wrap_scalar_value_t_impl<T> {
64  using type = etl::value_t<T>;
65 };
66 
70 template <typename T>
71 requires(!etl_expr<T>)
72 struct wrap_scalar_value_t_impl<T> {
76  using type = std::decay_t<T>;
77 };
78 
82 template <typename T>
84 
90 template <typename T>
91 decltype(auto) wrap_scalar(T&& value) requires (etl_expr<T>) {
92  return std::forward<T>(value);
93 }
94 
100 template <typename T>
101 etl::scalar<std::decay_t<T>> wrap_scalar(T&& value) requires(!etl_expr<T>) {
102  return etl::scalar<std::decay_t<T>>{value};
103 }
104 
110 template <typename Hint, typename T>
111 decltype(auto) smart_wrap_scalar(T&& value) {
112  if constexpr (is_etl_expr<T>) {
113  return std::forward<T>(value);
114  } else {
115  using scalar_type = etl::value_t<Hint>;
116  return etl::scalar<scalar_type>{scalar_type(value)};
117  }
118 }
119 
123 template <typename LE, typename RE, template <typename> typename OP>
125 
130 template <typename LE, typename RE, typename OP>
131 using left_binary_helper_op = binary_expr<value_t<LE>, build_type<LE>, OP, build_type<RE>>;
132 
137 template <typename LE, typename RE, typename OP>
139 
143 template <typename LE, typename RE, template <typename> typename OP>
144 using right_binary_helper = binary_expr<value_t<RE>, build_type<LE>, OP<value_t<RE>>, build_type<RE>>;
145 
150 template <typename LE, typename RE, typename OP>
151 using right_binary_helper_op = binary_expr<value_t<RE>, build_type<LE>, OP, build_type<RE>>;
152 
156 template <typename LE, typename RE, template <typename> typename OP>
157 using bool_left_binary_helper = binary_expr<bool, build_type<LE>, OP<value_t<LE>>, build_type<RE>>;
158 
162 template <typename LE, typename RE, template <typename> typename OP>
163 using bool_right_binary_helper = binary_expr<bool, build_type<LE>, OP<value_t<RE>>, build_type<RE>>;
164 
168 template <typename LE, typename RE, template <typename> typename OP>
170 
174 template <typename E, template <typename> typename OP>
176 
180 template <typename E, typename OP>
182 
186 template <typename E, typename OP>
188 
192 template <typename E, template <typename> typename OP>
194 
198 template <typename LE, typename RE, template <typename, typename> typename OP>
199 using stable_transform_binary_helper = unary_expr<value_t<LE>, OP<build_type<LE>, build_type<RE>>, transform_op>;
200 
205 template <typename E, template <typename> typename OP, typename... Args>
206 auto make_transform_expr(Args&&... args) {
207  return stable_transform_helper<E, OP>{OP<build_type<E>>(std::forward<Args>(args)...)};
208 }
209 
215 template <typename E, typename OP, typename... Args>
216 auto make_stateful_unary_expr(Args&&... args) {
217  return unary_expr<value_t<E>, build_type<E>, stateful_op<OP>>(std::forward<Args>(args)...);
218 }
219 
220 } //end of namespace etl::detail
Simple unary op for identity operations.
Definition: unary_expr.hpp:24
auto make_transform_expr(Args &&... args)
Make a stable unary transform unary expression.
Definition: expression_helpers.hpp:206
typename wrap_scalar_value_t_impl< T >::type wrap_scalar_value_t
Extract the value type of the given type taking scalar into account.
Definition: expression_helpers.hpp:83
decltype(auto) wrap_scalar(T &&value) requires(etl_expr< T >)
Transform a scalar value into an etl::scalar.
Definition: expression_helpers.hpp:91
Simple unary op for transform operations.
Definition: unary_expr.hpp:56
std::conditional_t< etl::is_etl_expr< T >, T, etl::scalar< std::decay_t< T > >> wrap_scalar_t
Wraps a type either into a scalar or keep the ETL expression.
Definition: expression_helpers.hpp:41
Definition: expression_builder.hpp:699
An unary expression.
Definition: unary_expr.hpp:126
Simple unary op for stateful operations.
Definition: unary_expr.hpp:91
A binary expression.
Definition: binary_expr.hpp:18
std::conditional_t< is_etl_value< T >, const std::decay_t< T > &, std::decay_t< T > > build_type
Helper to build the type for a sub expression.
Definition: expression_helpers.hpp:24
std::conditional_t< is_etl_value< T >, std::conditional_t< std::is_const_v< std::remove_reference_t< T > >, const std::decay_t< T > &, std::decay_t< T > & >, std::decay_t< T > > build_identity_type
Helper to build the identity type for a sub expression.
Definition: expression_helpers.hpp:35
auto make_stateful_unary_expr(Args &&... args)
Make a stable unary transform unary expression for a stateful op.
Definition: expression_helpers.hpp:216
Represents a scalar value.
Definition: concepts_base.hpp:19
requires(D > 0) struct dyn_base
Matrix with run-time fixed dimensions.
Definition: dyn_base.hpp:113
std::conditional_t< etl::is_etl_expr< T >, T, etl::scalar< etl::value_t< H > >> smart_wrap_scalar_t
Wraps a type either into a scalar or keep the ETL expression.
Definition: expression_helpers.hpp:50
Definition: expression_helpers.hpp:53
typename decay_traits< E >::value_type value_t
Traits to extract the value type out of an ETL type.
Definition: tmp.hpp:81