Nui
Loading...
Searching...
No Matches
observed_value_combinator.hpp
Go to the documentation of this file.
1#pragma once
2
7#include <nui/concepts.hpp>
8
9#include <tuple>
10
11namespace Nui
12{
13 template <typename... ObservedValues>
15 {
16 public:
17 explicit constexpr ObservedValueCombinatorBase(
19 : observedValues_{std::forward<Detail::ObservedAddReference_t<ObservedValues>>(observedValues)...}
20 {}
25
26 constexpr void attachEvent(auto eventId) const
27 {
31 [eventId](IsObserved auto const& observed) {
32 observed.attachEvent(eventId);
33 },
34 [eventId](IsWeakObserved auto const& observed) {
35 if (auto shared = observed.lock(); shared)
36 shared->attachEvent(eventId);
37 },
38 });
39 }
40
41 constexpr void attachOneshotEvent(auto eventId) const
42 {
46 [eventId](IsObserved auto const& observed) {
47 observed.attachOneshotEvent(eventId);
48 },
49 [eventId](IsWeakObserved auto const& observed) {
50 if (auto shared = observed.lock(); shared)
51 shared->attachOneshotEvent(eventId);
52 },
53 });
54 }
55
56 constexpr void detachEvent(auto eventId) const
57 {
61 [eventId](IsObserved auto const& observed) {
62 observed.detachEvent(eventId);
63 },
64 [eventId](IsWeakObserved auto const& observed) {
65 if (auto shared = observed.lock(); shared)
66 shared->detachEvent(eventId);
67 },
68 });
69 }
70
71 std::tuple<Detail::ObservedAddReference_t<ObservedValues>...> const& observedValues() &
72 {
73 return observedValues_;
74 }
75
76 std::tuple<Detail::ObservedAddReference_t<ObservedValues>...>&& observedValues() &&
77 {
78 return std::move(observedValues_);
79 }
80
81 bool isAnyExpired() const
82 {
83 const auto isExpired = Nui::overloaded{
84 [](IsObserved auto const&) {
85 return false;
86 },
87 [](IsWeakObserved auto const& observed) {
88 return observed.expired();
89 },
90 };
91
92 return std::apply(
93 [isExpired](auto const&... observed) {
94 return (isExpired(observed) || ...);
95 },
97 }
98
99 protected:
100 std::tuple<Detail::ObservedAddReference_t<ObservedValues>...> observedValues_;
101 };
102
103 template <typename... ObservedValues>
105
106 template <typename RendererType, typename... ObservedValues>
108 {
109 public:
110 using RendererTypeNoRef = std::decay_t<RendererType>;
111
118
119 ObservedValueCombinator<ObservedValues...> split() &&
120 {
121 return ObservedValueCombinator<ObservedValues...>{std::move(this->observedValues_)};
122 }
123
124 constexpr auto value() const
125 {
126 return generator_();
127 }
128
130 {
131 return generator_;
132 }
134 {
135 return std::move(generator_);
136 }
137
138 protected:
140 };
141
142 template <typename RendererType, typename... ObservedValues>
144 : public ObservedValueCombinatorWithGenerator<RendererType, ObservedValues...>
145 {
146 public:
147 using ObservedValueCombinatorWithGenerator<RendererType, ObservedValues...>::
148 ObservedValueCombinatorWithGenerator;
153
154 using ObservedValueCombinatorWithGenerator<RendererType, ObservedValues...>::split;
155 using ObservedValueCombinatorWithGenerator<RendererType, ObservedValues...>::value;
156 using ObservedValueCombinatorWithGenerator<RendererType, ObservedValues...>::generator;
157 };
158
159 template <typename... ObservedValues>
160 class ObservedValueCombinator : public ObservedValueCombinatorBase<ObservedValues...>
161 {
162 public:
163 using ObservedValueCombinatorBase<ObservedValues...>::ObservedValueCombinatorBase;
164 using ObservedValueCombinatorBase<ObservedValues...>::observedValues_;
165
166 template <typename RendererType>
167 requires std::invocable<RendererType>
170 {
172 observedValues_, std::forward<RendererType>(generator)};
173 }
174
175 template <typename RendererType>
176 requires std::invocable<RendererType>
179 {
181 observedValues_, std::forward<RendererType>(generator)};
182 }
183 };
184 template <typename... ObservedValues>
185 ObservedValueCombinator(ObservedValues&&...)
187 template <typename... ObservedValues>
190
191 template <typename... ObservedValues>
192 requires(IsObservedLike<ObservedValues> && ...)
193 ObservedValueCombinator<std::decay_t<Detail::ObservedAddReference_t<ObservedValues>>...>
194 observe(ObservedValues&&... observedValues)
195 {
197 std::forward<Detail::ObservedAddReference_t<ObservedValues>>(observedValues)...};
198 }
199}
Definition observed_value_combinator.hpp:15
std::tuple< Detail::ObservedAddReference_t< ObservedValues >... > observedValues_
Definition observed_value_combinator.hpp:100
constexpr void attachOneshotEvent(auto eventId) const
Definition observed_value_combinator.hpp:41
std::tuple< Detail::ObservedAddReference_t< ObservedValues >... > const & observedValues() &
Definition observed_value_combinator.hpp:71
constexpr ObservedValueCombinatorBase(Detail::ObservedAddReference_t< ObservedValues > &&... observedValues)
Definition observed_value_combinator.hpp:17
std::tuple< Detail::ObservedAddReference_t< ObservedValues >... > && observedValues() &&
Definition observed_value_combinator.hpp:76
constexpr ObservedValueCombinatorBase(std::tuple< Detail::ObservedAddReference_t< ObservedValues >... > observedValues)
Definition observed_value_combinator.hpp:21
constexpr void attachEvent(auto eventId) const
Definition observed_value_combinator.hpp:26
bool isAnyExpired() const
Definition observed_value_combinator.hpp:81
constexpr void detachEvent(auto eventId) const
Definition observed_value_combinator.hpp:56
Definition observed_value_combinator.hpp:108
RendererTypeNoRef generator() &&
Definition observed_value_combinator.hpp:133
ObservedValueCombinator< ObservedValues... > split() &&
Definition observed_value_combinator.hpp:119
RendererTypeNoRef generator_
Definition observed_value_combinator.hpp:139
RendererTypeNoRef generator() const &
Definition observed_value_combinator.hpp:129
constexpr ObservedValueCombinatorWithGenerator(std::tuple< Detail::ObservedAddReference_t< ObservedValues >... > observedValues, RendererType generator)
Definition observed_value_combinator.hpp:112
std::decay_t< RendererType > RendererTypeNoRef
Definition observed_value_combinator.hpp:110
constexpr auto value() const
Definition observed_value_combinator.hpp:124
Definition observed_value_combinator.hpp:145
ObservedValueCombinatorWithPropertyGenerator(ObservedValueCombinatorWithGenerator< RendererType, ObservedValues... > &&other)
Definition observed_value_combinator.hpp:149
Definition observed_value_combinator.hpp:161
constexpr ObservedValueCombinatorWithPropertyGenerator< std::decay_t< RendererType >, ObservedValues... > generateProperty(RendererType &&generator)
Definition observed_value_combinator.hpp:178
constexpr ObservedValueCombinatorWithGenerator< std::decay_t< RendererType >, ObservedValues... > generate(RendererType &&generator)
Definition observed_value_combinator.hpp:169
Definition observed_value.hpp:1540
Definition observed_value.hpp:1534
Definition observed_value.hpp:1538
typename ObservedAddReference< std::decay_t< T > >::type ObservedAddReference_t
Definition observed_value.hpp:1628
Definition file_dialog.hpp:6
ObservedValueCombinator< std::decay_t< Detail::ObservedAddReference_t< ObservedValues > >... > observe(ObservedValues &&... observedValues)
Definition observed_value_combinator.hpp:194
RendererType
Definition materialize.hpp:48
void tupleForEach(std::tuple< Types... > &t, FuncT &&func)
Definition tuple_for_each.hpp:18
Definition overloaded.hpp:7