Arcane  v3.14.10.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
AnyItemFamily.h
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2023 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/* AnyItemFamily.h (C) 2000-2023 */
9/* */
10/* Famille d'items de types quelconques. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCANE_ANYITEM_ANYITEMFAMILY_H
13#define ARCANE_ANYITEM_ANYITEMFAMILY_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
17#include <arcane/utils/SharedPtr.h>
18
19#include <set>
20
21/*---------------------------------------------------------------------------*/
22/*---------------------------------------------------------------------------*/
23
24#include "arcane/utils/FatalErrorException.h"
25#include "arcane/anyitem/AnyItemGlobal.h"
26#include "arcane/anyitem/AnyItemPrivate.h"
27#include "arcane/anyitem/AnyItemGroup.h"
28#include "arcane/anyitem/AnyItemFamilyObserver.h"
29#include "arcane/ItemGroupObserver.h"
30
31/*---------------------------------------------------------------------------*/
32/*---------------------------------------------------------------------------*/
33
34namespace Arcane::AnyItem
35{
36
37/*---------------------------------------------------------------------------*/
38/*---------------------------------------------------------------------------*/
39
45{
46private:
47 typedef std::set<IFamilyObserver*> FamilyObservers;
48
49public:
50
53 {
54 clear();
55 }
56
57public:
58
61 {
62 ItemGroup group = builder.group();
63 const Integer size = m_groups.size();
64
65 if (m_groups.findGroupInfo(group.internal()) != NULL)
66 throw FatalErrorException(String::format("Group '{0}' already registered",group.name()));
67
68 m_groups.resize(size+1);
69 Private::GroupIndexInfo & info = m_groups[size];
70 info.group = group.internal();
71 info.group_index = size;
72 info.local_id_offset = m_max_local_id;
74 info.is_partial = builder.isPartial();
75 info.group->attachObserver(this, newItemGroupObserverT(this, &FamilyInternal::_notifyGroupHasChanged));
76 // std::cout << "Attach " << this << " observer on group " << group.name() << "\n";
77
78 // On previent les observeurs
79 _notifyFamilyIsIncreased();
80 return *this;
81 }
82
84 inline bool contains(const ItemGroup& group) const
85 {
86 return (m_groups.findGroupInfo(group.internal()) != NULL);
87 }
88
90 inline bool isPartial(const ItemGroup& group) const
91 {
92 const Private::GroupIndexInfo * info = m_groups.findGroupInfo(group.internal());
93 if (info == NULL)
94 throw Arcane::FatalErrorException(Arcane::String::format("Group '{0}' not registered",group.name()));
95 return info->is_partial;
96 }
97
99 // Ce groupe n'a pas besoin d'observer la famille car il partage les données
100 inline Group allItems() const {
101 return m_groups;
102 }
103
105 inline Integer groupIndex(const ItemGroup& group) const {
106 const Private::GroupIndexInfo * info = m_groups.findGroupInfo(group.internal());
107 if (info == NULL)
108 throw FatalErrorException(String::format("Group '{0}' not registered",group.name()));
109 return info->group_index;
110 }
111
113 inline Integer firstLocalId(const ItemGroup& group) const
114 {
115 const Private::GroupIndexInfo * info = m_groups.findGroupInfo(group.internal());
116 if (!info)
117 ARCANE_FATAL("Group '{0}' not registered",group.name());
118 return info->local_id_offset;
119 }
120
122 template<typename AnyItemT>
123 Item item(const AnyItemT & any_item) const
124 {
125 // NOTE GG: la valeur de group.itemInfoListView() ne change pas au cours
126 // du calcul donc il est possible de la conserver comme champ de la classe.
127 const Integer group_index = any_item.groupIndex();
128 const Private::GroupIndexInfo & info = m_groups[group_index];
129 const ItemGroupImpl & group = *(info.group);
130 Integer index_in_group = any_item.localId() - info.local_id_offset;
131 Item item = group.itemInfoListView()[group.itemsLocalId()[index_in_group]];
132 // ARCANE_ASSERT((!info.is_partial || (item->localId() == any_item.varIndex())),("Inconsistent concrete item"));
133 // ARCANE_ASSERT((item->isOwn() == any_item.m_is_own),("Inconsistent concrete item isOwn"));
134 return item;
135 }
136
138 inline Integer groupSize() const {
139 return m_groups.size();
140 }
141
143
144 inline Integer maxLocalId() const {
145 return m_max_local_id;
146 }
147
149 ItemGroup group(Integer i) const {
150 return ItemGroup(m_groups[i].group);
151 }
152
154 void clear() {
155 for(Integer igrp=0;igrp<m_groups.size();++igrp) {
156 m_groups[igrp].group->detachObserver(this);
157 // std::cout << "Detach " << this << " observer on group " << m_groups[igrp].group->name() << "\n";
158 }
159 // On efface
160 m_groups.clear();
161 m_max_local_id = 0;
162 // On previent les observeurs
163 _notifyFamilyIsInvalidate();
164 }
165
168 {
169 FamilyObservers::const_iterator it = m_observers.find(&observer);
170 if(it != m_observers.end())
171 throw FatalErrorException("FamilyObserver already registered");
172 m_observers.insert(&observer);
173 }
174
177 {
178 FamilyObservers::const_iterator it = m_observers.find(&observer);
179 if(it == m_observers.end())
180 throw FatalErrorException("FamilyObserver not registered");
181 m_observers.erase(it);
182 }
183
184public:
185 const Private::GroupIndexInfo * findGroupInfo(ItemGroup agroup) {
186 return m_groups.findGroupInfo(agroup.internal());
187 }
188
189private:
190
191 void _notifyFamilyIsInvalidate() {
192 for(FamilyObservers::iterator it = m_observers.begin(); it != m_observers.end(); ++it)
193 (*it)->notifyFamilyIsInvalidate();
194 }
195
196 void _notifyFamilyIsIncreased() {
197 for(FamilyObservers::iterator it = m_observers.begin(); it != m_observers.end(); ++it)
198 (*it)->notifyFamilyIsIncreased();
199 }
200
201 void _notifyGroupHasChanged() {
202 throw FatalErrorException(A_FUNCINFO, "Group changes while registered in AnyItem::Family");
203 }
204
205private:
206
209
212
214 mutable FamilyObservers m_observers;
215};
216
217/*---------------------------------------------------------------------------*/
218/*---------------------------------------------------------------------------*/
219
226{
227public:
228
229 Family() : m_internal(new FamilyInternal) {}
230 Family(const Family& f) : m_internal(f.m_internal) {}
231 ~Family() {}
232
233public:
234
236 bool operator==(const Family& f) const { return m_internal == f.m_internal; }
237 bool operator!=(const Family& f) const { return !operator==(f); }
238
239 Family& operator=(const Family& f)
240 {
241 m_internal = f.m_internal;
242 return *this;
243 }
244
247 {
248 *m_internal << builder;
249 return *this;
250 }
251
253 inline bool contains(const ItemGroup& group) const
254 {
255 return m_internal->contains(group);
256 }
257
259 inline bool isPartial(const ItemGroup& group) const
260 {
261 return m_internal->isPartial(group);
262 }
263
265 inline Group allItems() {
266 return m_internal->allItems();
267 }
268
270 inline Integer groupIndex(const ItemGroup& group) const {
271 return m_internal->groupIndex(group);
272 }
273
275 inline Integer firstLocalId(const ItemGroup& group) const {
276 return m_internal->firstLocalId(group);
277 }
278
280 template<typename AnyItemT>
281 Item item(const AnyItemT & any_item) const {
282 return m_internal->item(any_item);
283 }
284
286 inline Integer groupSize() const {
287 return m_internal->groupSize();
288 }
289
291
292 inline Integer maxLocalId() const {
293 return m_internal->maxLocalId();
294 }
295
297 ItemGroup group(Integer i) const {
298 return m_internal->group(i);
299 }
300
302 void clear() {
303 m_internal->clear();
304 }
305
308 {
309 m_internal->registerObserver(observer);
310 }
311
314 {
315 m_internal->removeObserver(observer);
316 }
317
318 FamilyInternal * internal() const {
319 return m_internal.get();
320 }
321
322private:
323
326};
327
328/*---------------------------------------------------------------------------*/
329/*---------------------------------------------------------------------------*/
330
331}
332
333/*---------------------------------------------------------------------------*/
334/*---------------------------------------------------------------------------*/
335
336#endif /* ARCANE_ANYITEM_ANYITEMFAMILY_H */
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
Famille AnyItem partie interne Aggrégation de groupes pour décrire des variables / variables partiell...
Private::GroupIndexMapping m_groups
Conteneur des groupes.
bool contains(const ItemGroup &group) const
retroune vrai si la famille contient le groupe
Integer groupSize() const
Taille de la famille, ie nombre de groupes.
Integer m_max_local_id
Indentifiant maximal (équivalent à la taille de la famille)
ItemGroup group(Integer i) const
Accesseur au i-ème groupe de la famille.
void removeObserver(IFamilyObserver &observer) const
Supprime un observeur.
Item item(const AnyItemT &any_item) const
Retoune l'item concret associé à ce AnyItem.
void registerObserver(IFamilyObserver &observer) const
Enregistre un observeur.
FamilyObservers m_observers
Pour que les objets construits sur la famille ne puissent pas la modifier.
Integer firstLocalId(const ItemGroup &group) const
Position dans la famille du premier localId de ce groupe.
void clear()
Vide la famille.
Group allItems() const
Groupe de tous les items.
bool isPartial(const ItemGroup &group) const
retourne vrai si le groupe est associé à une variable partielle
Integer maxLocalId() const
Nombre d'items dans cette famille.
Integer groupIndex(const ItemGroup &group) const
Position du groupe dans la famille.
FamilyInternal & operator<<(GroupBuilder builder)
Ajout d'un groupe dans la famille.
Famille AnyItem (pattern flyweight) Aggrégation de groupes pour décrire des variables / variables par...
ItemGroup group(Integer i) const
Accesseur au i-ème groupe de la famille.
Integer maxLocalId() const
Nombre d'items dans cette famille.
Integer firstLocalId(const ItemGroup &group) const
Position dans la famille du premier localId de ce groupe.
bool operator==(const Family &f) const
Comparaisons.
Item item(const AnyItemT &any_item) const
Retoune l'item concret associé à ce AnyItem.
SharedPtrT< FamilyInternal > m_internal
Famille interne.
bool isPartial(const ItemGroup &group) const
retourne vrai si le groupe est associé à une variable partielle
void removeObserver(IFamilyObserver &observer) const
Supprime un observeur.
Integer groupSize() const
Taille de la famille, ie nombre de groupes.
Group allItems()
Groupe de tous les items.
void clear()
Vide la famille.
Family & operator<<(GroupBuilder builder)
Ajout d'un groupe dans la famille.
bool contains(const ItemGroup &group) const
retroune vrai si la famille contient le groupe
void registerObserver(IFamilyObserver &observer) const
Enregistre un observeur.
Integer groupIndex(const ItemGroup &group) const
Position du groupe dans la famille.
Outil pour construire un groupe.
Groupe AnyItem Agglomération de groupe Arcane + informations {partiel ou non} pour les variables Cons...
Interface d'observeurs de famille AnyItem.
Implémentation d'un groupe d'entités de maillage.
void attachObserver(const void *ref, IItemGroupObserver *obs)
Attache un observer.
Groupe d'entités de maillage.
Definition ItemGroup.h:49
ItemGroupImpl * internal() const
Retourne l'implémentation du groupe.
Definition ItemGroup.h:120
const String & name() const
Nom du groupe.
Definition ItemGroup.h:76
Integer size() const
Nombre d'éléments du groupe.
Definition ItemGroup.h:88
Classe de base d'un élément de maillage.
Definition Item.h:83
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Definition Lima.cc:120
Integer size() const
Nombre d'éléments du vecteur.
void resize(Int64 s)
Change le nombre d'éléments du tableau à s.
void clear()
Supprime les éléments du tableau.
Exception lorsqu'une erreur fatale est survenue.
IItemGroupObserver * newItemGroupObserverT(T *object, typename IItemGroupObserver::FuncTraits< T >::FuncPtr funcptr)
Utilitaire pour création simplifié de ItemGroupObserverT.