Arcane  v3.14.10.0
Documentation développeur
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/*---------------------------------------------------------------------------*/
42template <class T>
44: public CollectionImplT<T>
45{
46 public:
47
49
50 public:
51
52 typedef const T& ObjectRef;
53
55 typedef T value_type;
59 typedef const value_type* const_iterator;
63 typedef const value_type* const_pointer;
68
73
74 public:
75
77 ListImplBase() = default;
78
79 public:
80
82 void assign(const ListImplBase<T>& s)
83 {
84 _arrayCopy(s);
85 }
88 {
89 _arrayCopy(s);
90 }
92 void assign(const ArrayView<T>& s)
93 {
94 _arrayCopy(s);
95 }
96
97 public:
98
104 T& operator[](Integer i)
105 {
106 return m_array[i];
107 }
108
114 const T& operator[](Integer i) const
115 {
116 return m_array[i];
117 }
118
120 iterator begin() override
121 {
122 return m_array.data();
123 }
125 iterator end() override
126 {
127 return m_array.data() + this->count();
128 }
130 const_iterator begin() const override
131 {
132 return m_array.data();
133 }
135 const_iterator end() const override
136 {
137 return m_array.data() + this->count();
138 }
139
141 T* begin2() const override
142 {
143 return const_cast<T*>(m_array.data());
144 }
145
147 T* end2() const override
148 {
149 return begin2() + this->count();
150 }
151
152 public:
153
155 template <class Function> Function
157 {
158 std::for_each(begin(), end(), f);
159 return f;
160 }
161
162 public:
163
168 void reserve(Integer new_capacity)
169 {
170 m_array.reserve(new_capacity);
171 }
172
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
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
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
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
330template <class T>
332: public ListImplBase<T>
333{
334 public:
335
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
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'implémentation d'une collection typée.
Interface d'un énumérateur.
Definition Enumerator.h:42
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Definition Lima.cc:120
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
Tableau avec allocateur virtuel.
Definition ListImpl.h:45
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
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
Int32 Integer
Type représentant un entier.