Skip to content

Commit 4bca60e

Browse files
authored
Merge pull request #105 from NuiCpp/devel
Fixed const correctness in static range.
2 parents 9e7e3f0 + bf1ae0f commit 4bca60e

File tree

4 files changed

+74
-10
lines changed

4 files changed

+74
-10
lines changed

nui/include/nui/frontend/elements/impl/html_element.hpp

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -267,18 +267,22 @@ namespace Nui
267267
requires(!InvocableReturns<GeneratorT, std::string>)
268268
auto operator()(GeneratorT&& elementRenderer) &&
269269
{
270-
return [self = this->clone(),
271-
elementRenderer = std::forward<GeneratorT>(elementRenderer)](auto& parentElement, Renderer const&) {
272-
return elementRenderer()(parentElement, Renderer{.type = RendererType::Append});
270+
return [self = this->clone(), elementRenderer = std::forward<GeneratorT>(elementRenderer)](
271+
auto& parentElement, Renderer const& gen) {
272+
auto materialized = renderElement(gen, parentElement, self);
273+
elementRenderer()(*materialized, Renderer{.type = RendererType::Append});
274+
return materialized;
273275
};
274276
}
275277
template <typename T, std::invocable<T&, Renderer const&> GeneratorT>
276278
requires InvocableReturns<GeneratorT, std::string>
277279
auto operator()(GeneratorT&& elementRenderer) &&
278280
{
279-
return [self = this->clone(),
280-
elementRenderer = std::forward<GeneratorT>(elementRenderer)](auto& parentElement, Renderer const&) {
281-
return elementRenderer(parentElement, Renderer{.type = RendererType::Append});
281+
return [self = this->clone(), elementRenderer = std::forward<GeneratorT>(elementRenderer)](
282+
auto& parentElement, Renderer const& gen) {
283+
auto materialized = renderElement(gen, parentElement, self);
284+
materialized->setTextContent(elementRenderer(*materialized, Renderer{.type = RendererType::Append}));
285+
return materialized;
282286
};
283287
}
284288

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -138,10 +138,10 @@ namespace Nui
138138
}
139139

140140
template <typename ContainerT>
141-
UnoptimizedRange<IteratorAccessor<ContainerT>> range(ContainerT const& container)
141+
UnoptimizedRange<IteratorAccessor<ContainerT const>> range(ContainerT const& container)
142142
{
143-
return UnoptimizedRange<IteratorAccessor<ContainerT>>{
144-
IteratorAccessor<ContainerT>{container},
143+
return UnoptimizedRange<IteratorAccessor<ContainerT const>>{
144+
IteratorAccessor<ContainerT const>{container},
145145
};
146146
}
147147

nui/include/nui/utility/iterator_accessor.hpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,4 +47,12 @@ namespace Nui
4747
private:
4848
ContainerT* container_;
4949
};
50+
51+
// Deduction guide for const ContainerT
52+
template <typename ContainerT>
53+
IteratorAccessor(ContainerT const&) -> IteratorAccessor<const ContainerT>;
54+
55+
// Deduction guide for non-const ContainerT
56+
template <typename ContainerT>
57+
IteratorAccessor(ContainerT&) -> IteratorAccessor<ContainerT>;
5058
}

nui/test/nui/test_render.hpp

Lines changed: 53 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -484,7 +484,7 @@ namespace Nui::Tests
484484
else
485485
{
486486
const auto s = stabilize(
487-
stable,
487+
stable,
488488
span{id = once}(button{class_ = onceClass}())
489489
);
490490
once = "X";
@@ -733,4 +733,56 @@ namespace Nui::Tests
733733
EXPECT_EQ(
734734
Nui::val::global("document")["body"]["children"][0]["children"][0]["attributes"]["cx"].as<long long>(), 10);
735735
}
736+
737+
TEST_F(TestRender, CanUseUnconditionalRendererFunction)
738+
{
739+
using namespace Nui::Elements;
740+
using namespace Nui::Attributes;
741+
using div = Nui::Elements::div;
742+
743+
render(body{id = "body"}([]() -> Nui::ElementRenderer {
744+
return div{
745+
id = "inner",
746+
}();
747+
}));
748+
749+
EXPECT_EQ(Nui::val::global("document")["body"]["children"]["length"].as<long long>(), 1);
750+
EXPECT_EQ(Nui::val::global("document")["body"]["children"][0]["attributes"]["id"].as<std::string>(), "inner");
751+
}
752+
753+
TEST_F(TestRender, AttributesArePresentOnRangeChildWithRendererFunctionChildren)
754+
{
755+
using namespace Nui::Elements;
756+
using namespace Nui::Attributes;
757+
using div = Nui::Elements::div;
758+
using span = Nui::Elements::span;
759+
760+
Nui::Observed<std::vector<std::string>> range{std::vector<std::string>{"A", "B", "C", "D"}};
761+
762+
render(body{
763+
class_ = "range-parent",
764+
}(range.map([](long long, auto const& element) {
765+
return div{
766+
class_ = "range-child",
767+
id = element,
768+
}([]() -> Nui::ElementRenderer {
769+
return span{
770+
class_ = "range-child-child",
771+
}();
772+
});
773+
})));
774+
775+
auto children = Nui::val::global("document")["body"]["children"].as<Nui::Tests::Engine::Array>();
776+
ASSERT_EQ(children.size(), range.value().size());
777+
778+
for (size_t i = 0; i < children.size(); ++i)
779+
{
780+
auto& child = children[i];
781+
std::string expectedId = range.value()[i];
782+
std::string expectedClass = "range-child";
783+
784+
EXPECT_EQ(child["attributes"]["id"].as<std::string>(), expectedId);
785+
EXPECT_EQ(child["attributes"]["class"].as<std::string>(), expectedClass);
786+
}
787+
}
736788
}

0 commit comments

Comments
 (0)