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>;
50 static constexpr bool IsConst = std::is_const_v<DataType>;
54 using value_type = DataType;
55 using ExtentsType = Extents;
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;
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()))
95 m_extents = DynamicDimsType(v.size());
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();
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)
166 ARCCORE_HOST_DEVICE DataType&
operator()(Int32 i, Int32
j, Int32
k)
const requires(Extents::rank() == 3)
171 constexpr ARCCORE_HOST_DEVICE DataType&
operator()(Int32 i, Int32
j)
const requires(Extents::rank() == 2)
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)
194 ARCCORE_HOST_DEVICE DataType*
ptrAt(Int32 i, Int32
j, Int32
k)
const requires(Extents::rank() == 3)
199 constexpr ARCCORE_HOST_DEVICE DataType*
ptrAt(Int32 i, Int32
j)
const requires(Extents::rank() == 2)
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 = {};
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;
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Classe de base des vues multi-dimensionnelles.
constexpr ARCCORE_HOST_DEVICE DataType * ptrAt(Int32 i) const
Pointeur sur la valeur pour l'élément i.
constexpr ARCCORE_HOST_DEVICE Int64 offset(Int32 i) const
Valeur pour l'élément i.
constexpr ARCCORE_HOST_DEVICE DataType * ptrAt(MDIndexType idx) const
Pointeur sur la valeur pour l'élément i.
constexpr ARCCORE_HOST_DEVICE DataType * ptrAt(Int32 i, Int32 j) const
Pointeur sur la valeur pour l'élément i,j.
ARCCORE_HOST_DEVICE DataType * ptrAt(Int32 i, Int32 j, Int32 k) const
Pointeur sur la valeur pour l'élément i,j,k.
constexpr ARCCORE_HOST_DEVICE Int32 extent3() const
Valeur de la quatrième dimension.
constexpr ARCCORE_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 ARCCORE_HOST_DEVICE Int64 offset(MDIndexType idx) const
Valeur pour l'élément idx.
constexpr ARCCORE_HOST_DEVICE DataType & operator()(Int32 i, Int32 j, Int32 k, Int32 l) const
Valeur pour l'élément i,j,k,l.
constexpr ARCCORE_HOST_DEVICE Int64 offset(Int32 i, Int32 j, Int32 k) const
Valeur pour l'élément i,j,k.
constexpr ARCCORE_HOST_DEVICE DataType operator[](Int32 i) const
Valeur pour l'élément i.
constexpr ARCCORE_HOST_DEVICE Int32 extent2() const
Valeur de la troisième dimension.
constexpr ARCCORE_HOST_DEVICE DataType & operator()(Int32 i, Int32 j) const
Valeur pour l'élément i,j.
ARCCORE_HOST_DEVICE DataType & operator()(Int32 i, Int32 j, Int32 k) const
Valeur pour l'élément i,j,k.
constexpr ARCCORE_HOST_DEVICE Int32 extent0() const
Valeur de la première dimension.
constexpr ARCCORE_HOST_DEVICE Int32 extent1() const
Valeur de la deuxième dimension.
ARCCORE_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 ARCCORE_HOST_DEVICE Int64 offset(Int32 i, Int32 j) const
Valeur pour l'élément i,j.
constexpr ARCCORE_HOST_DEVICE DataType & operator()(MDIndexType idx) const
Valeur pour l'élément idx.
constexpr ARCCORE_HOST_DEVICE DataType & operator()(Int32 i) const
Valeur pour l'élément i.
constexpr ARCCORE_HOST_DEVICE Int64 offset(Int32 i, Int32 j, Int32 k, Int32 l) const
Valeur pour l'élément i,j,k,l.
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 -*-