Arcane  v3.16.6.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
ServiceRegisterer.h
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2025 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com)
4// See the top-level COPYRIGHT file for details.
5// SPDX-License-Identifier: Apache-2.0
6//-----------------------------------------------------------------------------
7/*---------------------------------------------------------------------------*/
8/* ServiceRegisterer.h (C) 2000-2025 */
9/* */
10/* Singleton permettant d'enregistrer un service. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCANE_CORE_SERCVICEREGISTERER_H
13#define ARCANE_CORE_SERCVICEREGISTERER_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
19#include "arcane/core/ModuleProperty.h"
20
21/*---------------------------------------------------------------------------*/
22/*---------------------------------------------------------------------------*/
23
24namespace Arcane
25{
26
27/*---------------------------------------------------------------------------*/
28/*---------------------------------------------------------------------------*/
29/*!
30 * \brief Enregistreur de service et modules
31 *
32 * Cette classe implémente le pattern Singleton pour un service donnée.
33 *
34 * Elle permet de déclarer une variable globale qui enregistre automatiquement
35 * le IServiceFactory du service souhaité. Cette classe ne s'utilise pas
36 * directement mais par l'intermédiaire de la macro ARCANE_DEFINE_SERVICE(name).
37 *
38 * Comme cette classe est utilisé avec des instances globales, elles sont
39 * construites avant que le code ne rentre dans le main(). Il faut donc
40 * faire très attention à n'utiliser aucun objet ni faire d'allocation( En
41 * particulier, le nom du service doit être un const char* standard).
42 * Pour cela, la liste des services enregistré est maintenu dans une liste
43 * chaînée et chaque instance contient le pointeur vers le membre suivant et
44 * précédent de la liste. Le premier élément de la liste est obtenu par
45 * l'appel à ServiceRegisterer::firstService().
46 */
47class ARCANE_CORE_EXPORT ServiceRegisterer
48{
49 public:
50
51 typedef IModuleFactoryInfo* (*ModuleFactoryWithPropertyFunc)(const ModuleProperty& properties);
52 typedef IServiceInfo* (*ServiceInfoWithPropertyCreateFunc)(const ServiceProperty& properties);
53
54 public:
55
56 /*!
57 * \brief Crée en enregistreur pour le service \a name et la fonction \a func.
58 *
59 * Ce constructeur est utilisé pour enregistrer un service.
60 */
61 ServiceRegisterer(ServiceInfoWithPropertyCreateFunc func, const ServiceProperty& properties) ARCANE_NOEXCEPT;
62
63 /*!
64 * \brief Crée en enregistreur pour le module \a name avec les propriétés \a properties.
65 *
66 * Ce constructeur est utilisé pour enregistrer un module.
67 */
68 ServiceRegisterer(ModuleFactoryWithPropertyFunc func, const ModuleProperty& properties) ARCANE_NOEXCEPT;
69
70 public:
71
72 /*!
73 * \brief Fonction de création de l'instance 'ServiceInfo' si on est un service.
74 *
75 * Ce pointeur peut-être nul si on n'est pas un service, auquel cas
76 * il faut utiliser infoCreatorFunction().
77 */
78 ServiceInfoWithPropertyCreateFunc infoCreatorWithPropertyFunction() { return m_info_function_with_property; }
79
80 /*!
81 * \brief Fonction de création de la factory si on est un module.
82 *
83 * Ce pointeur peut-être nul si on n'est pas un module, auquel cas
84 * il faut utiliser infoCreatorFunction().
85 */
86 ModuleFactoryWithPropertyFunc moduleFactoryWithPropertyFunction() { return m_module_factory_with_property_functor; }
87
88 //! Nom du service
89 const char* name() { return m_name; }
90
91 /*!
92 * \brief Propriétés du service.
93 *
94 * \deprecated Utiliser \a serviceProperty() à la place
95 */
96 ARCANE_DEPRECATED_260 const ServiceProperty& property() const { return m_service_property; }
97
98 //! Propriétés dans le cas d'un service
99 const ServiceProperty& serviceProperty() const { return m_service_property; }
100
101 //! Propriétés dans le cas d'un module
102 const ModuleProperty& moduleProperty() const { return m_module_property; }
103
104 //! Service précédent (0 si le premier)
105 ServiceRegisterer* previousService() const { return m_previous; }
106
107 //! Service suivant (0 si le dernier)
108 ServiceRegisterer* nextService() const { return m_next; }
109
110 private:
111
112 //! Positionne le service précédent
113 /*! Utilisé en interne pour construire la chaine de service */
114 void setPreviousService(ServiceRegisterer* s) { m_previous = s; }
115
116 //! Positionne le service suivant
117 /*! Utilisé en interne pour construire la chaine de service */
118 void setNextService(ServiceRegisterer* s) { m_next = s; }
119
120 public:
121
122 //! Accès au premier élément de la chaine d'enregistreur de service
123 static ServiceRegisterer* firstService();
124
125 //! Nombre d'enregistreurs de service dans la chaine
126 static Integer nbService();
127
128 private:
129
130 //! Fonction de création du IModuleFactory
131 ModuleFactoryWithPropertyFunc m_module_factory_with_property_functor = nullptr;
132 //! Fonction de création du IServiceInfo
133 ServiceInfoWithPropertyCreateFunc m_info_function_with_property = nullptr;
134 //! Nom du service
135 const char* m_name = nullptr;
136 //! Propriétés du service
137 ServiceProperty m_service_property;
138 //! Propriétés du module
139 ModuleProperty m_module_property;
140 //! Service précédent
141 ServiceRegisterer* m_previous = nullptr;
142 //! Service suivant
143 ServiceRegisterer* m_next = nullptr;
144
145 private:
146
147 void _init();
148};
149
150/*---------------------------------------------------------------------------*/
151/*---------------------------------------------------------------------------*/
152
153} // namespace Arcane
154
155/*---------------------------------------------------------------------------*/
156/*---------------------------------------------------------------------------*/
157
158#endif
Déclarations des types généraux de Arcane.
Ce fichier contient les différentes types et classes pour spécifier les propriétés d'un service.
Informations sur la fabrique d'un module.
Interface des informations d'un service ou d'un module.
Propriétés de création d'un module.
Propriétés de création d'un service.
Enregistreur de service et modules.
ServiceRegisterer * previousService() const
Service précédent (0 si le premier)
ServiceRegisterer * nextService() const
Service suivant (0 si le dernier)
const ServiceProperty & serviceProperty() const
Propriétés dans le cas d'un service.
const char * name()
Nom du service.
ModuleFactoryWithPropertyFunc moduleFactoryWithPropertyFunction()
Fonction de création de la factory si on est un module.
ServiceInfoWithPropertyCreateFunc infoCreatorWithPropertyFunction()
Fonction de création de l'instance 'ServiceInfo' si on est un service.
const ModuleProperty & moduleProperty() const
Propriétés dans le cas d'un module.
ARCANE_DEPRECATED_260 const ServiceProperty & property() const
Propriétés du service.
ServiceRegisterer(ServiceInfoWithPropertyCreateFunc func, const ServiceProperty &properties) ARCANE_NOEXCEPT
Crée en enregistreur pour le service name et la fonction func.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
Int32 Integer
Type représentant un entier.