From 105a3ce06269eb5c45a4820aba9d04f26de1fbdf Mon Sep 17 00:00:00 2001 From: Mehdi Amini Date: Wed, 12 Oct 2016 19:43:02 +0000 Subject: [ADT] Zip range adapter This augments the STLExtras toolset with a zip iterator and range adapter. Zip comes in two varieties: `zip`, which will zip to the shortest of the input ranges, and `zip_first`, which limits its `begin() == end()` checks to just the first krange. Patch by: Bryant Wong Differential Revision: https://reviews.llvm.org/D23252 llvm-svn: 284035 --- llvm/unittests/ADT/IteratorTest.cpp | 63 +++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) (limited to 'llvm/unittests/ADT') diff --git a/llvm/unittests/ADT/IteratorTest.cpp b/llvm/unittests/ADT/IteratorTest.cpp index 4f1d81d487d..a8d5b33a0b4 100644 --- a/llvm/unittests/ADT/IteratorTest.cpp +++ b/llvm/unittests/ADT/IteratorTest.cpp @@ -209,4 +209,67 @@ TEST(PointerIterator, Const) { EXPECT_EQ(A + 4, std::next(*Begin, 4)); } +TEST(ZipIteratorTest, Basic) { + using namespace std; + const SmallVector pi{3, 1, 4, 1, 5, 9}; + SmallVector odd{1, 1, 0, 1, 1, 1}; + const char message[] = "yynyyy\0"; + + for (auto tup : zip(pi, odd, message)) { + EXPECT_EQ(get<0>(tup) & 0x01, get<1>(tup)); + EXPECT_EQ(get<0>(tup) & 0x01 ? 'y' : 'n', get<2>(tup)); + } + + // note the rvalue + for (auto tup : zip(pi, SmallVector{1, 1, 0, 1, 1})) { + EXPECT_EQ(get<0>(tup) & 0x01, get<1>(tup)); + } +} + +TEST(ZipIteratorTest, ZipFirstBasic) { + using namespace std; + const SmallVector pi{3, 1, 4, 1, 5, 9}; + unsigned iters = 0; + + for (auto tup : zip_first(SmallVector{1, 1, 0, 1}, pi)) { + EXPECT_EQ(get<0>(tup), get<1>(tup) & 0x01); + iters += 1; + } + + EXPECT_EQ(iters, 4u); +} + +TEST(ZipIteratorTest, Mutability) { + using namespace std; + const SmallVector pi{3, 1, 4, 1, 5, 9}; + char message[] = "hello zip\0"; + + for (auto tup : zip(pi, message, message)) { + EXPECT_EQ(get<1>(tup), get<2>(tup)); + get<2>(tup) = get<0>(tup) & 0x01 ? 'y' : 'n'; + } + + // note the rvalue + for (auto tup : zip(message, "yynyyyzip\0")) { + EXPECT_EQ(get<0>(tup), get<1>(tup)); + } +} + +TEST(ZipIteratorTest, ZipFirstMutability) { + using namespace std; + vector pi{3, 1, 4, 1, 5, 9}; + unsigned iters = 0; + + for (auto tup : zip_first(SmallVector{1, 1, 0, 1}, pi)) { + get<1>(tup) = get<0>(tup); + iters += 1; + } + + EXPECT_EQ(iters, 4u); + + for (auto tup : zip_first(SmallVector{1, 1, 0, 1}, pi)) { + EXPECT_EQ(get<0>(tup), get<1>(tup)); + } +} + } // anonymous namespace -- cgit v1.2.3