Arcane  4.1.11.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
ItemPairGroupImpl.cc
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/* ItemPairGroupImpl.cc (C) 2000-2021 */
9/* */
10/* Implémentation d'un tableau de listes d'entités. */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13
14#include "arcane/utils/ArcanePrecomp.h"
15
16#include "arcane/utils/Array.h"
17#include "arcane/utils/IFunctor.h"
18
19#include "arcane/ItemGroupObserver.h"
20#include "arcane/ItemPairGroupImpl.h"
21#include "arcane/ItemPairGroup.h"
22#include "arcane/IItemFamily.h"
23#include "arcane/ItemGroup.h"
24#include "arcane/IMesh.h"
25
26/*---------------------------------------------------------------------------*/
27/*---------------------------------------------------------------------------*/
28
29namespace Arcane
30{
31/*---------------------------------------------------------------------------*/
32/*---------------------------------------------------------------------------*/
33/*!
34 * \internal
35 * \brief Classe d'un groupe nul.
36 */
37class ItemPairGroupImplNull
38: public ItemPairGroupImpl
39{
40 public:
41
42 ItemPairGroupImplNull() : ItemPairGroupImpl() {}
43 virtual ~ItemPairGroupImplNull() {} //!< Libère les ressources
44
45 public:
46 private:
47};
48
49/*---------------------------------------------------------------------------*/
50/*---------------------------------------------------------------------------*/
51/*!
52 * \internal
53 */
54class ItemPairGroupImplPrivate
55{
56 public:
57
58 ItemPairGroupImplPrivate();
59 ItemPairGroupImplPrivate(const ItemGroup& group,const ItemGroup& sub_group);
60 ~ItemPairGroupImplPrivate();
61
62 public:
63
64 inline bool null() const { return m_is_null; }
65 inline IMesh* mesh() const { return m_mesh; }
66 inline eItemKind kind() const { return m_kind; }
67 inline eItemKind subKind() const { return m_sub_kind; }
68
69 public:
70
71 IMesh* m_mesh; //!< Gestionnare de groupe associé
72 IItemFamily* m_item_family; //!< Famille associée
73 IItemFamily* m_sub_item_family; //!< Famille associée
74 ItemGroup m_item_group;
75 ItemGroup m_sub_item_group;
76 bool m_is_null; //!< \a true si le groupe est nul
77 eItemKind m_kind; //!< Genre de entités du groupe
78 eItemKind m_sub_kind;
79 bool m_need_recompute; //!< Vrai si le groupe doit être recalculé
80
81 UniqueArray<Int64> m_indexes;
82 UniqueArray<Int32> m_sub_items_local_id;
83 IFunctor* m_compute_functor;
84
85 public:
86
87 void invalidate() { m_need_recompute = true; }
88
89 private:
90
91 void _init();
92};
93
94/*---------------------------------------------------------------------------*/
95/*---------------------------------------------------------------------------*/
96
97ItemPairGroupImplPrivate::
98ItemPairGroupImplPrivate()
99: m_mesh(nullptr)
100, m_item_family(nullptr)
101, m_sub_item_family(nullptr)
102, m_is_null(true)
103, m_kind(IK_Unknown)
104, m_sub_kind(IK_Unknown)
105, m_need_recompute(false)
106, m_compute_functor(nullptr)
107{
108 _init();
109}
110
111/*---------------------------------------------------------------------------*/
112/*---------------------------------------------------------------------------*/
113
114ItemPairGroupImplPrivate::
115ItemPairGroupImplPrivate(const ItemGroup& group,const ItemGroup& sub_group)
116: m_mesh(group.mesh())
117, m_item_family(group.itemFamily())
118, m_sub_item_family(sub_group.itemFamily())
119, m_item_group(group)
120, m_sub_item_group(sub_group)
121, m_is_null(false)
122, m_kind(group.itemKind())
123, m_sub_kind(sub_group.itemKind())
124, m_need_recompute(false)
125, m_compute_functor(nullptr)
126{
127 _init();
128}
129
130/*---------------------------------------------------------------------------*/
131/*---------------------------------------------------------------------------*/
132
133ItemPairGroupImplPrivate::
134~ItemPairGroupImplPrivate()
135{
136 delete m_compute_functor;
137}
138
139/*---------------------------------------------------------------------------*/
140/*---------------------------------------------------------------------------*/
141
142void ItemPairGroupImplPrivate::
143_init()
144{
145}
146
147/*---------------------------------------------------------------------------*/
148/*---------------------------------------------------------------------------*/
149
150/*---------------------------------------------------------------------------*/
151/*---------------------------------------------------------------------------*/
152
153ItemPairGroupImpl* ItemPairGroupImpl::shared_null= 0;
154
155/*---------------------------------------------------------------------------*/
156/*---------------------------------------------------------------------------*/
157
158/*---------------------------------------------------------------------------*/
159/*---------------------------------------------------------------------------*/
160
161ItemPairGroupImpl* ItemPairGroupImpl::
162checkSharedNull()
163{
164 if (!shared_null){
165 shared_null = new ItemPairGroupImplNull();
166 shared_null->addRef();
167 }
168 return shared_null;
169}
170
171/*---------------------------------------------------------------------------*/
172/*---------------------------------------------------------------------------*/
173
174ItemPairGroupImpl::
175ItemPairGroupImpl(const ItemGroup& group,const ItemGroup& sub_group)
176: m_p (new ItemPairGroupImplPrivate(group,sub_group))
177{
178 m_p->m_item_group.internal()->attachObserver(this,newItemGroupObserverT(m_p,&ItemPairGroupImplPrivate::invalidate));
179 m_p->m_sub_item_group.internal()->attachObserver(this,newItemGroupObserverT(m_p,&ItemPairGroupImplPrivate::invalidate));
180}
181
182/*---------------------------------------------------------------------------*/
183/*---------------------------------------------------------------------------*/
184
185ItemPairGroupImpl::
186ItemPairGroupImpl()
187: m_p (new ItemPairGroupImplPrivate())
188{
189}
190
191/*---------------------------------------------------------------------------*/
192/*---------------------------------------------------------------------------*/
193
196{
197 m_p->m_item_group.internal()->detachObserver(this);
198 m_p->m_sub_item_group.internal()->detachObserver(this);
199 delete m_p;
200}
201
202/*---------------------------------------------------------------------------*/
203/*---------------------------------------------------------------------------*/
204/*!
205 * \todo a supprimer...
206 */
208deleteMe()
209{
210 delete this;
211}
212
213/*---------------------------------------------------------------------------*/
214/*---------------------------------------------------------------------------*/
215
221
222/*---------------------------------------------------------------------------*/
223/*---------------------------------------------------------------------------*/
224
230
231/*---------------------------------------------------------------------------*/
232/*---------------------------------------------------------------------------*/
233
235mesh() const
236{
237 return m_p->mesh();
238}
239
240/*---------------------------------------------------------------------------*/
241/*---------------------------------------------------------------------------*/
242
244itemFamily() const
245{
246 return m_p->m_item_family;
247}
248
249/*---------------------------------------------------------------------------*/
250/*---------------------------------------------------------------------------*/
251
253subItemFamily() const
254{
255 return m_p->m_sub_item_family;
256}
257
258/*---------------------------------------------------------------------------*/
259/*---------------------------------------------------------------------------*/
260
262null() const
263{
264 return m_p->null();
265}
266
267/*---------------------------------------------------------------------------*/
268/*---------------------------------------------------------------------------*/
269
271itemKind() const
272{
273 return m_p->kind();
274}
275
276/*---------------------------------------------------------------------------*/
277/*---------------------------------------------------------------------------*/
278
280subItemKind() const
281{
282 return m_p->subKind();
283}
284
285/*---------------------------------------------------------------------------*/
286/*---------------------------------------------------------------------------*/
287
289itemGroup() const
290{
291 return m_p->m_item_group;
292}
293
294/*---------------------------------------------------------------------------*/
295/*---------------------------------------------------------------------------*/
296
298subItemGroup() const
299{
300 return m_p->m_sub_item_group;
301}
302
303/*---------------------------------------------------------------------------*/
304/*---------------------------------------------------------------------------*/
305
308{
309}
310
311/*---------------------------------------------------------------------------*/
312/*---------------------------------------------------------------------------*/
313
315invalidate(bool force_recompute)
316{
317 m_p->m_need_recompute = true;
318 if (force_recompute)
320}
321
322/*---------------------------------------------------------------------------*/
323/*---------------------------------------------------------------------------*/
324
327{
328 if (m_p->m_need_recompute){
329 m_p->m_need_recompute = false;
330 if (m_p->m_compute_functor)
331 m_p->m_compute_functor->executeFunctor();
332 return true;
333 }
334 return false;
335}
336
337/*---------------------------------------------------------------------------*/
338/*---------------------------------------------------------------------------*/
339
340Array<Int64>& ItemPairGroupImpl::
341unguardedIndexes() const
342{
343 return m_p->m_indexes;
344}
345
346/*---------------------------------------------------------------------------*/
347/*---------------------------------------------------------------------------*/
348
349Array<Int32>& ItemPairGroupImpl::
350unguardedLocalIds() const
351{
352 return m_p->m_sub_items_local_id;
353}
354
355/*---------------------------------------------------------------------------*/
356/*---------------------------------------------------------------------------*/
357
358ArrayView<Int64> ItemPairGroupImpl::
359indexes()
360{
362 return m_p->m_indexes;
363}
364
365/*---------------------------------------------------------------------------*/
366/*---------------------------------------------------------------------------*/
367
368Span<const Int32> ItemPairGroupImpl::
369subItemsLocalId()
370{
372 return m_p->m_sub_items_local_id;
373}
374
375/*---------------------------------------------------------------------------*/
376/*---------------------------------------------------------------------------*/
377
378void ItemPairGroupImpl::
379setComputeFunctor(IFunctor* functor)
380{
381 delete m_p->m_compute_functor;
382 m_p->m_compute_functor = functor;
383}
384
385/*---------------------------------------------------------------------------*/
386/*---------------------------------------------------------------------------*/
387
388} // End namespace Arcane
389
390/*---------------------------------------------------------------------------*/
391/*---------------------------------------------------------------------------*/
Vue modifiable d'un tableau d'un type T.
Classe de base des vecteurs 1D de données.
Interface d'une famille d'entités.
Definition IItemFamily.h:84
Groupe d'entités de maillage.
Definition ItemGroup.h:49
virtual ~ItemPairGroupImplNull()
Libère les ressources.
eItemKind m_kind
Genre de entités du groupe.
bool m_need_recompute
Vrai si le groupe doit être recalculé
IItemFamily * m_item_family
Famille associée.
IItemFamily * m_sub_item_family
Famille associée.
IMesh * m_mesh
Gestionnare de groupe associé
bool m_is_null
true si le groupe est nul
IMesh * mesh() const
Maillage auquel appartient le groupe (0 pour le groupe nul).
eItemKind subItemKind() const
Genre du groupe. Il s'agit du genre de ses éléments.
const ItemGroup & itemGroup() const
Groupe des entités.
bool checkNeedUpdate()
Réactualise le groupe si nécessaire.
void checkValid()
Vérifie que le groupe est valide.
~ItemPairGroupImpl() override
Libère les ressources.
eItemKind itemKind() const
Genre du groupe. Il s'agit du genre de ses éléments.
IItemFamily * subItemFamily() const
Famille à laquelle appartient le groupe (ou 0 si aucune).
void removeRef() override
Décrémente le compteur de référence.
IItemFamily * itemFamily() const
Famille à laquelle appartient le groupe (ou 0 si aucune).
void addRef() override
Incrémente le compteur de référence.
const ItemGroup & subItemGroup() const
Groupe des sous-entités.
void invalidate(bool force_recompute)
Invalide le groupe.
bool null() const
Retourne true si le groupe est nul.
virtual void deleteMe()=0
Détruit l'objet référencé
void addRef() override
Incrémente le compteur de référence.
void removeRef() override
Décrémente le compteur de référence.
Vue d'un tableau d'éléments de type T.
Definition Span.h:633
Vecteur 1D de données avec sémantique par valeur (style STL).
-- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature --
eItemKind
Genre d'entité de maillage.
@ IK_Unknown
Entité de maillage de genre inconnu ou non initialisé
IItemGroupObserver * newItemGroupObserverT(T *object, typename IItemGroupObserver::FuncTraits< T >::FuncPtr funcptr)
Utilitaire pour création simplifié de ItemGroupObserverT.