65 std::decay_t<meta::pack_head_t<DependenciesPack>>,
66 std::decay_t<Decoratee>
70 return std::expected<meta::RuntimeRef<RelatedEntity>,
Error> {
76 using NonDecoratedDependenciesPack
79 auto decorated_dependencies = std::tuple { decoratee };
81 auto maybe_non_decorated_dependencies_tuple = [
this, &context]<
82 typename... NonDecoratedDependencies
86 return [
this, &context]<std::size_t... Idx>(std::index_sequence<Idx...>) {
89 auto it = std::ranges::find_if(
90 this->dependency_tags_,
91 [](
const auto& tag_pair){
92 return tag_pair.first == Idx + 1;
96 if (it == std::ranges::end(this->dependency_tags_)) [[unlikely]]
100 .template resolve<std::decay_t<NonDecoratedDependencies>>();
105 .template resolve<std::decay_t<NonDecoratedDependencies>>(std::tuple {
TagInput {
110 }(std::index_sequence_for<NonDecoratedDependencies...>{});
111 }(NonDecoratedDependenciesPack{});
113 auto maybe_non_decorated_dependencies = std::apply(
114 [](
auto&&... maybe_dependencies) {
115 using DependenciesTuple = std::tuple<
116 typename std::remove_reference_t<
decltype(maybe_dependencies)>::value_type...
119 if ((maybe_dependencies.has_value() && ...))
121 return std::expected<DependenciesTuple, Error> {
122 std::tuple { std::move(maybe_dependencies.value())... }
127 return std::expected<DependenciesTuple, Error> {
132 std::move(maybe_non_decorated_dependencies_tuple)
135 if (!maybe_non_decorated_dependencies.has_value()) [[unlikely]]
137 return std::expected<meta::RuntimeRef<RelatedEntity>,
Error> {
138 std::unexpected { maybe_non_decorated_dependencies.error() }
142 auto non_decorated_dependencies
143 = std::move(maybe_non_decorated_dependencies).value();
145 auto dependencies = std::tuple_cat(
146 std::move(decorated_dependencies),
147 std::move(non_decorated_dependencies)
152 .transform([](
auto decorator_ref) {