Arcane  v3.14.10.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
ListImpl.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/* ListImpl.h (C) 2000-2022 */
9/* */
10/* Implémentation de la classe Tableau. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCANE_UTILS_LISTIMPL_H
13#define ARCANE_UTILS_LISTIMPL_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
17#include "arcane/utils/CollectionImpl.h"
18#include "arcane/utils/Enumerator.h"
19#include "arcane/utils/UniqueArray.h"
20
21/*---------------------------------------------------------------------------*/
22/*---------------------------------------------------------------------------*/
23
24namespace Arcane
25{
26
27/*---------------------------------------------------------------------------*/
28/*---------------------------------------------------------------------------*/
29
30extern "C" ARCANE_UTILS_EXPORT void throwOutOfRangeException();
31extern "C" ARCANE_UTILS_EXPORT void throwNullReference();
32
33/*---------------------------------------------------------------------------*/
34/*---------------------------------------------------------------------------*/
35/*!
36 * \internal
37 * \brief Tableau avec allocateur virtuel.
38 *
39 * C'est à la classe virtuelle de détruire les objets dans le
40 * destructeur virtuel.
41 */
42template <class T>
44: public CollectionImplT<T>
45{
46 public:
47
48 typedef CollectionImplT<T> BaseClass;
49
50 public:
51
52 typedef const T& ObjectRef;
53
54 //! Type des éléments du tableau
55 typedef T value_type;
56 //! Type de l'itérateur sur un élément du tableau
58 //! Type de l'itérateur constant sur un élément du tableau
59 typedef const value_type* const_iterator;
60 //! Type pointeur d'un élément du tableau
62 //! Type pointeur constant d'un élément du tableau
63 typedef const value_type* const_pointer;
64 //! Type référence d'un élément du tableau
66 //! Type référence constante d'un élément du tableau
68
69 //! Type d'un itérateur sur tout le tableau
71 //! Type d'un itérateur constant sur tout le tableau
73
74 public:
75
76 //! Construit un tableau vide.
77 ListImplBase() = default;
78
79 public:
80
81 //! Recopie le tableau \a s.
82 void assign(const ListImplBase<T>& s)
83 {
84 _arrayCopy(s);
85 }
86 //! Recopie le tableau \a s.
88 {
89 _arrayCopy(s);
90 }
91 //! Recopie le tableau \a s.
92 void assign(const ArrayView<T>& s)
93 {
94 _arrayCopy(s);
95 }
96
97 public:
98
99 /*!
100 * \brief i-ème élément du tableau.
101 *
102 * En mode \a check, vérifie les débordements.
103 */
104 T& operator[](Integer i)
105 {
106 return m_array[i];
107 }
108
109 /*!
110 * \brief i-ème élément du tableau.
111 *
112 * En mode \a check, vérifie les débordements.
113 */
114 const T& operator[](Integer i) const
115 {
116 return m_array[i];
117 }
118
119 //! Retourne un iterateur sur le premier élément du tableau
120 iterator begin() override
121 {
122 return m_array.data();
123 }
124 //! Retourne un iterateur sur le premier élément après la fin du tableau
125 iterator end() override
126 {
127 return m_array.data() + this->count();
128 }
129 //! Retourne un iterateur constant sur le premier élément du tableau
130 const_iterator begin() const override
131 {
132 return m_array.data();
133 }
134 //! Retourne un iterateur constant sur le premier élément après la fin du tableau
135 const_iterator end() const override
136 {
137 return m_array.data() + this->count();
138 }
139
140 //! Retourne un iterateur sur le premier élément du tableau
141 T* begin2() const override
142 {
143 return const_cast<T*>(m_array.data());
144 }
145
146 //! Retourne un iterateur sur le premier élément après la fin du tableau
147 T* end2() const override
148 {
149 return begin2() + this->count();
150 }
151
152 public:
153
154 //! Applique le fonctor \a f à tous les éléments du tableau
155 template <class Function> Function
156 each(Function f)
157 {
158 std::for_each(begin(), end(), f);
159 return f;
160 }
161
162 public:
163
164 /*! \brief Signale qu'il faut réserver de la mémoire pour \a new_capacity éléments
165 * Il s'agit juste d'une indication. La classe dérivée est libre de ne
166 * pas en tenir compte.
167 */
168 void reserve(Integer new_capacity)
169 {
170 m_array.reserve(new_capacity);
171 }
172
173 /*!
174 * \brief Retourne le nombre d'éléments alloués du tableau.
175 *
176 * Il s'agit juste d'une indication. La classe dérivée est libre de ne
177 * pas en tenir compte.
178 */
179 Integer capacity() const
180 {
181 return m_array.capacity();
182 }
183
184 void clear() override
185 {
186 this->onClear();
187 m_array.clear();
188 this->_setCount(0);
189 this->onClearComplete();
190 }
191
192 //! Ajoute l'élément \a elem à la fin du tableau
193 void add(ObjectRef elem) override
194 {
195 this->onInsert();
196 Integer s = this->count();
197 m_array.add(elem);
198 this->_setCount(s + 1);
199 this->onInsertComplete(_ptr() + s, s);
200 }
201
202 bool remove(ObjectRef element) override
203 {
204 Integer i = 0;
205 Integer s = this->count();
206 for (; i < s; ++i)
207 if (m_array[i] == element) {
208 _removeAt(i);
209 return true;
210 }
211 throwOutOfRangeException();
212 return false;
213 }
214
215 void removeAt(Integer index) override
216 {
217 Integer s = this->count();
218 if (index >= s)
219 throwOutOfRangeException();
220 _removeAt(index);
221 }
222
223 const_iterator find(ObjectRef element) const
224 {
225 Integer s = this->count();
226 for (Int32 i = 0; i < s; ++i)
227 if (m_array[i] == element)
228 return begin() + i;
229 return end();
230 }
231
232 bool contains(ObjectRef element) const override
233 {
234 const_iterator i = find(element);
235 return (i != end());
236 }
237
238 EnumeratorImplBase* enumerator() const override;
239
240 protected:
241
242 void _removeAt(Integer index)
243 {
244 Integer s = this->count();
245 T* ptr = _ptr();
246 T* remove_ob = ptr + index;
247 this->onRemove();
248 m_array.remove(index);
249 this->_setCount(s - 1);
250 // TODO: supprimer utilisation de 'remove_ob' car ce n'est pas le bon objet
251 this->onRemoveComplete(remove_ob, index);
252 }
253
254 public:
255
256 /*!\brief Modifie la taille du tableau.
257 * \a new_size est le nouveau nombre d'éléments du tableau.
258 */
259 void resize(Integer new_size)
260 {
261 m_array.resize(new_size);
262 this->_setCount(new_size);
263 }
264
265 protected:
266
267 Integer _capacity() const
268 {
269 return m_array.capacity();
270 }
271
272 protected:
273
274 void _arrayCopy(const ListImplBase<T>& array)
275 {
276 _arrayCopy(array.begin2(), array.count());
277 }
278 void _arrayCopy(const ConstArrayView<T>& array)
279 {
280 _arrayCopy(array.data(), array.size());
281 }
282 void _arrayCopy(const ArrayView<T>& array)
283 {
284 _arrayCopy(array.data(), array.size());
285 }
286 void _arrayCopy(const T* from_ptr, Integer from_size)
287 {
288 if (from_size == 0) {
289 clear();
290 return;
291 }
292 m_array.copy(ConstArrayView<T>(from_size, from_ptr));
293 this->_setCount(from_size);
294 }
295
296 protected:
297
298 /*!
299 * \brief Retourne un pointeur sur le tableau
300 *
301 * \warning Il est préférable de ne pas utiliser cette méthode pour
302 * accéder à un élément du tableau car
303 * ce pointeur peut être invalidé par un redimensionnement du tableau.
304 * De plus, accéder aux éléments du tableau par ce pointeur ne permet
305 * aucune vérification de dépassement, même en mode DEBUG.
306 */
307 inline T* _ptr()
308 {
309 return m_array.data();
310 }
311
312 inline const T* _ptr() const
313 {
314 return m_array.data();
315 }
316
317 private:
318
319 UniqueArray<T> m_array;
320
321 private:
322};
323
324/*---------------------------------------------------------------------------*/
325/*---------------------------------------------------------------------------*/
326
327/*!
328 * \internal
329 */
330template <class T>
332: public ListImplBase<T>
333{
334 public:
335
336 typedef ListImplBase<T> BaseClass;
337
338 public:
339
340 ListImplT() {}
341 explicit ListImplT(const ConstArrayView<T>& array)
342 {
343 this->_arrayCopy(array);
344 }
345 explicit ListImplT(const ArrayView<T>& array)
346 {
347 this->_arrayCopy(array);
348 }
349 ListImplT(const ListImplT<T>& array)
350 : BaseClass()
351 {
352 this->_arrayCopy(array);
353 }
354 explicit ListImplT(const Collection<T>& array)
355 : BaseClass()
356 {
357 for (typename Collection<T>::Enumerator i(array); ++i;) {
358 BaseClass::add(*i);
359 }
360 }
361 explicit ListImplT(const EnumeratorT<T>& enumerator)
362 : BaseClass()
363 {
364 for (EnumeratorT<T> i(enumerator); ++i;) {
365 BaseClass::add(*i);
366 }
367 }
368
369 void assign(const Collection<T>& array)
370 {
371 this->clear();
372 for (typename Collection<T>::Enumerator i(array); ++i;) {
373 this->add(*i);
374 }
375 }
376 void assign(const EnumeratorT<T>& enumerator)
377 {
378 this->clear();
379 for (EnumeratorT<T> i(enumerator); ++i;) {
380 this->add(*i);
381 }
382 }
383
384 private:
385};
386
387/*---------------------------------------------------------------------------*/
388/*---------------------------------------------------------------------------*/
389
390/*!
391 * \internal
392 */
393template <class T>
395: public EnumeratorImplBase
396{
397 public:
398
399 typedef T* Ptr;
400
401 public:
402
403 ListEnumeratorImplT(Ptr begin, Ptr end)
404 : m_begin(begin)
405 , m_current(begin - 1)
406 , m_end(end)
407 {}
408
409 public:
410
411 void reset() override { m_current = m_begin - 1; }
412 bool moveNext() override
413 {
414 ++m_current;
415 return m_current < m_end;
416 }
417 void* current() override { return m_current; }
418 const void* current() const override { return m_current; }
419
420 private:
421
422 Ptr m_begin;
423 Ptr m_current;
424 Ptr m_end;
425};
426
427/*---------------------------------------------------------------------------*/
428/*---------------------------------------------------------------------------*/
429
431enumerator() const
432{
433 return new ListEnumeratorImplT<T>(begin2(), end2());
434}
435
436/*---------------------------------------------------------------------------*/
437/*---------------------------------------------------------------------------*/
438
439} // namespace Arcane
440
441/*---------------------------------------------------------------------------*/
442/*---------------------------------------------------------------------------*/
443
444#endif
virtual void onRemove()
Evènement envoyé avant de supprimer un élément.
Integer count() const
Retourne le nombre d'éléments de la collection.
virtual void onInsert()
Evènement envoyé avant d'insérer un élément.
virtual void onClear()
Evènement envoyé avant de supprimer tous les éléments.
virtual void onRemoveComplete(void *object, Integer position)
Evènement envoyé après supression d'un élément.
virtual void onInsertComplete(void *object, Integer position)
Evènement envoyé après insertion d'un élément.
virtual void onClearComplete()
Evènement envoyé lorsque tous les éléments ont été supprimés.
Classe de base d'une collection fortement typée.
Definition Collection.h:115
EnumeratorT< T > Enumerator
Type d'un itérateur sur toute la collection.
Definition Collection.h:129
Enumérateur typé.
Definition Enumerator.h:136
void * current() override
Objet courant de l'énumérateur.
Definition ListImpl.h:417
const void * current() const override
Objet courant de l'énumérateur.
Definition ListImpl.h:418
bool moveNext() override
Avance l'énumérateur sur l'élément suivant de la collection.
Definition ListImpl.h:412
void reset() override
Remet à zéro l'énumérateur.
Definition ListImpl.h:411
value_type & reference
Type référence d'un élément du tableau.
Definition ListImpl.h:65
const value_type * const_iterator
Type de l'itérateur constant sur un élément du tableau.
Definition ListImpl.h:59
void reserve(Integer new_capacity)
Signale qu'il faut réserver de la mémoire pour new_capacity éléments Il s'agit juste d'une indication...
Definition ListImpl.h:168
value_type * iterator
Type de l'itérateur sur un élément du tableau.
Definition ListImpl.h:57
T value_type
Type des éléments du tableau.
Definition ListImpl.h:55
const value_type * const_pointer
Type pointeur constant d'un élément du tableau.
Definition ListImpl.h:63
T & operator[](Integer i)
i-ème élément du tableau.
Definition ListImpl.h:104
const T & operator[](Integer i) const
i-ème élément du tableau.
Definition ListImpl.h:114
void clear() override
Supprime tous les éléments de la collection.
Definition ListImpl.h:184
ConstIterT< ListImplBase< T > > const_iter
Type d'un itérateur constant sur tout le tableau.
Definition ListImpl.h:72
iterator begin() override
Retourne un iterateur sur le premier élément du tableau.
Definition ListImpl.h:120
iterator end() override
Retourne un iterateur sur le premier élément après la fin du tableau.
Definition ListImpl.h:125
Integer capacity() const
Retourne le nombre d'éléments alloués du tableau.
Definition ListImpl.h:179
void assign(const ListImplBase< T > &s)
Recopie le tableau s.
Definition ListImpl.h:82
void add(ObjectRef elem) override
Ajoute l'élément elem à la fin du tableau.
Definition ListImpl.h:193
void resize(Integer new_size)
Modifie la taille du tableau. new_size est le nouveau nombre d'éléments du tableau.
Definition ListImpl.h:259
const_iterator end() const override
Retourne un iterateur constant sur le premier élément après la fin du tableau.
Definition ListImpl.h:135
T * _ptr()
Retourne un pointeur sur le tableau.
Definition ListImpl.h:307
T * begin2() const override
Retourne un iterateur sur le premier élément du tableau.
Definition ListImpl.h:141
void assign(const ArrayView< T > &s)
Recopie le tableau s.
Definition ListImpl.h:92
const value_type & const_reference
Type référence constante d'un élément du tableau.
Definition ListImpl.h:67
value_type * pointer
Type pointeur d'un élément du tableau.
Definition ListImpl.h:61
IterT< ListImplBase< T > > iter
Type d'un itérateur sur tout le tableau.
Definition ListImpl.h:70
const_iterator begin() const override
Retourne un iterateur constant sur le premier élément du tableau.
Definition ListImpl.h:130
Function each(Function f)
Applique le fonctor f à tous les éléments du tableau.
Definition ListImpl.h:156
EnumeratorImplBase * enumerator() const override
Retourne un énumérateur générique sur la collection.
Definition ListImpl.h:431
ListImplBase()=default
Construit un tableau vide.
T * end2() const override
Retourne un iterateur sur le premier élément après la fin du tableau.
Definition ListImpl.h:147
void assign(const ConstArrayView< T > &s)
Recopie le tableau s.
Definition ListImpl.h:87
Vue modifiable d'un tableau d'un type T.
Vue constante d'un tableau de type T.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
Int32 Integer
Type représentant un entier.