Skip to content

Commit f2d3be1

Browse files
committed
update
1 parent a7bc6cd commit f2d3be1

File tree

4 files changed

+20
-24
lines changed

4 files changed

+20
-24
lines changed

Include/SevenBit/DI/Details/Factories/ServiceFactory.hpp

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,15 @@ namespace sb::di::details
2020
public:
2121
IServiceInstance::Ptr createInstance(ServiceProvider &serviceProvider, const bool inPlaceRequest) const override
2222
{
23-
Injector injector{serviceProvider};
2423
if (inPlaceRequest)
2524
{
26-
return injector.template makeUnique<InPlaceService<T>>();
25+
return std::unique_ptr<InPlaceService<T>>(inject<InPlaceService<T>>(serviceProvider));
2726
}
28-
return injector.template makeUnique<UniquePtrService<T>>();
27+
return std::unique_ptr<UniquePtrService<T>>(inject<UniquePtrService<T>>(serviceProvider));
2928
}
29+
30+
private:
31+
template <class S> S *inject(ServiceProvider &serviceProvider) { return CtorInjector<S>{serviceProvider}(); }
3032
};
3133

3234
} // namespace sb::di::details

Include/SevenBit/DI/Details/Factories/ServiceFcnFactory.hpp

Lines changed: 6 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -16,42 +16,29 @@ namespace sb::di::details
1616
template <class FactoryFcn> class ServiceFcnFactory final : public IServiceFactory
1717
{
1818
using Injector = FunctorInjector<FactoryFcn>;
19+
using FunctorReturnType = decltype(Injector{nullptr, nullptr}());
20+
static constexpr bool isReturnTypeOk = IsUniquePtrV<FunctorReturnType> || IsInPlaceServiceV<FunctorReturnType>;
21+
static_assert(isReturnTypeOk || notSupportedType<FactoryFcn>,
22+
"Service factory return type must be std::unique_ptr<TService> or copyable/movable object");
1923

2024
mutable FactoryFcn _factoryFunction;
2125

2226
public:
23-
using FunctorReturnType = decltype(Injector{nullptr, nullptr}());
2427
using ServiceType = RemoveUniquePtrT<FunctorReturnType>;
2528

2629
explicit ServiceFcnFactory(FactoryFcn &&factoryFunction) : _factoryFunction{std::move(factoryFunction)} {}
2730

2831
IServiceInstance::Ptr createInstance(ServiceProvider &serviceProvider, const bool inPlaceRequest) const override
2932
{
3033
Injector injector{_factoryFunction, serviceProvider};
31-
if constexpr (IsUniquePtrV<FunctorReturnType>)
32-
{
33-
return injector.template makeUnique<UniquePtrService<ServiceType>>();
34-
}
35-
else if constexpr (IsInPlaceServiceV<FunctorReturnType>)
34+
if constexpr (!IsUniquePtrV<FunctorReturnType>)
3635
{
3736
if (inPlaceRequest)
3837
{
3938
return injector.template makeUnique<InPlaceService<ServiceType>>();
4039
}
41-
return injector.template makeUnique<UniquePtrService<ServiceType>>();
4240
}
43-
else
44-
{
45-
badFunctor();
46-
return nullptr;
47-
}
48-
}
49-
50-
private:
51-
static void badFunctor()
52-
{
53-
static_assert(notSupportedType<FactoryFcn>,
54-
"Service factory return type must be std::unique_ptr<TService> or copyable/movable object");
41+
return injector.template makeUnique<UniquePtrService<ServiceType>>();
5542
}
5643
};
5744
} // namespace sb::di::details

Include/SevenBit/DI/Details/Helpers/CtorInjector.hpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@ namespace sb::di::details
4141
explicit CtorInjector(ServiceProvider &serviceProvider) : _serviceProvider(serviceProvider) {}
4242
explicit CtorInjector(ServiceProvider *serviceProvider) : CtorInjector(*serviceProvider) {}
4343

44+
T *operator()() { return makeNew(std::make_index_sequence<parametersNumber>{}); };
45+
4446
template <class TWrapper> std::unique_ptr<TWrapper> makeUnique()
4547
{
4648
return makeUnique<TWrapper>(std::make_index_sequence<parametersNumber>{});
@@ -52,6 +54,11 @@ namespace sb::di::details
5254
{
5355
return std::make_unique<TWrapper>(ServiceExtractor<T>(&_serviceProvider, ParamNumber)...);
5456
}
57+
58+
template <std::size_t... ParamNumber> T *makeNew(std::index_sequence<ParamNumber...>)
59+
{
60+
return new T *{ServiceExtractor<T>(&_serviceProvider, ParamNumber)...};
61+
}
5562
};
5663

5764
} // namespace sb::di::details

Include/SevenBit/DI/Details/Helpers/FunctorInjector.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,12 @@ namespace sb::di::details
88
{
99
template <class F> class FunctorInjector
1010
{
11+
static_assert(IsFunctorV<F> || notSupportedType<F>, "Object is not functor/lambda");
12+
1113
F &_functor;
1214
ServiceProvider &_serviceProvider;
1315

1416
public:
15-
static_assert(IsFunctorV<F> || notSupportedType<F>, "Object is not functor/lambda");
16-
1717
FunctorInjector(F &functor, ServiceProvider &provider) : _functor(functor), _serviceProvider(provider) {}
1818
FunctorInjector(F *functor, ServiceProvider *provider) : FunctorInjector(*functor, *provider) {}
1919

0 commit comments

Comments
 (0)