13#ifndef ARCANE_ANYITEM_ANYITEMLINKFAMILY_H
14#define ARCANE_ANYITEM_ANYITEMLINKFAMILY_H
19#include "arcane/anyitem/AnyItemGlobal.h"
29ANYITEM_BEGIN_NAMESPACE
37template<
typename U,
typename V>
41 PairT(U u,
V v) : m_u(u), m_v(v) {}
46template<
typename U,
typename V>
78#ifdef ARCANE_ANYITEM_USEPACKEDDATA
99 inline void setGroupIndex(Integer group_index) {
100 ARCANE_ASSERT(((group_index & ~
m_short_mask) == 0),(
"Too large group index %d", group_index));
102 ARCANE_ASSERT((groupIndex() == group_index),(
"Corrupted data write detected"));
104 inline void setLocalId(Integer local_id) {
105 ARCANE_ASSERT(((local_id & ~
m_integer_mask) == 0),(
"Too large local id %d", local_id));
107 ARCANE_ASSERT((localId() == local_id),(
"Corrupted data write detected"));
112 ARCANE_ASSERT((varIndex() ==
item_local_id),(
"Corrupted data write detected"));
118 LinkData() : m_group_index(0), m_local_id(0), m_var_index(0) {}
124 Integer
localId()
const {
return m_local_id; }
132 inline void setGroupIndex(Integer group_index) { m_group_index = group_index; }
133 inline void setLocalId(Integer local_id) { m_local_id = local_id; }
134 inline void setVarIndex(Integer item_local_id) { m_var_index = item_local_id; }
153 inline Integer index()
const {
return m_index; }
170 inline bool hasNext()
const {
return m_sources.size() != m_index; }
171 inline void operator++() { m_index++; }
174 return m_sources[m_index];
178 return m_targets[m_index];
198 template<
typename U,
typename V>
203 : m_family(family), m_a(a), m_b(
b), m_used(
false) {}
206 ARCANE_ASSERT((m_used ==
true),(
"LinkAdder never used"));
210 template<
typename R,
typename S>
213 ARCANE_ASSERT((m_used ==
false),(
"VariableAdder already used"));
214 m_family.addSourceNode(
p.m_u,m_a);
215 m_family.addTargetNode(
p.m_v,m_b);
239 ARCANE_ASSERT((m_used ==
true),(
"Link never used"));
243 template<
typename U,
typename V>
261 typedef std::set<ILinkFamilyObserver*> LinkFamilyObservers;
270 m_family.registerObserver(*
this);
281 if(m_nb_link >= capacity()) {
282 m_source_nodes.reserve(2 * capacity());
283 m_target_nodes.reserve(2 * capacity());
284 _notifyFamilyIsReserved();
287 m_source_nodes.resize(m_nb_link);
288 m_target_nodes.resize(m_nb_link);
289 return Link(*
this,m_nb_link-1);
294 m_source_nodes.reserve(size);
295 m_target_nodes.reserve(size);
296 _notifyFamilyIsReserved();
304 return m_source_nodes.capacity();
310 m_source_nodes.clear();
311 m_target_nodes.clear();
312 _notifyFamilyIsInvalidate();
318 LinkFamilyObservers::const_iterator
it = m_observers.find(&
observer);
319 if(
it != m_observers.end())
327 LinkFamilyObservers::const_iterator
it = m_observers.find(&
observer);
328 if(
it == m_observers.end())
330 m_observers.erase(
it);
337 _notifyFamilyIsInvalidate();
347 template<
typename T,
typename V>
350 initLinkData(m_source_nodes.back(),
t, group);
353 template<
typename T,
typename V>
354 inline void addTargetNode(
const T& t, ItemGroupT<V> group) {
356 initLinkData(m_target_nodes.back(), t, group);
359 const LinkData& source(
const LinkIndex& link)
const {
360 return m_source_nodes[link.index()];
363 const LinkData& target(
const LinkIndex& link)
const {
364 return m_target_nodes[link.index()];
369 const Family& family()
const {
420 ARCANE_ASSERT((info != 0),(
"Inconsistent group info while adding new node"));
421 data.setGroupIndex(info->group_index);
422 const Integer
local_index = (*(group.localIdToIndex()))[
t.localId()];
423 data.setLocalId(info->local_id_offset +
local_index);
424 if(info->is_partial) {
425 const Integer
local_index = (*(group.localIdToIndex()))[
t.localId()];
428 data.setVarIndex(
t.localId());
438 ARCANE_ASSERT((info != 0),(
"Inconsistent group info while adding new node"));
439 data.setGroupIndex(info->group_index);
441 data.setLocalId(info->local_id_offset +
local_index);
442 if(info->is_partial) {
445 data.setVarIndex(
t.localId());
456 void _notifyFamilyIsInvalidate() {
457 for(LinkFamilyObservers::iterator
it = m_observers.begin();
it != m_observers.end(); ++
it)
458 (*it)->notifyFamilyIsInvalidate();
461 void _notifyFamilyIsReserved() {
462 for(LinkFamilyObservers::iterator it = m_observers.begin(); it != m_observers.end(); ++it)
463 (*it)->notifyFamilyIsReserved();
507 : m_internal(f.m_internal) {}
514 return m_internal->newLink();
519 m_internal->reserve(size);
527 return m_internal->capacity();
538 m_internal->registerObserver(
observer);
544 m_internal->removeObserver(
observer);
549 m_internal->notifyFamilyIsInvalidate();
554 m_internal->notifyFamilyIsIncreased();
559 template<
typename T,
typename V>
561 m_internal->addSourceNode(
t,group);
564 template<
typename T,
typename V>
565 inline void addTargetNode(
const T& t, ItemGroupT<V> group) {
566 m_internal->addTargetNode(t,group);
571 LinkFamilyInternal * internal()
const {
572 return m_internal.get();
Interface d'observeurs de famille AnyItem.
Interface d'observeurs de famille de liaisons AnyItem.
Classe de base d'un élément de maillage.
Lecteur des fichiers de maillage via la bibliothèque LIMA.
const Arcane::Array< LinkData > & m_sources
Toutes les données back.
const LinkData & back() const
Données du lien back.
const Arcane::Array< LinkData > & m_targets
Toutes les données front.
const LinkData & front() const
Données du lien front.
unsigned m_group_index
Index du groupe d'où vient cet item.
Integer m_var_index
Index pour les partiels, localId sinon.
bool operator==(const LinkData &data) const
Opérateur de comparaison.
unsigned m_local_id
Identifiant dans l(indexation globale de AnyItem::Family.
Integer varIndex() const
Identifiant localId de l'item référencé dans sa famille IItemFamily d'origine.
Integer localId() const
Identifiant localId de l'item référencé dans sa famille AnyItemFamily.
Integer groupIndex() const
Identifiant du groupe auquel est associé l'item référencé par ce LinkData.
LinkAdder< U, V > operator()(const ItemGroupT< U > &a, const ItemGroupT< V > &b)
Ajout de liens pour les groupes a et b.
LinkFamilyInternal & m_family
Famille de liens.
bool m_used
Indicateur si le lien est utilisé
Famille de liens AnyItem partie interne les données stockées sont les localid des items et l'offset d...
void initLinkData(LinkData &data, const ItemEnumeratorT< T > &t, ItemGroupT< T > group) const
Ajout des noeuds des liaisons par énumerateurs.
LinkFamilyInternal(const Family &family)
Famille de liens pour une famille anyitem.
Link newLink()
Création d'un nouveau lien vide.
LinkFamilyObservers m_observers
Observeurs de la famille.
Integer m_nb_link
Nombre de liens.
Arcane::UniqueArray< LinkData > m_source_nodes
Données back.
Enumerator enumerator() const
Enumérateurs des liens.
void clear()
Vide la famille.
void notifyFamilyIsInvalidate()
Notifie que la famille est invalidée.
void removeObserver(ILinkFamilyObserver &observer) const
Détruit un observeur de la famille.
Integer capacity() const
retourne la capacité
void registerObserver(ILinkFamilyObserver &observer) const
Enrgistre un observeur de la famille.
Item item(const LinkData &link_data) const
Retoune l'item concret associé à ce AnyItem.
void initLinkData(LinkData &data, const T &t, ItemGroupT< T > group) const
Ajout des noeuds des liaisons par type d'item.
void reserve(Integer size)
Réserve une capacité de liens.
Arcane::UniqueArray< LinkData > m_target_nodes
Données front.
const Family m_family
Famille AnyItem.
void notifyFamilyIsIncreased()
Notifie à l'observeur que la famille est agrandie.
Famille de liens AnyItem (pattern flyweight)
Integer capacity() const
retourne la capacité
void reserve(Integer size)
Réserve une capacité de liens.
Enumerator enumerator() const
Enumérateurs des liens.
void notifyFamilyIsIncreased()
Notifie que la famille est agrandie.
void registerObserver(ILinkFamilyObserver &observer) const
Enrgistre un observeur de la famille.
SharedPtrT< LinkFamilyInternal > m_internal
Famille de liens interne.
void removeObserver(ILinkFamilyObserver &observer) const
Detruit un observeur de la famille.
void clear()
Vide la famille.
void notifyFamilyIsInvalidate()
Notifie que la famille est invalidée.
Link newLink()
Création d'un nouveau lien vide.
Outil pour créer une pair d'items.
Exception lorsqu'une erreur fatale est survenue.
void arcaneCallFunctionAndTerminateIfThrow(std::function< void()> function)
Outil pour l'ajout de lien.
LinkFamilyInternal & m_family
Famille de liens.
ItemGroupT< V > m_b
groupe front
ItemGroupT< U > m_a
Groupe back.
bool m_used
Indicateur si le adder est utilisé
void operator<<(const PairT< R, S > &p)
Ajout d'une pair d'item.