Add GetDependencyGraph method to ServiceContextBuilder
This commit is contained in:
parent
18365b6386
commit
f2db8a222a
1 changed files with 34 additions and 6 deletions
|
@ -69,7 +69,7 @@ struct ServiceContext {
|
||||||
storage{
|
storage{
|
||||||
[&]<auto... Is>(std::index_sequence<Is...>) -> utempl::Tuple<Ts...> {
|
[&]<auto... Is>(std::index_sequence<Is...>) -> utempl::Tuple<Ts...> {
|
||||||
return {[&]<auto I>(utempl::Wrapper<I>) {
|
return {[&]<auto I>(utempl::Wrapper<I>) {
|
||||||
return [&]() -> std::remove_cvref_t<decltype(Get<I>(storage))> {
|
return [&] -> std::remove_cvref_t<decltype(Get<I>(storage))> {
|
||||||
return {utempl::Wrapper<Get<I>(names)>{}, *this};
|
return {utempl::Wrapper<Get<I>(names)>{}, *this};
|
||||||
};
|
};
|
||||||
}(utempl::Wrapper<Is>{})...};
|
}(utempl::Wrapper<Is>{})...};
|
||||||
|
@ -202,14 +202,18 @@ public:
|
||||||
static constexpr auto FindComponent() -> T&;
|
static constexpr auto FindComponent() -> T&;
|
||||||
|
|
||||||
template <std::size_t I = 0, typename... TTs>
|
template <std::size_t I = 0, typename... TTs>
|
||||||
static consteval auto GetDependencies() requires
|
static consteval auto GetDependencies() requires (I == 0 ||
|
||||||
requires {Magic(loopholes::Getter<DependencyInfoKey<Current, I>{}>{});} {
|
requires {Magic(loopholes::Getter<DependencyInfoKey<Current, I>{}>{});}) {
|
||||||
|
if constexpr(I == 0 && !requires {Magic(loopholes::Getter<DependencyInfoKey<Current, I>{}>{});}) {
|
||||||
|
return utempl::TypeList{};
|
||||||
|
} else {
|
||||||
if constexpr(requires{GetDependencies<I + 1, TTs...>();}) {
|
if constexpr(requires{GetDependencies<I + 1, TTs...>();}) {
|
||||||
return GetDependencies<I + 1, TTs..., typename decltype(Magic(loopholes::Getter<DependencyInfoKey<Current, I>{}>{}))::Type>();
|
return GetDependencies<I + 1, TTs..., typename decltype(Magic(loopholes::Getter<DependencyInfoKey<Current, I>{}>{}))::Type>();
|
||||||
} else {
|
} else {
|
||||||
return utempl::kTypeList<TTs..., typename decltype(Magic(loopholes::Getter<DependencyInfoKey<Current, I>{}>{}))::Type>;
|
return utempl::kTypeList<TTs..., typename decltype(Magic(loopholes::Getter<DependencyInfoKey<Current, I>{}>{}))::Type>;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
};
|
||||||
|
|
||||||
template <utempl::ConstexprString name>
|
template <utempl::ConstexprString name>
|
||||||
static inline consteval auto Inject() {
|
static inline consteval auto Inject() {
|
||||||
|
@ -219,6 +223,16 @@ public:
|
||||||
|
|
||||||
} // namespace impl
|
} // namespace impl
|
||||||
|
|
||||||
|
template <typename T, utempl::TypeList Dependencies>
|
||||||
|
struct DependencyGraphElement {};
|
||||||
|
|
||||||
|
|
||||||
|
template <typename... Ts>
|
||||||
|
struct DependencyGraph {
|
||||||
|
static constexpr auto kValue = utempl::TypeList<Ts...>{};
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
template <ConstexprConfig config = {}, typename... Ts>
|
template <ConstexprConfig config = {}, typename... Ts>
|
||||||
struct ServiceContextBuilder {
|
struct ServiceContextBuilder {
|
||||||
static constexpr auto kList = utempl::kTypeList<Ts...>;
|
static constexpr auto kList = utempl::kTypeList<Ts...>;
|
||||||
|
@ -257,6 +271,20 @@ struct ServiceContextBuilder {
|
||||||
return config;
|
return config;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static consteval auto GetDependencyGraph() {
|
||||||
|
return [&]<utempl::ConstexprString... names, typename... TTs, Options... Options>
|
||||||
|
(ComponentConfig<names, TTs, Options>...){
|
||||||
|
return DependencyGraph<DependencyGraphElement<TTs,
|
||||||
|
[]<utempl::ConstexprString name, typename T, ::cserver::Options OOptions>
|
||||||
|
(ComponentConfig<name, T, OOptions>) {
|
||||||
|
impl::DependencyInfoInjector<T, config, Ts...> injector;
|
||||||
|
injector.template Inject<name>();
|
||||||
|
return injector.GetDependencies();
|
||||||
|
}(Ts{})>...>{};
|
||||||
|
}(Ts{}...);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
static constexpr auto Run() -> void {
|
static constexpr auto Run() -> void {
|
||||||
[]<utempl::ConstexprString... names, typename... TTs, Options... Options>
|
[]<utempl::ConstexprString... names, typename... TTs, Options... Options>
|
||||||
(utempl::TypeList<ComponentConfig<names, TTs, Options>...>) {
|
(utempl::TypeList<ComponentConfig<names, TTs, Options>...>) {
|
||||||
|
|
Loading…
Reference in a new issue