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>
76 friend class LinkFamilyInternal;
78#ifdef ARCANE_ANYITEM_USEPACKEDDATA
80 LinkData() : m_packed_data(0) {}
86 Integer localId()
const {
return (m_packed_data >> m_local_id_shift) & m_integer_mask; }
88 bool operator==(
const LinkData& data)
const {
return m_packed_data == data.m_packed_data; }
90 static const Integer m_integer_size = 26;
91 static const Int64 m_integer_mask = (
Int64(1)<<m_integer_size)-1;
92 static const Integer m_short_size = 8;
93 static const Int64 m_short_mask = (
Int64(1)<<m_short_size)-1;
94 static const Integer m_group_shift = 52;
95 static const Int64 m_group_mask = m_short_mask<<m_group_shift;
96 static const Integer m_local_id_shift = m_integer_size;
97 static const Int64 m_local_id_mask = m_integer_mask<<m_local_id_shift;
99 inline void setGroupIndex(
Integer group_index) {
100 ARCANE_ASSERT(((group_index & ~m_short_mask) == 0),(
"Too large group index %d", group_index));
101 m_packed_data = (m_packed_data & ~m_group_mask) | (
Int64(group_index)<<m_group_shift);
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));
106 m_packed_data = (m_packed_data & ~m_local_id_mask) | (
Int64(local_id)<<m_local_id_shift);
107 ARCANE_ASSERT((
localId() == local_id),(
"Corrupted data write detected"));
109 inline void setVarIndex(
Integer item_local_id) {
110 ARCANE_ASSERT(((item_local_id & ~m_integer_mask) == 0),(
"Too large item local id %d", item_local_id));
111 m_packed_data = (m_packed_data & ~m_integer_mask) | item_local_id;
112 ARCANE_ASSERT((
varIndex() == item_local_id),(
"Corrupted data write detected"));
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; }
168 Enumerator(
const Enumerator& e)
170 inline bool hasNext()
const {
return m_sources.size() != m_index; }
171 inline void operator++() { m_index++; }
198 template<
typename U,
typename V>
206 ARCANE_ASSERT((
m_used ==
true),(
"LinkAdder never used"));
210 template<
typename R,
typename S>
213 ARCANE_ASSERT((
m_used ==
false),(
"VariableAdder already used"));
239 ARCANE_ASSERT((m_used ==
true),(
"Link never used"));
243 template<
typename U,
typename V>
261 typedef std::set<ILinkFamilyObserver*> LinkFamilyObservers;
284 _notifyFamilyIsReserved();
296 _notifyFamilyIsReserved();
312 _notifyFamilyIsInvalidate();
318 LinkFamilyObservers::const_iterator it =
m_observers.find(&observer);
327 LinkFamilyObservers::const_iterator it =
m_observers.find(&observer);
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);
423 data.setLocalId(info->local_id_offset + local_index);
424 if(info->is_partial) {
426 data.setVarIndex(local_index);
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) {
443 data.setVarIndex(local_index);
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();
503 LinkFamily(
const Family& f)
506 LinkFamily(
const LinkFamily& f)
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();
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.