14#include "arcane/utils/DependencyInjection.h"
16#include "arcane/utils/UniqueArray.h"
17#include "arcane/utils/ExternalRef.h"
18#include "arcane/utils/FatalErrorException.h"
23namespace Arcane::DependencyInjection
36 : m_instance(instance)
48 for (Integer i = 0, n = m_instance_list.size(); i < n; ++i)
49 delete m_instance_list[i].m_instance;
50 m_instance_list.clear();
56 Int32 index = m_instance_list.size();
57 m_instance_list.add(InstanceInfo{ instance, index });
59 IInjectedInstance* instance(Int32 index)
const {
return m_instance_list[index].m_instance; }
60 Int32 nbInstance()
const {
return m_instance_list.size(); }
63 UniqueArray<InstanceInfo> m_instance_list;
66 UniqueArray<Ref<impl::IInstanceFactory>> m_factories;
91_add(IInjectedInstance* instance)
93 m_p->addInstance(instance);
102 return m_p->nbInstance();
108IInjectedInstance* Injector::
109_value(Integer i)
const
111 return m_p->instance(i);
120 return m_p->m_factories.size();
126impl::IInstanceFactory* Injector::
127_factory(Integer i)
const
129 return m_p->m_factories[i].get();
140namespace Arcane::DependencyInjection::impl
146void ConstructorRegistererBase::
147_doError1(
const String& message,
int nb_value)
159 : m_property(property)
160 , m_name(property.name())
194 m_p->m_factories.add(f);
201hasName(
const String& str)
const
203 return str == m_p->m_name;
214: m_factory_create_func(
func)
215, m_factory_property(property)
229namespace Arcane::DependencyInjection
236fillWithGlobalFactories()
241 auto func =
g->infoCreatorWithPropertyFunction();
244 fi = (*func)(
g->property());
246 m_p->m_factories.addRange(
fi->m_p->m_factories);
248 g =
g->nextRegisterer();
251 ARCANE_FATAL(
"Infinite loop in DependencyInjection global factories");
259printFactories()
const
261 std::ostringstream ostr;
263 auto f = [&](impl::IInstanceFactory* v) ->
bool {
264 const impl::ConcreteFactoryTypeInfo& cfi = v->concreteFactoryInfo();
265 ostr <<
"I=" << index <<
" " <<
typeid(v).name()
266 <<
"\n interface=" << cfi.interfaceTypeInfo().traceInfo()
267 <<
"\n concrete=" << cfi.concreteTypeInfo().traceInfo()
268 <<
"\n constructor=" << cfi.constructorTypeInfo().traceInfo()
273 FactoryVisitorFunctor ff(f);
274 _iterateFactories(String(), &ff);
275 String s = ostr.str();
291 Integer n = _nbFactory();
293 for (Integer i = 0; i < n; ++i) {
299 if (functor->execute(f))
311 IInstanceVisitorFunctor*
lambda)
314 Integer n = _nbValue();
315 for (Integer i = 0; i < n; ++i) {
330_doError(
const TraceInfo& ti,
const String& message)
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
#define ARCCORE_DEFINE_REFERENCE_COUNTED_CLASS(class_name)
Macro pour définir les méthodes et types une classe qui utilise un compteur de référence.
Interface d'un fonctor pour appliqué à chaque fabrique.
Informations pour une fabrique.
GlobalRegisterer(FactoryCreateFunc func, const ProviderProperty &property) noexcept
Crée en enregistreur pour le service name et la fonction func.
Fabrique pour une instance encapsulée par une référence (i.e Ref<T>).
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Chaîne de caractères unicode.
Espace de nom de Arccore.
Int32 Integer
Type représentant un entier.