8#include "tensor_impl.hpp"
16template <
class IndexToRelabelize, TensorIndex OldIndex, TensorIndex NewIndex>
17struct RelabelizeIndex;
19template <
class IndexToRelabelize, TensorIndex OldIndex, TensorIndex NewIndex>
20 requires(!TensorIndex<IndexToRelabelize> || TensorNatIndex<IndexToRelabelize>)
21struct RelabelizeIndex<IndexToRelabelize, OldIndex, NewIndex>
24 conditional_t<std::is_same_v<IndexToRelabelize, OldIndex>, NewIndex, IndexToRelabelize>;
29 class IndexToRelabelizeType,
33struct RelabelizeIndex<IndexToRelabelizeType<Arg...>, OldIndex, NewIndex>
35 using type = std::conditional_t<
36 std::is_same_v<IndexToRelabelizeType<Arg...>, OldIndex>,
38 IndexToRelabelizeType<typename RelabelizeIndex<Arg, OldIndex, NewIndex>::type...>>;
41template <
class T,
class OldIndex,
class NewIndex>
42struct RelabelizeIndexInType;
44template <
template <
class...>
class T,
class... DDim,
class OldIndex,
class NewIndex>
45struct RelabelizeIndexInType<T<DDim...>, OldIndex, NewIndex>
47 using type = T<typename RelabelizeIndex<DDim, OldIndex, NewIndex>::type...>;
52template <
class T, TensorIndex OldIndex, TensorIndex NewIndex>
57template <
class OldIndex,
class NewIndex>
58struct RelabelizeIndexIn
60 template <
class... DDim>
61 static constexpr auto run(ddc::DiscreteElement<DDim...> elem)
63 return ddc::DiscreteElement<
64 typename detail::RelabelizeIndex<DDim, OldIndex, NewIndex>::type...>(
65 elem.template uid<DDim>()...);
68 template <
class... DDim>
69 static constexpr auto run(ddc::DiscreteVector<DDim...> vect)
71 return ddc::DiscreteVector<
72 typename detail::RelabelizeIndex<DDim, OldIndex, NewIndex>::type...>(
73 static_cast<std::size_t
>(vect.template get<DDim>())...);
76 template <
class... DDim>
77 static constexpr auto run(ddc::DiscreteDomain<DDim...> dom)
87template <
class OldIndex,
class NewIndex,
class T>
90 return detail::RelabelizeIndexIn<OldIndex, NewIndex>::run(t);
94template <
class TensorType,
class OldIndex,
class NewIndex>
95struct RelabelizeIndexOfType;
102 class LayoutStridedPolicy,
104struct RelabelizeIndexOfType<
105 Tensor<ElementType, Dom, LayoutStridedPolicy, MemorySpace>,
111 typename RelabelizeIndexInType<Dom, OldIndex, NewIndex>::type,
118template <misc::Specialization<Tensor> TensorType, TensorIndex OldIndex, TensorIndex NewIndex>
126 class LayoutStridedPolicy,
129 Tensor<ElementType, ddc::DiscreteDomain<DDim...>, LayoutStridedPolicy, MemorySpace>,
133 Tensor<ElementType, ddc::DiscreteDomain<DDim...>, LayoutStridedPolicy, MemorySpace>
137 Tensor<ElementType, ddc::DiscreteDomain<DDim...>, LayoutStridedPolicy, MemorySpace>,
140 old_tensor.data_handle(),
141 typename detail::RelabelizeIndexInType<
142 ddc::DiscreteDomain<DDim...>,
145 type(ddc::DiscreteDomain<
146 typename detail::RelabelizeIndex<DDim, OldIndex, NewIndex>::type>(
147 ddc::DiscreteElement<
148 typename detail::RelabelizeIndex<DDim, OldIndex, NewIndex>::
149 type>(old_tensor.domain().front().template uid<DDim>()),
151 typename detail::RelabelizeIndex<DDim, OldIndex, NewIndex>::
152 type>(
static_cast<std::size_t
>(
153 old_tensor.template extent<DDim>())))...));
157template <
class IndexToRelabelize,
class OldIndices,
class NewIndices>
158struct RelabelizeIndices;
160template <
class IndexToRelabelize>
161struct RelabelizeIndices<IndexToRelabelize, ddc::detail::TypeSeq<>, ddc::detail::TypeSeq<>>
163 using type = IndexToRelabelize;
167 class IndexToRelabelize,
169 class... TailOldIndex,
171 class... TailNewIndex>
172struct RelabelizeIndices<
174 ddc::detail::TypeSeq<HeadOldIndex, TailOldIndex...>,
175 ddc::detail::TypeSeq<HeadNewIndex, TailNewIndex...>>
177 static_assert(
sizeof...(TailOldIndex) ==
sizeof...(TailNewIndex));
178 using type = std::conditional_t<
179 (
sizeof...(TailOldIndex) > 0),
180 typename RelabelizeIndices<
181 typename RelabelizeIndex<IndexToRelabelize, HeadOldIndex, HeadNewIndex>::type,
182 ddc::detail::TypeSeq<TailOldIndex...>,
183 ddc::detail::TypeSeq<TailNewIndex...>>::type,
184 typename RelabelizeIndex<IndexToRelabelize, HeadOldIndex, HeadNewIndex>::type>;
187template <
class T,
class OldIndices,
class NewIndices>
188struct RelabelizeIndicesInType;
191struct RelabelizeIndicesInType<T, ddc::detail::TypeSeq<>, ddc::detail::TypeSeq<>>
199 class... TailOldIndex,
201 class... TailNewIndex>
202struct RelabelizeIndicesInType<
204 ddc::detail::TypeSeq<HeadOldIndex, TailOldIndex...>,
205 ddc::detail::TypeSeq<HeadNewIndex, TailNewIndex...>>
207 static_assert(
sizeof...(TailOldIndex) ==
sizeof...(TailNewIndex));
208 using type =
typename RelabelizeIndicesInType<
210 ddc::detail::TypeSeq<TailOldIndex...>,
211 ddc::detail::TypeSeq<TailNewIndex...>>::type;
216template <
class T,
class OldIndices,
class NewIndices>
218 typename detail::RelabelizeIndicesInType<T, OldIndices, NewIndices>::type;
222template <
class OldIndices,
class NewIndices, std::
size_t I = 0>
223struct RelabelizeIndicesIn
225 template <
class... DDim>
226 static constexpr auto run(ddc::DiscreteElement<DDim...> elem)
228 if constexpr (I != ddc::type_seq_size_v<OldIndices>) {
229 return RelabelizeIndicesIn<OldIndices, NewIndices, I + 1>::run(
231 ddc::type_seq_element_t<I, OldIndices>,
232 ddc::type_seq_element_t<I, NewIndices>>(elem));
238 template <
class... DDim>
239 static constexpr auto run(ddc::DiscreteVector<DDim...> vect)
241 if constexpr (I != ddc::type_seq_size_v<OldIndices>) {
242 return RelabelizeIndicesIn<OldIndices, NewIndices, I + 1>::run(
244 ddc::type_seq_element_t<I, OldIndices>,
245 ddc::type_seq_element_t<I, NewIndices>>(vect));
251 template <
class... DDim>
252 static constexpr auto run(ddc::DiscreteDomain<DDim...> dom)
254 if constexpr (I != ddc::type_seq_size_v<OldIndices>) {
255 return RelabelizeIndicesIn<OldIndices, NewIndices, I + 1>::run(
257 ddc::type_seq_element_t<I, OldIndices>,
258 ddc::type_seq_element_t<I, NewIndices>>(dom));
267template <
class OldIndices,
class NewIndices,
class T>
270 static_assert(ddc::type_seq_size_v<OldIndices> == ddc::type_seq_size_v<NewIndices>);
271 return detail::RelabelizeIndicesIn<OldIndices, NewIndices>::run(t);
276template <
class TensorType,
class OldIndex,
class NewIndex>
277struct RelabelizeIndicesOfType;
284 class LayoutStridedPolicy,
286struct RelabelizeIndicesOfType<
287 Tensor<ElementType, Dom, LayoutStridedPolicy, MemorySpace>,
291 static_assert(ddc::type_seq_size_v<OldIndices> == ddc::type_seq_size_v<NewIndices>);
294 typename RelabelizeIndicesInType<Dom, OldIndices, NewIndices>::type,
305 class LayoutStridedPolicy,
307constexpr auto RelabelizeIndicesOf(
308 Tensor<ElementType, ddc::DiscreteDomain<DDim...>, LayoutStridedPolicy, MemorySpace>
311 static_assert(ddc::type_seq_size_v<OldIndices> == ddc::type_seq_size_v<NewIndices>);
312 if constexpr (I != ddc::type_seq_size_v<OldIndices>) {
313 return RelabelizeIndicesOf<
314 ddc::type_seq_replace_t<
316 ddc::detail::TypeSeq<ddc::type_seq_element_t<I, OldIndices>>,
317 ddc::detail::TypeSeq<ddc::type_seq_element_t<I, NewIndices>>>,
321 ddc::DiscreteDomain<DDim...>,
324 ddc::type_seq_element_t<I, OldIndices>,
325 ddc::type_seq_element_t<I, NewIndices>>(
326 old_tensor.data_handle(),
327 typename detail::RelabelizeIndexInType<
328 ddc::DiscreteDomain<DDim...>,
329 ddc::type_seq_element_t<I, OldIndices>,
330 ddc::type_seq_element_t<I, NewIndices>>::
331 type(ddc::DiscreteDomain<
typename detail::RelabelizeIndex<
333 ddc::type_seq_element_t<I, OldIndices>,
334 ddc::type_seq_element_t<I, NewIndices>>::type>(
335 ddc::DiscreteElement<
typename detail::RelabelizeIndex<
337 ddc::type_seq_element_t<I, OldIndices>,
338 ddc::type_seq_element_t<I, NewIndices>>::type>(
339 old_tensor.domain().front().template uid<DDim>()),
340 ddc::DiscreteVector<
typename detail::RelabelizeIndex<
342 ddc::type_seq_element_t<I, OldIndices>,
343 ddc::type_seq_element_t<I, NewIndices>>::type>(
344 static_cast<std::size_t
>(
345 old_tensor.template extent<DDim>())))...)));
354 misc::Specialization<Tensor> TensorType,
355 misc::Specialization<ddc::detail::TypeSeq> OldIndices,
356 misc::Specialization<ddc::detail::TypeSeq> NewIndices>
358 = detail::RelabelizeIndicesOfType<TensorType, OldIndices, NewIndices>::type;
367 static_assert(ddc::type_seq_size_v<OldIndices> == ddc::type_seq_size_v<NewIndices>);
368 return detail::RelabelizeIndicesOf<OldIndices, NewIndices, 0>(tensor);
Tensor(ddc::Chunk< ElementType, SupportType, Allocator >) -> Tensor< ElementType, SupportType, Kokkos::layout_right, typename Allocator::memory_space >
detail::RelabelizeIndicesOfType< TensorType, OldIndices, NewIndices >::type relabelize_indices_of_t
constexpr relabelize_indices_in_t< T, OldIndices, NewIndices > relabelize_indices_in(T t)
detail::RelabelizeIndexInType< T, OldIndex, NewIndex >::type relabelize_index_in_t
constexpr relabelize_index_in_t< T, OldIndex, NewIndex > relabelize_index_in(T t)
detail::RelabelizeIndexOfType< TensorType, OldIndex, NewIndex >::type relabelize_index_of_t
constexpr relabelize_index_of_t< Tensor< ElementType, ddc::DiscreteDomain< DDim... >, LayoutStridedPolicy, MemorySpace >, OldIndex, NewIndex > relabelize_index_of(Tensor< ElementType, ddc::DiscreteDomain< DDim... >, LayoutStridedPolicy, MemorySpace > old_tensor)
constexpr relabelize_indices_of_t< Tensor, OldIndices, NewIndices > relabelize_indices_of(Tensor tensor)
typename detail::RelabelizeIndicesInType< T, OldIndices, NewIndices >::type relabelize_indices_in_t
The top-level namespace of SimiLie.