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:
116
117 ObservedValueCombinator<ObservedValues...> split() &&
118 {
119 return ObservedValueCombinator<ObservedValues...>{std::move(this->observedValues_)};
120 }
121
122 constexpr auto value() const
123 {
124 return generator_();
125 }
126
127 RendererType generator() const&
128 {
129 return generator_;
130 }
132 {
133 return std::move(generator_);
134 }
135
136 protected:
138 };
139
140 template <typename RendererType, typename... ObservedValues>
142 : public ObservedValueCombinatorWithGenerator<RendererType, ObservedValues...>
143 {
144 public:
145 using ObservedValueCombinatorWithGenerator<RendererType, ObservedValues...>::
146 ObservedValueCombinatorWithGenerator;
151
152 using ObservedValueCombinatorWithGenerator<RendererType, ObservedValues...>::split;
153 using ObservedValueCombinatorWithGenerator<RendererType, ObservedValues...>::value;
154 using ObservedValueCombinatorWithGenerator<RendererType, ObservedValues...>::generator;
155 };
156
157 template <typename... ObservedValues>
158 class ObservedValueCombinator : public ObservedValueCombinatorBase<ObservedValues...>
159 {
160 public:
161 using ObservedValueCombinatorBase<ObservedValues...>::ObservedValueCombinatorBase;
162 using ObservedValueCombinatorBase<ObservedValues...>::observedValues_;
163
164 template <typename RendererType>
165 requires std::invocable<RendererType>
166 constexpr ObservedValueCombinatorWithGenerator<RendererType, ObservedValues...>
168 {
169 return ObservedValueCombinatorWithGenerator<RendererType, ObservedValues...>{
170 observedValues_, std::forward<RendererType>(generator)};
171 }
172
173 template <typename RendererType>
174 requires std::invocable<RendererType>
177 {
179 observedValues_, std::forward<RendererType>(generator)};
180 }
181 };
182 template <typename... ObservedValues>
183 ObservedValueCombinator(ObservedValues&&...)
185 template <typename... ObservedValues>
188
189 template <typename... ObservedValues>
190 requires(IsObservedLike<ObservedValues> && ...)
191 ObservedValueCombinator<std::decay_t<Detail::ObservedAddReference_t<ObservedValues>>...>
192 observe(ObservedValues&&... observedValues)
193 {
195 std::forward<Detail::ObservedAddReference_t<ObservedValues>>(observedValues)...};
196 }
197}
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
RendererType generator() const &
Definition observed_value_combinator.hpp:127
ObservedValueCombinator< ObservedValues... > split() &&
Definition observed_value_combinator.hpp:117
RendererType generator_
Definition observed_value_combinator.hpp:137
constexpr ObservedValueCombinatorWithGenerator(std::tuple< Detail::ObservedAddReference_t< ObservedValues >... > observedValues, RendererType generator)
Definition observed_value_combinator.hpp:110
RendererType generator() &&
Definition observed_value_combinator.hpp:131
constexpr auto value() const
Definition observed_value_combinator.hpp:122
Definition observed_value_combinator.hpp:143
ObservedValueCombinatorWithPropertyGenerator(ObservedValueCombinatorWithGenerator< RendererType, ObservedValues... > &&other)
Definition observed_value_combinator.hpp:147
Definition observed_value_combinator.hpp:159
constexpr ObservedValueCombinatorWithPropertyGenerator< RendererType, ObservedValues... > generateProperty(RendererType &&generator)
Definition observed_value_combinator.hpp:176
constexpr ObservedValueCombinatorWithGenerator< RendererType, ObservedValues... > generate(RendererType &&generator)
Definition observed_value_combinator.hpp:167
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:192
RendererType
Definition materialize.hpp:48
void tupleForEach(std::tuple< Types... > &t, FuncT &&func)
Definition tuple_for_each.hpp:18
Definition overloaded.hpp:7