15 template <
template <
typename,
size_t>
typename TT,
typename T>
16 struct is_2 : std::false_type {};
21 template <
template <
typename,
size_t>
typename TT,
typename V1,
size_t R>
22 struct is_2<TT, TT<V1, R>> : std::true_type {};
27 template <
template <
typename,
size_t,
size_t>
typename TT,
typename T>
28 struct is_3 : std::false_type {};
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 {};
39 template <
template <
typename,
size_t...>
typename TT,
typename T>
45 template <
template <
typename,
size_t...>
typename TT,
typename V1,
size_t... R>
46 struct is_var<TT, TT<V1, R...>> : std::true_type {};
51 template <
template <
typename,
typename,
size_t...>
typename TT,
typename T>
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 {};
101 template <
size_t S,
size_t I,
size_t F,
size_t... Dims>
103 if constexpr (I < S) {
104 return nth_size<S, I + 1, Dims...>();
115 template <
size_t D1,
size_t...
D>
117 if constexpr (
sizeof...(
D)) {
120 cpp_assert(i == 0,
"Invalid recursion");
128 template <
typename S1,
typename S2,
typename Enable =
void>
135 struct sequence_equal<std::index_sequence<>, std::index_sequence<>> : std::true_type {};
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 {};
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...>> {};
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 {};
162 template <
typename Int,
typename T, Int Begin>
168 template <
typename Int, Int... N, Int Begin>
173 using type = std::integer_sequence<Int, N + Begin...>;
179 template <
typename Int, Int Begin, Int End>
185 template <
size_t Begin,
size_t End>
191 template <
typename... Dims>
193 std::array<size_t,
sizeof...(Dims)> tmp{{sizes...}};
196 for (
auto& v : tmp) {
198 result += std::to_string(v);
211 template <
typename T>
212 static decltype(
auto) apply(T&& t) {
213 return *(std::forward<T>(t));
224 template <
typename T>
225 static decltype(
auto) apply(T&& t) {
226 return std::forward<T>(t);
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>>;
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));
253 template <
bool B,
typename T>
258 return std::forward<T>(t);
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