Expression Templates Library (ETL)
tmp.hpp
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 
8 #pragma once
9 
10 namespace etl {
11 
15 template <template <typename, size_t> typename TT, typename T>
16 struct is_2 : std::false_type {};
17 
21 template <template <typename, size_t> typename TT, typename V1, size_t R>
22 struct is_2<TT, TT<V1, R>> : std::true_type {};
23 
27 template <template <typename, size_t, size_t> typename TT, typename T>
28 struct is_3 : std::false_type {};
29 
33 template <template <typename, size_t, size_t> typename TT, typename V1, size_t R1, size_t R2>
34 struct is_3<TT, TT<V1, R1, R2>> : std::true_type {};
35 
39 template <template <typename, size_t...> typename TT, typename T>
40 struct is_var : std::false_type {};
41 
45 template <template <typename, size_t...> typename TT, typename V1, size_t... R>
46 struct is_var<TT, TT<V1, R...>> : std::true_type {};
47 
51 template <template <typename, typename, size_t...> typename TT, typename T>
52 struct is_var_2 : std::false_type {};
53 
57 template <template <typename, typename, size_t...> typename TT, typename V1, typename V2, size_t... R>
58 struct is_var_2<TT, TT<V1, V2, R...>> : std::true_type {};
59 
67 template <typename T>
68 struct etl_traits;
69 
74 template <typename E>
76 
80 template <typename E>
82 
86 template <typename S>
87 using memory_t =
88  std::conditional_t<std::is_const_v<std::remove_reference_t<S>>, typename std::decay_t<S>::const_memory_type, typename std::decay_t<S>::memory_type>;
89 
93 template <typename S>
94 using const_memory_t = typename std::decay_t<S>::const_memory_type;
95 
101 template <size_t S, size_t I, size_t F, size_t... Dims>
102 constexpr size_t nth_size() {
103  if constexpr (I < S) {
104  return nth_size<S, I + 1, Dims...>();
105  } else {
106  return F;
107  }
108 }
109 
115 template <size_t D1, size_t... D>
116 size_t dyn_nth_size(size_t i) {
117  if constexpr (sizeof...(D)) {
118  return i == 0 ? D1 : dyn_nth_size<D...>(i - 1);
119  } else {
120  cpp_assert(i == 0, "Invalid recursion");
121  return D1;
122  }
123 }
124 
128 template <typename S1, typename S2, typename Enable = void>
130 
134 template <>
135 struct sequence_equal<std::index_sequence<>, std::index_sequence<>> : std::true_type {};
136 
140 template <size_t... I1, size_t... I2>
141 struct sequence_equal<std::index_sequence<I1...>, std::index_sequence<I2...>, std::enable_if_t<sizeof...(I1) != sizeof...(I2)>> : std::false_type {};
142 
146 template <size_t I, size_t... I1, size_t... I2>
147 struct sequence_equal<std::index_sequence<I, I1...>, std::index_sequence<I, I2...>, std::enable_if_t<sizeof...(I1) == sizeof...(I2)>>
148  : sequence_equal<std::index_sequence<I1...>, std::index_sequence<I2...>> {};
149 
153 template <size_t I11, size_t I21, size_t... I1, size_t... I2>
154 struct sequence_equal<std::index_sequence<I11, I1...>, std::index_sequence<I21, I2...>, cpp::disable_if_t<I11 == I21>> : std::false_type {};
155 
162 template <typename Int, typename T, Int Begin>
164 
168 template <typename Int, Int... N, Int Begin>
169 struct integer_range_impl<Int, std::integer_sequence<Int, N...>, Begin> {
173  using type = std::integer_sequence<Int, N + Begin...>;
174 };
175 
179 template <typename Int, Int Begin, Int End>
180 using make_integer_range = typename integer_range_impl<Int, std::make_integer_sequence<Int, End - Begin>, Begin>::type;
181 
185 template <size_t Begin, size_t End>
187 
191 template <typename... Dims>
192 std::string concat_sizes(Dims... sizes) {
193  std::array<size_t, sizeof...(Dims)> tmp{{sizes...}};
194  std::string result;
195  std::string sep;
196  for (auto& v : tmp) {
197  result += sep;
198  result += std::to_string(v);
199  sep = ",";
200  }
201  return result;
202 }
203 
211  template <typename T>
212  static decltype(auto) apply(T&& t) {
213  return *(std::forward<T>(t));
214  }
215 };
216 
220 struct forward_op {
224  template <typename T>
225  static decltype(auto) apply(T&& t) {
226  return std::forward<T>(t);
227  }
228 };
229 
230 template <typename T>
231 using remove_const_deep = std::
232  conditional_t<std::is_lvalue_reference_v<T>, std::add_lvalue_reference_t<std::remove_cvref_t<T>>, std::remove_const_t<T>>;
233 
242  template <typename T>
243  static decltype(auto) apply(T&& t) {
244  using real_type = decltype(std::forward<T>(t));
245  return const_cast<remove_const_deep<real_type>>(std::forward<T>(t));
246  }
247 };
248 
253 template <bool B, typename T>
254 constexpr decltype(auto) optional_move(T&& t) {
255  if constexpr (B) {
256  return std::move(t);
257  } else {
258  return std::forward<T>(t);
259  }
260 }
261 
262 } //end of namespace etl
size_t dyn_nth_size(size_t i)
Returns the dth (dynamic) dimension from the variadic list D.
Definition: tmp.hpp:116
const_memory_t< sub_type > const_memory_type
The const memory access type.
Definition: dyn_matrix_view.hpp:33
D D
The number of dimensions.
Definition: dyn_matrix_view.hpp:24
constexpr size_t nth_size()
Traits to get the Sth dimension in Dims..
Definition: tmp.hpp:102
Functor that dereference a pointer and return its value.
Definition: tmp.hpp:207
Implementation for TMP utility to hold a range of integers.
Definition: tmp.hpp:163
decltype(auto) constexpr optional_move(T &&t)
Function to move or forward depending on a constant boolean flag.
Definition: tmp.hpp:254
std::integer_sequence< Int, N+Begin... > type
The resulting integer range from Begin to End.
Definition: tmp.hpp:173
std::string concat_sizes(Dims... sizes)
Returns a string representation of the given dimensions.
Definition: tmp.hpp:192
memory_t< sub_type > memory_type
The memory acess type.
Definition: dyn_matrix_view.hpp:32
Traits to get information about ETL types.
Definition: tmp.hpp:68
Root namespace for the ETL library.
Definition: adapter.hpp:15
Traits to test if T is a specialization of TT<T1, T2, size_t...>
Definition: tmp.hpp:52
typename integer_range_impl< Int, std::make_integer_sequence< Int, End - Begin >, Begin >::type make_integer_range
Helper to create an integer_range of numbers.
Definition: tmp.hpp:180
Traits to test if T is a specialization of TT<T, size_t...>
Definition: tmp.hpp:40
std::conditional_t< std::is_const_v< std::remove_reference_t< S > >, typename std::decay_t< S >::const_memory_type, typename std::decay_t< S >::memory_type > memory_t
Traits to extract the direct memory type out of an ETL type.
Definition: tmp.hpp:88
typename std::decay_t< S >::const_memory_type const_memory_t
Traits to extract the direct const memory type out of an ETL type.
Definition: tmp.hpp:94
Traits to test if two index_sequence are equal.
Definition: tmp.hpp:129
Functor that forwards a value.
Definition: tmp.hpp:220
Traits to test if T is a specialization of TT<T, size_t>
Definition: tmp.hpp:16
make_integer_range< size_t, Begin, End > make_index_range
Helper to create an integer_range of size_t numbers.
Definition: tmp.hpp:186
Functor that forwards a value and removes the constness of it.
Definition: tmp.hpp:238
typename decay_traits< E >::value_type value_t
Traits to extract the value type out of an ETL type.
Definition: tmp.hpp:81
Traits to test if T is a specialization of TT<T, size_t, size_t>
Definition: tmp.hpp:28