Arcane  v3.16.8.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
ServiceFinder2.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/* ServiceFinder2.h (C) 2000-2025 */
9/* */
10/* Classe pour trouver un service donné. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCANE_CORE_SERVICEFINDER2_H
13#define ARCANE_CORE_SERVICEFINDER2_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
17#include "arcane/utils/String.h"
18#include "arcane/utils/Array.h"
19#include "arcane/utils/Collection.h"
20#include "arcane/utils/Enumerator.h"
21
22#include "arcane/core/IServiceInfo.h"
23#include "arcane/core/IFactoryService.h"
24#include "arcane/core/IApplication.h"
25#include "arcane/core/IServiceFactory.h"
26#include "arcane/core/IServiceMng.h"
27#include "arcane/core/ServiceBuildInfo.h"
28#include "arcane/core/ServiceInstance.h"
29
30#include <set>
31
32/*---------------------------------------------------------------------------*/
33/*---------------------------------------------------------------------------*/
34
35namespace Arcane::Internal
36{
37
38/*---------------------------------------------------------------------------*/
39/*---------------------------------------------------------------------------*/
40/*!
41 * \internal
42 * \brief Classe utilitaire pour retrouver un ou plusieurs services
43 * implémentant l'interface \a InterfaceType.
44 */
45template<typename InterfaceType>
46class ServiceFinderBase2T
47{
48 public:
49 typedef IServiceFactory2T<InterfaceType> FactoryType;
50 public:
51 ServiceFinderBase2T(IApplication* app,const ServiceBuildInfoBase& sbi)
52 : m_application(app), m_service_build_info_base(sbi)
53 {
54 }
55
56 virtual ~ServiceFinderBase2T(){}
57
58 public:
59 /*!
60 * \brief Créé une instance du service \a name.
61 *
62 * Retourne nul si aucun service de ce nom n'existe.
63 *
64 * \deprecated Utiliser createReference() à la place.
65 */
66 ARCCORE_DEPRECATED_2019("Use createReference() instead")
67 virtual InterfaceType* create(const String& name)
68 {
69 return _create(name,m_service_build_info_base);
70 }
71
72 /*!
73 * \brief Créé une instance du service \a name.
74 *
75 * Retourne une référence nulle si aucun service de ce nom n'existe.
76 */
78 {
79 return _createReference(name,m_service_build_info_base);
80 }
81
82 /*!
83 * \brief Créé une instance du service \a name pour le maillage \a mesh.
84 *
85 * Cela n'est valide que pour les services de sous-domaine. Pour les autres,
86 * cela est sans effet.
87 * L'appelant doit détruire ces services.
88 * Retourne nul si aucun service de ce nom n'existe.
89 *
90 * \deprecated Utiliser createReference() à la place.
91 */
92 ARCCORE_DEPRECATED_2019("Use createReference() instead")
93 virtual InterfaceType* create(const String& name,IMesh* mesh)
94 {
95 ISubDomain* sd = m_service_build_info_base.subDomain();
96 if (!sd)
97 return {};
98 if (mesh)
99 return _create(name,ServiceBuildInfoBase(sd,mesh));
100 return _create(name,ServiceBuildInfoBase(sd));
101 }
102
103 /*!
104 * \brief Créé une instance du service \a name pour le maillage \a mesh.
105 *
106 * Cela n'est valide que pour les services de sous-domaine. Pour les autres,
107 * cela est sans effet.
108 * L'appelant doit détruire ces services.
109 * Retourne nul si aucun service de ce nom n'existe.
110 */
112 {
113 ISubDomain* sd = m_service_build_info_base.subDomain();
114 if (!sd)
115 return {};
116 if (mesh)
117 return _createReference(name,ServiceBuildInfoBase(sd,mesh));
118 return _createReference(name,ServiceBuildInfoBase(sd));
119 }
120
121 /*!
122 * \brief Instance singleton du service ayant pour interface \a InterfaceType.
123 *
124 * Retourne nul si aucun service n'est trouvé
125 */
126 virtual InterfaceType* getSingleton()
127 {
128 IServiceMng* sm = m_service_build_info_base.serviceParent()->serviceMng();
129 SingletonServiceInstanceCollection singleton_services = sm->singletonServices();
130 for( typename SingletonServiceInstanceCollection::Enumerator i(singleton_services); ++i; ){
131 ISingletonServiceInstance* ssi = (*i).get();
132 if (ssi){
133 for( typename ServiceInstanceCollection::Enumerator k(ssi->interfaceInstances()); ++k; ){
134 IServiceInstance* sub_isi = (*k).get();
135 auto m = dynamic_cast< IServiceInstanceT<InterfaceType>* >(sub_isi);
136 if (m)
137 return m->instance().get();
138 }
139 }
140 }
141 return nullptr;
142 }
143
144 /*!
145 * \brief Créé une instance de chaque service qui implémente \a InterfaceType.
146 *
147 * L'appelant doit détruire ces services via l'appel à 'operator delete'.
148 *
149 * \deprecated Utilise ls surcharge prenant en argument un tableau de références.
150 */
151 ARCCORE_DEPRECATED_2019("Use createAll(Array<ServiceRef<InterfaceType>>&) instead")
152 virtual void createAll(Array<InterfaceType*>& instances)
153 {
154 _createAll(instances,m_service_build_info_base);
155 }
156
157 /*!
158 * \brief Créé une instance de chaque service qui implémente \a InterfaceType.
159 */
161 {
162 return _createAll(m_service_build_info_base);
163 }
164
165 public:
166
167 SharedArray<FactoryType*> factories()
168 {
169 SharedArray<FactoryType*> m_factories;
170 for( typename ServiceFactory2Collection::Enumerator j(this->m_application->serviceFactories2()); ++j; ){
171 IServiceFactory2* sf2 = *j;
173 //m_application->traceMng()->info() << " FOUND sf2=" << sf2 << " M=" << m;
174 if (m){
175 m_factories.add(m);
176 }
177 }
178 return m_factories.constView();
179 }
180
181 void getServicesNames(Array<String>& names) const
182 {
183 for( typename ServiceFactory2Collection::Enumerator j(this->m_application->serviceFactories2()); ++j; ){
184 IServiceFactory2* sf2 = *j;
185 IServiceFactory2T<InterfaceType>* true_factory = dynamic_cast< IServiceFactory2T<InterfaceType>* >(sf2);
186 if (true_factory){
187 IServiceInfo* si = sf2->serviceInfo();
188 names.add(si->localName());
189 }
190 }
191 }
192
193 protected:
194
195 InterfaceType* _create(const String& name,const ServiceBuildInfoBase& sbib)
196 {
197 return _createReference(name,sbib)._release();
198 }
199
200 Ref<InterfaceType> _createReference(const String& name,const ServiceBuildInfoBase& sbib)
201 {
202 for( typename ServiceFactory2Collection::Enumerator j(this->m_application->serviceFactories2()); ++j; ){
203 Internal::IServiceFactory2* sf2 = *j;
204 IServiceInfo* s = sf2->serviceInfo();
205 if (s->localName()!=name)
206 continue;
207 IServiceFactory2T<InterfaceType>* m = dynamic_cast< IServiceFactory2T<InterfaceType>* >(sf2);
208 //m_application->traceMng()->info() << " FOUND sf2=" << sf2 << " M=" << m;
209 if (m){
210 Ref<InterfaceType> tt = m->createServiceReference(sbib);
211 if (!tt.isNull())
212 return tt;
213 }
214 }
215 return {};
216 }
217
218 void _createAll(Array<InterfaceType*>& instances,const ServiceBuildInfoBase& sbib)
219 {
220 UniqueArray<Ref<InterfaceType>> ref_instances = _createAll(sbib);
221 for( auto& x : ref_instances )
222 instances.add(x._release());
223 }
224
225 UniqueArray<Ref<InterfaceType>> _createAll(const ServiceBuildInfoBase& sbib)
226 {
227 UniqueArray<Ref<InterfaceType>> instances;
228 for( typename ServiceFactory2Collection::Enumerator j(this->m_application->serviceFactories2()); ++j; ){
229 Internal::IServiceFactory2* sf2 = *j;
230 IServiceFactory2T<InterfaceType>* m = dynamic_cast< IServiceFactory2T<InterfaceType>* >(sf2);
231 if (m){
232 Ref<InterfaceType> tt = m->createServiceReference(sbib);
233 if (tt.get()){
234 instances.add(tt);
235 }
236 }
237 }
238 return instances;
239 }
240
241 protected:
242
243 IApplication* m_application;
244 ServiceBuildInfoBase m_service_build_info_base;
245};
246
247/*---------------------------------------------------------------------------*/
248/*---------------------------------------------------------------------------*/
249
250} // End namespace Internal
251
252namespace Arcane
253{
254
255/*---------------------------------------------------------------------------*/
256/*---------------------------------------------------------------------------*/
257/*!
258 * \brief Classe utilitaire pour retrouver un ou plusieurs services
259 * implémentant l'interface \a InterfaceType.
260 * \deprecated Cette classe ne doit plus être utilisée directement.
261 * Il faut utiliser à la place ServiceBuilder.
262 */
263template<typename InterfaceType,typename ParentType>
264class ServiceFinder2T
265: public Internal::ServiceFinderBase2T<InterfaceType>
266{
267 public:
268 ServiceFinder2T(IApplication* app,ParentType* parent)
270 {
271 }
272
273 ~ServiceFinder2T(){}
274
275 public:
276};
277
278/*---------------------------------------------------------------------------*/
279/*---------------------------------------------------------------------------*/
280
281} // End namespace Arcane
282
283/*---------------------------------------------------------------------------*/
284/*---------------------------------------------------------------------------*/
285
286#endif
Classe de base des vecteurs 1D de données.
void add(ConstReferenceType val)
Ajoute l'élément val à la fin du tableau.
ConstArrayView< T > constView() const
Vue constante sur ce tableau.
EnumeratorT< SingletonServiceInstanceRef > Enumerator
Definition Collection.h:129
Interface de l'application.
virtual ServiceFactory2Collection serviceFactories2()=0
Liste des fabriques de service.
Interface d'une instance d'un service.
Definition IService.h:67
Interface du gestionnaire de services.
Definition IServiceMng.h:31
virtual SingletonServiceInstanceCollection singletonServices() const =0
Retourne la liste des services singleton.
virtual ServiceInstanceCollection interfaceInstances()=0
Liste des instances des interfaces implémentées par le singleton.
Interface du gestionnaire d'un sous-domaine.
Definition ISubDomain.h:74
virtual InterfaceType * create(const String &name)
Créé une instance du service name.
virtual UniqueArray< Ref< InterfaceType > > createAll()
Créé une instance de chaque service qui implémente InterfaceType.
virtual void createAll(Array< InterfaceType * > &instances)
Créé une instance de chaque service qui implémente InterfaceType.
virtual InterfaceType * getSingleton()
Instance singleton du service ayant pour interface InterfaceType.
virtual Ref< InterfaceType > createReference(const String &name, IMesh *mesh)
Créé une instance du service name pour le maillage mesh.
virtual Ref< InterfaceType > createReference(const String &name)
Créé une instance du service name.
Référence à une instance.
Informations pour créer un service.
Vecteur 1D de données avec sémantique par référence.
Chaîne de caractères unicode.
Vecteur 1D de données avec sémantique par valeur (style STL).
InstanceType * get() const
Instance associée ou nullptr si aucune.
Types interne à Arcane.
Definition ArcaneTypes.h:97
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
Collection< SingletonServiceInstanceRef > SingletonServiceInstanceCollection
Collection d'instances de services singletons.