|
6 | 6 | #include "enumerate.hpp" |
7 | 7 | #include "filter.hpp" |
8 | 8 | #include "filter_map.hpp" |
| 9 | +#include "flatten.hpp" |
9 | 10 | #include "inspect.hpp" |
10 | 11 | #include "interperse.hpp" |
11 | 12 | #include "map.hpp" |
@@ -47,6 +48,7 @@ using iterator::CycleType; |
47 | 48 | using iterator::Enumerate; |
48 | 49 | using iterator::Filter; |
49 | 50 | using iterator::FilterMap; |
| 51 | +using iterator::Flatten; |
50 | 52 | using iterator::Inspect; |
51 | 53 | using iterator::Interperse; |
52 | 54 | using iterator::Map; |
@@ -113,6 +115,10 @@ class IterInterface |
113 | 115 | [[nodiscard]] auto filterMap(Functor&& f) |
114 | 116 | -> FilterMap<T, typename std::invoke_result_t<Functor, T>::value_type, Functor, Derived>; |
115 | 117 |
|
| 118 | + template <class R = T> |
| 119 | + requires Indexable<R> |
| 120 | + [[nodiscard]] auto flatten() -> Flatten<R, Derived>; |
| 121 | + |
116 | 122 | template <class B, class Functor> |
117 | 123 | requires FoldFunctor<B, T, Functor> |
118 | 124 | [[nodiscard]] auto fold(B&& init, Functor&& f) -> B; |
@@ -241,7 +247,7 @@ auto rusty_iterators::interface::IterInterface<T, Derived>::collect() -> std::ve |
241 | 247 | auto size = sizeHintChecked(); |
242 | 248 |
|
243 | 249 | collection.reserve(size); |
244 | | - self().forEach([&collection](auto&& x) { collection.push_back(std::move(x)); }); |
| 250 | + self().forEach([&collection](auto x) { collection.push_back(x); }); |
245 | 251 |
|
246 | 252 | return std::move(collection); |
247 | 253 | } |
@@ -322,6 +328,14 @@ auto rusty_iterators::interface::IterInterface<T, Derived>::filterMap(Functor&& |
322 | 328 | std::forward<Derived>(self()), std::forward<Functor>(f)}; |
323 | 329 | } |
324 | 330 |
|
| 331 | +template <class T, class Derived> |
| 332 | +template <class R> |
| 333 | + requires rusty_iterators::concepts::Indexable<R> |
| 334 | +auto rusty_iterators::interface::IterInterface<T, Derived>::flatten() -> Flatten<R, Derived> |
| 335 | +{ |
| 336 | + return Flatten<R, Derived>{std::forward<Derived>(self())}; |
| 337 | +} |
| 338 | + |
325 | 339 | template <class T, class Derived> |
326 | 340 | template <class B, class Functor> |
327 | 341 | requires rusty_iterators::concepts::FoldFunctor<B, T, Functor> |
@@ -353,7 +367,7 @@ auto rusty_iterators::interface::IterInterface<T, Derived>::forEach(Functor&& f) |
353 | 367 |
|
354 | 368 | [[likely]] while (nextItem.has_value()) |
355 | 369 | { |
356 | | - func(std::move(nextItem.value())); |
| 370 | + func(nextItem.value()); |
357 | 371 | nextItem = self().next(); |
358 | 372 | } |
359 | 373 | } |
|
0 commit comments