1 //===------ MappedIteratorTest.cpp - Unit tests for mapped_iterator -------===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
9 #include "llvm/ADT/STLExtras.h"
10 #include "gtest/gtest.h"
16 TEST(MappedIteratorTest
, ApplyFunctionOnDereference
) {
17 std::vector
<int> V({0});
19 auto I
= map_iterator(V
.begin(), [](int X
) { return X
+ 1; });
21 EXPECT_EQ(*I
, 1) << "should have applied function in dereference";
24 TEST(MappedIteratorTest
, ApplyFunctionOnArrow
) {
29 std::vector
<int> V({0});
33 auto I
= map_iterator(V
.begin(), [&](int X
) -> S
& { return *(P
+ X
); });
37 EXPECT_EQ(Y
.Z
, 42) << "should have applied function during arrow";
40 TEST(MappedIteratorTest
, FunctionPreservesReferences
) {
41 std::vector
<int> V({1});
42 std::map
<int, int> M({ {1, 1} });
44 auto I
= map_iterator(V
.begin(), [&](int X
) -> int& { return M
[X
]; });
47 EXPECT_EQ(M
[1], 42) << "assignment should have modified M";
50 TEST(MappedIteratorTest
, CustomIteratorApplyFunctionOnDereference
) {
51 struct CustomMapIterator
52 : public llvm::mapped_iterator_base
<CustomMapIterator
,
53 std::vector
<int>::iterator
, int> {
56 /// Map the element to the iterator result type.
57 int mapElement(int X
) const { return X
+ 1; }
60 std::vector
<int> V({0});
62 CustomMapIterator
I(V
.begin());
64 EXPECT_EQ(*I
, 1) << "should have applied function in dereference";
67 TEST(MappedIteratorTest
, CustomIteratorApplyFunctionOnArrow
) {
71 struct CustomMapIterator
72 : public llvm::mapped_iterator_base
<CustomMapIterator
,
73 std::vector
<int>::iterator
, S
&> {
74 CustomMapIterator(std::vector
<int>::iterator it
, S
*P
) : BaseT(it
), P(P
) {}
76 /// Map the element to the iterator result type.
77 S
&mapElement(int X
) const { return *(P
+ X
); }
82 std::vector
<int> V({0});
85 CustomMapIterator
I(V
.begin(), &Y
);
89 EXPECT_EQ(Y
.Z
, 42) << "should have applied function during arrow";
92 TEST(MappedIteratorTest
, CustomIteratorFunctionPreservesReferences
) {
93 struct CustomMapIterator
94 : public llvm::mapped_iterator_base
<CustomMapIterator
,
95 std::vector
<int>::iterator
, int &> {
96 CustomMapIterator(std::vector
<int>::iterator it
, std::map
<int, int> &M
)
99 /// Map the element to the iterator result type.
100 int &mapElement(int X
) const { return M
[X
]; }
102 std::map
<int, int> &M
;
104 std::vector
<int> V({1});
105 std::map
<int, int> M({{1, 1}});
107 auto I
= CustomMapIterator(V
.begin(), M
);
110 EXPECT_EQ(M
[1], 42) << "assignment should have modified M";
113 } // anonymous namespace