capydi
Loading...
Searching...
No Matches
Interface.hpp
Go to the documentation of this file.
1#ifndef INTERFACE_HPP_
2#define INTERFACE_HPP_
3
6
8#include <tuple>
9
10namespace capy::di
11{
12
14{
15
16template<CreationalConfig Decoratee, typename Interface>
17 requires std::derived_from<central_type_t<Decoratee>, Interface>
19 : public DecoratableConfig<
20 AsInterface<Decoratee, Interface>
21 >
22{
23public:
24 constexpr explicit AsInterface(meta::Unit<Interface>, Decoratee&& decoratee)
25 : decoratee_ { std::move(decoratee) }
26 {}
27
28public:
30 using /* meta::Pack<meta::Pack<?>> */ ResolutionKeysPack = meta::Pack<
33 >;
35
36public:
38
39public:
42 auto& dependencies,
44 const auto& input
45 ) const
46 {
47 return decoratee_.do_resolve(
49 dependencies,
50 context,
51 input
52 )
53 .transform([](auto ref) {
55 static_cast<central_type_t<Decoratee>&>(ref)
56 };
57 });
58 }
59
62 auto& dependencies,
64 const auto& input
65 ) const
66 {
67 return decoratee_.do_resolve(
69 dependencies,
70 context,
71 input
72 )
73 .transform([](auto ref) {
75 static_cast<const central_type_t<Decoratee>&>(ref)
76 };
77 });
78 }
79
80 template<std::size_t DependencyIndex>
82 {
83 return this->decoratee_
85 }
86
87private:
88 Decoratee decoratee_;
89};
90
91}
92
94{
95 template<CreationalConfig Decoratee, typename InterfaceType>
97 Decoratee&& decoratee,
98 meta::Unit<InterfaceType> interface_deducer
99 ) {
101 interface_deducer,
102 std::forward<Decoratee>(decoratee)
103 };
104 }
105};
106
107}
108
109#endif // INTERFACE_HPP_
Concept and utilities for creational (factory/constructor) configurations.
Compile-time type pack utilities and metaprogramming foundations.
meta::wrapped_with< std::optional > auto get_dependencies_input() const
Definition Interface.hpp:81
dependencies_pack_t< Decoratee > DependenciesPack
Definition Interface.hpp:34
static constexpr ConfigType CONFIG_TYPE
Definition Interface.hpp:37
meta::Pack< meta::Pack< Interface >, meta::Pack< const Interface > > ResolutionKeysPack
Definition Interface.hpp:30
auto do_resolve(meta::Pack< Interface > keys, auto &dependencies, meta::wrapped_with< ResolutionContext > auto &context, const auto &input) const
Definition Interface.hpp:40
Interface CentralType
Definition Interface.hpp:29
constexpr AsInterface(meta::Unit< Interface >, Decoratee &&decoratee)
Definition Interface.hpp:24
auto do_resolve(meta::Pack< const Interface > keys, auto &dependencies, meta::wrapped_with< ResolutionContext > auto &context, const auto &input) const
Definition Interface.hpp:60
Definition RuntimeRef.hpp:13
Definition WrappedWIth.hpp:30
Definition DependencyTags.hpp:18
Definition Decorator.hpp:19
typename Config::DependenciesPack dependencies_pack_t
Definition CreationalConfig.hpp:82
ConfigType
Categorization of configuration strategies in the DI container.
Definition ConfigType.hpp:24
@ CREATIONAL
Creational configs handle object instantiation and factory patterns. These are responsible for creati...
Definition ConfigType.hpp:27
typename Config::CentralType central_type_t
Helper alias to extract the central type from a CreationalConfig.
Definition CreationalConfig.hpp:75
Definition DecoratableConfig.hpp:9
Definition Interface.hpp:94
static constexpr implementation_details_::AsInterface< Decoratee, InterfaceType > decorate(Decoratee &&decoratee, meta::Unit< InterfaceType > interface_deducer)
Definition Interface.hpp:96
A compile-time heterogeneous type list.
Definition Pack.hpp:70
A zero-cost wrapper for forwarding compile-time type information.
Definition Pack.hpp:45