12#ifndef ARCANE_ANYITEM_ANYITEMFAMILY_H
13#define ARCANE_ANYITEM_ANYITEMFAMILY_H
17#include <arcane/utils/SharedPtr.h>
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"
34namespace Arcane::AnyItem
47 typedef std::set<IFamilyObserver*> FamilyObservers;
70 info.group =
group.internal();
71 info.group_index = size;
74 info.is_partial = builder.isPartial();
79 _notifyFamilyIsIncreased();
95 return info->is_partial;
109 return info->group_index;
118 return info->local_id_offset;
122 template<
typename AnyItemT>
127 const Integer group_index = any_item.groupIndex();
130 Integer index_in_group = any_item.localId() - info.local_id_offset;
156 m_groups[igrp].group->detachObserver(
this);
163 _notifyFamilyIsInvalidate();
169 FamilyObservers::const_iterator it =
m_observers.find(&observer);
178 FamilyObservers::const_iterator it =
m_observers.find(&observer);
191 void _notifyFamilyIsInvalidate() {
193 (*it)->notifyFamilyIsInvalidate();
196 void _notifyFamilyIsIncreased() {
198 (*it)->notifyFamilyIsIncreased();
201 void _notifyGroupHasChanged() {
202 throw FatalErrorException(A_FUNCINFO,
"Group changes while registered in AnyItem::Family");
239 Family& operator=(
const Family& f)
280 template<
typename AnyItemT>
#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...
Exception lorsqu'une erreur fatale est survenue.
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.
ItemGroupImpl * internal() const
Retourne l'implémentation du groupe.
Classe de base d'un élément de maillage.
Int32 Integer
Type représentant un entier.
IItemGroupObserver * newItemGroupObserverT(T *object, typename IItemGroupObserver::FuncTraits< T >::FuncPtr funcptr)
Utilitaire pour création simplifié de ItemGroupObserverT.