12#ifndef ARCANE_UTILS_NUMARRAY_H 
   13#define ARCANE_UTILS_NUMARRAY_H 
   17#include "arcane/utils/MDSpan.h" 
   18#include "arcane/utils/MDDim.h" 
   19#include "arcane/utils/NumArrayContainer.h" 
   20#include "arcane/utils/String.h" 
   54template <
typename DataType, 
typename Extents, 
typename LayoutPolicy>
 
   60#if !defined(ARCANE_NO_CONCEPT_FOR_NUMARRAY) 
   66  using ExtentsType = Extents;
 
   68  using DynamicDimsType = 
typename ExtentsType::DynamicDimsType;
 
   72  using ArrayBoundsIndexType = 
typename MDSpanType::ArrayBoundsIndexType;
 
   73  using value_type = DataType;
 
   74  using LayoutPolicyType = LayoutPolicy;
 
   76  using ConstSpanType ARCANE_DEPRECATED_REASON(
"Use 'ConstMDSpanType' instead") = ConstMDSpanType;
 
   77  using SpanType ARCANE_DEPRECATED_REASON(
"Use 'MDSpanType' instead") = MDSpanType;
 
   82  static constexpr int rank() { 
return Extents::rank(); }
 
  113           Int32 dim3_size, 
Int32 dim4_size) 
requires(Extents::nb_dynamic == 4)
 
  114  : ThatClass(DynamicDimsType(dim1_size, dim2_size, dim3_size, dim4_size))
 
 
  121  : ThatClass(DynamicDimsType(dim1_size, dim2_size, dim3_size, dim4_size), r)
 
 
  127  : ThatClass(DynamicDimsType(dim1_size, dim2_size, dim3_size))
 
 
  132  : ThatClass(DynamicDimsType(dim1_size, dim2_size, dim3_size), r)
 
 
  138  : ThatClass(DynamicDimsType(dim1_size, dim2_size))
 
 
  143  : ThatClass(DynamicDimsType(dim1_size, dim2_size), r)
 
 
  149  : ThatClass(DynamicDimsType(dim1_size))
 
 
  154  : ThatClass(DynamicDimsType(dim1_size), r)
 
 
  165  requires(Extents::is_full_dynamic() && Extents::rank() == 2)
 
  168    this->m_data.copyInitializerList(alist);
 
 
  173  requires(Extents::isDynamic1D())
 
  176    this->m_data.copyInitializerList(alist);
 
 
  181  requires(Extents::isDynamic1D())
 
  184    this->m_data.copy(v);
 
 
  189  requires(Extents::isDynamic1D())
 
  192    this->m_data.copy(v);
 
 
  198  , m_total_nb_element(rhs.m_total_nb_element)
 
  200    _updateSpanPointerFromData();
 
  205  , m_data(std::move(rhs.m_data))
 
  206  , m_total_nb_element(rhs.m_total_nb_element)
 
  210  ThatClass& operator=(ThatClass&&) = 
default;
 
  226      m_data = ArrayWrapper(rhs_r);
 
 
  240    m_data.swap(rhs.m_data);
 
  241    std::swap(m_span, rhs.m_span);
 
  242    std::swap(m_total_nb_element, rhs.m_total_nb_element);
 
 
  255    return m_span.extentsWithOffset();
 
  257  Int64 capacity()
 const { 
return m_data.capacity(); }
 
  258  eMemoryRessource memoryRessource()
 const { 
return m_data.memoryRessource(); }
 
  289  constexpr Int32 extent0() const requires(Extents::
rank() >= 1) { 
return m_span.extent0(); }
 
  291  constexpr Int32 extent1() const requires(Extents::
rank() >= 2) { 
return m_span.extent1(); }
 
  293  constexpr Int32 extent2() const requires(Extents::
rank() >= 3) { 
return m_span.extent2(); }
 
  295  constexpr Int32 extent3() const requires(Extents::
rank() >= 4) { 
return m_span.extent3(); }
 
  302    m_span.m_extents = DynamicDimsType(dim1_size);
 
 
  310    this->
resizeDestructive(DynamicDimsType(dim1_size, dim2_size, dim3_size, dim4_size));
 
 
  336    this->
resizeDestructive(DynamicDimsType(dim1_size, dim2_size, dim3_size, dim4_size));
 
 
  367    m_span.m_extents = dims;
 
 
  394    m_data.fill(v, indexes, queue);
 
 
  405    m_data.fill(v, indexes, &queue);
 
 
  415    m_data.fill(v, queue);
 
 
  425    m_data.fill(v, &queue);
 
 
  436    _checkHost(memoryRessource());
 
 
  459  void copy(ConstMDSpanType rhs) { 
copy(rhs, 
nullptr); }
 
  467  void copy(
const ThatClass& rhs) { 
copy(rhs, 
nullptr); }
 
  479    _resizeAndCopy(ConstMDSpanType(rhs), eMemoryRessource::Unknown, queue);
 
 
  492    _resizeAndCopy(rhs, eMemoryRessource::Unknown, queue);
 
 
  505    _resizeAndCopy(ConstMDSpanType(rhs), eMemoryRessource::Unknown, &queue);
 
 
  518    _resizeAndCopy(rhs, eMemoryRessource::Unknown, &queue);
 
 
  531    _resizeAndCopy(rhs.
constMDSpan(), rhs.memoryRessource(), queue);
 
 
  544    _resizeAndCopy(rhs.
constMDSpan(), rhs.memoryRessource(), &queue);
 
 
  552  DataType 
operator[](
Int32 i) 
const requires(Extents::rank() == 1) { 
return m_span(i); }
 
  559    return m_span(i, j, k, l);
 
 
  564    return m_span(i, j, k, l);
 
 
  570    return m_span(i, j, k);
 
 
  575    return m_span(i, j, k);
 
 
  589  DataType 
operator()(
Int32 i) 
const requires(Extents::rank() == 1) { 
return m_span(i); }
 
  610  ARCANE_DEPRECATED_REASON(
"Y2023: Use operator() instead")
 
  613    return m_span(i, j, k, l);
 
 
  616  ARCANE_DEPRECATED_REASON(
"Y2023: Use operator() instead")
 
  619    return m_span(i, j, k);
 
 
  622  ARCANE_DEPRECATED_REASON(
"Y2023: Use operator() instead")
 
  628  ARCANE_DEPRECATED_REASON(
"Y2023: Use operator() instead")
 
  629  DataType& 
s(
Int32 i) requires(Extents::
rank() == 1) { 
return m_span(i); }
 
  632  ARCANE_DEPRECATED_REASON(
"Y2023: Use operator() instead")
 
  633  DataType& 
s(ArrayBoundsIndexType idx)
 
 
  641  ARCANE_DEPRECATED_REASON(
"Y2024: Use mdspan() instead")
 
  642  MDSpanType 
span() { 
return m_span; }
 
  645  ARCANE_DEPRECATED_REASON(
"Y2024: Use mdspan() instead")
 
  646  ConstMDSpanType 
span()
 const { 
return m_span.constMDSpan(); }
 
  649  ARCANE_DEPRECATED_REASON(
"Y2024: Use constMDSpan() instead")
 
  650  ConstMDSpanType 
constSpan()
 const { 
return m_span.constMDSpan(); }
 
  656  ConstMDSpanType 
mdspan()
 const { 
return m_span.constMDSpan(); }
 
  659  ConstMDSpanType 
constMDSpan()
 const { 
return m_span.constMDSpan(); }
 
  668  constexpr operator MDSpanType() { 
return this->
mdspan(); }
 
  670  constexpr operator ConstMDSpanType()
 const { 
return this->
constMDSpan(); }
 
  687  DataType* _internalData() { 
return m_span._internalData(); }
 
  693  Int64 m_total_nb_element = 0;
 
  697  void _updateSpanPointerFromData()
 
  699    m_span.m_ptr = m_data.to1DSpan().data();
 
  702  void _resizeAndCopy(ConstMDSpanType rhs, 
eMemoryRessource input_ressource, 
const RunQueue* queue)
 
  704    this->
resize(rhs.extents().dynamicExtents());
 
  705    m_data.copyOnly(rhs.to1DSpan(), input_ressource, queue);
 
  706    _updateSpanPointerFromData();
 
  712    m_total_nb_element = m_span.extents().totalNbElement();
 
  713    m_data.resize(m_total_nb_element);
 
  714    _updateSpanPointerFromData();
 
  726    if constexpr (ExtentsType::nb_dynamic == 0) {
 
  727      resize(DynamicDimsType());
 
 
static constexpr int rank()
NumArray()
Construit un tableau vide.
File d'exécution pour un accélérateur.
Interface d'un allocateur pour la mémoire.
Classe de base des vues multi-dimensionnelles.
void resizeDestructive(Int32 dim1_size, Int32 dim2_size, Int32 dim3_size, Int32 dim4_size)
Modifie la taille du tableau.
DataType operator()(Int32 i) const
Valeur pour l'élément i.
void resizeDestructive(Int32 dim1_size, Int32 dim2_size)
Modifie la taille du tableau en ne gardant pas les valeurs actuelles.
void copy(const ThatClass &rhs, const RunQueue *queue)
Copie dans l'instance les valeurs de rhs via la file queue.
constexpr Int32 extent0() const
Valeur de la première dimension.
Span< const DataType > to1DSpan() const
Vue 1D constante sur l'instance.
Span< std::byte > bytes()
Vue sous forme d'octets.
DataType & s(Int32 i, Int32 j, Int32 k, Int32 l)
DataType & operator()(Int32 i, Int32 j)
Positionne la valeur pour l'élément i,j.
constexpr SmallSpan< const DataType > to1DConstSmallSpan() const
Vue constante 1D sur l'instance (uniquement si rank == 1)
constexpr Int32 dim4Size() const
Valeur de la quatrième dimension.
DataType & operator()(Int32 i)
Positionne la valeur pour l'élément i.
NumArray(Int32 dim1_size, Int32 dim2_size, Int32 dim3_size)
Construit un tableau avec 3 valeurs dynamiques.
void swap(ThatClass &rhs)
Échange les données avec rhs.
void copy(const ThatClass &rhs)
Copie dans l'instance les valeurs de rhs.
Span< DataType > to1DSpan()
Vue 1D sur l'instance.
static constexpr int rank()
Nombre de dimensions du tableau.
DataType operator()(Int32 i, Int32 j) const
Valeur pour l'élément i,j.
NumArray(Int32 dim1_size, Int32 dim2_size)
Construit un tableau avec 2 valeurs dynamiques.
void fill(const DataType &v, const RunQueue *queue)
Remplit les éléments de l'instance la valeur v en utilisant la file queue.
void copy(SmallSpan< const DataType > rhs)
Copie dans l'instance les valeurs de rhs.
constexpr Int32 dim3Size() const
Valeur de la troisième dimension.
NumArray(eMemoryRessource r)
Créé un tableau vide utilisant la ressource mémoire r.
MDSpanType mdspan()
Vue multi-dimension sur l'instance.
constexpr SmallSpan< DataType > to1DSmallSpan()
Vue 1D sur l'instance (uniquement si rank == 1)
ThatClass & operator=(const ThatClass &rhs)
Opérateur de recopie.
DataType operator()(Int32 i, Int32 j, Int32 k) const
Valeur pour l'élément i,j,k.
DataType & operator()(Int32 i, Int32 j, Int32 k)
Positionne la valeur pour l'élément i,j,k.
NumArray(Int32 dim1_size, std::initializer_list< DataType > alist)
Construit un tableau à partir de valeurs prédéfinies (uniquement tableaux 1D dynamiques)
DataType & operator[](Int32 i)
Récupère une référence pour l'élément i.
void copy(ConstMDSpanType rhs)
Copie dans l'instance les valeurs de rhs.
void resizeDestructive(Int32 dim1_size, Int32 dim2_size, Int32 dim3_size)
Modifie la taille du tableau en ne gardant pas les valeurs actuelles.
void fill(const DataType &v, const RunQueue &queue)
Remplit les éléments de l'instance la valeur v en utilisant la file queue.
String debugName()
Nom de debug (nul si aucun nom spécifié)
Span< const std::byte > bytes() const
Vue constante forme d'octets.
IMemoryAllocator * memoryAllocator() const
Allocateur mémoire associé
DataType & operator()(ArrayBoundsIndexType idx)
Référence modifiable l'élément idx.
void copy(ConstMDSpanType rhs, const RunQueue &queue)
Copie dans l'instance les valeurs de rhs via la file queue.
ConstMDSpanType mdspan() const
Vue constante multi-dimension sur l'instance.
NumArray(Int32 dim1_size, eMemoryRessource r)
Construit un tableau avec 1 valeur dynamique.
constexpr SmallSpan< const DataType > to1DSmallSpan() const
Vue constante 1D sur l'instance (uniquement si rank == 1)
const DataType & operator()(ArrayBoundsIndexType idx) const
Référence constante pour l'élément idx.
NumArray(Int32 dim1_size, Int32 dim2_size, Int32 dim3_size, Int32 dim4_size)
Construit un tableau avec 4 valeurs dynamiques.
void fill(const DataType &v, SmallSpan< const Int32 > indexes, const RunQueue *queue)
Remplit via la file queue, les valeurs du tableau d'indices données par indexes par la valeur v .
void copy(SmallSpan< const DataType > rhs, const RunQueue &queue)
Copie dans l'instance les valeurs de rhs via la file queue.
void copy(ConstMDSpanType rhs, const RunQueue *queue)
Copie dans l'instance les valeurs de rhs via la file queue.
void resize(const DynamicDimsType &dims)
Modifie la taille du tableau en ne gardant pas les valeurs actuelles.
NumArray(Int32 dim1_size, Int32 dim2_size, eMemoryRessource r)
Construit un tableau avec 2 valeurs dynamiques.
void fill(const DataType &v)
Remplit les valeurs du tableau par v.
void fillHost(const DataType &v)
Remplit les valeurs du tableau par v.
constexpr Int32 extent1() const
Valeur de la deuxième dimension.
void resize(Int32 dim1_size, Int32 dim2_size)
Modifie la taille du tableau en ne gardant pas les valeurs actuelles.
static constexpr Int32 nbDimension()
Nombre de dimensions.
void resizeDestructive(const DynamicDimsType &dims)
Modifie la taille du tableau en ne gardant pas les valeurs actuelles.
void resizeDestructive(Int32 dim1_size)
Modifie la taille du tableau en ne gardant pas les valeurs actuelles.
constexpr Int32 dim1Size() const
Valeur de la première dimension.
NumArray(const DynamicDimsType &extents, eMemoryRessource r)
Construit un tableau en spécifiant directement la liste des dimensions.
NumArray()
Construit un tableau vide.
DataType operator()(Int32 i, Int32 j, Int32 k, Int32 l) const
Valeur pour l'élément i,j,k,l.
void fill(const DataType &v, SmallSpan< const Int32 > indexes, const RunQueue &queue)
Remplit via la file queue, les valeurs du tableau d'indices données par indexes par la valeur v .
constexpr Int32 extent3() const
Valeur de la quatrième dimension.
NumArray(Int32 dim1_size, Int32 dim2_size, Int32 dim3_size, Int32 dim4_size, eMemoryRessource r)
Construit un tableau avec 4 valeurs dynamiques.
void copy(SmallSpan< const DataType > rhs, const RunQueue *queue)
Copie dans l'instance les valeurs de rhs via la file queue.
constexpr Int32 dim2Size() const
Valeur de la deuxième dimension.
ConstMDSpanType constSpan() const
NumArray(Int32 dim1_size)
Construit un tableau avec 1 valeur dynamique.
void setDebugName(const String &str)
Positionne le nom du tableau pour les informations de debug.
ConstMDSpanType constMDSpan() const
Vue constante multi-dimension sur l'instance.
void resize(Int32 dim1_size, Int32 dim2_size, Int32 dim3_size, Int32 dim4_size)
Modifie la taille du tableau en ne gardant pas les valeurs actuelles.
constexpr Int32 extent2() const
Valeur de la troisième dimension.
void resize(Int32 dim1_size, Int32 dim2_size, Int32 dim3_size)
Modifie la taille du tableau en ne gardant pas les valeurs actuelles.
NumArray(Int32 dim1_size, Int32 dim2_size, std::initializer_list< DataType > alist)
Construit un tableau à partir de valeurs prédéfinies (tableaux 2D dynamiques).
NumArray(Int32 dim1_size, Int32 dim2_size, Int32 dim3_size, eMemoryRessource r)
Construit un tableau avec 3 valeurs dynamiques.
void copy(const ThatClass &rhs, const RunQueue &queue)
Copie dans l'instance les valeurs de rhs via la file queue.
NumArray(DynamicDimsType extents)
Construit un tableau en spécifiant directement la liste des dimensions.
NumArray(SmallSpan< const DataType > v)
Construit une instance à partir d'une vue (uniquement tableaux 1D dynamiques)
DataType & operator()(Int32 i, Int32 j, Int32 k, Int32 l)
Positionne la valeur pour l'élément i,j,k,l.
ArrayExtents< MDDim1 > extents() const
DataType operator[](Int32 i) const
Valeur pour l'élément i.
NumArray(Span< const DataType > v)
Construit une instance à partir d'une vue (uniquement tableaux 1D dynamiques)
constexpr Int64 totalNbElement() const
Nombre total d'éléments du tableau.
void resize(Int32 dim1_size)
Modifie la taille du tableau en gardant pas les valeurs actuelles.
Vue d'un tableau d'éléments de type T.
Vue d'un tableau d'éléments de type T.
Chaîne de caractères unicode.
constexpr view_type smallView()
Vue constante sur cette vue.
constexpr ConstArrayView< value_type > constSmallView() const
Vue constante sur cette vue.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
Integer arcaneCheckArraySize(unsigned long long size)
Vérifie que size peut être converti dans un 'Integer' pour servir de taille à un tableau....
std::int64_t Int64
Type entier signé sur 64 bits.
Arcane::eMemoryResource eMemoryRessource
Typedef pour la version Arcane historique (avec 2's')
Impl::SpanTypeFromSize< conststd::byte, SizeType >::SpanType asBytes(const SpanImpl< DataType, SizeType, Extent > &s)
Converti la vue en un tableau d'octets non modifiables.
Impl::SpanTypeFromSize< std::byte, SizeType >::SpanType asWritableBytes(const SpanImpl< DataType, SizeType, Extent > &s)
Converti la vue en un tableau d'octets modifiables.
std::int32_t Int32
Type entier signé sur 32 bits.