Skip to content

Commit 1e1ee1a

Browse files
authored
Merge pull request #74 from NuiCpp/devel
Important fix to make Observed<> ctor explicit
2 parents 5283fc0 + 8138bdc commit 1e1ee1a

File tree

14 files changed

+186
-96
lines changed

14 files changed

+186
-96
lines changed

nui/include/nui/frontend/attributes/impl/attribute.hpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ namespace Nui
2323
std::string data;
2424
};
2525

26+
Attribute() = default;
2627
Attribute(
2728
std::function<void(Dom::ChildlessElement&)> setter,
2829
std::function<EventContext::EventIdType(std::weak_ptr<Dom::ChildlessElement>&& element)> createEvent = {},
@@ -67,8 +68,8 @@ namespace Nui
6768
bool isStringData() const;
6869

6970
private:
70-
std::variant<RegularAttribute, StringDataAttribute> attributeImpl_;
71-
std::function<EventContext::EventIdType(std::weak_ptr<Dom::ChildlessElement>&& element)> createEvent_;
72-
std::function<void(EventContext::EventIdType const&)> clearEvent_;
71+
std::variant<std::monostate, RegularAttribute, StringDataAttribute> attributeImpl_{};
72+
std::function<EventContext::EventIdType(std::weak_ptr<Dom::ChildlessElement>&& element)> createEvent_{};
73+
std::function<void(EventContext::EventIdType const&)> clearEvent_{};
7374
};
7475
}

nui/include/nui/frontend/components/dialog.hpp

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -32,11 +32,11 @@ namespace Nui::Components
3232

3333
struct ConstructionArgs
3434
{
35-
Observed<std::optional<std::string>> className = std::nullopt;
36-
Observed<std::string> title = "";
37-
Observed<std::string> body = "";
38-
Observed<std::string> buttonClassName = "";
39-
Observed<ButtonConfiguration> buttonConfiguration = ButtonConfiguration::Ok;
35+
std::optional<std::string> className{std::nullopt};
36+
std::string title{""};
37+
std::string body{""};
38+
std::string buttonClassName{""};
39+
ButtonConfiguration buttonConfiguration{ButtonConfiguration::Ok};
4040
std::function<void(Button)> onButtonClicked = [](Button) {};
4141
};
4242

@@ -107,6 +107,11 @@ namespace Nui::Components
107107
private:
108108
bool isOpen_;
109109
std::weak_ptr<Dom::Element> element_;
110-
ConstructionArgs args_;
110+
Observed<std::optional<std::string>> className_;
111+
Observed<std::string> title_;
112+
Observed<std::string> body_;
113+
Observed<std::string> buttonClassName_;
114+
Observed<ButtonConfiguration> buttonConfiguration_;
115+
std::function<void(Button)> onButtonClicked_;
111116
};
112117
}

nui/include/nui/frontend/dom/basic_element.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ namespace Nui::Dom
1313
class BasicElement : public std::enable_shared_from_this<BasicElement>
1414
{
1515
public:
16-
BasicElement(Nui::val val)
16+
explicit BasicElement(Nui::val val)
1717
: element_{std::move(val)}
1818
{}
1919
virtual ~BasicElement() = default;

nui/include/nui/frontend/dom/childless_element.hpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,10 @@
44
#include <nui/frontend/elements/impl/html_element.hpp>
55
#include <nui/frontend/utility/functions.hpp>
66

7+
#include <optional>
8+
#include <string>
9+
#include <string_view>
10+
711
namespace Nui::Dom
812
{
913
/**
@@ -13,10 +17,10 @@ namespace Nui::Dom
1317
class ChildlessElement : public BasicElement
1418
{
1519
public:
16-
ChildlessElement(HtmlElement const& elem)
20+
explicit ChildlessElement(HtmlElement const& elem)
1721
: BasicElement{ChildlessElement::createElement(elem)}
1822
{}
19-
ChildlessElement(Nui::val val)
23+
explicit ChildlessElement(Nui::val val)
2024
: BasicElement{std::move(val)}
2125
{}
2226

nui/include/nui/frontend/dom/element.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,13 +46,13 @@ namespace Nui::Dom
4646
using const_iterator = collection_type::const_iterator;
4747
using value_type = collection_type::value_type;
4848

49-
Element(HtmlElement const& elem)
49+
explicit Element(HtmlElement const& elem)
5050
: ChildlessElement{elem}
5151
, children_{}
5252
, unsetup_{}
5353
{}
5454

55-
Element(Nui::val val)
55+
explicit Element(Nui::val val)
5656
: ChildlessElement{std::move(val)}
5757
, children_{}
5858
, unsetup_{}

nui/include/nui/frontend/dom/reference.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ namespace Nui::Dom
1313
struct ReferencePasser
1414
{
1515
public:
16-
ReferencePasser(T&& func)
16+
explicit ReferencePasser(T&& func)
1717
: func_{std::move(func)}
1818
{}
1919
void operator()(std::weak_ptr<BasicElement>&& weakElement) const

nui/include/nui/frontend/event_system/observed_value.hpp

Lines changed: 82 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -168,10 +168,22 @@ namespace Nui
168168
}
169169
return *this;
170170
};
171+
ModifiableObserved& operator=(ContainedT const& contained)
172+
{
173+
contained_ = contained;
174+
update();
175+
return *this;
176+
}
177+
ModifiableObserved& operator=(ContainedT&& contained)
178+
{
179+
contained_ = std::move(contained);
180+
update();
181+
return *this;
182+
}
171183
~ModifiableObserved() = default;
172184

173185
template <typename T = ContainedT>
174-
ModifiableObserved(T&& t)
186+
explicit ModifiableObserved(T&& t)
175187
: contained_{std::forward<T>(t)}
176188
{}
177189

@@ -316,9 +328,14 @@ namespace Nui
316328
{
317329
return ref_;
318330
}
319-
void operator=(T&& ref)
331+
void operator=(T&& val)
332+
{
333+
ref_ = std::move(val);
334+
owner_->insertRangeChecked(pos_, pos_, RangeStateType::Modify);
335+
}
336+
void operator=(T const& val)
320337
{
321-
ref_ = std::forward<T>(ref);
338+
ref_ = val;
322339
owner_->insertRangeChecked(pos_, pos_, RangeStateType::Modify);
323340
}
324341

@@ -527,12 +544,12 @@ namespace Nui
527544
, afterEffectId_{registerAfterEffect()}
528545
{}
529546
template <typename T = ContainerT>
530-
ObservedContainer(T&& t)
547+
explicit ObservedContainer(T&& t)
531548
: ModifiableObserved<ContainerT>{std::forward<T>(t)}
532549
, rangeContext_{static_cast<long>(contained_.size())}
533550
, afterEffectId_{registerAfterEffect()}
534551
{}
535-
ObservedContainer(RangeEventContext&& rangeContext)
552+
explicit ObservedContainer(RangeEventContext&& rangeContext)
536553
: ModifiableObserved<ContainerT>{}
537554
, rangeContext_{std::move(rangeContext)}
538555
, afterEffectId_{registerAfterEffect()}
@@ -987,6 +1004,17 @@ namespace Nui
9871004
using ModifiableObserved<T>::ModifiableObserved;
9881005
using ModifiableObserved<T>::operator=;
9891006
using ModifiableObserved<T>::operator->;
1007+
1008+
Observed& operator=(T const& contained)
1009+
{
1010+
ModifiableObserved<T>::operator=(contained);
1011+
return *this;
1012+
}
1013+
Observed& operator=(T&& contained)
1014+
{
1015+
ModifiableObserved<T>::operator=(std::move(contained));
1016+
return *this;
1017+
}
9901018
};
9911019
template <typename... Parameters>
9921020
class Observed<std::vector<Parameters...>> : public ObservedContainer<std::vector<Parameters...>>
@@ -996,6 +1024,17 @@ namespace Nui
9961024
using ObservedContainer<std::vector<Parameters...>>::operator=;
9971025
using ObservedContainer<std::vector<Parameters...>>::operator->;
9981026
static constexpr auto isRandomAccess = true;
1027+
1028+
Observed<std::vector<Parameters...>>& operator=(std::vector<Parameters...> const& contained)
1029+
{
1030+
ObservedContainer<std::vector<Parameters...>>::operator=(contained);
1031+
return *this;
1032+
}
1033+
Observed<std::vector<Parameters...>>& operator=(std::vector<Parameters...>&& contained)
1034+
{
1035+
ObservedContainer<std::vector<Parameters...>>::operator=(std::move(contained));
1036+
return *this;
1037+
}
9991038
};
10001039
template <typename... Parameters>
10011040
class Observed<std::deque<Parameters...>> : public ObservedContainer<std::deque<Parameters...>>
@@ -1005,6 +1044,17 @@ namespace Nui
10051044
using ObservedContainer<std::deque<Parameters...>>::operator=;
10061045
using ObservedContainer<std::deque<Parameters...>>::operator->;
10071046
static constexpr auto isRandomAccess = true;
1047+
1048+
Observed<std::deque<Parameters...>>& operator=(std::deque<Parameters...> const& contained)
1049+
{
1050+
ObservedContainer<std::deque<Parameters...>>::operator=(contained);
1051+
return *this;
1052+
}
1053+
Observed<std::deque<Parameters...>>& operator=(std::deque<Parameters...>&& contained)
1054+
{
1055+
ObservedContainer<std::deque<Parameters...>>::operator=(std::move(contained));
1056+
return *this;
1057+
}
10081058
};
10091059
template <typename... Parameters>
10101060
class Observed<std::basic_string<Parameters...>> : public ObservedContainer<std::basic_string<Parameters...>>
@@ -1015,6 +1065,17 @@ namespace Nui
10151065
using ObservedContainer<std::basic_string<Parameters...>>::operator->;
10161066
static constexpr auto isRandomAccess = true;
10171067

1068+
Observed<std::basic_string<Parameters...>>& operator=(std::basic_string<Parameters...> const& contained)
1069+
{
1070+
ObservedContainer<std::basic_string<Parameters...>>::operator=(contained);
1071+
return *this;
1072+
}
1073+
Observed<std::basic_string<Parameters...>>& operator=(std::basic_string<Parameters...>&& contained)
1074+
{
1075+
ObservedContainer<std::basic_string<Parameters...>>::operator=(std::move(contained));
1076+
return *this;
1077+
}
1078+
10181079
Observed<std::basic_string<Parameters...>>& erase(std::size_t index = 0, std::size_t count = std::string::npos)
10191080
{
10201081
const auto sizeBefore = this->contained_.size();
@@ -1027,18 +1088,32 @@ namespace Nui
10271088
class Observed<std::set<Parameters...>> : public ObservedContainer<std::set<Parameters...>>
10281089
{
10291090
public:
1091+
using ObservedContainer<std::set<Parameters...>>::ObservedContainer;
1092+
using ObservedContainer<std::set<Parameters...>>::operator=;
1093+
using ObservedContainer<std::set<Parameters...>>::operator->;
10301094
static constexpr auto isRandomAccess = false;
10311095

10321096
public:
10331097
Observed()
10341098
: ObservedContainer<std::set<Parameters...>>{RangeEventContext{0, true}}
10351099
{}
10361100
template <typename T = std::set<Parameters...>>
1037-
Observed(T&& t)
1101+
explicit Observed(T&& t)
10381102
: ObservedContainer<std::set<Parameters...>>{
10391103
std::forward<T>(t),
10401104
RangeEventContext{static_cast<long>(t.size()), true}}
10411105
{}
1106+
1107+
Observed<std::set<Parameters...>>& operator=(std::set<Parameters...> const& contained)
1108+
{
1109+
ObservedContainer<std::set<Parameters...>>::operator=(contained);
1110+
return *this;
1111+
}
1112+
Observed<std::set<Parameters...>>& operator=(std::set<Parameters...>&& contained)
1113+
{
1114+
ObservedContainer<std::set<Parameters...>>::operator=(std::move(contained));
1115+
return *this;
1116+
}
10421117
};
10431118

10441119
template <typename ContainerT>
@@ -1118,7 +1193,7 @@ namespace Nui
11181193
struct CopiableObservedWrap // minimal wrapper to make Observed<T> copiable
11191194
{
11201195
public:
1121-
constexpr CopiableObservedWrap(Observed<T> const& observed)
1196+
explicit constexpr CopiableObservedWrap(Observed<T> const& observed)
11221197
: observed_{&observed}
11231198
{}
11241199

nui/include/nui/frontend/event_system/observed_value_combinator.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,10 @@ namespace Nui
1212
class ObservedValueCombinatorBase
1313
{
1414
public:
15-
constexpr ObservedValueCombinatorBase(ObservedValues const&... observedValues)
15+
explicit constexpr ObservedValueCombinatorBase(ObservedValues const&... observedValues)
1616
: observedValues_{observedValues...}
1717
{}
18-
constexpr ObservedValueCombinatorBase(std::tuple<ObservedValues const&...> observedValues)
18+
explicit constexpr ObservedValueCombinatorBase(std::tuple<ObservedValues const&...> observedValues)
1919
: observedValues_{std::move(observedValues)}
2020
{}
2121

nui/include/nui/frontend/event_system/range.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ namespace Nui
66
class ObservedRange
77
{
88
public:
9-
constexpr ObservedRange(ObservedValue& observedValues)
9+
explicit constexpr ObservedRange(ObservedValue& observedValues)
1010
: observedValue_{observedValues}
1111
{}
1212

nui/include/nui/frontend/event_system/range_event_context.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -182,7 +182,7 @@ namespace Nui
182182
class RangeEventContext
183183
{
184184
public:
185-
RangeEventContext(long dataSize)
185+
explicit RangeEventContext(long dataSize)
186186
: modificationRanges_{}
187187
, fullRangeUpdate_{true}
188188
, disableOptimizations_{false}

0 commit comments

Comments
 (0)