26 CreationalConfig Decoratee,
27 typename TagComparator
31 TagFilter<Decoratee, TagComparator>
35 constexpr explicit TagFilter(TagComparator&& comparator, Decoratee&& decoratee)
36 : decoratee_ { std::move(decoratee) }
37 , comparator_ { std::move(comparator) }
49 template<
typename Key>
57 std::optional<TagInput> tag_input = input.template retrieve_override<TagInput>();
59 if (!tag_input.has_value()) [[unlikely]]
64 const tag_t input_tag = tag_input.value().tag.value();
66 if (!this->comparator_(input_tag)) [[unlikely]]
71 return decoratee_.do_resolve(
79 template<std::
size_t DependencyIndex>
82 return this->decoratee_
88 TagComparator comparator_;
93 typename TagComparator
97 TagFilterChainable<Decoratee, TagComparator>
102 TagComparator&& comparator,
103 Decoratee&& decoratee
105 : decoratee_ { std::move(decoratee) }
106 , comparator_ { std::move(comparator) }
124 decltype(context.input),
128 using ResultType =
decltype(this->decoratee_.pipe(decoratee, context));
132 const TagInput& tag_input = std::get<TagInput>(context.input);
134 if (!this->comparator_(tag_input.
tag.
value()))
141 return this->decoratee_.pipe(decoratee, context);
153 Decoratee decoratee_;
154 TagComparator comparator_;
161 template<CreationalConfig Decoratee>
163 Decoratee&& decoratee,
167 [tag](
const tag_t& inner_tag) {
return inner_tag == tag; },
168 std::forward<Decoratee>(decoratee)
172 template<ChainableConfig Decoratee>
174 Decoratee&& decoratee,
178 [tag](
const tag_t& inner_tag) {
return inner_tag == tag; },
179 std::forward<Decoratee>(decoratee)
188 typename TagComparator
192 Decoratee&& decoratee,
193 TagComparator&& tag_comparator
197 std::move(tag_comparator),
198 std::forward<Decoratee>(decoratee)
204 typename TagComparator
208 Decoratee&& decoratee,
209 TagComparator&& tag_comparator
213 std::move(tag_comparator),
214 std::forward<Decoratee>(decoratee)
Concept and utilities for chainable (decorator/pipeline) configurations.
Concept and utilities for creational (factory/constructor) configurations.
Error codes and diagnostics for dependency injection operations.
Compile-time type pack utilities and metaprogramming foundations.
constexpr Type & value() noexcept
Definition RequiredFieldsUsageValidator.hpp:69
Resolution< RelatedEntity, Error > auto pipe(meta::Reference< RelatedEntity > auto decoratee, meta::wrapped_with< ResolutionContext > auto &context) const
Definition Tag.hpp:118
constexpr TagFilterChainable(TagComparator &&comparator, Decoratee &&decoratee)
Definition Tag.hpp:101
get_related_keys_pack_t< Decoratee > RelatedKeysPack
Definition Tag.hpp:111
static constexpr ConfigType CONFIG_TYPE
Definition Tag.hpp:114
get_related_entity_t< Decoratee > RelatedEntity
Definition Tag.hpp:110
static constexpr ConfigType CONFIG_TYPE
Definition Tag.hpp:46
meta::wrapped_with< std::optional > auto get_dependencies_input() const
Definition Tag.hpp:80
std::expected< meta::RuntimeRef< Key >, Error > do_resolve(meta::Pack< Key > &&keys, auto &dependencies, meta::wrapped_with< ResolutionContext > auto &context, const auto &input) const
Definition Tag.hpp:50
constexpr TagFilter(TagComparator &&comparator, Decoratee &&decoratee)
Definition Tag.hpp:35
central_type_t< Decoratee > CentralType
Definition Tag.hpp:41
dependencies_pack_t< Decoratee > DependenciesPack
Definition Tag.hpp:43
resolution_keys_pack_t< Decoratee > ResolutionKeysPack
Definition Tag.hpp:42
Concept for configuration objects that transform/decorate dependencies.
Definition ChainableConfig.hpp:58
Concept for configurations that handle dependency creation and instantiation.
Definition CreationalConfig.hpp:50
Definition Resolution.hpp:30
Definition DependencyTags.hpp:18
Definition Decorator.hpp:19
const char * tag_t
Definition TagInput.hpp:9
typename Config::RelatedEntity get_related_entity_t
Helper alias to extract the entity type from a ChainableConfig.
Definition ChainableConfig.hpp:92
typename Config::RelatedKeysPack get_related_keys_pack_t
Helper alias to extract the key type from a ChainableConfig.
Definition ChainableConfig.hpp:96
typename Config::DependenciesPack dependencies_pack_t
Definition CreationalConfig.hpp:82
typename Config::ResolutionKeysPack resolution_keys_pack_t
Helper alias to extract the resolution keys from a CreationalConfig.
Definition CreationalConfig.hpp:79
ConfigType
Categorization of configuration strategies in the DI container.
Definition ConfigType.hpp:24
@ CHAINABLE
Chainable configs form a pipeline of transformations applied after creation. Examples: proxies,...
Definition ConfigType.hpp:35
@ CREATIONAL
Creational configs handle object instantiation and factory patterns. These are responsible for creati...
Definition ConfigType.hpp:27
Error
Enumeration of possible errors during dependency injection resolution.
Definition Error.hpp:26
@ TAG_CONFIG_EXPECTED
Definition Error.hpp:39
@ TAG_MISMATCH
Definition Error.hpp:41
typename Config::CentralType central_type_t
Helper alias to extract the central type from a CreationalConfig.
Definition CreationalConfig.hpp:75
Definition DecoratableConfig.hpp:9
static constexpr implementation_details_::TagFilter< Decoratee, TagComparator > decorate(Decoratee &&decoratee, TagComparator &&tag_comparator)
Definition Tag.hpp:191
static constexpr implementation_details_::TagFilterChainable< Decoratee, TagComparator > decorate_chainable(Decoratee &&decoratee, TagComparator &&tag_comparator)
Definition Tag.hpp:207
static constexpr auto decorate_chainable(Decoratee &&decoratee, tag_t tag)
Definition Tag.hpp:173
static constexpr auto decorate(Decoratee &&decoratee, tag_t tag)
Definition Tag.hpp:162