Arcane  v3.14.10.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-2022 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-2018 */
9/* */
10/* Singleton permettant d'enregister un service. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCANE_SERCVICEREGISTERER_H
13#define ARCANE_SERCVICEREGISTERER_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
18
19#include "arcane/ServiceProperty.h"
20#include "arcane/ModuleProperty.h"
21
22/*---------------------------------------------------------------------------*/
23/*---------------------------------------------------------------------------*/
24
25ARCANE_BEGIN_NAMESPACE
26
27/*---------------------------------------------------------------------------*/
28/*---------------------------------------------------------------------------*/
29
30class IServiceFactory;
31class IServiceInfo;
32class IModuleFactoryInfo;
33class ModuleProperty;
34
35/*---------------------------------------------------------------------------*/
36/*---------------------------------------------------------------------------*/
37/*!
38 * \brief Enregistreur de service et modules
39 *
40 * Cette classe implémente le pattern Singleton pour un service donnée.
41 *
42 * Elle permet de déclarer une variable globale qui enregistre automatiquement
43 * le IServiceFactory du service souhaité. Cette classe ne s'utilise pas
44 * directement mais par l'intermédiaire de la macro ARCANE_DEFINE_SERVICE(name).
45 *
46 * Comme cette classe est utilisé avec des instances globales, elles sont
47 * construites avant que le code ne rentre dans le main(). Il faut donc
48 * faire très attention à n'utiliser aucun objet ni faire d'allocation( En
49 * particulier, le nom du service doit être un const char* standard).
50 * Pour cela, la liste des services enregistré est maintenu dans une liste
51 * chaînée et chaque instance contient le pointeur vers le membre suivant et
52 * précédent de la liste. Le premier élément de la liste est obtenu par
53 * l'appel à ServiceRegisterer::firstService().
54 */
55class ARCANE_CORE_EXPORT ServiceRegisterer
56{
57 public:
58
59 typedef IModuleFactoryInfo* (*ModuleFactoryWithPropertyFunc)(const ModuleProperty& properties);
60 typedef IServiceInfo* (*ServiceInfoWithPropertyCreateFunc)(const ServiceProperty& properties);
61
62 public:
63
64 /*!
65 * \brief Crée en enregistreur pour le service \a name et la fonction \a func.
66 *
67 * Ce constructeur est utilisé pour enregistrer un service.
68 */
69 ServiceRegisterer(ServiceInfoWithPropertyCreateFunc func,const ServiceProperty& properties) ARCANE_NOEXCEPT;
70
71 /*!
72 * \brief Crée en enregistreur pour le module \a name avec les propriétés \a properties.
73 *
74 * Ce constructeur est utilisé pour enregistrer un module.
75 */
76 ServiceRegisterer(ModuleFactoryWithPropertyFunc func,const ModuleProperty& properties) ARCANE_NOEXCEPT;
77
78 public:
79
80 /*!
81 * \brief Fonction de création de l'instance 'ServiceInfo' si on est un service.
82 *
83 * Ce pointeur peut-être nul si on n'est pas un service, auquel cas
84 * il faut utiliser infoCreatorFunction().
85 */
86 ServiceInfoWithPropertyCreateFunc infoCreatorWithPropertyFunction() { return m_info_function_with_property; }
87
88 /*!
89 * \brief Fonction de création de la factory si on est un module.
90 *
91 * Ce pointeur peut-être nul si on n'est pas un module, auquel cas
92 * il faut utiliser infoCreatorFunction().
93 */
94 ModuleFactoryWithPropertyFunc moduleFactoryWithPropertyFunction() { return m_module_factory_with_property_functor; }
95
96 //! Nom du service
97 const char* name() { return m_name; }
98
99 /*
100 * \brief Propriétés du service.
101 *
102 * \deprecated Utiliser \a serviceProperty() à la place
103 */
104 ARCANE_DEPRECATED_260 const ServiceProperty& property() const { return m_service_property; }
105
106 //! Propriétés dans le cas d'un service
107 const ServiceProperty& serviceProperty() const { return m_service_property; }
108
109 //! Propriétés dans le cas d'un module
110 const ModuleProperty& moduleProperty() const { return m_module_property; }
111
112 //! Service précédent (0 si le premier)
113 ServiceRegisterer* previousService() const { return m_previous; }
114
115 //! Service suivant (0 si le dernier)
116 ServiceRegisterer* nextService() const { return m_next; }
117
118 private:
119
120 //! Positionne le service précédent
121 /*! Utilisé en interne pour construire la chaine de service */
122 void setPreviousService(ServiceRegisterer* s) { m_previous = s; }
123
124 //! Positionne le service suivant
125 /*! Utilisé en interne pour construire la chaine de service */
126 void setNextService(ServiceRegisterer* s) { m_next = s; }
127
128 public:
129
130 //! Accès au premier élément de la chaine d'enregistreur de service
131 static ServiceRegisterer* firstService();
132
133 //! Nombre d'enregisteur de service dans la chaine
134 static Integer nbService();
135
136 private:
137
138 //! Fonction de création du IModuleFactory
139 ModuleFactoryWithPropertyFunc m_module_factory_with_property_functor;
140 //! Fonction de création du IServiceInfo
141 ServiceInfoWithPropertyCreateFunc m_info_function_with_property;
142 //! Nom du service
143 const char* m_name;
144 //! Propriétés du service
145 ServiceProperty m_service_property;
146 //! Propriétés du module
147 ModuleProperty m_module_property;
148 //! Service précédent
149 ServiceRegisterer* m_previous;
150 //! Service suivant
151 ServiceRegisterer* m_next;
152
153 private:
154
155 void _init();
156};
157
158/*---------------------------------------------------------------------------*/
159/*---------------------------------------------------------------------------*/
160
161ARCANE_END_NAMESPACE
162
163/*---------------------------------------------------------------------------*/
164/*---------------------------------------------------------------------------*/
165
166#endif
167
Fichier de configuration d'Arcane.
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.
Int32 Integer
Type représentant un entier.