Arcane  v3.14.10.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
CollectionImpl.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/* CollectionImpl.h (C) 2000-2022 */
9/* */
10/* Implémentation de la classe de base d'une collection. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCANE_UTILS_COLLECTIONIMPL_H
13#define ARCANE_UTILS_COLLECTIONIMPL_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
17#include "arcane/utils/ObjectImpl.h"
18#include "arcane/utils/Iostream.h"
19#include "arcane/utils/Event.h"
20
21#include <algorithm>
22
23/*---------------------------------------------------------------------------*/
24/*---------------------------------------------------------------------------*/
25
26namespace Arcane
27{
28
29/*---------------------------------------------------------------------------*/
30/*---------------------------------------------------------------------------*/
31
32class EnumeratorImplBase;
33
34extern "C" ARCANE_UTILS_EXPORT void throwOutOfRangeException();
35extern "C" ARCANE_UTILS_EXPORT void throwNullReference();
36
37/*---------------------------------------------------------------------------*/
38/*---------------------------------------------------------------------------*/
39/*!
40 * \internal
41 * \brief Arguments d'un évènement envoyé par une collection.
42 *
43 * \ingroup Collection
44 *
45 * Une collection peut envoyé 4 types d'évènements, indiqué par le champs
46 * \a m_action:
47 * \arg Clear lorsque tous les éléments de la liste sont supprimés
48 * \arg Insert lorsqu'un élément de la liste est ajouté.
49 * \arg Remove lorsqu'un élément de la liste est supprimé.
50 * \arg Set
51 *
52 */
54{
55 public:
56
57 enum eAction
58 {
59 ClearComplete,
60 InsertComplete,
61 RemoveComplete,
62 SetComplete
63 };
64
65 public:
66
67 CollectionEventArgs(eAction aaction, void* aobject, Integer aposition)
68 : m_action(aaction)
69 , m_object(aobject)
70 , m_position(aposition)
71 {}
72
73 public:
74
75 eAction action() const { return m_action; }
76 void* object() const { return m_object; }
77 Integer position() const { return m_position; }
78
79 private:
80
81 eAction m_action;
82 void* m_object;
83 Integer m_position;
84};
85
86/*---------------------------------------------------------------------------*/
87/*---------------------------------------------------------------------------*/
88/*!
89 * \brief Evènements envoyés par une Collection
90 * \relates Collection
91 */
92typedef EventObservable<const CollectionEventArgs&> CollectionChangeEventHandler;
93
94/*---------------------------------------------------------------------------*/
95/*---------------------------------------------------------------------------*/
96/*!
97 * \internal
98 * \brief classe de base d'implémentation d'une collection.
99 *
100 * Une collection est un objet contenant des éléments (i.e. un conteneur).
101 *
102 * Il est possible de parcourir les éléments d'une collection au moyen
103 * d'un énumerateur obtenu par enumerator(). L'énumérateur ainsi obtenu
104 * est générique quel que soit le type de la collection. Il est par
105 * conséquent moins performant qu'un énumérateur dédié à un type et il
106 * vaut mieux utiliser ce dernier si cela est possible.
107 *
108 * Une collection génère des événements lorsque des éléments sont supprimés,
109 * insérés ou modifiés. Il est possible d'enregistrer un handler pour
110 * obtenir ces évènements avec change().
111 *
112 * Les opérations constantes sont threadsafe.
113 *
114 * Cette classe est destinée à être dérivée pour chaque implémentation
115 * d'une collection.
116 *
117 * \sa EnumeratorImpl
118 */
120: public ObjectImpl
121{
122 public:
123
124 //! Type indexant le tableau
125 typedef Integer size_type;
126 //! Type d'une distance entre itérateur éléments du tableau
127 typedef ptrdiff_t difference_type;
128
129 public:
130
131 //! Construit une collection vide
133 //! Construit une collection avec \a acount éléments
134 explicit CollectionImplBase(Integer acount)
135 : m_count(acount)
136 {}
137 /*!\brief Opérateur de recopie.
138 * les handlers d'évènements ne sont pas recopiés. */
140
141 public:
142
143 //! Retourne le nombre d'éléments de la collection
144 Integer count() const { return m_count; }
145 //! Supprime tous les éléments de la collection
146 virtual void clear() = 0;
147
148 public:
149
150 //! Evènement envoyé avant de supprimer tous les éléments
151 virtual void onClear() {}
152 //! Evènement envoyé lorsque tous les éléments ont été supprimés
153 virtual void onClearComplete()
154 {
155 _sendEvent(CollectionEventArgs::ClearComplete, 0, 0);
156 }
157 //! Evènement envoyé avant d'insérer un élément
158 virtual void onInsert() {}
159 //! Evènement envoyé après insertion d'un élément
160 virtual void onInsertComplete(void* object, Integer position)
161 {
162 _sendEvent(CollectionEventArgs::InsertComplete, object, position);
163 }
164 //! Evènement envoyé avant de supprimer un élément
165 virtual void onRemove() {}
166 //! Evènement envoyé après supression d'un élément
167 virtual void onRemoveComplete(void* object, Integer position)
168 {
169 _sendEvent(CollectionEventArgs::RemoveComplete, object, position);
170 }
171 virtual void onSet() {}
172 virtual void onSetComplete(void* object, Integer position)
173 {
174 _sendEvent(CollectionEventArgs::SetComplete, object, position);
175 }
176 virtual void onValidate() {}
177
178 public:
179
180 //! Retourne un énumérateur générique sur la collection.
181 virtual EnumeratorImplBase* enumerator() const = 0;
182
183 public:
184
185 CollectionChangeEventHandler& change() { return m_collection_handlers; }
186
187 protected:
188
189 void _setCount(Integer acount) { m_count = acount; }
190
191 private:
192
193 Integer m_count = 0;
194 CollectionChangeEventHandler m_collection_handlers;
195
196 private:
197
198 void _sendEvent(CollectionEventArgs::eAction action, void* object, Integer position)
199 {
200 CollectionEventArgs args(action, object, position);
201 m_collection_handlers.notify(args);
202 }
203};
204
205/*---------------------------------------------------------------------------*/
206/*---------------------------------------------------------------------------*/
207
208/*---------------------------------------------------------------------------*/
209/*---------------------------------------------------------------------------*/
210/*!
211 * \internal
212 * \brief classe de base d'implémentation d'une collection typée.
213 */
214template <class T>
216: public CollectionImplBase
217{
218 public:
219
220 typedef const T& ObjectRef;
221 typedef T* ObjectIterator;
222 typedef const T* ConstObjectIterator;
223
224 public:
225
228 {}
229 virtual ~CollectionImplT() {}
230
231 public:
232
233 virtual ObjectIterator begin() = 0;
234 virtual const T* begin() const = 0;
235 virtual ObjectIterator end() = 0;
236 virtual const T* end() const = 0;
237
238 virtual T* begin2() const = 0;
239 virtual T* end2() const = 0;
240
241 public:
242
243 //! Applique le fonctor \a f à tous les éléments de la collection
244 template <class Function> Function
245 each(Function f)
246 {
247 std::for_each(begin(), end(), f);
248 return f;
249 }
250
251 public:
252
253 virtual void add(ObjectRef value) = 0;
254 virtual bool remove(ObjectRef value) = 0;
255 virtual void removeAt(Integer index) = 0;
256 virtual bool contains(ObjectRef value) const = 0;
257};
258
259/*---------------------------------------------------------------------------*/
260/*---------------------------------------------------------------------------*/
261
262} // namespace Arcane
263
264/*---------------------------------------------------------------------------*/
265/*---------------------------------------------------------------------------*/
266
267#endif
Fichier contenant les mécanismes de gestion des évènements.
virtual EnumeratorImplBase * enumerator() const =0
Retourne un énumérateur générique sur la collection.
ptrdiff_t difference_type
Type d'une distance entre itérateur éléments du tableau.
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.
Integer size_type
Type indexant le tableau.
virtual void clear()=0
Supprime tous les éléments de la collection.
virtual void onClear()
Evènement envoyé avant de supprimer tous les éléments.
CollectionImplBase(const CollectionImplBase &from)=delete
Opérateur de recopie. les handlers d'évènements ne sont pas recopiés.
virtual void onRemoveComplete(void *object, Integer position)
Evènement envoyé après supression d'un élément.
CollectionImplBase()=default
Construit une collection vide.
virtual void onInsertComplete(void *object, Integer position)
Evènement envoyé après insertion d'un élément.
CollectionImplBase(Integer acount)
Construit une collection avec acount éléments.
virtual void onClearComplete()
Evènement envoyé lorsque tous les éléments ont été supprimés.
Function each(Function f)
Applique le fonctor f à tous les éléments de la collection.
EventObservable< const CollectionEventArgs & > CollectionChangeEventHandler
Evènements envoyés par une Collection.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-