Arcane  4.1.11.0
Documentation développeur
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/*---------------------------------------------------------------------------*/
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:
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
78 {
79 return _createReference(name,m_service_build_info_base);
80 }
81
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
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
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
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
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/*---------------------------------------------------------------------------*/
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
Tableau d'items de types quelconques.
ConstArrayView< T > constView() const
Vue constante sur ce tableau.
void add(ConstReferenceType val)
Ajoute l'élément val à la fin du tableau.
Interface de l'application.
virtual ServiceFactory2Collection serviceFactories2()=0
Liste des fabriques de service.
Interface typée gérant l'instance d'un service.
Definition IService.h:109
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.
Interface d'une instance de service singleton.
Definition IService.h:93
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
Fabrique pour un service implémentant l'interface InterfaceType.
Classe utilitaire pour retrouver un ou plusieurs services implémentant l'interface InterfaceType.
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.
InstanceType * get() const
Instance associée ou nullptr si aucune.
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).
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.