Skip to content

Commit e9abbfe

Browse files
committed
add inject keyed service ability
1 parent d576fc2 commit e9abbfe

4 files changed

Lines changed: 66 additions & 11 deletions

File tree

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

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,4 +23,26 @@ namespace sb::di::details
2323
return _provider->getService<std::remove_cv_t<S>>();
2424
}
2525
};
26+
27+
template <class T> class KeyedServiceExtractor
28+
{
29+
ServiceProvider *_provider = nullptr;
30+
const std::string_view _key;
31+
32+
public:
33+
explicit KeyedServiceExtractor(ServiceProvider *provider, const std::string_view key,
34+
std::size_t paramNumber = 0)
35+
: _provider(provider), _key(key)
36+
{
37+
}
38+
39+
template <class S, class = std::enable_if_t<!IsCopyCtorV<T, S>>> operator S()
40+
{
41+
return ServiceGetter<std::remove_cv_t<S>>::get(*_provider, _key);
42+
}
43+
template <class S, class = std::enable_if_t<!IsCopyCtorV<T, S>>> operator S &() const
44+
{
45+
return _provider->getKeyedService<std::remove_cv_t<S>>(_key);
46+
}
47+
};
2648
} // namespace sb::di::details

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

Lines changed: 21 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -13,43 +13,53 @@ namespace sb::di::details
1313

1414
template <class T> struct ServiceGetter
1515
{
16-
static auto get(ServiceProvider &provider)
16+
static_assert(IsInPlaceServiceV<T> || notSupportedType<T>,
17+
"Type is not supported as function argument parameter use objects, pointers, references, "
18+
"std::unique_ptr<T>, std::vector containing pointers or std::unique_ptr<T>");
19+
20+
static auto get(ServiceProvider &provider) { return provider.createServiceInPlace<T>(); }
21+
static auto get(ServiceProvider &provider, const std::string_view key)
1722
{
18-
if constexpr (IsInPlaceServiceV<T>)
19-
{
20-
return provider.createServiceInPlace<T>();
21-
}
22-
else
23-
{
24-
static_assert(notSupportedType<T>,
25-
"Type is not supported as function argument parameter use objects, pointers, references, "
26-
"std::unique_ptr<T>, std::vector containing pointers or std::unique_ptr<T>");
27-
}
23+
return provider.createKeyedServiceInPlace<T>(key);
2824
}
2925
};
3026

3127
template <class T> struct ServiceGetter<T *>
3228
{
3329
static T *get(ServiceProvider &sp) { return sp.tryGetService<T>(); }
30+
static T *get(ServiceProvider &sp, const std::string_view key) { return sp.tryGetKeyedService<T>(key); }
3431
};
3532

3633
template <class T> struct ServiceGetter<T &>
3734
{
3835
static T &get(ServiceProvider &sp) { return sp.getService<T>(); }
36+
static T &get(ServiceProvider &sp, const std::string_view key) { return sp.getKeyedService<T>(key); }
3937
};
4038

4139
template <class T> struct ServiceGetter<std::vector<T *>>
4240
{
4341
static std::vector<T *> get(ServiceProvider &sp) { return sp.getServices<T>(); }
42+
static std::vector<T *> get(ServiceProvider &sp, const std::string_view key)
43+
{
44+
return sp.getKeyedServices<T>(key);
45+
}
4446
};
4547

4648
template <class T> struct ServiceGetter<std::unique_ptr<T>>
4749
{
4850
static std::unique_ptr<T> get(ServiceProvider &sp) { return sp.createService<T>(); }
51+
static std::unique_ptr<T> get(ServiceProvider &sp, const std::string_view key)
52+
{
53+
return sp.createKeyedService<T>(key);
54+
}
4955
};
5056

5157
template <class T> struct ServiceGetter<std::vector<std::unique_ptr<T>>>
5258
{
5359
static std::vector<std::unique_ptr<T>> get(ServiceProvider &sp) { return sp.createServices<T>(); }
60+
static std::vector<std::unique_ptr<T>> get(ServiceProvider &sp, const std::string_view key)
61+
{
62+
return sp.createKeyedServices<T>(key);
63+
}
5464
};
5565
} // namespace sb::di::details

Include/SevenBit/DI/Utils/Injected.hpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,11 @@ namespace sb::di
1919
[[nodiscard]] ServiceProvider &getProvider() const { return _provider; }
2020

2121
[[nodiscard]] ServiceInlineExtractor inject() const { return ServiceInlineExtractor{getProvider()}; }
22+
23+
[[nodiscard]] KeyedServiceInlineExtractor inject(const std::string_view key) const
24+
{
25+
return KeyedServiceInlineExtractor{getProvider(), key};
26+
}
2227
};
2328

2429
template <class TService, class TImplementation = TService>

Include/SevenBit/DI/Utils/ServiceInlineExtractor.hpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,4 +25,22 @@ namespace sb::di
2525
return provider.getService<std::remove_cv_t<S>>();
2626
}
2727
};
28+
29+
struct KeyedServiceInlineExtractor
30+
{
31+
ServiceProvider &provider;
32+
const std::string_view key;
33+
34+
template <class S, class = std::enable_if_t<!std::is_null_pointer_v<S> && !details::IsInitializerListV<S>>>
35+
operator S()
36+
{
37+
return details::ServiceGetter<std::remove_cv_t<S>>::get(provider, key);
38+
}
39+
template <class S, class = std::enable_if_t<!std::is_const_v<S> && !std::is_null_pointer_v<S> &&
40+
!details::IsInitializerListV<S>>>
41+
operator S &() const
42+
{
43+
return provider.getKeyedService<std::remove_cv_t<S>>(key);
44+
}
45+
};
2846
} // namespace sb::di

0 commit comments

Comments
 (0)