12#ifndef ARCANE_UTILS_MULTIARRAY2_H
13#define ARCANE_UTILS_MULTIARRAY2_H
17#include "arcane/utils/Array.h"
18#include "arcane/utils/MultiArray2View.h"
59template <
typename DataType>
64 using ConstReferenceType =
typename UniqueArray<DataType>::ConstReferenceType;
65 using ThatClass = MultiArray2<DataType>;
69 MultiArray2() =
default;
78 MultiArray2(
const ThatClass& rhs) =
delete;
79 ThatClass& operator=(
const ThatClass& rhs) =
delete;
89 : m_buffer(do_clone ? rhs.m_buffer.clone() : rhs.m_buffer)
90 , m_indexes(do_clone ? rhs.m_indexes.clone() : rhs.m_indexes)
91 , m_sizes(do_clone ? rhs.m_sizes.clone() : rhs.m_sizes)
95 : m_buffer(aview.m_buffer)
96 , m_indexes(aview.m_indexes)
97 , m_sizes(aview.m_sizes)
100 explicit MultiArray2(
const MemoryAllocationOptions& allocation_options)
101 : m_buffer(allocation_options)
102 , m_indexes(allocation_options)
103 , m_sizes(allocation_options)
106 MultiArray2(
const MemoryAllocationOptions& allocation_options, ConstArrayView<Int32> sizes)
107 : MultiArray2(allocation_options)
114 ArrayView<DataType> operator[](
Integer i)
116 return ArrayView<DataType>(m_sizes[i], m_buffer.data() + (m_indexes[i]));
118 ConstArrayView<DataType> operator[](
Integer i)
const
120 return ConstArrayView<DataType>(m_sizes[i], m_buffer.data() + (m_indexes[i]));
142 return m_buffer[m_indexes[i] + j];
146 return m_buffer[m_indexes[i] + j];
150 return m_buffer.
setAt(m_indexes[i] + j, v);
188 return { m_buffer.smallSpan(), m_indexes, m_sizes };
194 return { m_buffer, m_indexes, m_sizes };
200 return { m_buffer.constSmallSpan(), m_indexes, m_sizes };
206 return m_buffer.view();
212 return m_buffer.constView();
218 if (new_sizes.
empty()) {
234 void _resize(ConstArrayView<Int32> ar)
240 for (
Integer i = 0; i < size1; ++i)
247 for (
Integer i = 0; i < size1; ++i)
248 if (m_sizes[i] != ar[i]) {
256 Integer old_size1 = m_indexes.size();
258 SharedArray<DataType> new_buffer(m_buffer.allocationOptions(), total_size);
261 if (old_size1 > size1)
264 for (
Integer i = 0; i < old_size1; ++i) {
266 Integer old_size2 = m_sizes[i];
267 if (old_size2 > size2)
269 ConstArrayView<DataType> cav(_value(i));
270 for (
Integer j = 0; j < old_size2; ++j)
271 new_buffer[index + j] = cav[j];
274 m_buffer = new_buffer;
276 m_indexes.resize(size1);
277 m_sizes.resize(size1);
278 for (
Integer i2 = 0, index2 = 0; i2 < size1; ++i2) {
280 m_indexes[i2] = index2;
288 void _copy(
const MultiArray2<DataType>& rhs,
bool do_clone)
290 m_buffer = do_clone ? rhs.m_buffer.clone() : rhs.m_buffer;
291 m_indexes = do_clone ? rhs.m_indexes.clone() : rhs.m_indexes;
292 m_sizes = do_clone ? rhs.m_sizes.clone() : rhs.m_sizes;
294 void _copy(ConstMultiArray2View<DataType> aview)
296 m_buffer = aview.m_buffer;
297 m_indexes = aview.m_indexes;
298 m_sizes = aview.m_sizes;
304 SharedArray<DataType> m_buffer;
306 SharedArray<Int32> m_indexes;
308 SharedArray<Int32> m_sizes;
317template <
typename DataType>
318class SharedMultiArray2
319:
public MultiArray2<DataType>
323 using ThatClass = SharedMultiArray2<DataType>;
327 SharedMultiArray2() =
default;
329 : MultiArray2<DataType>(sizes)
332 : MultiArray2<DataType>(
view)
334 SharedMultiArray2(
const SharedMultiArray2<DataType>& rhs)
335 : MultiArray2<DataType>(rhs,
false)
341 ThatClass& operator=(
const ThatClass& rhs)
344 this->_copy(rhs,
false);
352 void operator=(
const MultiArray2<DataType>& rhs) =
delete;
357 SharedMultiArray2<DataType>
clone()
const
359 return SharedMultiArray2<DataType>(this->
constView());
372template <
typename DataType>
373class UniqueMultiArray2
374:
public MultiArray2<DataType>
378 using ThatClass = UniqueMultiArray2<DataType>;
382 UniqueMultiArray2() =
default;
384 : MultiArray2<DataType>(sizes)
390 : MultiArray2<DataType>(allocation_options)
394 : MultiArray2<DataType>(allocation_options, sizes)
397 : MultiArray2<DataType>(
view)
400 : MultiArray2<DataType>(rhs,
true)
402 UniqueMultiArray2(
const UniqueMultiArray2<DataType>& rhs)
403 : MultiArray2<DataType>(rhs,
true)
410 this->_copy(rhs,
true);
419 ThatClass& operator=(
const UniqueMultiArray2<DataType>& rhs)
422 this->_copy(rhs,
true);
425 ThatClass& operator=(
const MultiArray2<DataType>& rhs) =
delete;
430 UniqueMultiArray2<DataType>
clone()
const
432 return UniqueMultiArray2<DataType>(this->
constView());
439template <
typename DataType> SharedMultiArray2<DataType>::
440SharedMultiArray2(
const UniqueMultiArray2<DataType>& rhs)
441: MultiArray2<DataType>(rhs, true)
450 this->_copy(rhs,
true);
Integer size() const
Nombre d'éléments du vecteur.
Vue modifiable d'un tableau d'un type T.
const T * data() const
Accès à la racine du tableau hors toute protection.
void setAt(Int64 i, ConstReferenceType value)
Positionne l'élément d'indice i. Vérifie toujours les débordements.
Vue constante d'un tableau de type T.
constexpr bool empty() const noexcept
true si le tableau est vide (size()==0)
Vue constante sur un MultiArray2.
Interface d'un allocateur pour la mémoire.
Options pour configurer les allocations.
Vue modifiable sur un MultiArray2.
Classe de base des tableau 2D à taille multiple.
void clear()
Supprime les éléments du tableau.
void resize(ConstArrayView< Int32 > new_sizes)
Retaille le tableau avec comme nouvelles tailles new_sizes.
MultiArray2(const MultiArray2< DataType > &rhs, bool do_clone)
Constructeur de recopie. Méthode temporaire à supprimer une fois le constructeur et opérateur de reco...
void fill(const DataType &v)
Remplit les éléments du tableau avec la valeur v.
MultiArray2View< DataType > view()
Vue modifiable du tableau.
JaggedSmallSpan< const DataType > constSpan() const
Vue constante du tableau.
ConstArrayView< Int32 > dim2Sizes() const
Tableau du nombre d'éléments suivant la deuxième dimension.
JaggedSmallSpan< const DataType > span() const
Vue constante du tableau.
JaggedSmallSpan< DataType > span()
Vue modifiable du tableau.
ConstMultiArray2View< DataType > constView() const
Vue constante du tableau.
Int32 totalNbElement() const
Nombre total d'éléments.
Int32 dim1Size() const
Nombre d'éléments suivant la première dimension.
ConstArrayView< DataType > viewAsArray() const
Vue du tableau sous forme de tableau 1D.
ArrayView< DataType > viewAsArray()
Vue du tableau sous forme de tableau 1D.
Tableau 2D à taille multiple avec sémantique par référence.
SharedMultiArray2< DataType > clone() const
Clone le tableau.
Tableau 2D à taille multiple avec sémantique par valeur.
UniqueMultiArray2< DataType > clone() const
Clone le tableau.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
Int32 Integer
Type représentant un entier.
std::int32_t Int32
Type entier signé sur 32 bits.