|
30 | 30 |
|
31 | 31 | namespace {
|
32 | 32 |
|
33 |
| -#ifdef _MSC_VER |
34 |
| -// Warnings for unused variables in this test are false positives. On other |
35 |
| -// platforms, they are suppressed by ABSL_ATTRIBUTE_UNUSED, but that doesn't |
36 |
| -// work on MSVC. |
37 |
| -// Both the unused variables and the name length warnings are due to calls |
38 |
| -// to absl::make_index_sequence with very large values, creating very long type |
39 |
| -// names. The resulting warnings are so long they make build output unreadable. |
40 |
| -#pragma warning(push) |
41 |
| -#pragma warning(disable : 4503) // decorated name length exceeded |
42 |
| -#pragma warning(disable : 4101) // unreferenced local variable |
43 |
| -#endif // _MSC_VER |
44 |
| - |
45 | 33 | using ::testing::ElementsAre;
|
46 | 34 | using ::testing::Pointee;
|
47 | 35 | using ::testing::StaticAssertTypeEq;
|
48 | 36 |
|
49 |
| -TEST(IntegerSequenceTest, ValueType) { |
50 |
| - StaticAssertTypeEq<int, absl::integer_sequence<int>::value_type>(); |
51 |
| - StaticAssertTypeEq<char, absl::integer_sequence<char>::value_type>(); |
52 |
| -} |
53 |
| - |
54 |
| -TEST(IntegerSequenceTest, Size) { |
55 |
| - EXPECT_EQ(0, (absl::integer_sequence<int>::size())); |
56 |
| - EXPECT_EQ(1, (absl::integer_sequence<int, 0>::size())); |
57 |
| - EXPECT_EQ(1, (absl::integer_sequence<int, 1>::size())); |
58 |
| - EXPECT_EQ(2, (absl::integer_sequence<int, 1, 2>::size())); |
59 |
| - EXPECT_EQ(3, (absl::integer_sequence<int, 0, 1, 2>::size())); |
60 |
| - EXPECT_EQ(3, (absl::integer_sequence<int, -123, 123, 456>::size())); |
61 |
| - constexpr size_t sz = absl::integer_sequence<int, 0, 1>::size(); |
62 |
| - EXPECT_EQ(2, sz); |
63 |
| -} |
64 |
| - |
65 |
| -TEST(IntegerSequenceTest, MakeIndexSequence) { |
66 |
| - StaticAssertTypeEq<absl::index_sequence<>, absl::make_index_sequence<0>>(); |
67 |
| - StaticAssertTypeEq<absl::index_sequence<0>, absl::make_index_sequence<1>>(); |
68 |
| - StaticAssertTypeEq<absl::index_sequence<0, 1>, |
69 |
| - absl::make_index_sequence<2>>(); |
70 |
| - StaticAssertTypeEq<absl::index_sequence<0, 1, 2>, |
71 |
| - absl::make_index_sequence<3>>(); |
72 |
| -} |
73 |
| - |
74 |
| -TEST(IntegerSequenceTest, MakeIntegerSequence) { |
75 |
| - StaticAssertTypeEq<absl::integer_sequence<int>, |
76 |
| - absl::make_integer_sequence<int, 0>>(); |
77 |
| - StaticAssertTypeEq<absl::integer_sequence<int, 0>, |
78 |
| - absl::make_integer_sequence<int, 1>>(); |
79 |
| - StaticAssertTypeEq<absl::integer_sequence<int, 0, 1>, |
80 |
| - absl::make_integer_sequence<int, 2>>(); |
81 |
| - StaticAssertTypeEq<absl::integer_sequence<int, 0, 1, 2>, |
82 |
| - absl::make_integer_sequence<int, 3>>(); |
83 |
| -} |
84 |
| - |
85 |
| -template <typename... Ts> |
86 |
| -class Counter {}; |
87 |
| - |
88 |
| -template <size_t... Is> |
89 |
| -void CountAll(absl::index_sequence<Is...>) { |
90 |
| - // We only need an alias here, but instantiate a variable to silence warnings |
91 |
| - // for unused typedefs in some compilers. |
92 |
| - ABSL_ATTRIBUTE_UNUSED Counter<absl::make_index_sequence<Is>...> seq; |
93 |
| -} |
94 |
| - |
95 |
| -// This test verifies that absl::make_index_sequence can handle large arguments |
96 |
| -// without blowing up template instantiation stack, going OOM or taking forever |
97 |
| -// to compile (there is hard 15 minutes limit imposed by forge). |
98 |
| -TEST(IntegerSequenceTest, MakeIndexSequencePerformance) { |
99 |
| - // O(log N) template instantiations. |
100 |
| - // We only need an alias here, but instantiate a variable to silence warnings |
101 |
| - // for unused typedefs in some compilers. |
102 |
| - ABSL_ATTRIBUTE_UNUSED absl::make_index_sequence<(1 << 16) - 1> seq; |
103 |
| - // O(N) template instantiations. |
104 |
| - CountAll(absl::make_index_sequence<(1 << 8) - 1>()); |
105 |
| -} |
106 |
| - |
107 |
| -template <typename F, typename Tup, size_t... Is> |
108 |
| -auto ApplyFromTupleImpl(F f, const Tup& tup, absl::index_sequence<Is...>) |
109 |
| - -> decltype(f(std::get<Is>(tup)...)) { |
110 |
| - return f(std::get<Is>(tup)...); |
111 |
| -} |
112 |
| - |
113 |
| -template <typename Tup> |
114 |
| -using TupIdxSeq = absl::make_index_sequence<std::tuple_size<Tup>::value>; |
115 |
| - |
116 |
| -template <typename F, typename Tup> |
117 |
| -auto ApplyFromTuple(F f, const Tup& tup) |
118 |
| - -> decltype(ApplyFromTupleImpl(f, tup, TupIdxSeq<Tup>{})) { |
119 |
| - return ApplyFromTupleImpl(f, tup, TupIdxSeq<Tup>{}); |
120 |
| -} |
121 |
| - |
122 |
| -template <typename T> |
123 |
| -std::string Fmt(const T& x) { |
124 |
| - std::ostringstream os; |
125 |
| - os << x; |
126 |
| - return os.str(); |
127 |
| -} |
128 |
| - |
129 |
| -struct PoorStrCat { |
130 |
| - template <typename... Args> |
131 |
| - std::string operator()(const Args&... args) const { |
132 |
| - std::string r; |
133 |
| - for (const auto& e : {Fmt(args)...}) r += e; |
134 |
| - return r; |
135 |
| - } |
136 |
| -}; |
137 |
| - |
138 |
| -template <typename Tup, size_t... Is> |
139 |
| -std::vector<std::string> TupStringVecImpl(const Tup& tup, |
140 |
| - absl::index_sequence<Is...>) { |
141 |
| - return {Fmt(std::get<Is>(tup))...}; |
142 |
| -} |
143 |
| - |
144 |
| -template <typename... Ts> |
145 |
| -std::vector<std::string> TupStringVec(const std::tuple<Ts...>& tup) { |
146 |
| - return TupStringVecImpl(tup, absl::index_sequence_for<Ts...>()); |
147 |
| -} |
148 |
| - |
149 |
| -TEST(MakeIndexSequenceTest, ApplyFromTupleExample) { |
150 |
| - PoorStrCat f{}; |
151 |
| - EXPECT_EQ("12abc3.14", f(12, "abc", 3.14)); |
152 |
| - EXPECT_EQ("12abc3.14", ApplyFromTuple(f, std::make_tuple(12, "abc", 3.14))); |
153 |
| -} |
154 |
| - |
155 |
| -TEST(IndexSequenceForTest, Basic) { |
156 |
| - StaticAssertTypeEq<absl::index_sequence<>, absl::index_sequence_for<>>(); |
157 |
| - StaticAssertTypeEq<absl::index_sequence<0>, absl::index_sequence_for<int>>(); |
158 |
| - StaticAssertTypeEq<absl::index_sequence<0, 1, 2, 3>, |
159 |
| - absl::index_sequence_for<int, void, char, int>>(); |
160 |
| -} |
161 |
| - |
162 |
| -TEST(IndexSequenceForTest, Example) { |
163 |
| - EXPECT_THAT(TupStringVec(std::make_tuple(12, "abc", 3.14)), |
164 |
| - ElementsAre("12", "abc", "3.14")); |
165 |
| -} |
166 | 37 |
|
167 | 38 | int Function(int a, int b) { return a - b; }
|
168 | 39 |
|
|
0 commit comments