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>;
50 static constexpr bool IsConst = std::is_const_v<DataType>;
54 using value_type = DataType;
55 using ExtentsType = Extents;
56 using LayoutPolicyType = LayoutPolicy;
57 using MDIndexType =
typename Extents::MDIndexType;
59 using DynamicDimsType =
typename Extents::DynamicDimsType;
60 using RemovedFirstExtentsType =
typename Extents::RemovedFirstExtentsType;
63 using ArrayBoundsIndexType =
typename Extents::MDIndexType;
64 using IndexType =
typename Extents::MDIndexType;
69 constexpr ARCCORE_HOST_DEVICE
MDSpan(DataType* ptr, ArrayExtentsWithOffsetType extents)
74 constexpr ARCCORE_HOST_DEVICE
MDSpan(DataType* ptr,
const DynamicDimsType& dims)
79 template <
typename X,
typename = std::enable_if_t<std::is_same_v<X, UnqualifiedValueType>>>
82 , m_extents(rhs.m_extents)
86 , m_extents(DynamicDimsType(v.
size()))
90 , m_extents(DynamicDimsType(v.
size()))
92 constexpr ARCCORE_HOST_DEVICE ThatClass& operator=(
SmallSpan<DataType> v)
requires(Extents::isDynamic1D() && !IsConst)
95 m_extents = DynamicDimsType(v.
size());
98 constexpr ARCCORE_HOST_DEVICE ThatClass& operator=(
SmallSpan<const DataType> v)
requires(Extents::isDynamic1D() && IsConst)
101 m_extents = DynamicDimsType(v.
size());
107 constexpr ARCCORE_HOST_DEVICE DataType* _internalData() {
return m_ptr; }
108 constexpr ARCCORE_HOST_DEVICE
const DataType* _internalData()
const {
return m_ptr; }
114 return m_extents.extents();
116 ArrayExtentsWithOffsetType extentsWithOffset()
const
124 constexpr ARCCORE_HOST_DEVICE Int32
extent0() const requires(Extents::rank() >= 1) {
return m_extents.extent0(); }
126 constexpr ARCCORE_HOST_DEVICE Int32
extent1() const requires(Extents::rank() >= 2) {
return m_extents.extent1(); }
128 constexpr ARCCORE_HOST_DEVICE Int32
extent2() const requires(Extents::rank() >= 3) {
return m_extents.extent2(); }
130 constexpr ARCCORE_HOST_DEVICE Int32
extent3() const requires(Extents::rank() >= 4) {
return m_extents.extent3(); }
135 constexpr ARCCORE_HOST_DEVICE Int64
offset(Int32 i, Int32 j, Int32 k, Int32 l)
const requires(Extents::rank() == 4)
137 return m_extents.offset(i, j, k, l);
140 constexpr ARCCORE_HOST_DEVICE Int64
offset(Int32 i, Int32 j, Int32 k)
const requires(Extents::rank() == 3)
142 return m_extents.offset(i, j, k);
145 constexpr ARCCORE_HOST_DEVICE Int64
offset(Int32 i, Int32 j)
const requires(Extents::rank() == 2)
147 return m_extents.offset(i, j);
150 constexpr ARCCORE_HOST_DEVICE Int64
offset(Int32 i)
const requires(Extents::rank() == 1) {
return m_extents.offset(i); }
153 constexpr ARCCORE_HOST_DEVICE Int64
offset(MDIndexType idx)
const
155 return m_extents.offset(idx);
161 constexpr ARCCORE_HOST_DEVICE DataType&
operator()(Int32 i, Int32 j, Int32 k, Int32 l)
const requires(Extents::rank() == 4)
163 return m_ptr[
offset(i, j, k, l)];
166 ARCCORE_HOST_DEVICE DataType&
operator()(Int32 i, Int32 j, Int32 k)
const requires(Extents::rank() == 3)
168 return m_ptr[
offset(i, j, k)];
171 constexpr ARCCORE_HOST_DEVICE DataType&
operator()(Int32 i, Int32 j)
const requires(Extents::rank() == 2)
173 return m_ptr[
offset(i, j)];
176 constexpr ARCCORE_HOST_DEVICE DataType&
operator()(Int32 i)
const requires(Extents::rank() == 1) {
return m_ptr[
offset(i)]; }
178 constexpr ARCCORE_HOST_DEVICE DataType
operator[](Int32 i)
const requires(Extents::rank() == 1) {
return m_ptr[
offset(i)]; }
181 constexpr ARCCORE_HOST_DEVICE DataType&
operator()(MDIndexType idx)
const
183 return m_ptr[
offset(idx)];
189 constexpr ARCCORE_HOST_DEVICE DataType*
ptrAt(Int32 i, Int32 j, Int32 k, Int32 l)
const requires(Extents::rank() == 4)
191 return m_ptr +
offset(i, j, k, l);
194 ARCCORE_HOST_DEVICE DataType*
ptrAt(Int32 i, Int32 j, Int32 k)
const requires(Extents::rank() == 3)
196 return m_ptr +
offset(i, j, k);
199 constexpr ARCCORE_HOST_DEVICE DataType*
ptrAt(Int32 i, Int32 j)
const requires(Extents::rank() == 2)
201 return m_ptr +
offset(i, j);
204 constexpr ARCCORE_HOST_DEVICE DataType*
ptrAt(Int32 i)
const requires(Extents::rank() == 1) {
return m_ptr +
offset(i); }
207 constexpr ARCCORE_HOST_DEVICE DataType*
ptrAt(MDIndexType idx)
const
209 return m_ptr +
offset(idx);
227 slice(Int32 i)
const requires(Extents::rank() >= 2 && std::is_base_of_v<RightLayout, LayoutPolicy>)
229 auto new_extents = m_extents.extents().removeFirstExtent().dynamicExtents();
230 std::array<Int32, ExtentsType::rank()> indexes = {};
232 DataType* base_ptr = this->
ptrAt(MDIndexType(indexes));
243 constexpr ARCCORE_HOST_DEVICE MDSpan<const DataType, Extents, LayoutPolicy> constMDSpan()
const
245 return MDSpan<const DataType, Extents, LayoutPolicy>(m_ptr, m_extents);
248 constexpr ARCCORE_HOST_DEVICE Span<DataType> to1DSpan()
const
250 return { m_ptr, m_extents.totalNbElement() };
253 constexpr SmallSpan<DataType> to1DSmallSpan()
requires(Extents::rank() == 1)
255 return { _internalData(),
extent0() };
257 constexpr SmallSpan<const DataType> to1DSmallSpan() const requires(Extents::rank() == 1)
259 return to1DConstSmallSpan();
261 constexpr SmallSpan<const DataType> to1DConstSmallSpan() const requires(Extents::rank() == 1)
263 return { _internalData(),
extent0() };
268 DataType* m_ptr =
nullptr;
269 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.
Vue d'un tableau d'éléments de type T.
constexpr __host__ __device__ SizeType size() const noexcept
Retourne la taille du tableau.
constexpr __host__ __device__ pointer data() const noexcept
Pointeur sur le début de la vue.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-