File tree Expand file tree Collapse file tree 2 files changed +36
-0
lines changed
Expand file tree Collapse file tree 2 files changed +36
-0
lines changed Original file line number Diff line number Diff line change @@ -1415,6 +1415,18 @@ template <typename ContainerTy> auto make_second_range(ContainerTy &&c) {
14151415 });
14161416}
14171417
1418+ // / Return a range that conditionally reverses \p C. The collection is iterated
1419+ // / in reverse if \p ShouldReverse is true (otherwise, it is iterated forwards).
1420+ template <typename ContainerTy>
1421+ [[nodiscard]] auto reverse_conditionally (ContainerTy &&C, bool ShouldReverse) {
1422+ using IterTy = detail::IterOfRange<ContainerTy>;
1423+ using ReferenceTy = typename std::iterator_traits<IterTy>::reference;
1424+ return map_range (zip_equal (reverse (C), C),
1425+ [ShouldReverse](auto I) -> ReferenceTy {
1426+ return ShouldReverse ? std::get<0 >(I) : std::get<1 >(I);
1427+ });
1428+ }
1429+
14181430// ===----------------------------------------------------------------------===//
14191431// Extra additions to <utility>
14201432// ===----------------------------------------------------------------------===//
Original file line number Diff line number Diff line change @@ -1693,6 +1693,30 @@ TEST(STLExtrasTest, ProductOf) {
16931693 EXPECT_EQ (product_of (V3), 2 .0f );
16941694}
16951695
1696+ TEST (STLExtrasTest, ReverseConditionally) {
1697+ std::vector<char > foo = {' a' , ' b' , ' c' };
1698+
1699+ // Test backwards.
1700+ std::vector<char > ReverseResults;
1701+ for (char Value : llvm::reverse_conditionally (foo, /* ShouldReverse=*/ true )) {
1702+ ReverseResults.emplace_back (Value);
1703+ }
1704+ EXPECT_THAT (ReverseResults, ElementsAre (' c' , ' b' , ' a' ));
1705+
1706+ // Test forwards.
1707+ std::vector<char > ForwardResults;
1708+ for (char Value : llvm::reverse_conditionally (foo, /* ShouldReverse=*/ false )) {
1709+ ForwardResults.emplace_back (Value);
1710+ }
1711+ EXPECT_THAT (ForwardResults, ElementsAre (' a' , ' b' , ' c' ));
1712+
1713+ // Test modifying collection.
1714+ for (char &Value : llvm::reverse_conditionally (foo, /* ShouldReverse=*/ true )) {
1715+ ++Value;
1716+ }
1717+ EXPECT_THAT (foo, ElementsAre (' b' , ' c' , ' d' ));
1718+ }
1719+
16961720struct Foo ;
16971721struct Bar {};
16981722
You can’t perform that action at this time.
0 commit comments