12#ifndef ARCANE_UTILS_GENERICREGISTERER_H
13#define ARCANE_UTILS_GENERICREGISTERER_H
29 [[noreturn]]
void doErrorConflict();
30 [[noreturn]]
void doErrorNonZeroCount();
51template <
typename Type>
63 Type* firstRegisterer()
const {
return m_first_registerer; }
64 Int32 nbRegisterer()
const {
return m_nb_registerer; }
68 Type* m_first_registerer =
nullptr;
69 Int32 m_nb_registerer = 0;
74 using InstanceType = Type;
96 return Type::registererInfo().firstRegisterer();
102 return Type::registererInfo().nbRegisterer();
107 InstanceType* m_previous =
nullptr;
108 InstanceType* m_next =
nullptr;
112 void _init() noexcept
114 Info& reg_info = Type::registererInfo();
115 Type* current_instance =
static_cast<Type*
>(
this);
118 InstanceType* first = reg_info.firstRegisterer();
120 reg_info.m_first_registerer = current_instance;
121 m_previous =
nullptr;
125 InstanceType* next = first->nextRegisterer();
127 reg_info.m_first_registerer = current_instance;
129 next->m_previous = current_instance;
131 ++reg_info.m_nb_registerer;
134 auto* p = reg_info.firstRegisterer();
135 Integer count = reg_info.nbRegisterer();
136 while (p && count > 0) {
137 p = p->nextRegisterer();
143 else if (count > 0) {
144 doErrorNonZeroCount();
Fichier de configuration d'Arcane.
Classe template pour gérer une liste globale permettant d'enregistrer des fabriques.
static InstanceType * firstRegisterer()
Accès au premier élément de la chaine d'enregistreur.
static Integer nbRegisterer()
Nombre d'enregisteur de service dans la chaine.
InstanceType * nextRegisterer() const
Instance suivante (nullptr si la dernière)
InstanceType * previousRegisterer() const
Instance précédente (nullptr si la première)
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
Int32 Integer
Type représentant un entier.