Arcane  v3.16.0.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
ModuleFactory.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/* ModuleFactory.h (C) 2000-2019 */
9/* */
10/* Manufacture des modules. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCANE_MODULEFACTORY_H
13#define ARCANE_MODULEFACTORY_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
17#include "arcane/IServiceFactory.h"
18#include "arcane/IModuleFactory.h"
19#include "arcane/ServiceRegisterer.h"
20#include "arcane/ModuleBuildInfo.h"
21#include "arcane/IServiceInfo.h"
22#include "arcane/ModuleProperty.h"
23#include "arcane/ServiceProperty.h"
24
25#include <atomic>
26
27/*---------------------------------------------------------------------------*/
28/*---------------------------------------------------------------------------*/
29
30namespace Arcane
31{
32
33/*---------------------------------------------------------------------------*/
34/*---------------------------------------------------------------------------*/
35/*!
36 * \internal
37 * \brief Fabrique d'un module.
38 */
39class ARCANE_CORE_EXPORT ModuleFactory
40: public IModuleFactoryInfo
41{
42 public:
43
44 /*!
45 * \brief Construit une fabrique pour un module.
46 *
47 * Ce constructeur est celui utilisé par les macros ARCANE_REGISTER_MODULE
48 * et ARCANE_REGISTER_AXL_MODULE.
49 *
50 * Cette instance devient propriétaire de \a factory et la détruira
51 * dans le destructeur.
52 */
53 ModuleFactory(Ref<IModuleFactory2> factory,bool is_autoload);
54 ~ModuleFactory() override;
55
56 public:
57
58 void addReference() override;
59 void removeReference() override;
60 Ref<IModule> createModule(ISubDomain* parent,const MeshHandle& mesh_handle) override;
61 bool isAutoload() const override { return m_is_autoload; }
62 void initializeModuleFactory(ISubDomain* sub_domain) override;
63 String moduleName() const override { return m_name; }
64 const IServiceInfo* serviceInfo() const override;
65
66 private:
67
68 Ref<IModuleFactory2> m_factory;
69 bool m_is_autoload;
70 String m_name;
71 std::atomic<Int32> m_nb_ref;
72};
73
74/*---------------------------------------------------------------------------*/
75/*---------------------------------------------------------------------------*/
76/*!
77 * \internal
78 * \brief Classe implémentant IModuleFactory2.
79 */
80class ARCANE_CORE_EXPORT ModuleFactory2
81: public IModuleFactory2
82{
83 public:
84
85 ModuleFactory2(IServiceInfo* service_info,const String& name)
86 : m_service_info(service_info), m_name(name)
87 {
88 }
89 ~ModuleFactory2() override;
90
91 String moduleName() const override
92 {
93 return m_name;
94 }
95
96 const IServiceInfo* serviceInfo() const override
97 {
98 return m_service_info;
99 }
100
101 private:
102
103 IServiceInfo* m_service_info;
104 String m_name;
105};
106
107/*---------------------------------------------------------------------------*/
108/*---------------------------------------------------------------------------*/
109/*!
110 * \internal
111 * \brief Classe template de fabrique de module.
112 *
113 * Cette classe permet de créer un module implémenté par la classe \a ModuleType.
114 */
115template<class ModuleType>
116class ModuleFactory2T
117: public ModuleFactory2
118{
119 public:
120
121 ModuleFactory2T(IServiceInfo* service_info,const String& name)
122 : ModuleFactory2(service_info,name)
123 {
124 }
125
127 {
128 auto x = new ModuleType(ModuleBuildInfo(sd,mesh_handle,moduleName()));
129 return makeRef<IModule>(x);
130 }
131
133 {
134 ModuleType::staticInitialize(sd);
135 }
136};
137
138/*---------------------------------------------------------------------------*/
139/*---------------------------------------------------------------------------*/
140/*!
141 * \ingroup Service
142 * \brief Macro pour enregistrer un module.
143 *
144 * L'appel est comme suit:
145 *
146 \code
147 * ARCANE_REGISTER_MODULE(ClassName,
148 * Arcane::ModuleProperty("ModuleName"));
149 \endcode
150
151 * Avec les paramètres suivants:
152 * - \a ClassName est le nom de la classe du module,
153 * - \a "ModuleName" est le nom du module.
154 *
155 * Par exemple, on peut avoir une utilisation comme suit:
156 *
157 \code
158 * ARCANE_REGISTER_MODULE(ModuleSimpleHydro,
159 * ModuleProperty("SimpleHydro"));
160 \endcode
161 *
162 * \note Cette macro sert à enregistrer des modules qui n'ont pas de fichiers
163 * \c axl associés. Si ce n'est pas le cas, il faut utiliser la macro
164 * définie dans le fichier '.h' généré à partir du fichier \c axl.
165 */
166#define ARCANE_REGISTER_MODULE(class_name,a_module_properties) \
167extern "C++" ARCANE_EXPORT Arcane::IModuleFactoryInfo*\
168ARCANE_JOIN_WITH_LINE(arcaneCreateModuleFactory##class_name) (const Arcane::ModuleProperty& properties) \
169{\
170 const char* module_name = properties.name();\
171 Arcane::ServiceProperty sp(module_name,0);\
172 auto* si = Arcane::Internal::ServiceInfo::create(sp,__FILE__,__LINE__); \
173 Arcane::IModuleFactory2* mf = new Arcane::ModuleFactory2T< class_name >(si,module_name); \
174 return new Arcane::ModuleFactory(Arcane::makeRef(mf), properties.isAutoload()); \
175} \
176Arcane::ServiceRegisterer ARCANE_EXPORT ARCANE_JOIN_WITH_LINE(globalModuleRegisterer##class_name) \
177 (& ARCANE_JOIN_WITH_LINE(arcaneCreateModuleFactory##class_name),a_module_properties)
178
179/*---------------------------------------------------------------------------*/
180/*---------------------------------------------------------------------------*/
181/*!
182 * \internal
183 * \brief Macro pour enregistrer un module issu d'un fichier AXL.
184 *
185 * Cette macro est interne à Arcane et ne doit pas être utilisée directement
186 */
187#define ARCANE_REGISTER_AXL_MODULE(class_name,a_module_properties) \
188extern "C++" ARCANE_EXPORT Arcane::IModuleFactoryInfo*\
189ARCANE_JOIN_WITH_LINE(arcaneCreateModuleFactory##class_name) (const Arcane::ModuleProperty& properties) \
190{\
191 const char* module_name = properties.name();\
192 Arcane::ServiceProperty sp(module_name,0);\
193 auto* si = Arcane::Internal::ServiceInfo::create(sp,__FILE__,__LINE__); \
194 class_name :: fillServiceInfo(si); \
195 Arcane::IModuleFactory2* mf = new Arcane::ModuleFactory2T< class_name >(si,module_name); \
196 return new Arcane::ModuleFactory(Arcane::makeRef(mf),properties.isAutoload()); \
197} \
198Arcane::ServiceRegisterer ARCANE_EXPORT ARCANE_JOIN_WITH_LINE(globalModuleRegisterer##class_name) \
199 (& ARCANE_JOIN_WITH_LINE(arcaneCreateModuleFactory##class_name),a_module_properties)
200
201/*---------------------------------------------------------------------------*/
202/*---------------------------------------------------------------------------*/
203/*!
204 * \brief Macro pour définir un module de manière standard.
205 *
206 * Cette macro permet d'enregistrer automatiquement un module de
207 * nom \a module_name en créant une instance de la classe \a class_name.
208 *
209 * \deprecated Utiliser ARCANE_REGISTER_MODULE à la place.
210 */
211#define ARCANE_DEFINE_STANDARD_MODULE(class_name,module_name) \
212 ARCANE_REGISTER_MODULE(class_name,Arcane::ModuleProperty(#module_name))
213
214/*---------------------------------------------------------------------------*/
215/*---------------------------------------------------------------------------*/
216
217} // End namespace Arcane
218
219/*---------------------------------------------------------------------------*/
220/*---------------------------------------------------------------------------*/
221
222#endif
Informations sur la fabrique d'un module.
Interface des informations d'un service ou d'un module.
Interface du gestionnaire d'un sous-domaine.
Definition ISubDomain.h:74
Handle sur un maillage.
Definition MeshHandle.h:47
Informations pour construire un module.
Ref< IModule > createModuleInstance(ISubDomain *sd, const MeshHandle &mesh_handle) override
Créé un module.
void initializeModuleFactory(ISubDomain *sd) override
Initialisation statique du module.
String moduleName() const override
Nom du module créé par cette fabrique.
const IServiceInfo * serviceInfo() const override
Informations sur le module pouvant être créé par cette fabrique.
ModuleFactory(Ref< IModuleFactory2 > factory, bool is_autoload)
Construit une fabrique pour un module.
Ref< IModule > createModule(ISubDomain *parent, const MeshHandle &mesh_handle) override
Créé un module.
String moduleName() const override
Nom du module créé par cette fabrique.
bool isAutoload() const override
Indique si le module et doit être chargé automatiquement.
Référence à une instance.
Chaîne de caractères unicode.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
auto makeRef(InstanceType *t) -> Ref< InstanceType >
Créé une référence sur un pointeur.