12#ifndef ARCANE_CORE_ANYITEM_ANYITEMLINKFAMILY_H
13#define ARCANE_CORE_ANYITEM_ANYITEMLINKFAMILY_H
17#include "arcane/core/anyitem/AnyItemGlobal.h"
27ANYITEM_BEGIN_NAMESPACE
35template<
typename U,
typename V>
39 PairT(U u, V v) : m_u(u), m_v(v) {}
44template<
typename U,
typename V>
74 friend class LinkFamilyInternal;
76#ifdef ARCANE_ANYITEM_USEPACKEDDATA
78 LinkData() : m_packed_data(0) {}
84 Integer localId()
const {
return (m_packed_data >> m_local_id_shift) & m_integer_mask; }
86 bool operator==(
const LinkData& data)
const {
return m_packed_data == data.m_packed_data; }
88 static const Integer m_integer_size = 26;
89 static const Int64 m_integer_mask = (
Int64(1)<<m_integer_size)-1;
90 static const Integer m_short_size = 8;
91 static const Int64 m_short_mask = (
Int64(1)<<m_short_size)-1;
92 static const Integer m_group_shift = 52;
93 static const Int64 m_group_mask = m_short_mask<<m_group_shift;
94 static const Integer m_local_id_shift = m_integer_size;
95 static const Int64 m_local_id_mask = m_integer_mask<<m_local_id_shift;
97 inline void setGroupIndex(
Integer group_index) {
98 ARCANE_ASSERT(((group_index & ~m_short_mask) == 0),(
"Too large group index %d", group_index));
99 m_packed_data = (m_packed_data & ~m_group_mask) | (
Int64(group_index)<<m_group_shift);
100 ARCANE_ASSERT((
groupIndex() == group_index),(
"Corrupted data write detected"));
102 inline void setLocalId(
Integer local_id) {
103 ARCANE_ASSERT(((local_id & ~m_integer_mask) == 0),(
"Too large local id %d", local_id));
104 m_packed_data = (m_packed_data & ~m_local_id_mask) | (
Int64(local_id)<<m_local_id_shift);
105 ARCANE_ASSERT((
localId() == local_id),(
"Corrupted data write detected"));
107 inline void setVarIndex(
Integer item_local_id) {
108 ARCANE_ASSERT(((item_local_id & ~m_integer_mask) == 0),(
"Too large item local id %d", item_local_id));
109 m_packed_data = (m_packed_data & ~m_integer_mask) | item_local_id;
110 ARCANE_ASSERT((
varIndex() == item_local_id),(
"Corrupted data write detected"));
130 inline void setGroupIndex(
Integer group_index) { m_group_index = group_index; }
131 inline void setLocalId(
Integer local_id) { m_local_id = local_id; }
132 inline void setVarIndex(Integer item_local_id) { m_var_index = item_local_id; }
151 inline Integer index()
const {
return m_index; }
166 Enumerator(
const Enumerator& e)
168 inline bool hasNext()
const {
return m_sources.size() != m_index; }
169 inline void operator++() { m_index++; }
196 template<
typename U,
typename V>
204 ARCANE_ASSERT((
m_used ==
true),(
"LinkAdder never used"));
208 template<
typename R,
typename S>
211 ARCANE_ASSERT((
m_used ==
false),(
"VariableAdder already used"));
237 ARCANE_ASSERT((m_used ==
true),(
"Link never used"));
241 template<
typename U,
typename V>
259 typedef std::set<ILinkFamilyObserver*> LinkFamilyObservers;
282 _notifyFamilyIsReserved();
294 _notifyFamilyIsReserved();
310 _notifyFamilyIsInvalidate();
316 LinkFamilyObservers::const_iterator it =
m_observers.find(&observer);
325 LinkFamilyObservers::const_iterator it =
m_observers.find(&observer);
335 _notifyFamilyIsInvalidate();
345 template<
typename T,
typename V>
348 initLinkData(m_source_nodes.back(), t, group);
351 template<
typename T,
typename V>
352 inline void addTargetNode(
const T& t, ItemGroupT<V> group) {
354 initLinkData(m_target_nodes.back(), t, group);
357 const LinkData& source(
const LinkIndex& link)
const {
358 return m_source_nodes[link.index()];
361 const LinkData& target(
const LinkIndex& link)
const {
362 return m_target_nodes[link.index()];
367 const Family& family()
const {
418 ARCANE_ASSERT((info != 0),(
"Inconsistent group info while adding new node"));
419 data.setGroupIndex(info->group_index);
421 data.setLocalId(info->local_id_offset + local_index);
422 if(info->is_partial) {
424 data.setVarIndex(local_index);
426 data.setVarIndex(t.localId());
436 ARCANE_ASSERT((info != 0),(
"Inconsistent group info while adding new node"));
437 data.setGroupIndex(info->group_index);
439 data.setLocalId(info->local_id_offset + local_index);
440 if(info->is_partial) {
441 data.setVarIndex(local_index);
454 void _notifyFamilyIsInvalidate() {
455 for(LinkFamilyObservers::iterator it = m_observers.begin(); it != m_observers.end(); ++it)
456 (*it)->notifyFamilyIsInvalidate();
459 void _notifyFamilyIsReserved() {
460 for(LinkFamilyObservers::iterator it = m_observers.begin(); it != m_observers.end(); ++it)
461 (*it)->notifyFamilyIsReserved();
501 LinkFamily(
const Family& f)
504 LinkFamily(
const LinkFamily& f)
557 template<
typename T,
typename V>
559 m_internal->addSourceNode(t,group);
562 template<
typename T,
typename V>
563 inline void addTargetNode(
const T& t, ItemGroupT<V> group) {
564 m_internal->addTargetNode(t,group);
569 LinkFamilyInternal * internal()
const {
570 return m_internal.get();
Tableau d'items de types quelconques.
Exception lorsqu'une erreur fatale est survenue.
Interface d'observeurs de famille AnyItem.
Interface d'observeurs de famille de liaisons AnyItem.
Référence à un groupe d'un genre donné.
SharedPtrT< GroupIndexTable > localIdToIndex() const
Table des local ids vers une position pour toutes les entités du groupe.
Classe de base d'un élément de maillage.
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.
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.
Vecteur 1D de données avec sémantique par valeur (style STL).
std::int64_t Int64
Type entier signé sur 64 bits.
Int32 Integer
Type représentant un entier.
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.