Arcane  v3.16.8.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
ModuleFactory.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/* ModuleFactory.h (C) 2000-2025 */
9/* */
10/* Manufacture des modules. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCANE_CORE_MODULEFACTORY_H
13#define ARCANE_CORE_MODULEFACTORY_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
17#include "arcane/core/IServiceFactory.h"
18#include "arcane/core/IModuleFactory.h"
19#include "arcane/core/ServiceRegisterer.h"
20#include "arcane/core/ModuleBuildInfo.h"
21#include "arcane/core/IServiceInfo.h"
22#include "arcane/core/ModuleProperty.h"
24
25#include <atomic>
26
27/*---------------------------------------------------------------------------*/
28/*---------------------------------------------------------------------------*/
29
30namespace Arcane
31{
32
33/*---------------------------------------------------------------------------*/
34/*---------------------------------------------------------------------------*/
39class ARCANE_CORE_EXPORT ModuleFactory
40: public IModuleFactoryInfo
41{
42 public:
43
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/*---------------------------------------------------------------------------*/
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/*---------------------------------------------------------------------------*/
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/*---------------------------------------------------------------------------*/
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/*---------------------------------------------------------------------------*/
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/*---------------------------------------------------------------------------*/
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
Ce fichier contient les différentes types et classes pour spécifier les propriétés d'un service.
Interface d'une fabrique de module (V2).
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.