10
10
11
11
namespace cib ::detail {
12
12
template <
13
- typename ExtensionPath ,
13
+ typename ServiceType ,
14
14
typename ... Args>
15
15
struct extend : public config_item {
16
+ using service_type = ServiceType;
17
+ constexpr static auto builder = cib::traits::builder_v<service_type>;
16
18
cib::tuple<Args...> args_tuple;
17
19
18
20
CIB_CONSTEVAL explicit extend (
@@ -23,63 +25,10 @@ namespace cib::detail {
23
25
// pass
24
26
}
25
27
26
- template <
27
- typename TargetBuilder,
28
- typename Builder>
29
- [[nodiscard]] CIB_CONSTEVAL auto add (
30
- path<TargetBuilder> const &,
31
- Builder const & b
32
- ) const {
33
- if constexpr (is_same_v<TargetBuilder, typename std::remove_cv_t <std::remove_reference_t <decltype (b)>>::Service>) {
34
- return apply ([&](auto const & ... args){
35
- return service_entry <
36
- typename std::remove_cv_t <std::remove_reference_t <decltype (b)>>::Service,
37
- decltype (b.builder .add (args...))>{b.builder .add (args...)};
38
- }, args_tuple);
39
- } else {
40
- return b;
41
- }
28
+ template <typename ... InitArgs>
29
+ [[nodiscard]] CIB_CONSTEVAL auto extends_tuple (InitArgs const & ...) const {
30
+ return cib::make_tuple (*this );
42
31
}
43
-
44
- template <
45
- typename TargetBuilder,
46
- typename SubBuilder,
47
- typename ... SubBuilders,
48
- typename Builder>
49
- [[nodiscard]] CIB_CONSTEVAL auto add (
50
- path<TargetBuilder, SubBuilder, SubBuilders...> const &,
51
- Builder const & b
52
- ) const {
53
- if constexpr (is_same_v<TargetBuilder, typename std::remove_cv_t <std::remove_reference_t <decltype (b)>>::Service>) {
54
- return apply ([&](auto const & ... args){
55
- return service_entry <
56
- typename std::remove_cv_t <std::remove_reference_t <decltype (b)>>::Service,
57
- decltype (b.builder .template add <SubBuilder, SubBuilders...>(args...))>{b.builder .template add <SubBuilder, SubBuilders...>(args...)};
58
- }, args_tuple);
59
- } else {
60
- return b;
61
- }
62
- }
63
-
64
- template <typename Builders, typename ... InitArgs>
65
- [[nodiscard]] CIB_CONSTEVAL auto init (
66
- Builders const & builders_tuple,
67
- InitArgs const & ...
68
- ) const {
69
- return apply ([&](auto const & ... builders){
70
- static_assert (
71
- (is_same_v<typename ExtensionPath::First, typename std::remove_cv_t <std::remove_reference_t <decltype (builders)>>::Service> + ... + 0 ) > 0 ,
72
- " Extension didn't match any service" );
73
-
74
- static_assert (
75
- (is_same_v<typename ExtensionPath::First, typename std::remove_cv_t <std::remove_reference_t <decltype (builders)>>::Service> + ... + 0 ) <= 1 ,
76
- " Extension matched more than 1 service" );
77
-
78
- return cib::make_tuple (index_metafunc_<extract_service_tag>, add (ExtensionPath{}, builders)...);
79
- }, builders_tuple);
80
- }
81
-
82
-
83
32
};
84
33
}
85
34
0 commit comments