Skip to content

Commit f8d17f2

Browse files
committed
Add Merge() template specializations for Element containers
1 parent f21fcc1 commit f8d17f2

File tree

1 file changed

+27
-2
lines changed

1 file changed

+27
-2
lines changed

include/ftxui/dom/take_any_args.hpp

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,11 @@
55
#define FTXUI_DOM_TAKE_ANY_ARGS_HPP
66

77
// IWYU pragma: private, include "ftxui/dom/elements.hpp"
8+
#include <concepts>
89
#include <ftxui/dom/node.hpp>
10+
#include <queue>
11+
#include <ranges>
12+
#include <stack>
913

1014
namespace ftxui {
1115

@@ -17,13 +21,34 @@ inline void Merge(Elements& container, Element element) {
1721
container.push_back(std::move(element));
1822
}
1923

20-
template <>
21-
inline void Merge(Elements& container, Elements elements) {
24+
template <class Container>
25+
concept ElementRange =
26+
std::ranges::range<Container> &&
27+
std::same_as<std::ranges::range_value_t<Container>, Element>;
28+
29+
template <ElementRange T>
30+
inline void Merge(Elements& container, T elements) {
2231
for (auto& element : elements) {
2332
container.push_back(std::move(element));
2433
}
2534
}
2635

36+
template <>
37+
inline void Merge(Elements& container, std::stack<Element> elements) {
38+
while (!elements.empty()) {
39+
container.push_back(std::move(elements.top()));
40+
elements.pop();
41+
}
42+
}
43+
44+
template <>
45+
inline void Merge(Elements& container, std::queue<Element> elements) {
46+
while (!elements.empty()) {
47+
container.push_back(std::move(elements.back()));
48+
elements.pop();
49+
}
50+
}
51+
2752
// Turn a set of arguments into a vector.
2853
template <class... Args>
2954
Elements unpack(Args... args) {

0 commit comments

Comments
 (0)