Skip to content

Commit a7bc6cd

Browse files
committed
refactor injector code
1 parent 41b047c commit a7bc6cd

File tree

14 files changed

+90
-116
lines changed

14 files changed

+90
-116
lines changed

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

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,22 +5,22 @@
55

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

8-
#include "SevenBit/DI/Details/Meta/FunctorInjectorResolver.hpp"
9-
#include "SevenBit/DI/Details/Meta/Type.hpp"
8+
#include "SevenBit/DI/Details/Helpers/FunctorInjector.hpp"
109
#include "SevenBit/DI/Details/Services/InPlaceService.hpp"
1110
#include "SevenBit/DI/Details/Services/UniquePtrService.hpp"
11+
#include "SevenBit/DI/Details/Utils/Meta.hpp"
1212
#include "SevenBit/DI/IServiceFactory.hpp"
1313

1414
namespace sb::di::details
1515
{
1616
template <class FactoryFcn> class ServiceFcnFactory final : public IServiceFactory
1717
{
18-
using Injector = ResolveFunctorInjector<FactoryFcn>;
18+
using Injector = FunctorInjector<FactoryFcn>;
1919

2020
mutable FactoryFcn _factoryFunction;
2121

2222
public:
23-
using FunctorReturnType = typename Injector::ReturnType;
23+
using FunctorReturnType = decltype(Injector{nullptr, nullptr}());
2424
using ServiceType = RemoveUniquePtrT<FunctorReturnType>;
2525

2626
explicit ServiceFcnFactory(FactoryFcn &&factoryFunction) : _factoryFunction{std::move(factoryFunction)} {}
@@ -47,6 +47,7 @@ namespace sb::di::details
4747
}
4848
}
4949

50+
private:
5051
static void badFunctor()
5152
{
5253
static_assert(notSupportedType<FactoryFcn>,

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

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

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

7-
#include "SevenBit/DI/Details/Meta/TypeCtorInfo.hpp"
7+
#include "SevenBit/DI/Details/Helpers/ServiceExtractor.hpp"
88
#include "SevenBit/DI/ServiceProvider.hpp"
99

1010
namespace sb::di::details
1111
{
1212
template <class T> class CtorInjector
1313
{
14-
using TCtorInfo = TypeCtorInfo<T>;
14+
template <std::size_t... Ns>
15+
static constexpr auto paramsNumber(std::size_t) -> decltype(T{ServiceExtractor<T>{nullptr, Ns}...}, 0)
16+
{
17+
return sizeof...(Ns);
18+
}
19+
20+
template <std::size_t... Ns> static constexpr std::size_t paramsNumber(...)
21+
{
22+
if constexpr (sizeof...(Ns) > _7BIT_DI_CTOR_PARAMS_LIMIT)
23+
{
24+
static_assert(
25+
details::notSupportedType<T>,
26+
"Proper constructor for specified type was not found, reached maximum constructor params number "
27+
"limit, to bump limit define macro _7BIT_DI_CTOR_PARAMS_LIMIT with new value before including lib");
28+
return 0;
29+
}
30+
else
31+
{
32+
return paramsNumber<Ns..., sizeof...(Ns)>(0);
33+
}
34+
}
35+
1536
ServiceProvider &_serviceProvider;
1637

1738
public:
39+
static constexpr std::size_t parametersNumber = paramsNumber(0);
40+
1841
explicit CtorInjector(ServiceProvider &serviceProvider) : _serviceProvider(serviceProvider) {}
42+
explicit CtorInjector(ServiceProvider *serviceProvider) : CtorInjector(*serviceProvider) {}
1943

2044
template <class TWrapper> std::unique_ptr<TWrapper> makeUnique()
2145
{
22-
return makeUnique<TWrapper>(std::make_index_sequence<TCtorInfo::parametersNumber>{});
46+
return makeUnique<TWrapper>(std::make_index_sequence<parametersNumber>{});
2347
};
2448

2549
private:
2650
template <class TWrapper, std::size_t... ParamNumber>
2751
std::unique_ptr<TWrapper> makeUnique(std::index_sequence<ParamNumber...>)
2852
{
29-
return std::make_unique<TWrapper>(TCtorInfo::ArgExtractor(&_serviceProvider, ParamNumber)...);
53+
return std::make_unique<TWrapper>(ServiceExtractor<T>(&_serviceProvider, ParamNumber)...);
3054
}
3155
};
3256

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

Lines changed: 12 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2,38 +2,33 @@
22

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

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

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

1414
public:
15-
using ReturnType = R;
15+
static_assert(IsFunctorV<F> || notSupportedType<F>, "Object is not functor/lambda");
1616

17-
FunctorInjector(F &functor, ServiceProvider &serviceProvider)
18-
: _functor(functor), _serviceProvider(serviceProvider)
19-
{
20-
}
17+
FunctorInjector(F &functor, ServiceProvider &provider) : _functor(functor), _serviceProvider(provider) {}
18+
FunctorInjector(F *functor, ServiceProvider *provider) : FunctorInjector(*functor, *provider) {}
19+
20+
auto operator()() { return matchCall(&F::operator()); }
2121

2222
template <class TWrapper> std::unique_ptr<TWrapper> makeUnique()
2323
{
24-
return std::make_unique<TWrapper>(_functor(ServiceGetter<Args>::get(_serviceProvider)...));
24+
return std::make_unique<TWrapper>((*this)());
2525
}
26-
};
2726

28-
template <class F> struct BadFunctorInjector
29-
{
30-
using ReturnType = int;
27+
private:
28+
template <class R, class T, class... Args> R matchCall(R (T::*)(Args...)) { return call<R, Args...>(); }
3129

32-
BadFunctorInjector(F &, ServiceProvider &)
33-
{
34-
static_assert(notSupportedType<F>, "Object is not functor/lambda");
35-
}
30+
template <class R, class T, class... Args> R matchCall(R (T::*)(Args...) const) { return call<R, Args...>(); }
3631

37-
template <class TWrapper> std::unique_ptr<TWrapper> makeUnique() { return nullptr; }
32+
template <class R, class... Args> R call() { return _functor(ServiceGetter<Args>::get(_serviceProvider)...); }
3833
};
3934
} // namespace sb::di::details
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 "ServiceGetter.hpp"
6+
#include "SevenBit/DI/Details/Utils/Meta.hpp"
7+
8+
namespace sb::di::details
9+
{
10+
template <class T> class ServiceExtractor
11+
{
12+
ServiceProvider *_provider = nullptr;
13+
14+
public:
15+
explicit ServiceExtractor(ServiceProvider *provider, std::size_t paramNumber = 0) : _provider(provider) {}
16+
17+
template <class S, class = std::enable_if_t<!IsCopyCtorV<T, S>>> operator S()
18+
{
19+
return ServiceGetter<std::remove_cv_t<S>>::get(*_provider);
20+
}
21+
template <class S, class = std::enable_if_t<!IsCopyCtorV<T, S>>> operator S &() const
22+
{
23+
return _provider->getService<std::remove_cv_t<S>>();
24+
}
25+
};
26+
} // namespace sb::di::details

Include/SevenBit/DI/Details/Meta/ServiceGetter.hpp renamed to Include/SevenBit/DI/Details/Helpers/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/Type.hpp"
8+
#include "SevenBit/DI/Details/Utils/Meta.hpp"
99
#include "SevenBit/DI/ServiceProvider.hpp"
1010

1111
namespace sb::di::details

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

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

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

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

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/Type.hpp"
5+
#include "SevenBit/DI/Details/Utils/Meta.hpp"
66

77
namespace sb::di::details
88
{

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

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,17 @@
77

88
namespace sb::di::details
99
{
10+
template <class> struct IsFunctor : std::false_type
11+
{
12+
};
13+
template <class R, class T, class... Args> struct IsFunctor<R (T::*)(Args...)> : std::true_type
14+
{
15+
};
16+
template <class R, class T, class... Args> struct IsFunctor<R (T::*)(Args...) const> : std::true_type
17+
{
18+
};
19+
template <class T> inline static constexpr bool IsFunctorV = IsFunctor<decltype(&T::operator())>::value;
20+
1021
template <class, class> struct IsCopyCtor : std::false_type
1122
{
1223
};

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/Type.hpp"
9+
#include "SevenBit/DI/Details/Utils/Meta.hpp"
1010

1111
namespace sb::di
1212
{

Tests/Unit/Helpers/FunctorInjectorTest.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
#include "../../Helpers/Classes/Dependencies.hpp"
44
#include "../../Helpers/Mocks/ServiceProviderMock.hpp"
5-
#include <SevenBit/DI/Details/Meta/FunctorInjectorResolver.hpp>
5+
#include <SevenBit/DI/Details/Helpers/FunctorInjector.hpp>
66
#include <SevenBit/DI/Details/Services/InPlaceService.hpp>
77

88
class FunctorInjectorTest : public testing::Test
@@ -34,7 +34,7 @@ TEST_F(FunctorInjectorTest, ShouldInvokeFuncFactory)
3434
return 1;
3535
};
3636

37-
sb::di::details::ResolveFunctorInjector<decltype(func)> invoker{func, mock};
37+
sb::di::details::FunctorInjector<decltype(func)> invoker{func, mock};
3838

3939
auto res = invoker.makeUnique<int>();
4040
EXPECT_TRUE(res);

Tests/Unit/Helpers/ServiceGetterTest.cpp

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

33
#include "../../Helpers/Classes/Dependencies.hpp"
44
#include "../../Helpers/Mocks/ServiceProviderMock.hpp"
5-
#include <SevenBit/DI/Details/Meta/ServiceGetter.hpp>
5+
#include "SevenBit/DI/Details/Helpers/ServiceGetter.hpp"
66
#include <SevenBit/DI/Details/Services/InPlaceService.hpp>
77
#include <SevenBit/DI/Details/Services/UniquePtrService.hpp>
88

Tests/Unit/Utils/CtorParamsNumberTest.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
#include <gtest/gtest.h>
22

33
#include "../../Helpers/Classes/Complex.hpp"
4-
#include <SevenBit/DI/Details/Meta/TypeCtorInfo.hpp>
4+
#include <SevenBit/DI/Details/Helpers/FunctorInjector.hpp>
55

66
class CtorParamsNumberTest : public testing::Test
77
{

Tests/Unit/Utils/MetaTest.cpp

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

33
#include "../../Helpers/Classes/Complex.hpp"
44
#include "../../Helpers/Classes/MultiInherit.hpp"
5-
#include <SevenBit/DI/Details/Meta/Type.hpp>
5+
#include <SevenBit/DI/Details/Utils/Meta.hpp>
66

77
class MetaTest : public testing::Test
88
{

0 commit comments

Comments
 (0)