Arcane  v3.15.3.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
DependencyInjection.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/* DependencyInjection.h (C) 2000-2025 */
9/* */
10/* Types et fonctions pour gérer le pattern 'DependencyInjection'. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCANE_UTILS_INTERNAL_DEPENDENCYINJECTION_H
13#define ARCANE_UTILS_INTERNAL_DEPENDENCYINJECTION_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
17/*
18 * NOTE: API en cours de définition. Ne pas utiliser.
19 */
20
21#include "arcane/utils/Ref.h"
22#include "arcane/utils/ExternalRef.h"
23#include "arcane/utils/GenericRegisterer.h"
24
26
27//TODO Mettre le lancement des exceptions dans le '.cc'
28#include "arcane/utils/NotImplementedException.h"
29
30#include <tuple>
31#include <typeinfo>
32
33// TODO: Améliorer les messages d'erreurs en cas d'échec de l'injection
34// TODO: Ajouter méthodes pour afficher le type en cas d'erreur (utiliser A_FUNC_INFO)
35// TODO: Ajouter mode verbose
36// TODO: Supporter plusieurs constructeurs et ne pas échouer si le premier
37// ne fonctionne pas
38// TODO: Supporter des instances externes (comme par exemple celles créées en C#).
39
40/*---------------------------------------------------------------------------*/
41/*---------------------------------------------------------------------------*/
42
43namespace Arcane::DependencyInjection
44{
45class Injector;
46}
47
48namespace Arcane::DependencyInjection::impl
49{
50class FactoryInfo;
51class FactoryInfoImpl;
52class IInstanceFactory;
53template <typename InterfaceType>
54class IConcreteFactory;
55class ConcreteFactoryTypeInfo;
56} // namespace Arcane::DependencyInjection::impl
57
59
60/*---------------------------------------------------------------------------*/
61/*---------------------------------------------------------------------------*/
62
63namespace Arcane::DependencyInjection
64{
65
66/*---------------------------------------------------------------------------*/
67/*---------------------------------------------------------------------------*/
68
69class ARCANE_UTILS_EXPORT IInjectedInstance
70{
71 public:
72 virtual ~IInjectedInstance() = default;
73 virtual bool hasName(const String& str) const = 0;
74 virtual bool hasTypeInfo(const std::type_info& tinfo) const = 0;
75};
76
77/*---------------------------------------------------------------------------*/
78/*---------------------------------------------------------------------------*/
85class ARCANE_UTILS_EXPORT ProviderProperty
86{
87 public:
88
89 ProviderProperty(const char* name)
90 : m_name(name)
91 {}
92
93 public:
94
95 const char* name() const { return m_name; }
96
97 private:
98
99 const char* m_name;
100};
101
102/*---------------------------------------------------------------------------*/
103/*---------------------------------------------------------------------------*/
104
105} // namespace Arcane::DependencyInjection
106
107/*---------------------------------------------------------------------------*/
108/*---------------------------------------------------------------------------*/
109
110namespace Arcane::DependencyInjection::impl
111{
112
113/*---------------------------------------------------------------------------*/
114/*---------------------------------------------------------------------------*/
115
117{
118 private:
119
120 TypeInfo(const TraceInfo& trace_info, const std::type_info& type_info)
121 : m_trace_info(trace_info)
122 , m_type_info(type_info)
123 {}
124
125 public:
126
127 template <typename Type> static TypeInfo create()
128 {
129 return TypeInfo(A_FUNCINFO, typeid(Type));
130 }
131 const TraceInfo& traceInfo() const { return m_trace_info; }
132 const std::type_info& stdTypeInfo() const { return m_type_info; }
133
134 private:
135
136 TraceInfo m_trace_info;
137 const std::type_info& m_type_info;
138};
139
140/*---------------------------------------------------------------------------*/
141/*---------------------------------------------------------------------------*/
149class ARCANE_UTILS_EXPORT ConcreteFactoryTypeInfo
150{
151 private:
152
154 : m_interface_info(a)
155 , m_concrete_info(b)
156 , m_constructor_info(c)
157 {}
158
159 public:
160
161 template <typename InterfaceType, typename ConcreteType, typename ConstructorType>
162 static ConcreteFactoryTypeInfo create()
163 {
164 return ConcreteFactoryTypeInfo(TypeInfo::create<InterfaceType>(),
165 TypeInfo::create<ConcreteType>(),
166 TypeInfo::create<ConstructorType>());
167 }
168 const TypeInfo& interfaceTypeInfo() const { return m_interface_info; }
169 const TypeInfo& concreteTypeInfo() const { return m_concrete_info; }
170 const TypeInfo& constructorTypeInfo() const { return m_constructor_info; }
171
172 private:
173
174 TypeInfo m_interface_info;
175 TypeInfo m_concrete_info;
176 TypeInfo m_constructor_info;
177};
178
179/*---------------------------------------------------------------------------*/
180/*---------------------------------------------------------------------------*/
185template <typename InterfaceType>
187: public IInjectedInstance
188{
189 public:
190
191 virtual Ref<InterfaceType> instance() = 0;
192
193 private:
194};
195
196/*---------------------------------------------------------------------------*/
197/*---------------------------------------------------------------------------*/
202template <typename InterfaceType>
204: public IInjectedRefInstanceT<InterfaceType>
205{
206 public:
207
209
210 public:
211
213 : m_instance(t_instance)
214 , m_name(t_name)
215 {}
216
217 public:
218
219 Ref<InterfaceType> instance() override { return m_instance; }
220 bool hasName(const String& str) const override { return m_name == str; }
221 bool hasTypeInfo(const std::type_info& tinfo) const override { return typeid(InstanceType) == tinfo; }
222
223 private:
224
225 InstanceType m_instance;
226 String m_name;
227};
228
229/*---------------------------------------------------------------------------*/
230/*---------------------------------------------------------------------------*/
235template <typename Type>
237: public IInjectedInstance
238{
239 public:
240
241 virtual Type instance() const = 0;
242};
243
244/*---------------------------------------------------------------------------*/
245/*---------------------------------------------------------------------------*/
250template <typename Type>
252: public IInjectedValueInstance<Type>
253{
254 public:
255
256 using InstanceType = Type;
257
258 public:
259
261 : m_instance(t_instance)
262 , m_name(t_name)
263 {}
264
265 public:
266
267 Type instance() const override { return m_instance; }
268 bool hasName(const String& str) const override { return m_name == str; }
269 bool hasTypeInfo(const std::type_info& tinfo) const override { return typeid(InstanceType) == tinfo; }
270
271 private:
272
273 Type m_instance;
274 String m_name;
275};
276
277/*---------------------------------------------------------------------------*/
278/*---------------------------------------------------------------------------*/
285class ARCANE_UTILS_EXPORT InjectedInstanceRef
286{
288
289 private:
290
291 explicit InjectedInstanceRef(const RefType& r)
292 : m_instance(r)
293 {}
294
295 public:
296
297 InjectedInstanceRef() = default;
298
299 public:
300
301 static InjectedInstanceRef createRef(IInjectedInstance* p)
302 {
303 return InjectedInstanceRef(RefType::create(p));
304 }
305 static InjectedInstanceRef createRefNoDestroy(IInjectedInstance* p)
306 {
307 return InjectedInstanceRef(RefType::_createNoDestroy(p));
308 }
309 static InjectedInstanceRef createWithHandle(IInjectedInstance* p, Internal::ExternalRef handle)
310 {
311 return InjectedInstanceRef(RefType::createWithHandle(p, handle));
312 }
313
314 public:
315
316 IInjectedInstance* get() const { return m_instance.get(); }
317 void reset() { m_instance.reset(); }
318
319 private:
320
321 RefType m_instance;
322};
323
324/*---------------------------------------------------------------------------*/
325/*---------------------------------------------------------------------------*/
330class ARCANE_UTILS_EXPORT IInstanceFactory
331{
333
334 protected:
335
336 virtual ~IInstanceFactory() = default;
337
338 public:
339
340 virtual InjectedInstanceRef createGenericReference(Injector& injector, const String& name) = 0;
341 virtual const FactoryInfoImpl* factoryInfoImpl() const = 0;
342 virtual ConcreteFactoryTypeInfo concreteFactoryInfo() const = 0;
343 virtual Int32 nbConstructorArg() const = 0;
344};
345
346/*---------------------------------------------------------------------------*/
347/*---------------------------------------------------------------------------*/
352class ARCANE_UTILS_EXPORT FactoryInfo
353{
355
356 private:
357
358 explicit FactoryInfo(const ProviderProperty& property);
359
360 public:
361
362 static FactoryInfo create(const ProviderProperty& property, const char* file_name, int line_number)
363 {
364 ARCANE_UNUSED(file_name);
365 ARCANE_UNUSED(line_number);
366 return FactoryInfo(property);
367 }
368 void addFactory(Ref<IInstanceFactory> f);
369 bool hasName(const String& str) const;
370 const FactoryInfoImpl* _impl() const { return m_p.get(); }
371
372 private:
373
374 std::shared_ptr<FactoryInfoImpl> m_p;
375};
376
377/*---------------------------------------------------------------------------*/
378/*---------------------------------------------------------------------------*/
391
392/*---------------------------------------------------------------------------*/
393/*---------------------------------------------------------------------------*/
394
395template <typename InterfaceType>
398{
399 // NOTE: On ne conserve pas une instance de 'FactoryInfo'
400 // mais uniquement son implémentation pour éviter des références croisées
401 // avec le std::shared_ptr.
402
403 public:
404
406 : m_factory_info_impl(si)
407 , m_sub_factory(sub_factory)
408 {
409 }
410
411 ~InstanceFactory() override
412 {
413 delete m_sub_factory;
414 }
415
416 InjectedInstanceRef createGenericReference(Injector& injector, const String& name) override
417 {
418 return _create(_createReference(injector), name);
419 }
420
421 Ref<InterfaceType> createReference(Injector& injector)
422 {
423 return _createReference(injector);
424 }
425
426 const FactoryInfoImpl* factoryInfoImpl() const override
427 {
428 return m_factory_info_impl;
429 }
430
431 ConcreteFactoryTypeInfo concreteFactoryInfo() const override
432 {
433 return m_sub_factory->concreteFactoryInfo();
434 }
435
436 Int32 nbConstructorArg() const override
437 {
438 return m_sub_factory->nbConstructorArg();
439 }
440
441 protected:
442
443 const FactoryInfoImpl* m_factory_info_impl = nullptr;
444 IConcreteFactory<InterfaceType>* m_sub_factory = nullptr;
445
446 private:
447
448 Ref<InterfaceType> _createReference(Injector& injector)
449 {
450 return m_sub_factory->createReference(injector);
451 }
452
453 InjectedInstanceRef _create(Ref<InterfaceType> it, const String& name)
454 {
455 IInjectedInstance* x = (!it) ? nullptr : new InjectedRefInstance<InterfaceType>(it, name);
456 return InjectedInstanceRef::createRef(x);
457 }
458};
459
460/*---------------------------------------------------------------------------*/
461/*---------------------------------------------------------------------------*/
462
463class ARCANE_UTILS_EXPORT IConcreteFactoryBase
464{
465 public:
466
467 virtual ~IConcreteFactoryBase() = default;
468
469 public:
470
471 virtual ConcreteFactoryTypeInfo concreteFactoryInfo() const = 0;
472 virtual Int32 nbConstructorArg() const = 0;
473};
474
475/*---------------------------------------------------------------------------*/
476/*---------------------------------------------------------------------------*/
482template <typename InterfaceType>
485{
486 public:
487
488 virtual ~IConcreteFactory() = default;
489
490 public:
491
494};
495
496/*---------------------------------------------------------------------------*/
497/*---------------------------------------------------------------------------*/
498
499class ARCANE_UTILS_EXPORT GlobalRegisterer
500: public GenericRegisterer<GlobalRegisterer>
501{
503 static BaseClass::Info m_global_registerer_info;
504
505 public:
506
507 static GenericRegisterer<GlobalRegisterer>::Info& registererInfo()
508 {
509 return m_global_registerer_info;
510 }
511
512 public:
513
514 typedef FactoryInfo (*FactoryCreateFunc)(const ProviderProperty& property);
515
516 public:
517
523 GlobalRegisterer(FactoryCreateFunc func, const ProviderProperty& property) noexcept;
524
525 public:
526
527 FactoryCreateFunc infoCreatorWithPropertyFunction() { return m_factory_create_func; }
528
530 const char* name() { return m_name; }
531
532 const ProviderProperty& property() const { return m_factory_property; }
533
534 private:
535
536 FactoryCreateFunc m_factory_create_func = nullptr;
537 const char* m_name = nullptr;
538 ProviderProperty m_factory_property;
539
540 private:
541};
542
543/*---------------------------------------------------------------------------*/
544/*---------------------------------------------------------------------------*/
545
546} // namespace Arcane::DependencyInjection::impl
547
548namespace Arcane::DependencyInjection
549{
550
551/*---------------------------------------------------------------------------*/
552/*---------------------------------------------------------------------------*/
556class ARCANE_UTILS_EXPORT Injector
557{
558 class Impl;
559 using FactoryFilterFunc = bool (*)(impl::IInstanceFactory*);
560
561 template <class Type>
563 {
564 public:
565
566 static IInjectedInstance* bind(const Type& t, const String& name)
567 {
568 return new impl::InjectedValueInstance<Type>(t, name);
569 }
570 static Type get(Injector& i, const String& name)
571 {
572 return i._getValue<Type>(name);
573 }
574 };
575
577 template <class PointerType>
578 class InjectorHelper<Ref<PointerType>>
579 {
580 public:
581
583
584 public:
585
586 static IInjectedInstance* bind(const ThatType& t, const String& name)
587 {
589 }
590 static ThatType get(Injector& i, const String& name)
591 {
592 return i._getRef<PointerType>(name);
593 }
594 };
599 {
600 public:
601
602 virtual ~IFactoryVisitorFunctor() = default;
603 virtual bool execute(impl::IInstanceFactory* f) = 0;
604 };
605
606 template <typename Lambda> class FactoryVisitorFunctor
608 {
609 public:
610
612 : m_lambda(lambda)
613 {}
614
615 public:
616
617 virtual bool execute(impl::IInstanceFactory* f) { return m_lambda(f); }
618
619 private:
620
621 Lambda& m_lambda;
622 };
623
628 {
629 public:
630
631 virtual ~IInstanceVisitorFunctor() = default;
632 virtual bool execute(IInjectedInstance* v) = 0;
633 };
634
635 template <typename Lambda> class InstanceVisitorFunctor
637 {
638 public:
639
641 : m_lambda(lambda)
642 {}
643
644 public:
645
646 virtual bool execute(IInjectedInstance* v) { return m_lambda(v); }
647
648 private:
649
650 Lambda& m_lambda;
651 };
652
653 public:
654
655 Injector();
656 Injector(const Injector&) = delete;
657 Injector& operator=(const Injector&) = delete;
658 ~Injector();
659
660 public:
661
662 template <typename Type> void
663 bind(Type iref, const String& name = String())
664 {
665 _add(InjectorHelper<Type>::bind(iref, name));
666 }
667
668 template <typename Type> Type
669 get(const String& name = String())
670 {
671 return InjectorHelper<Type>::get(*this, name);
672 }
673
687 template <typename InterfaceType> Ref<InterfaceType>
689 {
690 using FactoryType = impl::InstanceFactory<InterfaceType>;
691 Ref<InterfaceType> instance;
692 auto f = [&](impl::IInstanceFactory* v) -> bool {
693 auto* t = dynamic_cast<FactoryType*>(v);
694 //std::cout << "TRY DYNAMIC_CAST FACTORY v=" << v << " t=" << t << "\n";
695 if (t) {
696 Ref<InterfaceType> x = t->createReference(*this);
697 if (x.get()) {
698 instance = x;
699 return true;
700 }
701 }
702 return false;
703 };
705 _iterateFactories(implementation_name, &ff);
706 if (instance.get() || allow_null)
707 return instance;
708
709 // Pas d'implémentation correspondante trouvée.
710 // Dans ce cas on récupère la liste des implémentations valides et on les affiche dans
711 // le message d'erreur.
712 auto filter_func = [](impl::IInstanceFactory* v) -> bool {
713 return dynamic_cast<FactoryType*>(v) != nullptr;
714 };
715 _printValidImplementationAndThrow(A_FUNCINFO, implementation_name, filter_func);
716 }
717
718 String printFactories() const;
719
720 void fillWithGlobalFactories();
721
722 private:
723
724 Impl* m_p = nullptr;
725
726 private:
727
728 void _add(IInjectedInstance* instance);
729
730 // Itère sur la lambda et s'arrête dès que cette dernière retourne \a true
731 void _iterateInstances(const std::type_info& t_info, const String& instance_name,
732 IInstanceVisitorFunctor* lambda);
733 Integer _nbValue() const;
734 IInjectedInstance* _value(Integer i) const;
735
744 void _iterateFactories(const String& factory_name, IFactoryVisitorFunctor* functor) const;
745 Integer _nbFactory() const;
746 impl::IInstanceFactory* _factory(Integer i) const;
747
748 // Spécialisation pour les références
749 template <typename InterfaceType> Ref<InterfaceType>
750 _getRef(const String& instance_name)
751 {
753 InjectedType* t = nullptr;
754 auto f = [&](IInjectedInstance* v) -> bool {
755 t = dynamic_cast<InjectedType*>(v);
756 return t;
757 };
758 InstanceVisitorFunctor ff(f);
759 _iterateInstances(typeid(Ref<InterfaceType>), instance_name, &ff);
760 if (t)
761 return t->instance();
762 // TODO: faire un fatal ou créer l'instance
763 ARCANE_THROW(NotImplementedException, "Create Ref<InterfaceType> from factory");
764 }
765
766 template <typename Type> Type
767 _getValue(const String& instance_name)
768 {
769 using InjectedType = impl::IInjectedValueInstance<Type>;
770 InjectedType* t = nullptr;
771 auto f = [&](IInjectedInstance* v) -> bool {
772 t = dynamic_cast<InjectedType*>(v);
773 return t;
774 };
775 InstanceVisitorFunctor ff(f);
776 _iterateInstances(typeid(Type), instance_name, &ff);
777 if (t)
778 return t->instance();
779 _doError(A_FUNCINFO, "Can not find value for type");
780 }
781 [[noreturn]] void _printValidImplementationAndThrow(const TraceInfo& ti,
782 const String& implementation_name,
783 FactoryFilterFunc filter_func);
784 [[noreturn]] void _doError(const TraceInfo& ti, const String& message);
785};
786
787/*---------------------------------------------------------------------------*/
788/*---------------------------------------------------------------------------*/
789
790} // namespace Arcane::DependencyInjection
791
792namespace Arcane::DependencyInjection::impl
793{
794
795/*---------------------------------------------------------------------------*/
796/*---------------------------------------------------------------------------*/
797
798class ARCANE_UTILS_EXPORT ConstructorRegistererBase
799{
800 protected:
801
802 [[noreturn]] void _doError1(const String& message, int nb_value);
803};
804
811template <typename... Args>
814{
815 public:
816
817 using ArgsType = std::tuple<Args...>;
818
820
821 // Permet de récupérer via l'injecteur \a i le I-ème argument du tuple.
822 template <std::size_t I>
823 static auto _get(Injector& i) -> std::tuple_element_t<I, ArgsType>
824 {
825 using SelectedType = std::tuple_element_t<I, ArgsType>;
826 //std::cout << "RETURN _GET(I=" << I << ")\n";
827 return i.get<SelectedType>();
828 }
829
830 ArgsType createTuple(Injector& i)
831 {
832 // TODO: supporter plus d'arguments ou passer à des 'variadic templates'
833 constexpr int tuple_size = std::tuple_size<ArgsType>();
834 static_assert(tuple_size < 3, "Too many arguments for createTuple (max=2)");
835 if constexpr (tuple_size == 0) {
836 return ArgsType();
837 }
838 else if constexpr (tuple_size == 1) {
839 return ArgsType(_get<0>(i));
840 }
841 else if constexpr (tuple_size == 2) {
842 return ArgsType(_get<0>(i), _get<1>(i));
843 }
844 // Ne devrait pas arriver mais on ne sais jamais.
845 _doError1("Too many arguments for createTuple n={0} max=2", tuple_size);
846 }
847};
848
849/*---------------------------------------------------------------------------*/
850/*---------------------------------------------------------------------------*/
856template <typename InterfaceType, typename ConcreteType, typename ConstructorType>
858: public IConcreteFactory<InterfaceType>
859{
860 using Args = typename ConstructorType::ArgsType;
861
862 public:
863
865 {
867 ConcreteType* st = _create(ct.createTuple(injector));
868 return makeRef<InterfaceType>(st);
869 }
870 ConcreteFactoryTypeInfo concreteFactoryInfo() const override
871 {
872 return ConcreteFactoryTypeInfo::create<InterfaceType, ConcreteType, ConstructorType>();
873 }
874 Int32 nbConstructorArg() const override
875 {
876 return std::tuple_size<Args>();
877 }
878
879 private:
880
887 {
888 ConcreteType* st = std::apply([](auto&&... args) -> ConcreteType* { return new ConcreteType(args...); }, tuple_args);
889 return st;
890 }
891};
892
893/*---------------------------------------------------------------------------*/
894/*---------------------------------------------------------------------------*/
900template <typename... Interfaces>
902{
903 public:
904
911 template <typename ConcreteType, typename ConstructorType> void
913 {
914 _registerFactory<ConcreteType, ConstructorType, Interfaces...>(si);
915 }
916
917 private:
918
919 template <typename ConcreteType, typename ConstructorType,
920 typename InterfaceType, typename... OtherInterfaces>
921 void
922 _registerFactory(FactoryInfo& fi)
923 {
925 fi.addFactory(createRef<InstanceFactory<InterfaceType>>(fi._impl(), factory));
926 // Applique récursivement pour les autres interfaces si nécessaire
927 if constexpr (sizeof...(OtherInterfaces) > 0)
928 _registerFactory<ConcreteType, ConstructorType, OtherInterfaces...>(fi);
929 }
930};
931
932/*---------------------------------------------------------------------------*/
933/*---------------------------------------------------------------------------*/
940template <typename ConcreteType, typename InterfaceList>
942{
943 public:
944
946 template <typename... Constructors> void
948 {
949 _create(si, args...);
950 }
951
952 private:
953
954 // TODO: Créér l'instance de 'FactoryInfo' dans le constructeur
955 InterfaceList m_interface_list;
956
957 private:
958
960 template <typename ConstructorType> void
962 {
963 m_interface_list.template registerFactory<ConcreteType, ConstructorType>(si);
964 }
965
967 template <typename C1, typename C2, typename... OtherConstructors>
968 void _create(FactoryInfo& si, const C1& c1, const C2& c2, const OtherConstructors&... args)
969 {
970 _create<C1>(si, c1);
971 // Applique la récursivité sur les types restants
972 _create<C2, OtherConstructors...>(si, c2, args...);
973 }
974};
975
976/*---------------------------------------------------------------------------*/
977/*---------------------------------------------------------------------------*/
978
979} // namespace Arcane::DependencyInjection::impl
980
981/*---------------------------------------------------------------------------*/
982/*---------------------------------------------------------------------------*/
983
984#define ARCANE_DI_CONSTRUCTOR(...) \
985 ::Arcane::DependencyInjection::impl::ConstructorRegisterer<__VA_ARGS__>()
986
987#define ARCANE_DI_EMPTY_CONSTRUCTOR(...) \
988 ::Arcane::DependencyInjection::impl::ConstructorRegisterer<>()
989
990// TODO: garantir au moins une interface
991
992#define ARCANE_DI_INTERFACES(...) \
993 ::Arcane::DependencyInjection::impl::InterfaceListRegisterer<__VA_ARGS__>
994
995#define ARCANE_DI_REGISTER_PROVIDER(t_class, t_provider_property, t_interfaces, ...) \
996 namespace \
997 { \
998 Arcane::DependencyInjection::impl::FactoryInfo \
999 ARCANE_JOIN_WITH_LINE(arcaneCreateDependencyInjectionProviderInfo##t_class)(const Arcane::DependencyInjection::ProviderProperty& property) \
1000 { \
1001 auto si = Arcane::DependencyInjection::impl::FactoryInfo::create(property, __FILE__, __LINE__); \
1002 Arcane::DependencyInjection::impl::InjectionRegisterer<t_class, t_interfaces> injection_registerer; \
1003 injection_registerer.registerProviderInfo(si, __VA_ARGS__); \
1004 return si; \
1005 } \
1006 } \
1007 Arcane::DependencyInjection::impl::GlobalRegisterer ARCANE_EXPORT ARCANE_JOIN_WITH_LINE(globalServiceRegisterer##aclass)(&ARCANE_JOIN_WITH_LINE(arcaneCreateDependencyInjectionProviderInfo##t_class), t_provider_property)
1008
1009/*---------------------------------------------------------------------------*/
1010/*---------------------------------------------------------------------------*/
1011
1012#endif
#define ARCANE_THROW(exception_class,...)
Macro pour envoyer une exception avec formattage.
#define ARCCORE_DECLARE_REFERENCE_COUNTED_INCLASS_METHODS()
Macro pour déclarer les méthodes virtuelles gérant les compteurs de référence.
#define ARCCORE_DECLARE_REFERENCE_COUNTED_CLASS(class_name)
Macro pour déclarer qu'une classe utilise un compteur de référence.
#define ARCCORE_DEFINE_REFERENCE_COUNTED_INCLASS_METHODS()
Macro pour définir les méthodes gérant les compteurs de référence.
Interface d'un fonctor pour appliqué à chaque fabrique.
Interface d'un fonctor pour appliqué à chaque fabrique.
Ref< InterfaceType > createInstance(const String &implementation_name, bool allow_null=false)
Créé une instance implémentant une interface.
Fabrique pour le type ConcreteType pour l'interface InterfaceType via le constructeur ConstructorType...
ConcreteType * _create(const Args &&tuple_args)
Ref< InterfaceType > createReference(Injector &injector) override
Créé une instance du service .
Classe permettant d'enregistrer un constructeur pour créer un objet via un Injector....
Interface d'un fonctor de création d'une instance de service correspondant à l'interface InterfaceTyp...
virtual Ref< InterfaceType > createReference(Injector &)=0
Créé une instance du service .
Interface typée gérant l'instance d'un service.
Fabrique pour une instance encapsulée par une référence (i.e Ref<T>).
Interface typée gérant l'instance d'un service.
Interface typée gérant l'instance d'un service.
Classe permettant d'enregistrer des constructeurs pour créer un type ConcreteType implémentant les in...
void registerProviderInfo(FactoryInfo &si, const Constructors &... args)
Enregistre dans si les fabriques correspondentes aux constructeurs Constructors.
void _create(FactoryInfo &si, const C1 &c1, const C2 &c2, const OtherConstructors &... args)
Surcharge pour 2 constructeurs ou plus.
void _create(FactoryInfo &si, const ConstructorType &)
Surcharge pour 1 constructeur.
Classe permettant d'enregistrer la liste des interfaces d'un service. Interfaces contient la liste de...
void registerFactory(FactoryInfo &si)
Enregistre une fabrique.
Classe template pour gérer une liste globale permettant d'enregistrer des fabriques.
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Definition Lima.cc:149
Gestion des références sur un objet externe.
Exception lorsqu'une fonction n'est pas implémentée.
Référence à une instance.
Implémentation thread-safe d'un compteur de référence.
Chaîne de caractères unicode.
Type
Type of JSON value.
Definition rapidjson.h:665