Skip to content

Commit 7034674

Browse files
authored
Merge pull request #121 from NuiCpp/fix/competing-observed-ctor
Added flag to Observed<> ctor.
2 parents 992eff2 + a25c856 commit 7034674

File tree

3 files changed

+69
-20
lines changed

3 files changed

+69
-20
lines changed

nui/include/nui/event_system/observed_value.hpp

Lines changed: 37 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
#include <nui/concepts.hpp>
55
#include <nui/frontend/event_system/range_event_context.hpp>
66
#include <nui/frontend/event_system/event_context.hpp>
7+
#include <nui/utility/assert.hpp>
78
#include <nui/utility/meta/pick_first.hpp>
89

910
#include <memory>
@@ -26,7 +27,7 @@ namespace Nui
2627
class ObservedBase
2728
{
2829
public:
29-
explicit ObservedBase(EventContext* ctx)
30+
explicit ObservedBase(CustomEventContextFlag_t, EventContext* ctx)
3031
: eventContext_{ctx}
3132
, attachedEvents_{}
3233
, attachedOneshotEvents_{}
@@ -49,7 +50,6 @@ namespace Nui
4950
ObservedBase& operator=(ObservedBase&& other)
5051
{
5152
eventContext_ = other.eventContext_;
52-
other.eventContext_ = nullptr;
5353
for (auto& event : other.attachedEvents_)
5454
attachedEvents_.push_back(std::move(event));
5555
for (auto& event : other.attachedOneshotEvents_)
@@ -96,7 +96,7 @@ namespace Nui
9696

9797
virtual void update(bool /*force*/ = false) const
9898
{
99-
assert(eventContext_ != nullptr);
99+
NUI_ASSERT(eventContext_ != nullptr, "Event context must never be null.");
100100

101101
for (auto& event : attachedEvents_)
102102
{
@@ -114,7 +114,7 @@ namespace Nui
114114

115115
void updateNow(bool force = false) const
116116
{
117-
assert(eventContext_ != nullptr);
117+
NUI_ASSERT(eventContext_ != nullptr, "Event context must never be null.");
118118

119119
update(force);
120120
eventContext_->executeActiveEventsImmediately();
@@ -182,7 +182,7 @@ namespace Nui
182182

183183
public:
184184
ModifiableObserved()
185-
: ObservedBase{&globalEventContext}
185+
: ObservedBase{CustomEventContextFlag, &globalEventContext}
186186
, contained_{}
187187
{}
188188
ModifiableObserved(const ModifiableObserved&) = delete;
@@ -219,15 +219,21 @@ namespace Nui
219219

220220
template <typename T = ContainedT>
221221
explicit ModifiableObserved(T&& t)
222-
: ObservedBase{&globalEventContext}
222+
: ObservedBase{CustomEventContextFlag, &globalEventContext}
223223
, contained_{std::forward<T>(t)}
224224
{}
225225

226-
explicit ModifiableObserved(EventContext* ctx)
227-
: ObservedBase{ctx}
226+
explicit ModifiableObserved(CustomEventContextFlag_t, EventContext* ctx)
227+
: ObservedBase{CustomEventContextFlag, ctx}
228228
, contained_{}
229229
{}
230230

231+
template <typename T = ContainedT>
232+
explicit ModifiableObserved(CustomEventContextFlag_t, EventContext* ctx, T&& t)
233+
: ObservedBase{CustomEventContextFlag, ctx}
234+
, contained_{std::forward<T>(t)}
235+
{}
236+
231237
/**
232238
* @brief Assign a completely new value.
233239
*
@@ -584,8 +590,8 @@ namespace Nui
584590
using ModifiableObserved<ContainerT>::update;
585591

586592
public:
587-
explicit ObservedContainer(EventContext* ctx)
588-
: ModifiableObserved<ContainerT>{ctx}
593+
explicit ObservedContainer(CustomEventContextFlag_t, EventContext* ctx)
594+
: ModifiableObserved<ContainerT>{CustomEventContextFlag, ctx}
589595
, rangeContext_{0}
590596
, afterEffectId_{registerAfterEffect()}
591597
{}
@@ -595,6 +601,12 @@ namespace Nui
595601
, afterEffectId_{registerAfterEffect()}
596602
{}
597603
template <typename T = ContainerT>
604+
explicit ObservedContainer(CustomEventContextFlag_t, EventContext* ctx, T&& t)
605+
: ModifiableObserved<ContainerT>{CustomEventContextFlag, ctx, std::forward<T>(t)}
606+
, rangeContext_{static_cast<long>(contained_.size())}
607+
, afterEffectId_{registerAfterEffect()}
608+
{}
609+
template <typename T = ContainerT>
598610
explicit ObservedContainer(T&& t)
599611
: ModifiableObserved<ContainerT>{std::forward<T>(t)}
600612
, rangeContext_{static_cast<long>(contained_.size())}
@@ -605,12 +617,23 @@ namespace Nui
605617
, rangeContext_{std::move(rangeContext)}
606618
, afterEffectId_{registerAfterEffect()}
607619
{}
620+
explicit ObservedContainer(CustomEventContextFlag_t, EventContext* ctx, RangeEventContext&& rangeContext)
621+
: ModifiableObserved<ContainerT>{CustomEventContextFlag, ctx}
622+
, rangeContext_{std::move(rangeContext)}
623+
, afterEffectId_{registerAfterEffect()}
624+
{}
608625
template <typename T = ContainerT>
609626
ObservedContainer(T&& t, RangeEventContext&& rangeContext)
610627
: ModifiableObserved<ContainerT>{std::forward<T>(t)}
611628
, rangeContext_{std::move(rangeContext)}
612629
, afterEffectId_{registerAfterEffect()}
613630
{}
631+
template <typename T = ContainerT>
632+
ObservedContainer(CustomEventContextFlag_t, EventContext* ctx, T&& t, RangeEventContext&& rangeContext)
633+
: ModifiableObserved<ContainerT>{CustomEventContextFlag, ctx, std::forward<T>(t)}
634+
, rangeContext_{std::move(rangeContext)}
635+
, afterEffectId_{registerAfterEffect()}
636+
{}
614637

615638
ObservedContainer(const ObservedContainer&) = delete;
616639
ObservedContainer(ObservedContainer&&) = default;
@@ -785,7 +808,7 @@ namespace Nui
785808
decltype(std::declval<U>().insert(std::declval<const value_type&>()))>
786809
insert(const value_type& value)
787810
{
788-
assert(ObservedBase::eventContext_ != nullptr);
811+
NUI_ASSERT(ObservedBase::eventContext_ != nullptr, "Event context must never be null.");
789812

790813
const auto result = contained_.insert(value);
791814
rangeContext_.performFullRangeUpdate();
@@ -799,7 +822,7 @@ namespace Nui
799822
decltype(std::declval<U>().insert(std::declval<value_type&&>()))>
800823
insert(value_type&& value)
801824
{
802-
assert(ObservedBase::eventContext_ != nullptr);
825+
NUI_ASSERT(ObservedBase::eventContext_ != nullptr, "Event context must never be null.");
803826

804827
const auto result = contained_.insert(std::move(value));
805828
rangeContext_.performFullRangeUpdate();
@@ -1014,7 +1037,7 @@ namespace Nui
10141037
{
10151038
std::function<void(int)> doInsert;
10161039
doInsert = [&](int retries) {
1017-
assert(ObservedBase::eventContext_ != nullptr);
1040+
NUI_ASSERT(ObservedBase::eventContext_ != nullptr, "Event context must never be null.");
10181041

10191042
const auto result = rangeContext_.insertModificationRange(contained_.size(), low, high, type);
10201043
if (result == RangeEventContext::InsertResult::Final)
@@ -1043,7 +1066,7 @@ namespace Nui
10431066

10441067
auto registerAfterEffect()
10451068
{
1046-
assert(ObservedBase::eventContext_ != nullptr);
1069+
NUI_ASSERT(ObservedBase::eventContext_ != nullptr, "Event context must never be null.");
10471070
return ObservedBase::eventContext_->registerAfterEffect(Event{[this](EventContext::EventIdType) {
10481071
rangeContext_.reset(static_cast<long>(contained_.size()), true);
10491072
return true;

nui/include/nui/utility/assert.hpp

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
#pragma once
2+
3+
#include <nui/frontend/val.hpp>
4+
5+
#include <stdexcept>
6+
7+
namespace Nui
8+
{
9+
inline void assertImpl(bool condition, const char* message)
10+
{
11+
if (!condition)
12+
{
13+
#ifdef __cpp_exceptions
14+
throw std::runtime_error(message);
15+
#else
16+
Nui::val::global("console").call<void>("error", message);
17+
#endif
18+
}
19+
}
20+
21+
#ifdef NDEBUG
22+
# define NUI_ASSERT(condition, message)
23+
#else
24+
# define NUI_ASSERT(condition, message) assertImpl(condition, message)
25+
#endif
26+
}

nui/test/nui/test_events.hpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,7 @@ namespace Nui::Tests
144144
{
145145
EventContext eventContext;
146146

147-
Observed<int> obs{&eventContext};
147+
Observed<int> obs{CustomEventContextFlag, &eventContext};
148148

149149
int calledWith = 77;
150150
listen(eventContext, obs, [&calledWith](int const& value) -> bool {
@@ -162,7 +162,7 @@ namespace Nui::Tests
162162
{
163163
EventContext eventContext;
164164

165-
Observed<int> obs{&eventContext};
165+
Observed<int> obs{CustomEventContextFlag, &eventContext};
166166

167167
int calledWith = 77;
168168
listen(eventContext, obs, [&calledWith](int const& value) -> void {
@@ -179,7 +179,7 @@ namespace Nui::Tests
179179
{
180180
EventContext eventContext;
181181

182-
std::shared_ptr<Observed<int>> obs = std::make_shared<Observed<int>>(&eventContext);
182+
std::shared_ptr<Observed<int>> obs = std::make_shared<Observed<int>>(CustomEventContextFlag, &eventContext);
183183

184184
int calledWith = 77;
185185
listen(eventContext, obs, [&calledWith](int const& value) -> void {
@@ -196,7 +196,7 @@ namespace Nui::Tests
196196
{
197197
EventContext eventContext;
198198

199-
std::shared_ptr<Observed<int>> obs = std::make_shared<Observed<int>>(&eventContext);
199+
std::shared_ptr<Observed<int>> obs = std::make_shared<Observed<int>>(CustomEventContextFlag, &eventContext);
200200

201201
int calledWith = 77;
202202
listen(eventContext, obs, [&calledWith](int const& value) -> bool {
@@ -217,7 +217,7 @@ namespace Nui::Tests
217217
{
218218
EventContext eventContext;
219219

220-
std::shared_ptr<Observed<int>> obs = std::make_shared<Observed<int>>(&eventContext);
220+
std::shared_ptr<Observed<int>> obs = std::make_shared<Observed<int>>(CustomEventContextFlag, &eventContext);
221221

222222
int calledWith = 77;
223223
listen(eventContext, obs, [&calledWith](int const& value) -> bool {
@@ -254,7 +254,7 @@ namespace Nui::Tests
254254
{
255255
EventContext eventContext;
256256

257-
Observed<int> obs{&eventContext};
257+
Observed<int> obs{CustomEventContextFlag, &eventContext};
258258

259259
int calledWith = 77;
260260
listen(eventContext, obs, [&calledWith](int const& value) -> bool {

0 commit comments

Comments
 (0)