Arcane  v3.14.10.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
MultiArray2.h
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2022 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com)
4// See the top-level COPYRIGHT file for details.
5// SPDX-License-Identifier: Apache-2.0
6//-----------------------------------------------------------------------------
7/*---------------------------------------------------------------------------*/
8/* MultiArray2.h (C) 2000-2015 */
9/* */
10/* Tableau 2D à taille multiple. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCANE_UTILS_MULTIARRAY2_H
13#define ARCANE_UTILS_MULTIARRAY2_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
17#include "arcane/utils/Array.h"
18#include "arcane/utils/MultiArray2View.h"
19
20/*---------------------------------------------------------------------------*/
21/*---------------------------------------------------------------------------*/
22
23ARCANE_BEGIN_NAMESPACE
24
25/*---------------------------------------------------------------------------*/
26/*---------------------------------------------------------------------------*/
27/*!
28 * \ingroup Collection
29 * \brief Classe de base des tableau 2D à taille multiple.
30 *
31 * Cette classe gère les tableaux 2D dont le nombre d'éléments de la
32 * deuxième dimension est variable.
33 * Par exemple:
34 * \code
35 * UniqueArray<Int32> sizes(3); // Tableau avec 3 éléments
36 * sizes[0] = 1; sizes[1] = 2; sizes[2] = 4;
37 * // Construit le tableau avec sizes comme tailles
38 * MultiArray2<Int32> v(sizes);
39 * info() << " size=" << v.dim1Size(); // affiche 3
40 * info() << " size[0]=" << v[0].size(); // affiche 1
41 * info() << " size[1]=" << v[1].size(); // affiche 2
42 * info() << " size[2]=" << v[2].size(); // affiche 4
43 * \endcode
44 *
45 * Il est possible de redimensionner (via la méthode resize()) le
46 * tableau tout en conservant ses valeurs mais pour des raisons de performance, ces
47 * redimensionnements se font sur tout le tableau (il n'est pas possible
48 * de redimensionner uniquement pour un seul élément, par exemple v[5].resize(3)).
49 *
50 * Comme pour Array et Array2, les instances de cette classe ne sont
51 * pas copiables ni assignables. Pour obtenir cette fonctionnalité, il faut
52 * utiliser la classe SharedMultiArray2 pour une sémantique par référence
53 * ou UniqueMultiArray2 pour une sémantique par valeur.
54 */
55template<typename DataType>
57{
58 public:
59 typedef typename UniqueArray<DataType>::ConstReferenceType ConstReferenceType;
60 public:
61 MultiArray2() {}
63 {
64 _resize(sizes);
65 }
66 private:
68 void operator=(const MultiArray2<DataType>& rhs);
69 protected:
70 /*!
71 * \brief Constructeur de recopie.
72 * Méthode temporaire à supprimer une fois le constructeur et opérateur de recopie
73 * supprimé.
74 */
75 MultiArray2(const MultiArray2<DataType>& rhs,bool do_clone)
76 : m_buffer(do_clone ? rhs.m_buffer.clone() : rhs.m_buffer),
77 m_indexes(do_clone ? rhs.m_indexes.clone() : rhs.m_indexes),
78 m_sizes(do_clone ? rhs.m_sizes.clone() : rhs.m_sizes)
79 {
80 }
82 : m_buffer(aview.m_buffer), m_indexes(aview.m_indexes), m_sizes(aview.m_sizes)
83 {
84 }
85 public:
86 ArrayView<DataType> operator[](Integer i)
87 {
88 return ArrayView<DataType>(m_sizes[i],m_buffer.data() + (m_indexes[i]));
89 }
90 ConstArrayView<DataType> operator[](Integer i) const
91 {
92 return ConstArrayView<DataType>(m_sizes[i],m_buffer.data()+ (m_indexes[i]));
93 }
94 public:
95 //! Nombre total d'éléments
96 Integer totalNbElement() const { return m_buffer.size(); }
97 //! Supprime les éléments du tableau.
98 void clear()
99 {
100 m_buffer.clear();
101 m_indexes.clear();
102 m_sizes.clear();
103 }
104 //! Clone le tableau
106 {
107 MultiArray2<DataType> new_array;
108 new_array.m_buffer = m_buffer.clone();
109 new_array.m_indexes = m_indexes.clone();
110 new_array.m_sizes = m_sizes.clone();
111 return new_array;
112 }
113 //! Remplit les éléments du tableau avec la valeur \a v
114 void fill(const DataType& v)
115 {
116 m_buffer.fill(v);
117 }
118 DataType& at(Integer i,Integer j)
119 {
120 return m_buffer[m_indexes[i]+j];
121 }
122 void setAt(Integer i,Integer j,ConstReferenceType v)
123 {
124 return m_buffer.setAt(m_indexes[i]+j,v);
125 }
126 public:
127 //! Nombre d'éléments suivant la première dimension
128 Integer dim1Size() const { return m_indexes.size(); }
129
130 //! Tableau du nombre d'éléments suivant la deuxième dimension
131 IntegerConstArrayView dim2Sizes() const { return m_sizes; }
132
133 //! Opérateur de conversion vers une vue modifiable
135 {
136 return view();
137 }
138
139 //! Opérateur de conversion vers une vue constante.
141 {
142 return constView();
143 }
144
145 //! Vue modifiable du tableau
147 {
148 return MultiArray2View<DataType>(m_buffer,m_indexes,m_sizes);
149 }
150
151 //! Vue constante du tableau
153 {
154 return ConstMultiArray2View<DataType>(m_buffer,m_indexes,m_sizes);
155 }
156
157 //! Vue du tableau sous forme de tableau 1D
159 {
160 return m_buffer.view();
161 }
162
163 //! Vue du tableau sous forme de tableau 1D
165 {
166 return m_buffer.constView();
167 }
168
169 //! Retaille le tableau avec comme nouvelles tailles \a new_sizes
171 {
172 if (new_sizes.size()==0){
173 clear();
174 }
175 else
176 _resize(new_sizes);
177 }
178 protected:
179 ConstArrayView<DataType> _value(Integer i) const
180 {
181 return ConstArrayView<DataType>(m_sizes[i],m_buffer.data()+ m_indexes[i]);
182 }
183 protected:
184 void _resize(IntegerConstArrayView ar)
185 {
186 Integer size1 = ar.size();
187 // Calcule le nombre d'éléments total
188 Integer total_size = 0;
189 for( Integer i=0; i<size1; ++i )
190 total_size += ar[i];
191
192 // Si on ne change pas le nombre total d'élément, vérifie
193 // si le resize est nécessaire
194 if (total_size==totalNbElement() && size1==m_indexes.size()){
195 bool is_same = true;
196 for( Integer i=0; i<size1; ++i )
197 if (m_sizes[i]!=ar[i]){
198 is_same = false;
199 break;
200 }
201 if (is_same)
202 return;
203 }
204 //_setTotalNbElement(total_size);
205
206 // Alloue le tampon correspondant.
207 //T* anew_buffer = new T[total_size+1];
208 Integer old_size1 = m_indexes.size();
209
210 SharedArray<DataType> new_buffer(total_size);
211
212 // Recopie dans le nouveau tableau les valeurs de l'ancien.
213 if (old_size1>size1)
214 old_size1 = size1;
215 Integer index = 0;
216 for( Integer i=0; i<old_size1; ++i ){
217 Integer size2 = ar[i];
218 Integer old_size2 = m_sizes[i];
219 if (old_size2>size2)
220 old_size2 = size2;
221 ConstArrayView<DataType> cav(_value(i));
222 for( Integer j=0; j<old_size2; ++j )
223 new_buffer[index+j] = cav[j];
224 index += size2;
225 }
226 m_buffer = new_buffer;
227
228 m_indexes.resize(size1);
229 m_sizes.resize(size1);
230 for( Integer i2=0, index2=0; i2<size1; ++i2 ){
231 Integer size2 = ar[i2];
232 m_indexes[i2] = index2;
233 m_sizes[i2] = size2;
234 index2 += size2;
235 }
236 }
237
238 protected:
239
240 void _copy(const MultiArray2<DataType>& rhs,bool do_clone)
241 {
242 m_buffer = do_clone ? rhs.m_buffer.clone() : rhs.m_buffer;
243 m_indexes = do_clone ? rhs.m_indexes.clone() : rhs.m_indexes;
244 m_sizes = do_clone ? rhs.m_sizes.clone() : rhs.m_sizes;
245 }
246 void _copy(ConstMultiArray2View<DataType> aview)
247 {
248 m_buffer = aview.m_buffer;
249 m_indexes = aview.m_indexes;
250 m_sizes = aview.m_sizes;
251 }
252
253 private:
254 //! Valeurs
255 SharedArray<DataType> m_buffer;
256 //! Tableau des indices dans \a m_buffer du premièr élément de la deuxième dimension
257 SharedArray<Integer> m_indexes;
258 //! Tableau des tailles de la deuxième dimension
259 SharedArray<Integer> m_sizes;
260};
261
262/*---------------------------------------------------------------------------*/
263/*---------------------------------------------------------------------------*/
264/*!
265 * \ingroup Collection
266 * \brief Tableau 2D à taille multiple avec sémantique par référence.
267 */
268template<typename DataType>
270: public MultiArray2<DataType>
271{
272 public:
273
276 : MultiArray2<DataType>(sizes){}
278 : MultiArray2<DataType>(view){}
280 : MultiArray2<DataType>(rhs,false){}
282
283 public:
284
285 void operator=(const SharedMultiArray2<DataType>& rhs)
286 {
287 this->_copy(rhs,false);
288 }
289 void operator=(ConstMultiArray2View<DataType> view)
290 {
291 this->_copy(view);
292 }
293 void operator=(const UniqueMultiArray2<DataType>& rhs);
294
295 public:
296
297 //! Clone le tableau
299 {
300 return SharedMultiArray2<DataType>(this->constView());
301 }
302
303 private:
304
305 void operator=(const MultiArray2<DataType>& rhs);
306};
307
308/*---------------------------------------------------------------------------*/
309/*---------------------------------------------------------------------------*/
310/*!
311 * \ingroup Collection
312 * \brief Tableau 2D à taille multiple avec sémantique par valeur.
313 */
314template<typename DataType>
316: public MultiArray2<DataType>
317{
318 public:
319
322 : MultiArray2<DataType>(sizes){}
324 : MultiArray2<DataType>(view){}
326 : MultiArray2<DataType>(rhs,true){}
328 : MultiArray2<DataType>(rhs,true){}
329
330 public:
331
332 void operator=(const SharedMultiArray2<DataType>& rhs)
333 {
334 this->_copy(rhs,true);
335 }
336 void operator=(ConstMultiArray2View<DataType> view)
337 {
338 this->_copy(view);
339 }
340 void operator=(const UniqueMultiArray2<DataType>& rhs)
341 {
342 this->_copy(rhs,true);
343 }
344
345 public:
346
347 //! Clone le tableau
349 {
350 return UniqueMultiArray2<DataType>(this->constView());
351 }
352
353 private:
354
355 void operator=(const MultiArray2<DataType>& rhs);
356
357 private:
358};
359
360/*---------------------------------------------------------------------------*/
361/*---------------------------------------------------------------------------*/
362
363template<typename DataType> SharedMultiArray2<DataType>::
364SharedMultiArray2(const UniqueMultiArray2<DataType>& rhs)
365: MultiArray2<DataType>(rhs,true){}
366
367/*---------------------------------------------------------------------------*/
368/*---------------------------------------------------------------------------*/
369
370template<typename DataType> void SharedMultiArray2<DataType>::
371operator=(const UniqueMultiArray2<DataType>& rhs)
372{
373 this->_copy(rhs,true);
374}
375
376/*---------------------------------------------------------------------------*/
377/*---------------------------------------------------------------------------*/
378
379ARCANE_END_NAMESPACE
380
381/*---------------------------------------------------------------------------*/
382/*---------------------------------------------------------------------------*/
383
384#endif
Vue constante sur un MultiArray2.
Vue modifiable sur un MultiArray2.
Classe de base des tableau 2D à taille multiple.
Definition MultiArray2.h:57
void clear()
Supprime les éléments du tableau.
Definition MultiArray2.h:98
Integer totalNbElement() const
Nombre total d'éléments.
Definition MultiArray2.h:96
void resize(IntegerConstArrayView 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...
Definition MultiArray2.h:75
void fill(const DataType &v)
Remplit les éléments du tableau avec la valeur v.
MultiArray2View< DataType > view()
Vue modifiable du tableau.
IntegerConstArrayView dim2Sizes() const
Tableau du nombre d'éléments suivant la deuxième dimension.
ConstMultiArray2View< DataType > constView() const
Vue constante du tableau.
Integer dim1Size() const
Nombre d'éléments suivant la première dimension.
MultiArray2< DataType > clone()
Clone le tableau.
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.
Vue modifiable d'un tableau d'un type T.
Vue constante d'un tableau de type T.
constexpr Integer size() const noexcept
Nombre d'éléments du tableau.
SharedArray< T > clone() const
Clone le tableau.
Int32 Integer
Type représentant un entier.