capydi
Loading...
Searching...
No Matches
ResolutionOverrides.hpp
Go to the documentation of this file.
1#ifndef CAPYDI_RESOLUTION_OVERRIDES_HPP_
2#define CAPYDI_RESOLUTION_OVERRIDES_HPP_
3
7#include <tuple>
8#include <concepts>
9
10namespace capy::di
11{
12
13template<typename... Overrides>
15{
16private:
17 using OverrideHasBeenUsedFlag = bool;
18
19 template<typename Override>
20 struct OverrideCell
21 {
22 Override stored_override;
23 mutable OverrideHasBeenUsedFlag used;
24 };
25
26 using ConfigsContainer = std::tuple<
27 OverrideCell<Overrides>...
28 >;
29
30public:
31 constexpr explicit ResolutionOverrides(Overrides&&... overrides)
32 : overrides_ { OverrideCell {
33 .stored_override = std::move(overrides),
34 .used = false,
35 }...}
36 {}
37
38 template<typename Override>
39 constexpr std::optional<Override> retrieve_override() const
40 {
41 using AllOverridesPack = meta::Pack<std::decay_t<Overrides>...>;
42
44 {
45 const OverrideCell<Override>& override_cell
46 = std::get<OverrideCell<Override>>(this->overrides_);
47
48 override_cell.used = true;
49
50 return override_cell.stored_override;
51 }
52 else
53 {
54 return std::nullopt;
55 }
56 }
57
58 constexpr bool validate() const
59 {
60 return std::apply([](auto&&... cells){
61 return (cells.used && ...);
62 }, this->overrides_);
63 }
64
65 constexpr void reset() const
66 {
67 return std::apply([](auto&&... cells){
68 ((cells.used = false), ...);
69 }, this->overrides_);
70 }
71
72private:
73 ConfigsContainer overrides_;
74};
75
76}
77
78#endif // !CAPYDI_RESOLUTION_OVERRIDES_HPP_
constexpr bool validate() const
Definition ResolutionOverrides.hpp:58
constexpr ResolutionOverrides(Overrides &&... overrides)
Definition ResolutionOverrides.hpp:31
constexpr void reset() const
Definition ResolutionOverrides.hpp:65
constexpr std::optional< Override > retrieve_override() const
Definition ResolutionOverrides.hpp:39
Definition Decorator.hpp:19
constexpr bool pack_contains_t
Definition Contains.hpp:13
A compile-time heterogeneous type list.
Definition Pack.hpp:70