Add Merge() specializations to support more Element containers (#1117)

`Merge()` was previously only supporting `Elements` as a `Element` container.  
This PR adds specialization for:
- all the containers that matches the concept `std::ranges::range`
- `std::queue`
- `std::stack`

Co-authored-by: ArthurSonzogni <sonzogniarthur@gmail.com>
Bug:https://github.com/ArthurSonzogni/FTXUI/issues/1108
Fixed:https://github.com/ArthurSonzogni/FTXUI/issues/1108
This commit is contained in:
Nicolas Busser
2025-10-19 23:53:33 +09:00
committed by GitHub
parent 68281ce3e8
commit 09e690f8ab
6 changed files with 88 additions and 20 deletions

View File

@@ -173,7 +173,7 @@ class InputBase : public ComponentBase, public InputOption {
elements.push_back(element);
}
auto element = vbox(std::move(elements), cursor_line) | frame;
auto element = vbox(std::move(elements)) | frame;
return transform_func({
std::move(element), hovered_, is_focused,
false // placeholder

View File

@@ -145,8 +145,8 @@ class MenuBase : public ComponentBase, public MenuOption {
}
const Element bar = IsHorizontal()
? hbox(std::move(elements), selected_focus_)
: vbox(std::move(elements), selected_focus_);
? hbox(std::move(elements))
: vbox(std::move(elements));
if (!underline.enabled) {
return bar | reflect(box_);

View File

@@ -46,7 +46,7 @@ class RadioboxBase : public ComponentBase, public RadioboxOption {
}
elements.push_back(element | reflect(boxes_[i]));
}
return vbox(std::move(elements), hovered_) | reflect(box_);
return vbox(std::move(elements)) | reflect(box_);
}
// NOLINTNEXTLINE(readability-function-cognitive-complexity)

View File

@@ -2,9 +2,13 @@
// Use of this source code is governed by the MIT license that can be found in
// the LICENSE file.
#include <gtest/gtest.h> // for Test, TestInfo (ptr only), EXPECT_EQ, Message, TEST, TestPartResult
#include <cstddef> // for size_t
#include <string> // for allocator, basic_string, string
#include <vector> // for vector
#include <array> // for array
#include <cstddef> // for size_t
#include <queue>
#include <stack> // for stack
#include <string> // for allocator, basic_string, string
#include <unordered_set> // for unordered_set
#include <vector> // for vector
#include "ftxui/dom/elements.hpp" // for text, operator|, Element, flex_grow, flex_shrink, hbox
#include "ftxui/dom/node.hpp" // for Render
@@ -358,5 +362,39 @@ TEST(HBoxTest, FlexGrow_NoFlex_FlewShrink) {
}
}
TEST(HBoxTest, FromElementsContainer) {
Elements elements_vector{text("0"), text("1")};
std::array<Element, 2> elements_array{text("0"), text("1")};
std::deque<Element> elements_deque{text("0"), text("1")};
std::stack<Element> elements_stack;
elements_stack.push(text("1"));
elements_stack.push(text("0"));
std::queue<Element> elements_queue;
elements_queue.emplace(text("0"));
elements_queue.emplace(text("1"));
const std::vector<Element> collection_hboxes{
hbox(std::move(elements_vector)), hbox(std::move(elements_array)),
hbox(std::move(elements_stack)), hbox(std::move(elements_deque)),
hbox(std::move(elements_queue)),
};
for (const Element& collection_hbox : collection_hboxes) {
Screen screen(2, 1);
Render(screen, collection_hbox);
EXPECT_EQ("01", screen.ToString());
}
// Exception: unordered set, which has no guaranteed order.
std::unordered_set<Element> elements_set{text("0"), text("0")};
Screen screen(2, 1);
Render(screen, hbox(elements_set));
EXPECT_EQ("00", screen.ToString());
};
} // namespace ftxui
// NOLINTEND