Skip to content

Commit 41b047c

Browse files
committed
refactor meta code
1 parent ea424ea commit 41b047c

18 files changed

+135
-130
lines changed

Docs/advanced-guides/injected-utility-class.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ Injected Utility Class
22
========================================
33

44
The library provides also Injected_ utility class.
5-
This base class has inject() method that can be used to inject services in a simple inline way, also
5+
This base class has inject() method that can be used to injectParameter services in a simple inline way, also
66
there are InjectedSingleton, InjectedScoped and InjectedTransient base classes that inherit
77
from Injected and Registered classes to combine these two features. The injected class has also a method
88
getProvider(), the raw provider can be used to get keyed services for example.

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,13 @@ namespace sb::di::details
1414
{
1515
template <class T> class ServiceFactory final : public IServiceFactory
1616
{
17+
private:
18+
using Injector = CtorInjector<T>;
19+
1720
public:
1821
IServiceInstance::Ptr createInstance(ServiceProvider &serviceProvider, const bool inPlaceRequest) const override
1922
{
20-
CtorInjector<T> injector{serviceProvider};
23+
Injector injector{serviceProvider};
2124
if (inPlaceRequest)
2225
{
2326
return injector.template makeUnique<InPlaceService<T>>();

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

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@
55

66
#include "SevenBit/DI/LibraryConfig.hpp"
77

8-
#include "SevenBit/DI/Details/Helpers/FunctorInjector.hpp"
9-
#include "SevenBit/DI/Details/Meta/Meta.hpp"
8+
#include "SevenBit/DI/Details/Meta/FunctorInjectorResolver.hpp"
9+
#include "SevenBit/DI/Details/Meta/Type.hpp"
1010
#include "SevenBit/DI/Details/Services/InPlaceService.hpp"
1111
#include "SevenBit/DI/Details/Services/UniquePtrService.hpp"
1212
#include "SevenBit/DI/IServiceFactory.hpp"
@@ -15,28 +15,30 @@ namespace sb::di::details
1515
{
1616
template <class FactoryFcn> class ServiceFcnFactory final : public IServiceFactory
1717
{
18+
using Injector = ResolveFunctorInjector<FactoryFcn>;
19+
1820
mutable FactoryFcn _factoryFunction;
1921

2022
public:
21-
using FunctorReturnType = typename FunctorInjector<FactoryFcn>::ReturnType;
23+
using FunctorReturnType = typename Injector::ReturnType;
2224
using ServiceType = RemoveUniquePtrT<FunctorReturnType>;
2325

2426
explicit ServiceFcnFactory(FactoryFcn &&factoryFunction) : _factoryFunction{std::move(factoryFunction)} {}
2527

2628
IServiceInstance::Ptr createInstance(ServiceProvider &serviceProvider, const bool inPlaceRequest) const override
2729
{
28-
FunctorInjector<FactoryFcn> injector{_factoryFunction, serviceProvider};
30+
Injector injector{_factoryFunction, serviceProvider};
2931
if constexpr (IsUniquePtrV<FunctorReturnType>)
3032
{
31-
return std::make_unique<UniquePtrService<ServiceType>>(injector.call());
33+
return injector.template makeUnique<UniquePtrService<ServiceType>>();
3234
}
3335
else if constexpr (IsInPlaceServiceV<FunctorReturnType>)
3436
{
3537
if (inPlaceRequest)
3638
{
37-
return std::make_unique<InPlaceService<ServiceType>>(injector.call());
39+
return injector.template makeUnique<InPlaceService<ServiceType>>();
3840
}
39-
return std::make_unique<UniquePtrService<ServiceType>>(injector.call());
41+
return injector.template makeUnique<UniquePtrService<ServiceType>>();
4042
}
4143
else
4244
{

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

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,28 +4,29 @@
44

55
#include "SevenBit/DI/LibraryConfig.hpp"
66

7-
#include "SevenBit/DI/Details/Meta/CtorParamsNumber.hpp"
8-
#include "SevenBit/DI/Details/Meta/ServiceCtorArgExtractor.hpp"
7+
#include "SevenBit/DI/Details/Meta/TypeCtorInfo.hpp"
98
#include "SevenBit/DI/ServiceProvider.hpp"
109

1110
namespace sb::di::details
1211
{
1312
template <class T> class CtorInjector
1413
{
14+
using TCtorInfo = TypeCtorInfo<T>;
1515
ServiceProvider &_serviceProvider;
1616

1717
public:
1818
explicit CtorInjector(ServiceProvider &serviceProvider) : _serviceProvider(serviceProvider) {}
1919

20-
template <class TWrapper> auto makeUnique()
20+
template <class TWrapper> std::unique_ptr<TWrapper> makeUnique()
2121
{
22-
return makeUnique<TWrapper>(std::make_index_sequence<CtorParamsNumber::value<T>>{});
22+
return makeUnique<TWrapper>(std::make_index_sequence<TCtorInfo::parametersNumber>{});
2323
};
2424

2525
private:
26-
template <class TWrapper, std::size_t... Index> auto makeUnique(std::index_sequence<Index...>)
26+
template <class TWrapper, std::size_t... ParamNumber>
27+
std::unique_ptr<TWrapper> makeUnique(std::index_sequence<ParamNumber...>)
2728
{
28-
return std::make_unique<TWrapper>(ServiceCtorArgExtractor<T>{_serviceProvider, Index}...);
29+
return std::make_unique<TWrapper>(TCtorInfo::ArgExtractor(&_serviceProvider, ParamNumber)...);
2930
}
3031
};
3132

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

Lines changed: 9 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -6,49 +6,34 @@
66

77
namespace sb::di::details
88
{
9-
template <class R, class F, class... Args> class InternalFunctorInjector
9+
template <class R, class F, class... Args> class FunctorInjector
1010
{
1111
F &_functor;
1212
ServiceProvider &_serviceProvider;
1313

1414
public:
1515
using ReturnType = R;
1616

17-
InternalFunctorInjector(F &functor, ServiceProvider &serviceProvider)
17+
FunctorInjector(F &functor, ServiceProvider &serviceProvider)
1818
: _functor(functor), _serviceProvider(serviceProvider)
1919
{
2020
}
2121

22-
R call() { return _functor(ServiceGetter<Args>::get(_serviceProvider)...); }
22+
template <class TWrapper> std::unique_ptr<TWrapper> makeUnique()
23+
{
24+
return std::make_unique<TWrapper>(_functor(ServiceGetter<Args>::get(_serviceProvider)...));
25+
}
2326
};
2427

25-
template <class F> struct InternalBadFunctor
28+
template <class F> struct BadFunctorInjector
2629
{
2730
using ReturnType = int;
2831

29-
InternalBadFunctor(F &, ServiceProvider &)
32+
BadFunctorInjector(F &, ServiceProvider &)
3033
{
3134
static_assert(notSupportedType<F>, "Object is not functor/lambda");
3235
}
3336

34-
int call() { return 0; }
35-
};
36-
37-
template <class F> struct FunctorInjectorResolver
38-
{
39-
using Injector = InternalBadFunctor<F>;
40-
};
41-
42-
template <class R, class F, class... Args> struct FunctorInjectorResolver<R (F::*)(Args...) const>
43-
{
44-
using Injector = InternalFunctorInjector<R, F, Args...>;
45-
};
46-
47-
template <class R, class F, class... Args> struct FunctorInjectorResolver<R (F::*)(Args...)>
48-
{
49-
using Injector = InternalFunctorInjector<R, F, Args...>;
37+
template <class TWrapper> std::unique_ptr<TWrapper> makeUnique() { return nullptr; }
5038
};
51-
52-
template <class TFunctor>
53-
using FunctorInjector = typename FunctorInjectorResolver<decltype(&TFunctor::operator())>::Injector;
5439
} // namespace sb::di::details

Include/SevenBit/DI/Details/Meta/CtorParamsNumber.hpp

Lines changed: 0 additions & 44 deletions
This file was deleted.
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
#pragma once
2+
3+
#include "SevenBit/DI/LibraryConfig.hpp"
4+
5+
#include "SevenBit/DI/Details/Helpers/FunctorInjector.hpp"
6+
7+
namespace sb::di::details
8+
{
9+
template <class F> struct FunctorInjectorResolver
10+
{
11+
using Injector = BadFunctorInjector<F>;
12+
};
13+
14+
template <class R, class F, class... Args> struct FunctorInjectorResolver<R (F::*)(Args...) const>
15+
{
16+
using Injector = FunctorInjector<R, F, Args...>;
17+
};
18+
19+
template <class R, class F, class... Args> struct FunctorInjectorResolver<R (F::*)(Args...)>
20+
{
21+
using Injector = FunctorInjector<R, F, Args...>;
22+
};
23+
24+
template <class TFunctor>
25+
using ResolveFunctorInjector = typename FunctorInjectorResolver<decltype(&TFunctor::operator())>::Injector;
26+
} // namespace sb::di::details

Include/SevenBit/DI/Details/Meta/ServiceCtorArgExtractor.hpp

Lines changed: 0 additions & 26 deletions
This file was deleted.

Include/SevenBit/DI/Details/Meta/ServiceGetter.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
#include "SevenBit/DI/LibraryConfig.hpp"
77

8-
#include "SevenBit/DI/Details/Meta/Meta.hpp"
8+
#include "SevenBit/DI/Details/Meta/Type.hpp"
99
#include "SevenBit/DI/ServiceProvider.hpp"
1010

1111
namespace sb::di::details

Include/SevenBit/DI/Details/Meta/Meta.hpp renamed to Include/SevenBit/DI/Details/Meta/Type.hpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77

88
namespace sb::di::details
99
{
10-
1110
template <class, class> struct IsCopyCtor : std::false_type
1211
{
1312
};
@@ -17,7 +16,7 @@ namespace sb::di::details
1716
template <class T> struct IsCopyCtor<T, const T> : std::true_type
1817
{
1918
};
20-
template <class T, class U> inline constexpr bool IsCopyCtorV = IsCopyCtor<T, U>::value;
19+
template <class T, class U> inline static constexpr bool IsCopyCtorV = IsCopyCtor<T, U>::value;
2120

2221
template <class T> struct IsUniquePtr : std::false_type
2322
{
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
#pragma once
2+
3+
#include "SevenBit/DI/LibraryConfig.hpp"
4+
5+
#include "SevenBit/DI/Details/Meta/ServiceGetter.hpp"
6+
#include "SevenBit/DI/Details/Meta/Type.hpp"
7+
8+
namespace sb::di::details
9+
{
10+
template <class T> class TypeCtorInfo
11+
{
12+
public:
13+
class ArgExtractor
14+
{
15+
ServiceProvider *_provider = nullptr;
16+
17+
public:
18+
explicit ArgExtractor(ServiceProvider *provider, std::size_t paramNumber = 0) : _provider(provider) {}
19+
20+
template <class S, class = std::enable_if_t<!IsCopyCtorV<T, S>>> operator S()
21+
{
22+
return ServiceGetter<std::remove_cv_t<S>>::get(*_provider);
23+
}
24+
template <class S, class = std::enable_if_t<!IsCopyCtorV<T, S>>> operator S &() const
25+
{
26+
return _provider->getService<std::remove_cv_t<S>>();
27+
}
28+
};
29+
30+
private:
31+
template <std::size_t... Ns>
32+
static constexpr auto paramsNumber(std::size_t) -> decltype(T{ArgExtractor{nullptr, Ns}...}, 0)
33+
{
34+
return sizeof...(Ns);
35+
}
36+
37+
template <std::size_t... Ns> static constexpr std::size_t paramsNumber(...)
38+
{
39+
40+
if constexpr (sizeof...(Ns) > _7BIT_DI_CTOR_PARAMS_LIMIT)
41+
{
42+
static_assert(
43+
details::notSupportedType<T>,
44+
"Proper constructor for specified type was not found, reached maximum constructor params number "
45+
"limit, to bump limit define macro _7BIT_DI_CTOR_PARAMS_LIMIT with new value before including lib");
46+
return 0;
47+
}
48+
else
49+
{
50+
return paramsNumber<Ns..., sizeof...(Ns)>(0);
51+
}
52+
}
53+
54+
public:
55+
static constexpr std::size_t parametersNumber = paramsNumber(0);
56+
};
57+
} // namespace sb::di::details

Include/SevenBit/DI/Details/Utils/Assert.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
#include "SevenBit/DI/LibraryConfig.hpp"
44

5-
#include "SevenBit/DI/Details/Meta/Meta.hpp"
5+
#include "SevenBit/DI/Details/Meta/Type.hpp"
66

77
namespace sb::di::details
88
{

Include/SevenBit/DI/OneOrList.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
#include "SevenBit/DI/LibraryConfig.hpp"
88

9-
#include "SevenBit/DI/Details/Meta/Meta.hpp"
9+
#include "SevenBit/DI/Details/Meta/Type.hpp"
1010

1111
namespace sb::di
1212
{

Include/SevenBit/DI/Utils/Injected.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
#include "SevenBit/DI/LibraryConfig.hpp"
44

55
#include "SevenBit/DI/Utils/Register.hpp"
6-
#include "SevenBit/DI/Utils/ServiceExtractor.hpp"
6+
#include "SevenBit/DI/Utils/ServiceInlineExtractor.hpp"
77

88
namespace sb::di
99
{
@@ -18,7 +18,7 @@ namespace sb::di
1818
protected:
1919
[[nodiscard]] ServiceProvider &getProvider() const { return _provider; }
2020

21-
[[nodiscard]] ServiceExtractor inject() const { return ServiceExtractor{getProvider()}; }
21+
[[nodiscard]] ServiceInlineExtractor inject() const { return ServiceInlineExtractor{getProvider()}; }
2222
};
2323

2424
template <class TService, class TImplementation = TService>

Include/SevenBit/DI/Utils/ServiceExtractor.hpp renamed to Include/SevenBit/DI/Utils/ServiceInlineExtractor.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99

1010
namespace sb::di
1111
{
12-
struct ServiceExtractor
12+
struct ServiceInlineExtractor
1313
{
1414
ServiceProvider &provider;
1515

0 commit comments

Comments
 (0)