12#ifndef ARCANE_UTILS_MDSPAN_H
13#define ARCANE_UTILS_MDSPAN_H
17#include "arcane/utils/ArrayExtents.h"
18#include "arcane/utils/ArrayBounds.h"
19#include "arcane/utils/NumericTraits.h"
20#include "arcane/utils/ArrayLayout.h"
21#include "arcane/utils/ArcaneCxx20.h"
42template <
typename DataType,
typename Extents,
typename LayoutPolicy>
45 using UnqualifiedValueType = std::remove_cv_t<DataType>;
46 friend class NumArray<UnqualifiedValueType, Extents, LayoutPolicy>;
48 friend class MDSpan<const UnqualifiedValueType, Extents, LayoutPolicy>;
52 using value_type = DataType;
53 using ExtentsType = Extents;
54 using LayoutPolicyType = LayoutPolicy;
55 using MDIndexType =
typename Extents::MDIndexType;
57 using DynamicDimsType =
typename Extents::DynamicDimsType;
58 using RemovedFirstExtentsType =
typename Extents::RemovedFirstExtentsType;
61 using ArrayBoundsIndexType =
typename Extents::MDIndexType;
62 using IndexType =
typename Extents::MDIndexType;
67 constexpr ARCCORE_HOST_DEVICE
MDSpan(DataType* ptr, ArrayExtentsWithOffsetType extents)
72 constexpr ARCCORE_HOST_DEVICE
MDSpan(DataType* ptr,
const DynamicDimsType& dims)
77 template <
typename X,
typename = std::enable_if_t<std::is_same_v<X, UnqualifiedValueType>>>
80 , m_extents(rhs.m_extents)
85 constexpr ARCCORE_HOST_DEVICE DataType* _internalData() {
return m_ptr; }
86 constexpr ARCCORE_HOST_DEVICE
const DataType* _internalData()
const {
return m_ptr; }
92 return m_extents.extents();
94 ArrayExtentsWithOffsetType extentsWithOffset()
const
102 constexpr ARCCORE_HOST_DEVICE Int32
extent0() const requires(Extents::rank() >= 1) {
return m_extents.extent0(); }
104 constexpr ARCCORE_HOST_DEVICE Int32
extent1() const requires(Extents::rank() >= 2) {
return m_extents.extent1(); }
106 constexpr ARCCORE_HOST_DEVICE Int32
extent2() const requires(Extents::rank() >= 3) {
return m_extents.extent2(); }
108 constexpr ARCCORE_HOST_DEVICE Int32
extent3() const requires(Extents::rank() >= 4) {
return m_extents.extent3(); }
114 constexpr ARCCORE_HOST_DEVICE Int64
offset(Int32 i, Int32 j, Int32 k, Int32 l)
const requires(Extents::rank() == 4)
116 return m_extents.offset(i, j, k, l);
119 constexpr ARCCORE_HOST_DEVICE Int64
offset(Int32 i, Int32 j, Int32 k)
const requires(Extents::rank() == 3)
121 return m_extents.offset(i, j, k);
124 constexpr ARCCORE_HOST_DEVICE Int64
offset(Int32 i, Int32 j)
const requires(Extents::rank() == 2)
126 return m_extents.offset(i, j);
129 constexpr ARCCORE_HOST_DEVICE Int64
offset(Int32 i)
const requires(Extents::rank() == 1) {
return m_extents.offset(i); }
132 constexpr ARCCORE_HOST_DEVICE Int64
offset(MDIndexType idx)
const
134 return m_extents.offset(idx);
140 constexpr ARCCORE_HOST_DEVICE DataType&
operator()(Int32 i, Int32 j, Int32 k, Int32 l)
const requires(Extents::rank() == 4)
142 return m_ptr[
offset(i, j, k, l)];
145 ARCCORE_HOST_DEVICE DataType&
operator()(Int32 i, Int32 j, Int32 k)
const requires(Extents::rank() == 3)
147 return m_ptr[
offset(i, j, k)];
150 constexpr ARCCORE_HOST_DEVICE DataType&
operator()(Int32 i, Int32 j)
const requires(Extents::rank() == 2)
152 return m_ptr[
offset(i, j)];
155 constexpr ARCCORE_HOST_DEVICE DataType&
operator()(Int32 i)
const requires(Extents::rank() == 1) {
return m_ptr[
offset(i)]; }
157 constexpr ARCCORE_HOST_DEVICE DataType
operator[](Int32 i)
const requires(Extents::rank() == 1) {
return m_ptr[
offset(i)]; }
160 constexpr ARCCORE_HOST_DEVICE DataType&
operator()(MDIndexType idx)
const
162 return m_ptr[
offset(idx)];
168 constexpr ARCCORE_HOST_DEVICE DataType*
ptrAt(Int32 i, Int32 j, Int32 k, Int32 l)
const requires(Extents::rank() == 4)
170 return m_ptr +
offset(i, j, k, l);
173 ARCCORE_HOST_DEVICE DataType*
ptrAt(Int32 i, Int32 j, Int32 k)
const requires(Extents::rank() == 3)
175 return m_ptr +
offset(i, j, k);
178 constexpr ARCCORE_HOST_DEVICE DataType*
ptrAt(Int32 i, Int32 j)
const requires(Extents::rank() == 2)
180 return m_ptr +
offset(i, j);
183 constexpr ARCCORE_HOST_DEVICE DataType*
ptrAt(Int32 i)
const requires(Extents::rank() == 1) {
return m_ptr +
offset(i); }
186 constexpr ARCCORE_HOST_DEVICE DataType*
ptrAt(MDIndexType idx)
const
188 return m_ptr +
offset(idx);
206 slice(Int32 i)
const requires(Extents::rank() >= 2 && std::is_base_of_v<RightLayout, LayoutPolicy>)
208 auto new_extents = m_extents.extents().removeFirstExtent().dynamicExtents();
209 std::array<Int32, ExtentsType::rank()> indexes = {};
211 DataType* base_ptr = this->
ptrAt(MDIndexType(indexes));
222 constexpr ARCCORE_HOST_DEVICE MDSpan<const DataType, Extents, LayoutPolicy> constMDSpan()
const
224 return MDSpan<const DataType, Extents, LayoutPolicy>(m_ptr, m_extents);
227 constexpr ARCCORE_HOST_DEVICE Span<DataType> to1DSpan()
const
229 return { m_ptr, m_extents.totalNbElement() };
232 constexpr SmallSpan<DataType> to1DSmallSpan()
requires(Extents::rank() == 1)
234 return { _internalData(),
extent0() };
236 constexpr SmallSpan<const DataType> to1DSmallSpan() const requires(Extents::rank() == 1)
238 return to1DConstSmallSpan();
240 constexpr SmallSpan<const DataType> to1DConstSmallSpan() const requires(Extents::rank() == 1)
242 return { _internalData(),
extent0() };
247 DataType* m_ptr =
nullptr;
248 ArrayExtentsWithOffsetType m_extents;
Classe de base des vues multi-dimensionnelles.
__host__ __device__ MDSpan< DataType, RemovedFirstExtentsType, LayoutPolicy > slice(Int32 i) const
Retourne une vue de dimension (N-1) à partir de l'élément d'indice i.
constexpr __host__ __device__ DataType & operator()(Int32 i, Int32 j, Int32 k, Int32 l) const
Valeur pour l'élément i,j,k,l.
constexpr __host__ __device__ Int32 extent3() const
Valeur de la quatrième dimension.
constexpr __host__ __device__ DataType * ptrAt(Int32 i, Int32 j) const
Pointeur sur la valeur pour l'élément i,j.
constexpr __host__ __device__ Int64 offset(Int32 i, Int32 j, Int32 k, Int32 l) const
Valeur pour l'élément i,j,k,l.
constexpr __host__ __device__ Int64 offset(Int32 i) const
Valeur pour l'élément i.
constexpr __host__ __device__ Int64 offset(MDIndexType idx) const
Valeur pour l'élément idx.
constexpr __host__ __device__ DataType * ptrAt(Int32 i, Int32 j, Int32 k, Int32 l) const
Pointeur sur la valeur pour l'élément i,j,k.
constexpr __host__ __device__ Int64 offset(Int32 i, Int32 j, Int32 k) const
Valeur pour l'élément i,j,k.
constexpr __host__ __device__ DataType operator[](Int32 i) const
Valeur pour l'élément i.
constexpr __host__ __device__ DataType & operator()(Int32 i) const
Valeur pour l'élément i.
constexpr __host__ __device__ Int32 extent2() const
Valeur de la troisième dimension.
__host__ __device__ DataType * ptrAt(Int32 i, Int32 j, Int32 k) const
Pointeur sur la valeur pour l'élément i,j,k.
constexpr __host__ __device__ Int32 extent1() const
Valeur de la deuxième dimension.
__host__ __device__ DataType & operator()(Int32 i, Int32 j, Int32 k) const
Valeur pour l'élément i,j,k.
constexpr __host__ __device__ DataType & operator()(Int32 i, Int32 j) const
Valeur pour l'élément i,j.
constexpr __host__ __device__ Int64 offset(Int32 i, Int32 j) const
Valeur pour l'élément i,j.
constexpr __host__ __device__ DataType & operator()(MDIndexType idx) const
Valeur pour l'élément idx.
constexpr __host__ __device__ DataType * ptrAt(MDIndexType idx) const
Pointeur sur la valeur pour l'élément i.
constexpr __host__ __device__ Int32 extent0() const
Valeur de la première dimension.
constexpr __host__ __device__ DataType * ptrAt(Int32 i) const
Pointeur sur la valeur pour l'élément i.
Tableaux multi-dimensionnels pour les types numériques accessibles sur accélérateurs.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-