Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(155)

Side by Side Diff: base/containers/flat_tree_unittest.cc

Issue 2776793002: Make flat containers stable, allow constructing from vector. (Closed)
Patch Set: Merge Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2017 The Chromium Authors. All rights reserved. 1 // Copyright 2017 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "base/containers/flat_tree.h" 5 #include "base/containers/flat_tree.h"
6 6
7 // Following tests are ported and extended tests from libcpp for std::set. 7 // Following tests are ported and extended tests from libcpp for std::set.
8 // They can be found here: 8 // They can be found here:
9 // https://github.com/llvm-mirror/libcxx/tree/master/test/std/containers/associa tive/set 9 // https://github.com/llvm-mirror/libcxx/tree/master/test/std/containers/associa tive/set
10 // 10 //
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after
123 class NonDefaultConstructibleCompare { 123 class NonDefaultConstructibleCompare {
124 public: 124 public:
125 explicit NonDefaultConstructibleCompare(int) {} 125 explicit NonDefaultConstructibleCompare(int) {}
126 126
127 template <typename T> 127 template <typename T>
128 bool operator()(const T& lhs, const T& rhs) const { 128 bool operator()(const T& lhs, const T& rhs) const {
129 return std::less<T>()(lhs, rhs); 129 return std::less<T>()(lhs, rhs);
130 } 130 }
131 }; 131 };
132 132
133 template <class PairType>
134 struct LessByFirst {
135 bool operator()(const PairType& lhs, const PairType& rhs) const {
136 return lhs.first < rhs.first;
137 }
138 };
139
133 // Common test trees. 140 // Common test trees.
134 141
135 // TODO(dyaroshev): replace less<int> with less<>, once we have it 142 // TODO(dyaroshev): replace less<int> with less<>, once we have it
136 // crbug.com/682254. This will make it different than IntTree. 143 // crbug.com/682254. This will make it different than IntTree.
137 using IntTreeWithLess = 144 using IntTreeWithLess =
138 flat_tree<int, int, GetKeyFromValueIdentity<int>, std::less<int>>; 145 flat_tree<int, int, GetKeyFromValueIdentity<int>, std::less<int>>;
139 using IntTree = 146 using IntTree =
140 flat_tree<int, int, GetKeyFromValueIdentity<int>, std::less<int>>; 147 flat_tree<int, int, GetKeyFromValueIdentity<int>, std::less<int>>;
148 using IntPair = std::pair<int, int>;
149 using IntPairTree = flat_tree<IntPair,
150 IntPair,
151 GetKeyFromValueIdentity<IntPair>,
152 LessByFirst<IntPair>>;
141 using MoveOnlyTree = flat_tree<MoveOnlyInt, 153 using MoveOnlyTree = flat_tree<MoveOnlyInt,
142 MoveOnlyInt, 154 MoveOnlyInt,
143 GetKeyFromValueIdentity<MoveOnlyInt>, 155 GetKeyFromValueIdentity<MoveOnlyInt>,
144 std::less<MoveOnlyInt>>; 156 std::less<MoveOnlyInt>>;
145 using EmplaceableTree = flat_tree<Emplaceable, 157 using EmplaceableTree = flat_tree<Emplaceable,
146 Emplaceable, 158 Emplaceable,
147 GetKeyFromValueIdentity<Emplaceable>, 159 GetKeyFromValueIdentity<Emplaceable>,
148 std::less<Emplaceable>>; 160 std::less<Emplaceable>>;
149 using ReversedTree = 161 using ReversedTree =
150 flat_tree<int, int, GetKeyFromValueIdentity<int>, std::greater<int>>; 162 flat_tree<int, int, GetKeyFromValueIdentity<int>, std::greater<int>>;
151 163
152 using TreeWithStrangeCompare = flat_tree<int, 164 using TreeWithStrangeCompare = flat_tree<int,
153 int, 165 int,
154 GetKeyFromValueIdentity<int>, 166 GetKeyFromValueIdentity<int>,
155 NonDefaultConstructibleCompare>; 167 NonDefaultConstructibleCompare>;
156 168
157 using ::testing::ElementsAre; 169 using ::testing::ElementsAre;
158 170
159 } // namespace 171 } // namespace
160 172
173 TEST(FlatTree, LastUnique) {
174 using Pair = std::pair<int, int>;
175 using Vect = std::vector<Pair>;
176
177 auto cmp = [](const Pair& lhs, const Pair& rhs) {
178 return lhs.first == rhs.first;
179 };
180
181 // Empty case.
182 Vect empty;
183 EXPECT_EQ(empty.end(), LastUnique(empty.begin(), empty.end(), cmp));
184
185 // Single element.
186 Vect one;
187 one.push_back(Pair(1, 1));
188 EXPECT_EQ(one.end(), LastUnique(one.begin(), one.end(), cmp));
189 ASSERT_EQ(1u, one.size());
190 EXPECT_THAT(one, ElementsAre(Pair(1, 1)));
191
192 // Two elements, already unique.
193 Vect two_u;
194 two_u.push_back(Pair(1, 1));
195 two_u.push_back(Pair(2, 2));
196 EXPECT_EQ(two_u.end(), LastUnique(two_u.begin(), two_u.end(), cmp));
197 EXPECT_THAT(two_u, ElementsAre(Pair(1, 1), Pair(2, 2)));
198
199 // Two elements, dupes.
200 Vect two_d;
201 two_d.push_back(Pair(1, 1));
202 two_d.push_back(Pair(1, 2));
203 auto last = LastUnique(two_d.begin(), two_d.end(), cmp);
204 EXPECT_EQ(two_d.begin() + 1, last);
205 two_d.erase(last, two_d.end());
206 EXPECT_THAT(two_d, ElementsAre(Pair(1, 2)));
207
208 // Non-dupes, dupes, non-dupes.
209 Vect ndn;
210 ndn.push_back(Pair(1, 1));
211 ndn.push_back(Pair(2, 1));
212 ndn.push_back(Pair(2, 2));
213 ndn.push_back(Pair(2, 3));
214 ndn.push_back(Pair(3, 1));
215 last = LastUnique(ndn.begin(), ndn.end(), cmp);
216 EXPECT_EQ(ndn.begin() + 3, last);
217 ndn.erase(last, ndn.end());
218 EXPECT_THAT(ndn, ElementsAre(Pair(1, 1), Pair(2, 3), Pair(3, 1)));
219
220 // Dupes, non-dupes, dupes.
221 Vect dnd;
222 dnd.push_back(Pair(1, 1));
223 dnd.push_back(Pair(1, 2));
224 dnd.push_back(Pair(1, 3));
225 dnd.push_back(Pair(2, 1));
226 dnd.push_back(Pair(3, 1));
227 dnd.push_back(Pair(3, 2));
228 dnd.push_back(Pair(3, 3));
229 last = LastUnique(dnd.begin(), dnd.end(), cmp);
230 EXPECT_EQ(dnd.begin() + 3, last);
231 dnd.erase(last, dnd.end());
232 EXPECT_THAT(dnd, ElementsAre(Pair(1, 3), Pair(2, 1), Pair(3, 3)));
233 }
234
161 // ---------------------------------------------------------------------------- 235 // ----------------------------------------------------------------------------
162 // Class. 236 // Class.
163 237
164 // Check that flat_tree and its iterators can be instantiated with an 238 // Check that flat_tree and its iterators can be instantiated with an
165 // incomplete type. 239 // incomplete type.
166 240
167 TEST(FlatTree, IncompleteType) { 241 TEST(FlatTree, IncompleteType) {
168 struct A { 242 struct A {
169 using Tree = flat_tree<A, A, GetKeyFromValueIdentity<A>, std::less<A>>; 243 using Tree = flat_tree<A, A, GetKeyFromValueIdentity<A>, std::less<A>>;
170 int data; 244 int data;
171 Tree set_with_incomplete_type; 245 Tree set_with_incomplete_type;
172 Tree::iterator it; 246 Tree::iterator it;
173 Tree::const_iterator cit; 247 Tree::const_iterator cit;
174 248
175 // We do not declare operator< because clang complains that it's unused. 249 // We do not declare operator< because clang complains that it's unused.
176 }; 250 };
177 251
178 A a; 252 A a;
179 } 253 }
180 254
181 TEST(FlatTree, Stability) { 255 TEST(FlatTree, Stability) {
182 using Pair = std::pair<int, int>; 256 using Pair = std::pair<int, int>;
183 257
184 struct LessByFirst { 258 using Tree =
185 bool operator()(const Pair& lhs, const Pair& rhs) const { 259 flat_tree<Pair, Pair, GetKeyFromValueIdentity<Pair>, LessByFirst<Pair>>;
186 return lhs.first < rhs.first; 260
187 } 261 // Constructors are stable.
262 Tree cont({{0, 0}, {1, 0}, {0, 1}, {2, 0}, {0, 2}, {1, 1}},
263 KEEP_FIRST_OF_DUPES);
264
265 auto AllOfSecondsAreZero = [&cont] {
266 return std::all_of(cont.begin(), cont.end(),
267 [](const Pair& elem) { return elem.second == 0; });
188 }; 268 };
189 269
190 using Tree = 270 EXPECT_TRUE(AllOfSecondsAreZero()) << "constructor should be stable";
191 flat_tree<Pair, Pair, GetKeyFromValueIdentity<Pair>, LessByFirst>;
192
193 // Constructors are not stable.
194 Tree cont{{0, 0}, {1, 0}, {0, 1}, {2, 0}, {0, 2}, {1, 1}};
195
196 auto NoneOfSecondsAreTwo = [&cont] {
197 return std::none_of(cont.begin(), cont.end(),
198 [](const Pair& elem) { return elem.second == 2; });
199 };
200 271
201 // Should not replace existing. 272 // Should not replace existing.
202 cont.insert(Pair(0, 2)); 273 cont.insert(Pair(0, 2));
203 cont.insert(Pair(1, 2)); 274 cont.insert(Pair(1, 2));
204 cont.insert(Pair(2, 2)); 275 cont.insert(Pair(2, 2));
205 276
206 EXPECT_TRUE(NoneOfSecondsAreTwo()) 277 EXPECT_TRUE(AllOfSecondsAreZero()) << "insert should be stable";
207 << "insert should be stable with respect to constructor";
208 278
209 cont.insert(Pair(3, 0)); 279 cont.insert(Pair(3, 0));
210 cont.insert(Pair(3, 2)); 280 cont.insert(Pair(3, 2));
211 281
212 EXPECT_TRUE(NoneOfSecondsAreTwo()) 282 EXPECT_TRUE(AllOfSecondsAreZero()) << "insert should be stable";
213 << "insert should be stable with respect to previous insert";
214 } 283 }
215 284
216 // ---------------------------------------------------------------------------- 285 // ----------------------------------------------------------------------------
217 // Types. 286 // Types.
218 287
219 // key_type 288 // key_type
220 // key_compare 289 // key_compare
221 // value_type 290 // value_type
222 // value_compare 291 // value_compare
223 // pointer 292 // pointer
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
256 EXPECT_THAT(cont, ElementsAre()); 325 EXPECT_THAT(cont, ElementsAre());
257 } 326 }
258 327
259 { 328 {
260 TreeWithStrangeCompare cont(NonDefaultConstructibleCompare(0)); 329 TreeWithStrangeCompare cont(NonDefaultConstructibleCompare(0));
261 EXPECT_THAT(cont, ElementsAre()); 330 EXPECT_THAT(cont, ElementsAre());
262 } 331 }
263 } 332 }
264 333
265 // flat_tree(InputIterator first, 334 // flat_tree(InputIterator first,
266 // InputIterator last, 335 // InputIterator last,
267 // const Compare& comp = Compare()) 336 // FlatContainerDupes dupe_handling,
337 // const Compare& comp = Compare())
268 338
269 TEST(FlatTree, RangeConstructor) { 339 TEST(FlatTree, RangeConstructor) {
270 { 340 {
271 IntTree::value_type input_vals[] = {1, 1, 1, 2, 2, 2, 3, 3, 3}; 341 IntPair input_vals[] = {{1, 1}, {1, 2}, {2, 1}, {2, 2}, {1, 3},
342 {2, 3}, {3, 1}, {3, 2}, {3, 3}};
272 343
273 IntTree cont(MakeInputIterator(std::begin(input_vals)), 344 IntPairTree first_of(MakeInputIterator(std::begin(input_vals)),
274 MakeInputIterator(std::end(input_vals))); 345 MakeInputIterator(std::end(input_vals)),
275 EXPECT_THAT(cont, ElementsAre(1, 2, 3)); 346 KEEP_FIRST_OF_DUPES);
347 EXPECT_THAT(first_of,
348 ElementsAre(IntPair(1, 1), IntPair(2, 1), IntPair(3, 1)));
349
350 IntPairTree last_of(MakeInputIterator(std::begin(input_vals)),
351 MakeInputIterator(std::end(input_vals)),
352 KEEP_LAST_OF_DUPES);
353 EXPECT_THAT(last_of,
354 ElementsAre(IntPair(1, 3), IntPair(2, 3), IntPair(3, 3)));
276 } 355 }
277 { 356 {
278 TreeWithStrangeCompare::value_type input_vals[] = {1, 1, 1, 2, 2, 357 TreeWithStrangeCompare::value_type input_vals[] = {1, 1, 1, 2, 2,
279 2, 3, 3, 3}; 358 2, 3, 3, 3};
280 359
281 TreeWithStrangeCompare cont(MakeInputIterator(std::begin(input_vals)), 360 TreeWithStrangeCompare cont(MakeInputIterator(std::begin(input_vals)),
282 MakeInputIterator(std::end(input_vals)), 361 MakeInputIterator(std::end(input_vals)),
362 KEEP_FIRST_OF_DUPES,
283 NonDefaultConstructibleCompare(0)); 363 NonDefaultConstructibleCompare(0));
284 EXPECT_THAT(cont, ElementsAre(1, 2, 3)); 364 EXPECT_THAT(cont, ElementsAre(1, 2, 3));
285 } 365 }
286 } 366 }
287 367
288 // flat_tree(const flat_tree& x) 368 // flat_tree(const flat_tree& x)
289 369
290 TEST(FlatTree, CopyConstructor) { 370 TEST(FlatTree, CopyConstructor) {
291 IntTree original{1, 2, 3, 4}; 371 IntTree original({1, 2, 3, 4}, KEEP_FIRST_OF_DUPES);
292 IntTree copied(original); 372 IntTree copied(original);
293 373
294 EXPECT_THAT(copied, ElementsAre(1, 2, 3, 4)); 374 EXPECT_THAT(copied, ElementsAre(1, 2, 3, 4));
295 375
296 EXPECT_THAT(copied, ElementsAre(1, 2, 3, 4)); 376 EXPECT_THAT(copied, ElementsAre(1, 2, 3, 4));
297 EXPECT_THAT(original, ElementsAre(1, 2, 3, 4)); 377 EXPECT_THAT(original, ElementsAre(1, 2, 3, 4));
298 EXPECT_EQ(original, copied); 378 EXPECT_EQ(original, copied);
299 } 379 }
300 380
301 // flat_tree(flat_tree&& x) 381 // flat_tree(flat_tree&& x)
302 382
303 TEST(FlatTree, MoveConstructor) { 383 TEST(FlatTree, MoveConstructor) {
304 int input_range[] = {1, 2, 3, 4}; 384 int input_range[] = {1, 2, 3, 4};
305 385
306 MoveOnlyTree original(std::begin(input_range), std::end(input_range)); 386 MoveOnlyTree original(std::begin(input_range), std::end(input_range),
387 KEEP_FIRST_OF_DUPES);
307 MoveOnlyTree moved(std::move(original)); 388 MoveOnlyTree moved(std::move(original));
308 389
309 EXPECT_EQ(1U, moved.count(MoveOnlyInt(1))); 390 EXPECT_EQ(1U, moved.count(MoveOnlyInt(1)));
310 EXPECT_EQ(1U, moved.count(MoveOnlyInt(2))); 391 EXPECT_EQ(1U, moved.count(MoveOnlyInt(2)));
311 EXPECT_EQ(1U, moved.count(MoveOnlyInt(3))); 392 EXPECT_EQ(1U, moved.count(MoveOnlyInt(3)));
312 EXPECT_EQ(1U, moved.count(MoveOnlyInt(4))); 393 EXPECT_EQ(1U, moved.count(MoveOnlyInt(4)));
313 } 394 }
314 395
315 // flat_tree(std::initializer_list<value_type> ilist, 396 // flat_tree(std::vector<value_type>, FlatContainerDupes dupe_handling)
397
398 TEST(FlatTree, VectorConstructor) {
399 using Pair = std::pair<int, MoveOnlyInt>;
400
401 // Construct an unsorted vector with a duplicate item in it. Sorted by the
402 // first item, the second allows us to test for stability. Using a move
403 // only type to ensure the vector is not copied.
404 std::vector<Pair> storage;
405 storage.push_back(Pair(2, MoveOnlyInt(0)));
406 storage.push_back(Pair(1, MoveOnlyInt(0)));
407 storage.push_back(Pair(2, MoveOnlyInt(1)));
408
409 using Tree =
410 flat_tree<Pair, Pair, GetKeyFromValueIdentity<Pair>, LessByFirst<Pair>>;
411 Tree tree(std::move(storage), KEEP_FIRST_OF_DUPES);
412
413 // The list should be two items long, with only the first "2" saved.
414 ASSERT_EQ(2u, tree.size());
415 const Pair& zeroth = *tree.begin();
416 ASSERT_EQ(1, zeroth.first);
417 ASSERT_EQ(0, zeroth.second.data());
418
419 const Pair& first = *(tree.begin() + 1);
420 ASSERT_EQ(2, first.first);
421 ASSERT_EQ(0, first.second.data());
422
423 // Test KEEP_LAST_OF_DUPES with a simple vector constructor.
424 std::vector<IntPair> int_storage{{1, 1}, {1, 2}, {2, 1}};
425 IntPairTree int_tree(std::move(int_storage), KEEP_LAST_OF_DUPES);
426 EXPECT_THAT(int_tree, ElementsAre(IntPair(1, 2), IntPair(2, 1)));
427 }
428
429 // flat_tree(std::initializer_list<value_type> ilist,
430 // FlatContainerDupes dupe_handling,
316 // const Compare& comp = Compare()) 431 // const Compare& comp = Compare())
317 432
318 TEST(FlatTree, InitializerListConstructor) { 433 TEST(FlatTree, InitializerListConstructor) {
319 { 434 {
320 IntTree cont{1, 2, 3, 4, 5, 6, 10, 8}; 435 IntTree cont({1, 2, 3, 4, 5, 6, 10, 8}, KEEP_FIRST_OF_DUPES);
321 EXPECT_THAT(cont, ElementsAre(1, 2, 3, 4, 5, 6, 8, 10)); 436 EXPECT_THAT(cont, ElementsAre(1, 2, 3, 4, 5, 6, 8, 10));
322 } 437 }
323 { 438 {
324 TreeWithStrangeCompare cont({1, 2, 3, 4, 5, 6, 10, 8}, 439 IntTree cont({1, 2, 3, 4, 5, 6, 10, 8}, KEEP_FIRST_OF_DUPES);
440 EXPECT_THAT(cont, ElementsAre(1, 2, 3, 4, 5, 6, 8, 10));
441 }
442 {
443 TreeWithStrangeCompare cont({1, 2, 3, 4, 5, 6, 10, 8}, KEEP_FIRST_OF_DUPES,
325 NonDefaultConstructibleCompare(0)); 444 NonDefaultConstructibleCompare(0));
326 EXPECT_THAT(cont, ElementsAre(1, 2, 3, 4, 5, 6, 8, 10)); 445 EXPECT_THAT(cont, ElementsAre(1, 2, 3, 4, 5, 6, 8, 10));
327 } 446 }
447 {
448 IntPairTree first_of({{1, 1}, {2, 1}, {1, 2}}, KEEP_FIRST_OF_DUPES);
449 EXPECT_THAT(first_of, ElementsAre(IntPair(1, 1), IntPair(2, 1)));
450 }
451 {
452 IntPairTree last_of({{1, 1}, {2, 1}, {1, 2}}, KEEP_LAST_OF_DUPES);
453 EXPECT_THAT(last_of, ElementsAre(IntPair(1, 2), IntPair(2, 1)));
454 }
328 } 455 }
329 456
330 // ---------------------------------------------------------------------------- 457 // ----------------------------------------------------------------------------
331 // Assignments. 458 // Assignments.
332 459
333 // flat_tree& operator=(const flat_tree&) 460 // flat_tree& operator=(const flat_tree&)
334 461
335 TEST(FlatTree, CopyAssignable) { 462 TEST(FlatTree, CopyAssignable) {
336 IntTree original{1, 2, 3, 4}; 463 IntTree original({1, 2, 3, 4}, KEEP_FIRST_OF_DUPES);
337 IntTree copied; 464 IntTree copied;
338 copied = original; 465 copied = original;
339 466
340 EXPECT_THAT(copied, ElementsAre(1, 2, 3, 4)); 467 EXPECT_THAT(copied, ElementsAre(1, 2, 3, 4));
341 EXPECT_THAT(original, ElementsAre(1, 2, 3, 4)); 468 EXPECT_THAT(original, ElementsAre(1, 2, 3, 4));
342 EXPECT_EQ(original, copied); 469 EXPECT_EQ(original, copied);
343 } 470 }
344 471
345 // flat_tree& operator=(flat_tree&&) 472 // flat_tree& operator=(flat_tree&&)
346 473
347 TEST(FlatTree, MoveAssignable) { 474 TEST(FlatTree, MoveAssignable) {
348 int input_range[] = {1, 2, 3, 4}; 475 int input_range[] = {1, 2, 3, 4};
349 476
350 MoveOnlyTree original(std::begin(input_range), std::end(input_range)); 477 MoveOnlyTree original(std::begin(input_range), std::end(input_range),
478 KEEP_FIRST_OF_DUPES);
351 MoveOnlyTree moved; 479 MoveOnlyTree moved;
352 moved = std::move(original); 480 moved = std::move(original);
353 481
354 EXPECT_EQ(1U, moved.count(MoveOnlyInt(1))); 482 EXPECT_EQ(1U, moved.count(MoveOnlyInt(1)));
355 EXPECT_EQ(1U, moved.count(MoveOnlyInt(2))); 483 EXPECT_EQ(1U, moved.count(MoveOnlyInt(2)));
356 EXPECT_EQ(1U, moved.count(MoveOnlyInt(3))); 484 EXPECT_EQ(1U, moved.count(MoveOnlyInt(3)));
357 EXPECT_EQ(1U, moved.count(MoveOnlyInt(4))); 485 EXPECT_EQ(1U, moved.count(MoveOnlyInt(4)));
358 } 486 }
359 487
360 // flat_tree& operator=(std::initializer_list<value_type> ilist) 488 // flat_tree& operator=(std::initializer_list<value_type> ilist)
361 489
362 TEST(FlatTree, InitializerListAssignable) { 490 TEST(FlatTree, InitializerListAssignable) {
363 IntTree cont{0}; 491 IntTree cont({0}, KEEP_FIRST_OF_DUPES);
364 cont = {1, 2, 3, 4, 5, 6, 10, 8}; 492 cont = {1, 2, 3, 4, 5, 6, 10, 8};
365 493
366 EXPECT_EQ(0U, cont.count(0)); 494 EXPECT_EQ(0U, cont.count(0));
367 EXPECT_THAT(cont, ElementsAre(1, 2, 3, 4, 5, 6, 8, 10)); 495 EXPECT_THAT(cont, ElementsAre(1, 2, 3, 4, 5, 6, 8, 10));
368 } 496 }
369 497
370 // -------------------------------------------------------------------------- 498 // --------------------------------------------------------------------------
371 // Memory management. 499 // Memory management.
372 500
373 // void reserve(size_type new_capacity) 501 // void reserve(size_type new_capacity)
374 502
375 TEST(FlatTree, Reserve) { 503 TEST(FlatTree, Reserve) {
376 IntTree cont{1, 2, 3}; 504 IntTree cont({1, 2, 3}, KEEP_FIRST_OF_DUPES);
377 505
378 cont.reserve(5); 506 cont.reserve(5);
379 EXPECT_LE(5U, cont.capacity()); 507 EXPECT_LE(5U, cont.capacity());
380 } 508 }
381 509
382 // size_type capacity() const 510 // size_type capacity() const
383 511
384 TEST(FlatTree, Capacity) { 512 TEST(FlatTree, Capacity) {
385 IntTree cont{1, 2, 3}; 513 IntTree cont({1, 2, 3}, KEEP_FIRST_OF_DUPES);
386 514
387 EXPECT_LE(cont.size(), cont.capacity()); 515 EXPECT_LE(cont.size(), cont.capacity());
388 cont.reserve(5); 516 cont.reserve(5);
389 EXPECT_LE(cont.size(), cont.capacity()); 517 EXPECT_LE(cont.size(), cont.capacity());
390 } 518 }
391 519
392 // void shrink_to_fit() 520 // void shrink_to_fit()
393 521
394 TEST(FlatTree, ShrinkToFit) { 522 TEST(FlatTree, ShrinkToFit) {
395 IntTree cont{1, 2, 3}; 523 IntTree cont({1, 2, 3}, KEEP_FIRST_OF_DUPES);
396 524
397 IntTree::size_type capacity_before = cont.capacity(); 525 IntTree::size_type capacity_before = cont.capacity();
398 cont.shrink_to_fit(); 526 cont.shrink_to_fit();
399 EXPECT_GE(capacity_before, cont.capacity()); 527 EXPECT_GE(capacity_before, cont.capacity());
400 } 528 }
401 529
402 // ---------------------------------------------------------------------------- 530 // ----------------------------------------------------------------------------
403 // Size management. 531 // Size management.
404 532
405 // void clear() 533 // void clear()
406 534
407 TEST(FlatTree, Clear) { 535 TEST(FlatTree, Clear) {
408 IntTree cont{1, 2, 3, 4, 5, 6, 7, 8}; 536 IntTree cont({1, 2, 3, 4, 5, 6, 7, 8}, KEEP_FIRST_OF_DUPES);
409 cont.clear(); 537 cont.clear();
410 EXPECT_THAT(cont, ElementsAre()); 538 EXPECT_THAT(cont, ElementsAre());
411 } 539 }
412 540
413 // size_type size() const 541 // size_type size() const
414 542
415 TEST(FlatTree, Size) { 543 TEST(FlatTree, Size) {
416 IntTree cont; 544 IntTree cont;
417 545
418 EXPECT_EQ(0U, cont.size()); 546 EXPECT_EQ(0U, cont.size());
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
454 // const_reverse_iterator rbegin() const 582 // const_reverse_iterator rbegin() const
455 // reverse_iterator rend() 583 // reverse_iterator rend()
456 // const_reverse_iterator rend() const 584 // const_reverse_iterator rend() const
457 // 585 //
458 // const_iterator cbegin() const 586 // const_iterator cbegin() const
459 // const_iterator cend() const 587 // const_iterator cend() const
460 // const_reverse_iterator crbegin() const 588 // const_reverse_iterator crbegin() const
461 // const_reverse_iterator crend() const 589 // const_reverse_iterator crend() const
462 590
463 TEST(FlatTree, Iterators) { 591 TEST(FlatTree, Iterators) {
464 IntTree cont{1, 2, 3, 4, 5, 6, 7, 8}; 592 IntTree cont({1, 2, 3, 4, 5, 6, 7, 8}, KEEP_FIRST_OF_DUPES);
465 593
466 auto size = static_cast<IntTree::difference_type>(cont.size()); 594 auto size = static_cast<IntTree::difference_type>(cont.size());
467 595
468 EXPECT_EQ(size, std::distance(cont.begin(), cont.end())); 596 EXPECT_EQ(size, std::distance(cont.begin(), cont.end()));
469 EXPECT_EQ(size, std::distance(cont.cbegin(), cont.cend())); 597 EXPECT_EQ(size, std::distance(cont.cbegin(), cont.cend()));
470 EXPECT_EQ(size, std::distance(cont.rbegin(), cont.rend())); 598 EXPECT_EQ(size, std::distance(cont.rbegin(), cont.rend()));
471 EXPECT_EQ(size, std::distance(cont.crbegin(), cont.crend())); 599 EXPECT_EQ(size, std::distance(cont.crbegin(), cont.crend()));
472 600
473 { 601 {
474 IntTree::iterator it = cont.begin(); 602 IntTree::iterator it = cont.begin();
(...skipping 202 matching lines...) Expand 10 before | Expand all | Expand 10 after
677 EXPECT_EQ(2, *result); 805 EXPECT_EQ(2, *result);
678 } 806 }
679 } 807 }
680 808
681 // ---------------------------------------------------------------------------- 809 // ----------------------------------------------------------------------------
682 // Erase operations. 810 // Erase operations.
683 811
684 // iterator erase(const_iterator position_hint) 812 // iterator erase(const_iterator position_hint)
685 813
686 TEST(FlatTree, ErasePosition) { 814 TEST(FlatTree, ErasePosition) {
687 IntTree cont{1, 2, 3, 4, 5, 6, 7, 8}; 815 IntTree cont({1, 2, 3, 4, 5, 6, 7, 8}, KEEP_FIRST_OF_DUPES);
688 816
689 IntTree::iterator it = cont.erase(std::next(cont.cbegin(), 3)); 817 IntTree::iterator it = cont.erase(std::next(cont.cbegin(), 3));
690 EXPECT_EQ(std::next(cont.begin(), 3), it); 818 EXPECT_EQ(std::next(cont.begin(), 3), it);
691 EXPECT_THAT(cont, ElementsAre(1, 2, 3, 5, 6, 7, 8)); 819 EXPECT_THAT(cont, ElementsAre(1, 2, 3, 5, 6, 7, 8));
692 820
693 it = cont.erase(std::next(cont.cbegin(), 0)); 821 it = cont.erase(std::next(cont.cbegin(), 0));
694 EXPECT_EQ(cont.begin(), it); 822 EXPECT_EQ(cont.begin(), it);
695 EXPECT_THAT(cont, ElementsAre(2, 3, 5, 6, 7, 8)); 823 EXPECT_THAT(cont, ElementsAre(2, 3, 5, 6, 7, 8));
696 824
697 it = cont.erase(std::next(cont.cbegin(), 5)); 825 it = cont.erase(std::next(cont.cbegin(), 5));
(...skipping 17 matching lines...) Expand all
715 EXPECT_THAT(cont, ElementsAre(5)); 843 EXPECT_THAT(cont, ElementsAre(5));
716 844
717 it = cont.erase(cont.cbegin()); 845 it = cont.erase(cont.cbegin());
718 EXPECT_EQ(cont.begin(), it); 846 EXPECT_EQ(cont.begin(), it);
719 EXPECT_EQ(cont.end(), it); 847 EXPECT_EQ(cont.end(), it);
720 } 848 }
721 849
722 // iterator erase(const_iterator first, const_iterator last) 850 // iterator erase(const_iterator first, const_iterator last)
723 851
724 TEST(FlatTree, EraseRange) { 852 TEST(FlatTree, EraseRange) {
725 IntTree cont{1, 2, 3, 4, 5, 6, 7, 8}; 853 IntTree cont({1, 2, 3, 4, 5, 6, 7, 8}, KEEP_FIRST_OF_DUPES);
726 854
727 IntTree::iterator it = 855 IntTree::iterator it =
728 cont.erase(std::next(cont.cbegin(), 5), std::next(cont.cbegin(), 5)); 856 cont.erase(std::next(cont.cbegin(), 5), std::next(cont.cbegin(), 5));
729 EXPECT_EQ(std::next(cont.begin(), 5), it); 857 EXPECT_EQ(std::next(cont.begin(), 5), it);
730 EXPECT_THAT(cont, ElementsAre(1, 2, 3, 4, 5, 6, 7, 8)); 858 EXPECT_THAT(cont, ElementsAre(1, 2, 3, 4, 5, 6, 7, 8));
731 859
732 it = cont.erase(std::next(cont.cbegin(), 3), std::next(cont.cbegin(), 4)); 860 it = cont.erase(std::next(cont.cbegin(), 3), std::next(cont.cbegin(), 4));
733 EXPECT_EQ(std::next(cont.begin(), 3), it); 861 EXPECT_EQ(std::next(cont.begin(), 3), it);
734 EXPECT_THAT(cont, ElementsAre(1, 2, 3, 5, 6, 7, 8)); 862 EXPECT_THAT(cont, ElementsAre(1, 2, 3, 5, 6, 7, 8));
735 863
736 it = cont.erase(std::next(cont.cbegin(), 2), std::next(cont.cbegin(), 5)); 864 it = cont.erase(std::next(cont.cbegin(), 2), std::next(cont.cbegin(), 5));
737 EXPECT_EQ(std::next(cont.begin(), 2), it); 865 EXPECT_EQ(std::next(cont.begin(), 2), it);
738 EXPECT_THAT(cont, ElementsAre(1, 2, 7, 8)); 866 EXPECT_THAT(cont, ElementsAre(1, 2, 7, 8));
739 867
740 it = cont.erase(std::next(cont.cbegin(), 0), std::next(cont.cbegin(), 2)); 868 it = cont.erase(std::next(cont.cbegin(), 0), std::next(cont.cbegin(), 2));
741 EXPECT_EQ(std::next(cont.begin(), 0), it); 869 EXPECT_EQ(std::next(cont.begin(), 0), it);
742 EXPECT_THAT(cont, ElementsAre(7, 8)); 870 EXPECT_THAT(cont, ElementsAre(7, 8));
743 871
744 it = cont.erase(cont.cbegin(), cont.cend()); 872 it = cont.erase(cont.cbegin(), cont.cend());
745 EXPECT_EQ(cont.begin(), it); 873 EXPECT_EQ(cont.begin(), it);
746 EXPECT_EQ(cont.end(), it); 874 EXPECT_EQ(cont.end(), it);
747 } 875 }
748 876
749 // size_type erase(const key_type& key) 877 // size_type erase(const key_type& key)
750 878
751 TEST(FlatTree, EraseKey) { 879 TEST(FlatTree, EraseKey) {
752 IntTree cont{1, 2, 3, 4, 5, 6, 7, 8}; 880 IntTree cont({1, 2, 3, 4, 5, 6, 7, 8}, KEEP_FIRST_OF_DUPES);
753 881
754 EXPECT_EQ(0U, cont.erase(9)); 882 EXPECT_EQ(0U, cont.erase(9));
755 EXPECT_THAT(cont, ElementsAre(1, 2, 3, 4, 5, 6, 7, 8)); 883 EXPECT_THAT(cont, ElementsAre(1, 2, 3, 4, 5, 6, 7, 8));
756 884
757 EXPECT_EQ(1U, cont.erase(4)); 885 EXPECT_EQ(1U, cont.erase(4));
758 EXPECT_THAT(cont, ElementsAre(1, 2, 3, 5, 6, 7, 8)); 886 EXPECT_THAT(cont, ElementsAre(1, 2, 3, 5, 6, 7, 8));
759 887
760 EXPECT_EQ(1U, cont.erase(1)); 888 EXPECT_EQ(1U, cont.erase(1));
761 EXPECT_THAT(cont, ElementsAre(2, 3, 5, 6, 7, 8)); 889 EXPECT_THAT(cont, ElementsAre(2, 3, 5, 6, 7, 8));
762 890
(...skipping 15 matching lines...) Expand all
778 EXPECT_EQ(1U, cont.erase(5)); 906 EXPECT_EQ(1U, cont.erase(5));
779 EXPECT_THAT(cont, ElementsAre()); 907 EXPECT_THAT(cont, ElementsAre());
780 } 908 }
781 909
782 // ---------------------------------------------------------------------------- 910 // ----------------------------------------------------------------------------
783 // Comparators. 911 // Comparators.
784 912
785 // key_compare key_comp() const 913 // key_compare key_comp() const
786 914
787 TEST(FlatTree, KeyComp) { 915 TEST(FlatTree, KeyComp) {
788 ReversedTree cont{1, 2, 3, 4, 5}; 916 ReversedTree cont({1, 2, 3, 4, 5}, KEEP_FIRST_OF_DUPES);
789 917
790 EXPECT_TRUE(std::is_sorted(cont.begin(), cont.end(), cont.key_comp())); 918 EXPECT_TRUE(std::is_sorted(cont.begin(), cont.end(), cont.key_comp()));
791 int new_elements[] = {6, 7, 8, 9, 10}; 919 int new_elements[] = {6, 7, 8, 9, 10};
792 std::copy(std::begin(new_elements), std::end(new_elements), 920 std::copy(std::begin(new_elements), std::end(new_elements),
793 std::inserter(cont, cont.end())); 921 std::inserter(cont, cont.end()));
794 EXPECT_TRUE(std::is_sorted(cont.begin(), cont.end(), cont.key_comp())); 922 EXPECT_TRUE(std::is_sorted(cont.begin(), cont.end(), cont.key_comp()));
795 } 923 }
796 924
797 // value_compare value_comp() const 925 // value_compare value_comp() const
798 926
799 TEST(FlatTree, ValueComp) { 927 TEST(FlatTree, ValueComp) {
800 ReversedTree cont{1, 2, 3, 4, 5}; 928 ReversedTree cont({1, 2, 3, 4, 5}, KEEP_FIRST_OF_DUPES);
801 929
802 EXPECT_TRUE(std::is_sorted(cont.begin(), cont.end(), cont.value_comp())); 930 EXPECT_TRUE(std::is_sorted(cont.begin(), cont.end(), cont.value_comp()));
803 int new_elements[] = {6, 7, 8, 9, 10}; 931 int new_elements[] = {6, 7, 8, 9, 10};
804 std::copy(std::begin(new_elements), std::end(new_elements), 932 std::copy(std::begin(new_elements), std::end(new_elements),
805 std::inserter(cont, cont.end())); 933 std::inserter(cont, cont.end()));
806 EXPECT_TRUE(std::is_sorted(cont.begin(), cont.end(), cont.value_comp())); 934 EXPECT_TRUE(std::is_sorted(cont.begin(), cont.end(), cont.value_comp()));
807 } 935 }
808 936
809 // ---------------------------------------------------------------------------- 937 // ----------------------------------------------------------------------------
810 // Search operations. 938 // Search operations.
811 939
812 // size_type count(const key_type& key) const 940 // size_type count(const key_type& key) const
813 941
814 TEST(FlatTree, Count) { 942 TEST(FlatTree, Count) {
815 { 943 {
816 const IntTree cont{5, 6, 7, 8, 9, 10, 11, 12}; 944 const IntTree cont({5, 6, 7, 8, 9, 10, 11, 12}, KEEP_FIRST_OF_DUPES);
817 945
818 EXPECT_EQ(1U, cont.count(5)); 946 EXPECT_EQ(1U, cont.count(5));
819 EXPECT_EQ(1U, cont.count(6)); 947 EXPECT_EQ(1U, cont.count(6));
820 EXPECT_EQ(1U, cont.count(7)); 948 EXPECT_EQ(1U, cont.count(7));
821 EXPECT_EQ(1U, cont.count(8)); 949 EXPECT_EQ(1U, cont.count(8));
822 EXPECT_EQ(1U, cont.count(9)); 950 EXPECT_EQ(1U, cont.count(9));
823 EXPECT_EQ(1U, cont.count(10)); 951 EXPECT_EQ(1U, cont.count(10));
824 EXPECT_EQ(1U, cont.count(11)); 952 EXPECT_EQ(1U, cont.count(11));
825 EXPECT_EQ(1U, cont.count(12)); 953 EXPECT_EQ(1U, cont.count(12));
826 EXPECT_EQ(0U, cont.count(4)); 954 EXPECT_EQ(0U, cont.count(4));
827 } 955 }
828 { 956 {
829 const IntTreeWithLess cont{5, 6, 7, 8, 9, 10, 11, 12}; 957 const IntTreeWithLess cont({5, 6, 7, 8, 9, 10, 11, 12},
958 KEEP_FIRST_OF_DUPES);
830 959
831 EXPECT_EQ(1U, cont.count(5)); 960 EXPECT_EQ(1U, cont.count(5));
832 EXPECT_EQ(1U, cont.count(6)); 961 EXPECT_EQ(1U, cont.count(6));
833 EXPECT_EQ(1U, cont.count(7)); 962 EXPECT_EQ(1U, cont.count(7));
834 EXPECT_EQ(1U, cont.count(8)); 963 EXPECT_EQ(1U, cont.count(8));
835 EXPECT_EQ(1U, cont.count(9)); 964 EXPECT_EQ(1U, cont.count(9));
836 EXPECT_EQ(1U, cont.count(10)); 965 EXPECT_EQ(1U, cont.count(10));
837 EXPECT_EQ(1U, cont.count(11)); 966 EXPECT_EQ(1U, cont.count(11));
838 EXPECT_EQ(1U, cont.count(12)); 967 EXPECT_EQ(1U, cont.count(12));
839 EXPECT_EQ(0U, cont.count(4)); 968 EXPECT_EQ(0U, cont.count(4));
840 } 969 }
841 } 970 }
842 971
843 // iterator find(const key_type& key) 972 // iterator find(const key_type& key)
844 // const_iterator find(const key_type& key) const 973 // const_iterator find(const key_type& key) const
845 974
846 TEST(FlatTree, Find) { 975 TEST(FlatTree, Find) {
847 { 976 {
848 IntTree cont{5, 6, 7, 8, 9, 10, 11, 12}; 977 IntTree cont({5, 6, 7, 8, 9, 10, 11, 12}, KEEP_FIRST_OF_DUPES);
849 978
850 EXPECT_EQ(cont.begin(), cont.find(5)); 979 EXPECT_EQ(cont.begin(), cont.find(5));
851 EXPECT_EQ(std::next(cont.begin()), cont.find(6)); 980 EXPECT_EQ(std::next(cont.begin()), cont.find(6));
852 EXPECT_EQ(std::next(cont.begin(), 2), cont.find(7)); 981 EXPECT_EQ(std::next(cont.begin(), 2), cont.find(7));
853 EXPECT_EQ(std::next(cont.begin(), 3), cont.find(8)); 982 EXPECT_EQ(std::next(cont.begin(), 3), cont.find(8));
854 EXPECT_EQ(std::next(cont.begin(), 4), cont.find(9)); 983 EXPECT_EQ(std::next(cont.begin(), 4), cont.find(9));
855 EXPECT_EQ(std::next(cont.begin(), 5), cont.find(10)); 984 EXPECT_EQ(std::next(cont.begin(), 5), cont.find(10));
856 EXPECT_EQ(std::next(cont.begin(), 6), cont.find(11)); 985 EXPECT_EQ(std::next(cont.begin(), 6), cont.find(11));
857 EXPECT_EQ(std::next(cont.begin(), 7), cont.find(12)); 986 EXPECT_EQ(std::next(cont.begin(), 7), cont.find(12));
858 EXPECT_EQ(std::next(cont.begin(), 8), cont.find(4)); 987 EXPECT_EQ(std::next(cont.begin(), 8), cont.find(4));
859 } 988 }
860 { 989 {
861 const IntTree cont{5, 6, 7, 8, 9, 10, 11, 12}; 990 const IntTree cont({5, 6, 7, 8, 9, 10, 11, 12}, KEEP_FIRST_OF_DUPES);
862 991
863 EXPECT_EQ(cont.begin(), cont.find(5)); 992 EXPECT_EQ(cont.begin(), cont.find(5));
864 EXPECT_EQ(std::next(cont.begin()), cont.find(6)); 993 EXPECT_EQ(std::next(cont.begin()), cont.find(6));
865 EXPECT_EQ(std::next(cont.begin(), 2), cont.find(7)); 994 EXPECT_EQ(std::next(cont.begin(), 2), cont.find(7));
866 EXPECT_EQ(std::next(cont.begin(), 3), cont.find(8)); 995 EXPECT_EQ(std::next(cont.begin(), 3), cont.find(8));
867 EXPECT_EQ(std::next(cont.begin(), 4), cont.find(9)); 996 EXPECT_EQ(std::next(cont.begin(), 4), cont.find(9));
868 EXPECT_EQ(std::next(cont.begin(), 5), cont.find(10)); 997 EXPECT_EQ(std::next(cont.begin(), 5), cont.find(10));
869 EXPECT_EQ(std::next(cont.begin(), 6), cont.find(11)); 998 EXPECT_EQ(std::next(cont.begin(), 6), cont.find(11));
870 EXPECT_EQ(std::next(cont.begin(), 7), cont.find(12)); 999 EXPECT_EQ(std::next(cont.begin(), 7), cont.find(12));
871 EXPECT_EQ(std::next(cont.begin(), 8), cont.find(4)); 1000 EXPECT_EQ(std::next(cont.begin(), 8), cont.find(4));
872 } 1001 }
873 { 1002 {
874 IntTreeWithLess cont{5, 6, 7, 8, 9, 10, 11, 12}; 1003 IntTreeWithLess cont({5, 6, 7, 8, 9, 10, 11, 12}, KEEP_FIRST_OF_DUPES);
875 1004
876 EXPECT_EQ(cont.begin(), cont.find(5)); 1005 EXPECT_EQ(cont.begin(), cont.find(5));
877 EXPECT_EQ(std::next(cont.begin()), cont.find(6)); 1006 EXPECT_EQ(std::next(cont.begin()), cont.find(6));
878 EXPECT_EQ(std::next(cont.begin(), 2), cont.find(7)); 1007 EXPECT_EQ(std::next(cont.begin(), 2), cont.find(7));
879 EXPECT_EQ(std::next(cont.begin(), 3), cont.find(8)); 1008 EXPECT_EQ(std::next(cont.begin(), 3), cont.find(8));
880 EXPECT_EQ(std::next(cont.begin(), 4), cont.find(9)); 1009 EXPECT_EQ(std::next(cont.begin(), 4), cont.find(9));
881 EXPECT_EQ(std::next(cont.begin(), 5), cont.find(10)); 1010 EXPECT_EQ(std::next(cont.begin(), 5), cont.find(10));
882 EXPECT_EQ(std::next(cont.begin(), 6), cont.find(11)); 1011 EXPECT_EQ(std::next(cont.begin(), 6), cont.find(11));
883 EXPECT_EQ(std::next(cont.begin(), 7), cont.find(12)); 1012 EXPECT_EQ(std::next(cont.begin(), 7), cont.find(12));
884 EXPECT_EQ(std::next(cont.begin(), 8), cont.find(4)); 1013 EXPECT_EQ(std::next(cont.begin(), 8), cont.find(4));
885 } 1014 }
886 } 1015 }
887 1016
888 // pair<iterator, iterator> equal_range(const key_type& key) 1017 // pair<iterator, iterator> equal_range(const key_type& key)
889 // pair<const_iterator, const_iterator> equal_range(const key_type& key) const 1018 // pair<const_iterator, const_iterator> equal_range(const key_type& key) const
890 1019
891 TEST(FlatTree, EqualRange) { 1020 TEST(FlatTree, EqualRange) {
892 { 1021 {
893 IntTree cont{5, 7, 9, 11, 13, 15, 17, 19}; 1022 IntTree cont({5, 7, 9, 11, 13, 15, 17, 19}, KEEP_FIRST_OF_DUPES);
894 1023
895 std::pair<IntTree::iterator, IntTree::iterator> result = 1024 std::pair<IntTree::iterator, IntTree::iterator> result =
896 cont.equal_range(5); 1025 cont.equal_range(5);
897 EXPECT_EQ(std::next(cont.begin(), 0), result.first); 1026 EXPECT_EQ(std::next(cont.begin(), 0), result.first);
898 EXPECT_EQ(std::next(cont.begin(), 1), result.second); 1027 EXPECT_EQ(std::next(cont.begin(), 1), result.second);
899 result = cont.equal_range(7); 1028 result = cont.equal_range(7);
900 EXPECT_EQ(std::next(cont.begin(), 1), result.first); 1029 EXPECT_EQ(std::next(cont.begin(), 1), result.first);
901 EXPECT_EQ(std::next(cont.begin(), 2), result.second); 1030 EXPECT_EQ(std::next(cont.begin(), 2), result.second);
902 result = cont.equal_range(9); 1031 result = cont.equal_range(9);
903 EXPECT_EQ(std::next(cont.begin(), 2), result.first); 1032 EXPECT_EQ(std::next(cont.begin(), 2), result.first);
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
939 EXPECT_EQ(std::next(cont.begin(), 6), result.first); 1068 EXPECT_EQ(std::next(cont.begin(), 6), result.first);
940 EXPECT_EQ(std::next(cont.begin(), 6), result.second); 1069 EXPECT_EQ(std::next(cont.begin(), 6), result.second);
941 result = cont.equal_range(18); 1070 result = cont.equal_range(18);
942 EXPECT_EQ(std::next(cont.begin(), 7), result.first); 1071 EXPECT_EQ(std::next(cont.begin(), 7), result.first);
943 EXPECT_EQ(std::next(cont.begin(), 7), result.second); 1072 EXPECT_EQ(std::next(cont.begin(), 7), result.second);
944 result = cont.equal_range(20); 1073 result = cont.equal_range(20);
945 EXPECT_EQ(std::next(cont.begin(), 8), result.first); 1074 EXPECT_EQ(std::next(cont.begin(), 8), result.first);
946 EXPECT_EQ(std::next(cont.begin(), 8), result.second); 1075 EXPECT_EQ(std::next(cont.begin(), 8), result.second);
947 } 1076 }
948 { 1077 {
949 const IntTree cont{5, 7, 9, 11, 13, 15, 17, 19}; 1078 const IntTree cont({5, 7, 9, 11, 13, 15, 17, 19}, KEEP_FIRST_OF_DUPES);
950 1079
951 std::pair<IntTree::const_iterator, IntTree::const_iterator> result = 1080 std::pair<IntTree::const_iterator, IntTree::const_iterator> result =
952 cont.equal_range(5); 1081 cont.equal_range(5);
953 EXPECT_EQ(std::next(cont.begin(), 0), result.first); 1082 EXPECT_EQ(std::next(cont.begin(), 0), result.first);
954 EXPECT_EQ(std::next(cont.begin(), 1), result.second); 1083 EXPECT_EQ(std::next(cont.begin(), 1), result.second);
955 result = cont.equal_range(7); 1084 result = cont.equal_range(7);
956 EXPECT_EQ(std::next(cont.begin(), 1), result.first); 1085 EXPECT_EQ(std::next(cont.begin(), 1), result.first);
957 EXPECT_EQ(std::next(cont.begin(), 2), result.second); 1086 EXPECT_EQ(std::next(cont.begin(), 2), result.second);
958 result = cont.equal_range(9); 1087 result = cont.equal_range(9);
959 EXPECT_EQ(std::next(cont.begin(), 2), result.first); 1088 EXPECT_EQ(std::next(cont.begin(), 2), result.first);
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
995 EXPECT_EQ(std::next(cont.begin(), 6), result.first); 1124 EXPECT_EQ(std::next(cont.begin(), 6), result.first);
996 EXPECT_EQ(std::next(cont.begin(), 6), result.second); 1125 EXPECT_EQ(std::next(cont.begin(), 6), result.second);
997 result = cont.equal_range(18); 1126 result = cont.equal_range(18);
998 EXPECT_EQ(std::next(cont.begin(), 7), result.first); 1127 EXPECT_EQ(std::next(cont.begin(), 7), result.first);
999 EXPECT_EQ(std::next(cont.begin(), 7), result.second); 1128 EXPECT_EQ(std::next(cont.begin(), 7), result.second);
1000 result = cont.equal_range(20); 1129 result = cont.equal_range(20);
1001 EXPECT_EQ(std::next(cont.begin(), 8), result.first); 1130 EXPECT_EQ(std::next(cont.begin(), 8), result.first);
1002 EXPECT_EQ(std::next(cont.begin(), 8), result.second); 1131 EXPECT_EQ(std::next(cont.begin(), 8), result.second);
1003 } 1132 }
1004 { 1133 {
1005 IntTreeWithLess cont{5, 7, 9, 11, 13, 15, 17, 19}; 1134 IntTreeWithLess cont({5, 7, 9, 11, 13, 15, 17, 19}, KEEP_FIRST_OF_DUPES);
1006 1135
1007 std::pair<IntTree::iterator, IntTree::iterator> result = 1136 std::pair<IntTree::iterator, IntTree::iterator> result =
1008 cont.equal_range(5); 1137 cont.equal_range(5);
1009 EXPECT_EQ(std::next(cont.begin(), 0), result.first); 1138 EXPECT_EQ(std::next(cont.begin(), 0), result.first);
1010 EXPECT_EQ(std::next(cont.begin(), 1), result.second); 1139 EXPECT_EQ(std::next(cont.begin(), 1), result.second);
1011 result = cont.equal_range(7); 1140 result = cont.equal_range(7);
1012 EXPECT_EQ(std::next(cont.begin(), 1), result.first); 1141 EXPECT_EQ(std::next(cont.begin(), 1), result.first);
1013 EXPECT_EQ(std::next(cont.begin(), 2), result.second); 1142 EXPECT_EQ(std::next(cont.begin(), 2), result.second);
1014 result = cont.equal_range(9); 1143 result = cont.equal_range(9);
1015 EXPECT_EQ(std::next(cont.begin(), 2), result.first); 1144 EXPECT_EQ(std::next(cont.begin(), 2), result.first);
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
1057 EXPECT_EQ(std::next(cont.begin(), 8), result.first); 1186 EXPECT_EQ(std::next(cont.begin(), 8), result.first);
1058 EXPECT_EQ(std::next(cont.begin(), 8), result.second); 1187 EXPECT_EQ(std::next(cont.begin(), 8), result.second);
1059 } 1188 }
1060 } 1189 }
1061 1190
1062 // iterator lower_bound(const key_type& key); 1191 // iterator lower_bound(const key_type& key);
1063 // const_iterator lower_bound(const key_type& key) const; 1192 // const_iterator lower_bound(const key_type& key) const;
1064 1193
1065 TEST(FlatTree, LowerBound) { 1194 TEST(FlatTree, LowerBound) {
1066 { 1195 {
1067 IntTree cont{5, 7, 9, 11, 13, 15, 17, 19}; 1196 IntTree cont({5, 7, 9, 11, 13, 15, 17, 19}, KEEP_FIRST_OF_DUPES);
1068 1197
1069 EXPECT_EQ(cont.begin(), cont.lower_bound(5)); 1198 EXPECT_EQ(cont.begin(), cont.lower_bound(5));
1070 EXPECT_EQ(std::next(cont.begin()), cont.lower_bound(7)); 1199 EXPECT_EQ(std::next(cont.begin()), cont.lower_bound(7));
1071 EXPECT_EQ(std::next(cont.begin(), 2), cont.lower_bound(9)); 1200 EXPECT_EQ(std::next(cont.begin(), 2), cont.lower_bound(9));
1072 EXPECT_EQ(std::next(cont.begin(), 3), cont.lower_bound(11)); 1201 EXPECT_EQ(std::next(cont.begin(), 3), cont.lower_bound(11));
1073 EXPECT_EQ(std::next(cont.begin(), 4), cont.lower_bound(13)); 1202 EXPECT_EQ(std::next(cont.begin(), 4), cont.lower_bound(13));
1074 EXPECT_EQ(std::next(cont.begin(), 5), cont.lower_bound(15)); 1203 EXPECT_EQ(std::next(cont.begin(), 5), cont.lower_bound(15));
1075 EXPECT_EQ(std::next(cont.begin(), 6), cont.lower_bound(17)); 1204 EXPECT_EQ(std::next(cont.begin(), 6), cont.lower_bound(17));
1076 EXPECT_EQ(std::next(cont.begin(), 7), cont.lower_bound(19)); 1205 EXPECT_EQ(std::next(cont.begin(), 7), cont.lower_bound(19));
1077 EXPECT_EQ(std::next(cont.begin(), 0), cont.lower_bound(4)); 1206 EXPECT_EQ(std::next(cont.begin(), 0), cont.lower_bound(4));
1078 EXPECT_EQ(std::next(cont.begin(), 1), cont.lower_bound(6)); 1207 EXPECT_EQ(std::next(cont.begin(), 1), cont.lower_bound(6));
1079 EXPECT_EQ(std::next(cont.begin(), 2), cont.lower_bound(8)); 1208 EXPECT_EQ(std::next(cont.begin(), 2), cont.lower_bound(8));
1080 EXPECT_EQ(std::next(cont.begin(), 3), cont.lower_bound(10)); 1209 EXPECT_EQ(std::next(cont.begin(), 3), cont.lower_bound(10));
1081 EXPECT_EQ(std::next(cont.begin(), 4), cont.lower_bound(12)); 1210 EXPECT_EQ(std::next(cont.begin(), 4), cont.lower_bound(12));
1082 EXPECT_EQ(std::next(cont.begin(), 5), cont.lower_bound(14)); 1211 EXPECT_EQ(std::next(cont.begin(), 5), cont.lower_bound(14));
1083 EXPECT_EQ(std::next(cont.begin(), 6), cont.lower_bound(16)); 1212 EXPECT_EQ(std::next(cont.begin(), 6), cont.lower_bound(16));
1084 EXPECT_EQ(std::next(cont.begin(), 7), cont.lower_bound(18)); 1213 EXPECT_EQ(std::next(cont.begin(), 7), cont.lower_bound(18));
1085 EXPECT_EQ(std::next(cont.begin(), 8), cont.lower_bound(20)); 1214 EXPECT_EQ(std::next(cont.begin(), 8), cont.lower_bound(20));
1086 } 1215 }
1087 { 1216 {
1088 const IntTree cont{5, 7, 9, 11, 13, 15, 17, 19}; 1217 const IntTree cont({5, 7, 9, 11, 13, 15, 17, 19}, KEEP_FIRST_OF_DUPES);
1089 1218
1090 EXPECT_EQ(cont.begin(), cont.lower_bound(5)); 1219 EXPECT_EQ(cont.begin(), cont.lower_bound(5));
1091 EXPECT_EQ(std::next(cont.begin()), cont.lower_bound(7)); 1220 EXPECT_EQ(std::next(cont.begin()), cont.lower_bound(7));
1092 EXPECT_EQ(std::next(cont.begin(), 2), cont.lower_bound(9)); 1221 EXPECT_EQ(std::next(cont.begin(), 2), cont.lower_bound(9));
1093 EXPECT_EQ(std::next(cont.begin(), 3), cont.lower_bound(11)); 1222 EXPECT_EQ(std::next(cont.begin(), 3), cont.lower_bound(11));
1094 EXPECT_EQ(std::next(cont.begin(), 4), cont.lower_bound(13)); 1223 EXPECT_EQ(std::next(cont.begin(), 4), cont.lower_bound(13));
1095 EXPECT_EQ(std::next(cont.begin(), 5), cont.lower_bound(15)); 1224 EXPECT_EQ(std::next(cont.begin(), 5), cont.lower_bound(15));
1096 EXPECT_EQ(std::next(cont.begin(), 6), cont.lower_bound(17)); 1225 EXPECT_EQ(std::next(cont.begin(), 6), cont.lower_bound(17));
1097 EXPECT_EQ(std::next(cont.begin(), 7), cont.lower_bound(19)); 1226 EXPECT_EQ(std::next(cont.begin(), 7), cont.lower_bound(19));
1098 EXPECT_EQ(std::next(cont.begin(), 0), cont.lower_bound(4)); 1227 EXPECT_EQ(std::next(cont.begin(), 0), cont.lower_bound(4));
1099 EXPECT_EQ(std::next(cont.begin(), 1), cont.lower_bound(6)); 1228 EXPECT_EQ(std::next(cont.begin(), 1), cont.lower_bound(6));
1100 EXPECT_EQ(std::next(cont.begin(), 2), cont.lower_bound(8)); 1229 EXPECT_EQ(std::next(cont.begin(), 2), cont.lower_bound(8));
1101 EXPECT_EQ(std::next(cont.begin(), 3), cont.lower_bound(10)); 1230 EXPECT_EQ(std::next(cont.begin(), 3), cont.lower_bound(10));
1102 EXPECT_EQ(std::next(cont.begin(), 4), cont.lower_bound(12)); 1231 EXPECT_EQ(std::next(cont.begin(), 4), cont.lower_bound(12));
1103 EXPECT_EQ(std::next(cont.begin(), 5), cont.lower_bound(14)); 1232 EXPECT_EQ(std::next(cont.begin(), 5), cont.lower_bound(14));
1104 EXPECT_EQ(std::next(cont.begin(), 6), cont.lower_bound(16)); 1233 EXPECT_EQ(std::next(cont.begin(), 6), cont.lower_bound(16));
1105 EXPECT_EQ(std::next(cont.begin(), 7), cont.lower_bound(18)); 1234 EXPECT_EQ(std::next(cont.begin(), 7), cont.lower_bound(18));
1106 EXPECT_EQ(std::next(cont.begin(), 8), cont.lower_bound(20)); 1235 EXPECT_EQ(std::next(cont.begin(), 8), cont.lower_bound(20));
1107 } 1236 }
1108 { 1237 {
1109 IntTreeWithLess cont{5, 7, 9, 11, 13, 15, 17, 19}; 1238 IntTreeWithLess cont({5, 7, 9, 11, 13, 15, 17, 19}, KEEP_FIRST_OF_DUPES);
1110 1239
1111 EXPECT_EQ(cont.begin(), cont.lower_bound(5)); 1240 EXPECT_EQ(cont.begin(), cont.lower_bound(5));
1112 EXPECT_EQ(std::next(cont.begin()), cont.lower_bound(7)); 1241 EXPECT_EQ(std::next(cont.begin()), cont.lower_bound(7));
1113 EXPECT_EQ(std::next(cont.begin(), 2), cont.lower_bound(9)); 1242 EXPECT_EQ(std::next(cont.begin(), 2), cont.lower_bound(9));
1114 EXPECT_EQ(std::next(cont.begin(), 3), cont.lower_bound(11)); 1243 EXPECT_EQ(std::next(cont.begin(), 3), cont.lower_bound(11));
1115 EXPECT_EQ(std::next(cont.begin(), 4), cont.lower_bound(13)); 1244 EXPECT_EQ(std::next(cont.begin(), 4), cont.lower_bound(13));
1116 EXPECT_EQ(std::next(cont.begin(), 5), cont.lower_bound(15)); 1245 EXPECT_EQ(std::next(cont.begin(), 5), cont.lower_bound(15));
1117 EXPECT_EQ(std::next(cont.begin(), 6), cont.lower_bound(17)); 1246 EXPECT_EQ(std::next(cont.begin(), 6), cont.lower_bound(17));
1118 EXPECT_EQ(std::next(cont.begin(), 7), cont.lower_bound(19)); 1247 EXPECT_EQ(std::next(cont.begin(), 7), cont.lower_bound(19));
1119 EXPECT_EQ(std::next(cont.begin(), 0), cont.lower_bound(4)); 1248 EXPECT_EQ(std::next(cont.begin(), 0), cont.lower_bound(4));
1120 EXPECT_EQ(std::next(cont.begin(), 1), cont.lower_bound(6)); 1249 EXPECT_EQ(std::next(cont.begin(), 1), cont.lower_bound(6));
1121 EXPECT_EQ(std::next(cont.begin(), 2), cont.lower_bound(8)); 1250 EXPECT_EQ(std::next(cont.begin(), 2), cont.lower_bound(8));
1122 EXPECT_EQ(std::next(cont.begin(), 3), cont.lower_bound(10)); 1251 EXPECT_EQ(std::next(cont.begin(), 3), cont.lower_bound(10));
1123 EXPECT_EQ(std::next(cont.begin(), 4), cont.lower_bound(12)); 1252 EXPECT_EQ(std::next(cont.begin(), 4), cont.lower_bound(12));
1124 EXPECT_EQ(std::next(cont.begin(), 5), cont.lower_bound(14)); 1253 EXPECT_EQ(std::next(cont.begin(), 5), cont.lower_bound(14));
1125 EXPECT_EQ(std::next(cont.begin(), 6), cont.lower_bound(16)); 1254 EXPECT_EQ(std::next(cont.begin(), 6), cont.lower_bound(16));
1126 EXPECT_EQ(std::next(cont.begin(), 7), cont.lower_bound(18)); 1255 EXPECT_EQ(std::next(cont.begin(), 7), cont.lower_bound(18));
1127 EXPECT_EQ(std::next(cont.begin(), 8), cont.lower_bound(20)); 1256 EXPECT_EQ(std::next(cont.begin(), 8), cont.lower_bound(20));
1128 } 1257 }
1129 } 1258 }
1130 1259
1131 // iterator upper_bound(const key_type& key) 1260 // iterator upper_bound(const key_type& key)
1132 // const_iterator upper_bound(const key_type& key) const 1261 // const_iterator upper_bound(const key_type& key) const
1133 1262
1134 TEST(FlatTree, UpperBound) { 1263 TEST(FlatTree, UpperBound) {
1135 { 1264 {
1136 IntTree cont{5, 7, 9, 11, 13, 15, 17, 19}; 1265 IntTree cont({5, 7, 9, 11, 13, 15, 17, 19}, KEEP_FIRST_OF_DUPES);
1137 1266
1138 EXPECT_EQ(std::next(cont.begin(), 1), cont.upper_bound(5)); 1267 EXPECT_EQ(std::next(cont.begin(), 1), cont.upper_bound(5));
1139 EXPECT_EQ(std::next(cont.begin(), 2), cont.upper_bound(7)); 1268 EXPECT_EQ(std::next(cont.begin(), 2), cont.upper_bound(7));
1140 EXPECT_EQ(std::next(cont.begin(), 3), cont.upper_bound(9)); 1269 EXPECT_EQ(std::next(cont.begin(), 3), cont.upper_bound(9));
1141 EXPECT_EQ(std::next(cont.begin(), 4), cont.upper_bound(11)); 1270 EXPECT_EQ(std::next(cont.begin(), 4), cont.upper_bound(11));
1142 EXPECT_EQ(std::next(cont.begin(), 5), cont.upper_bound(13)); 1271 EXPECT_EQ(std::next(cont.begin(), 5), cont.upper_bound(13));
1143 EXPECT_EQ(std::next(cont.begin(), 6), cont.upper_bound(15)); 1272 EXPECT_EQ(std::next(cont.begin(), 6), cont.upper_bound(15));
1144 EXPECT_EQ(std::next(cont.begin(), 7), cont.upper_bound(17)); 1273 EXPECT_EQ(std::next(cont.begin(), 7), cont.upper_bound(17));
1145 EXPECT_EQ(std::next(cont.begin(), 8), cont.upper_bound(19)); 1274 EXPECT_EQ(std::next(cont.begin(), 8), cont.upper_bound(19));
1146 EXPECT_EQ(std::next(cont.begin(), 0), cont.upper_bound(4)); 1275 EXPECT_EQ(std::next(cont.begin(), 0), cont.upper_bound(4));
1147 EXPECT_EQ(std::next(cont.begin(), 1), cont.upper_bound(6)); 1276 EXPECT_EQ(std::next(cont.begin(), 1), cont.upper_bound(6));
1148 EXPECT_EQ(std::next(cont.begin(), 2), cont.upper_bound(8)); 1277 EXPECT_EQ(std::next(cont.begin(), 2), cont.upper_bound(8));
1149 EXPECT_EQ(std::next(cont.begin(), 3), cont.upper_bound(10)); 1278 EXPECT_EQ(std::next(cont.begin(), 3), cont.upper_bound(10));
1150 EXPECT_EQ(std::next(cont.begin(), 4), cont.upper_bound(12)); 1279 EXPECT_EQ(std::next(cont.begin(), 4), cont.upper_bound(12));
1151 EXPECT_EQ(std::next(cont.begin(), 5), cont.upper_bound(14)); 1280 EXPECT_EQ(std::next(cont.begin(), 5), cont.upper_bound(14));
1152 EXPECT_EQ(std::next(cont.begin(), 6), cont.upper_bound(16)); 1281 EXPECT_EQ(std::next(cont.begin(), 6), cont.upper_bound(16));
1153 EXPECT_EQ(std::next(cont.begin(), 7), cont.upper_bound(18)); 1282 EXPECT_EQ(std::next(cont.begin(), 7), cont.upper_bound(18));
1154 EXPECT_EQ(std::next(cont.begin(), 8), cont.upper_bound(20)); 1283 EXPECT_EQ(std::next(cont.begin(), 8), cont.upper_bound(20));
1155 } 1284 }
1156 { 1285 {
1157 const IntTree cont{5, 7, 9, 11, 13, 15, 17, 19}; 1286 const IntTree cont({5, 7, 9, 11, 13, 15, 17, 19}, KEEP_FIRST_OF_DUPES);
1158 1287
1159 EXPECT_EQ(std::next(cont.begin(), 1), cont.upper_bound(5)); 1288 EXPECT_EQ(std::next(cont.begin(), 1), cont.upper_bound(5));
1160 EXPECT_EQ(std::next(cont.begin(), 2), cont.upper_bound(7)); 1289 EXPECT_EQ(std::next(cont.begin(), 2), cont.upper_bound(7));
1161 EXPECT_EQ(std::next(cont.begin(), 3), cont.upper_bound(9)); 1290 EXPECT_EQ(std::next(cont.begin(), 3), cont.upper_bound(9));
1162 EXPECT_EQ(std::next(cont.begin(), 4), cont.upper_bound(11)); 1291 EXPECT_EQ(std::next(cont.begin(), 4), cont.upper_bound(11));
1163 EXPECT_EQ(std::next(cont.begin(), 5), cont.upper_bound(13)); 1292 EXPECT_EQ(std::next(cont.begin(), 5), cont.upper_bound(13));
1164 EXPECT_EQ(std::next(cont.begin(), 6), cont.upper_bound(15)); 1293 EXPECT_EQ(std::next(cont.begin(), 6), cont.upper_bound(15));
1165 EXPECT_EQ(std::next(cont.begin(), 7), cont.upper_bound(17)); 1294 EXPECT_EQ(std::next(cont.begin(), 7), cont.upper_bound(17));
1166 EXPECT_EQ(std::next(cont.begin(), 8), cont.upper_bound(19)); 1295 EXPECT_EQ(std::next(cont.begin(), 8), cont.upper_bound(19));
1167 EXPECT_EQ(std::next(cont.begin(), 0), cont.upper_bound(4)); 1296 EXPECT_EQ(std::next(cont.begin(), 0), cont.upper_bound(4));
1168 EXPECT_EQ(std::next(cont.begin(), 1), cont.upper_bound(6)); 1297 EXPECT_EQ(std::next(cont.begin(), 1), cont.upper_bound(6));
1169 EXPECT_EQ(std::next(cont.begin(), 2), cont.upper_bound(8)); 1298 EXPECT_EQ(std::next(cont.begin(), 2), cont.upper_bound(8));
1170 EXPECT_EQ(std::next(cont.begin(), 3), cont.upper_bound(10)); 1299 EXPECT_EQ(std::next(cont.begin(), 3), cont.upper_bound(10));
1171 EXPECT_EQ(std::next(cont.begin(), 4), cont.upper_bound(12)); 1300 EXPECT_EQ(std::next(cont.begin(), 4), cont.upper_bound(12));
1172 EXPECT_EQ(std::next(cont.begin(), 5), cont.upper_bound(14)); 1301 EXPECT_EQ(std::next(cont.begin(), 5), cont.upper_bound(14));
1173 EXPECT_EQ(std::next(cont.begin(), 6), cont.upper_bound(16)); 1302 EXPECT_EQ(std::next(cont.begin(), 6), cont.upper_bound(16));
1174 EXPECT_EQ(std::next(cont.begin(), 7), cont.upper_bound(18)); 1303 EXPECT_EQ(std::next(cont.begin(), 7), cont.upper_bound(18));
1175 EXPECT_EQ(std::next(cont.begin(), 8), cont.upper_bound(20)); 1304 EXPECT_EQ(std::next(cont.begin(), 8), cont.upper_bound(20));
1176 } 1305 }
1177 { 1306 {
1178 IntTreeWithLess cont{5, 7, 9, 11, 13, 15, 17, 19}; 1307 IntTreeWithLess cont({5, 7, 9, 11, 13, 15, 17, 19}, KEEP_FIRST_OF_DUPES);
1179 1308
1180 EXPECT_EQ(std::next(cont.begin(), 1), cont.upper_bound(5)); 1309 EXPECT_EQ(std::next(cont.begin(), 1), cont.upper_bound(5));
1181 EXPECT_EQ(std::next(cont.begin(), 2), cont.upper_bound(7)); 1310 EXPECT_EQ(std::next(cont.begin(), 2), cont.upper_bound(7));
1182 EXPECT_EQ(std::next(cont.begin(), 3), cont.upper_bound(9)); 1311 EXPECT_EQ(std::next(cont.begin(), 3), cont.upper_bound(9));
1183 EXPECT_EQ(std::next(cont.begin(), 4), cont.upper_bound(11)); 1312 EXPECT_EQ(std::next(cont.begin(), 4), cont.upper_bound(11));
1184 EXPECT_EQ(std::next(cont.begin(), 5), cont.upper_bound(13)); 1313 EXPECT_EQ(std::next(cont.begin(), 5), cont.upper_bound(13));
1185 EXPECT_EQ(std::next(cont.begin(), 6), cont.upper_bound(15)); 1314 EXPECT_EQ(std::next(cont.begin(), 6), cont.upper_bound(15));
1186 EXPECT_EQ(std::next(cont.begin(), 7), cont.upper_bound(17)); 1315 EXPECT_EQ(std::next(cont.begin(), 7), cont.upper_bound(17));
1187 EXPECT_EQ(std::next(cont.begin(), 8), cont.upper_bound(19)); 1316 EXPECT_EQ(std::next(cont.begin(), 8), cont.upper_bound(19));
1188 EXPECT_EQ(std::next(cont.begin(), 0), cont.upper_bound(4)); 1317 EXPECT_EQ(std::next(cont.begin(), 0), cont.upper_bound(4));
1189 EXPECT_EQ(std::next(cont.begin(), 1), cont.upper_bound(6)); 1318 EXPECT_EQ(std::next(cont.begin(), 1), cont.upper_bound(6));
1190 EXPECT_EQ(std::next(cont.begin(), 2), cont.upper_bound(8)); 1319 EXPECT_EQ(std::next(cont.begin(), 2), cont.upper_bound(8));
1191 EXPECT_EQ(std::next(cont.begin(), 3), cont.upper_bound(10)); 1320 EXPECT_EQ(std::next(cont.begin(), 3), cont.upper_bound(10));
1192 EXPECT_EQ(std::next(cont.begin(), 4), cont.upper_bound(12)); 1321 EXPECT_EQ(std::next(cont.begin(), 4), cont.upper_bound(12));
1193 EXPECT_EQ(std::next(cont.begin(), 5), cont.upper_bound(14)); 1322 EXPECT_EQ(std::next(cont.begin(), 5), cont.upper_bound(14));
1194 EXPECT_EQ(std::next(cont.begin(), 6), cont.upper_bound(16)); 1323 EXPECT_EQ(std::next(cont.begin(), 6), cont.upper_bound(16));
1195 EXPECT_EQ(std::next(cont.begin(), 7), cont.upper_bound(18)); 1324 EXPECT_EQ(std::next(cont.begin(), 7), cont.upper_bound(18));
1196 EXPECT_EQ(std::next(cont.begin(), 8), cont.upper_bound(20)); 1325 EXPECT_EQ(std::next(cont.begin(), 8), cont.upper_bound(20));
1197 } 1326 }
1198 } 1327 }
1199 1328
1200 // ---------------------------------------------------------------------------- 1329 // ----------------------------------------------------------------------------
1201 // General operations. 1330 // General operations.
1202 1331
1203 // void swap(flat_tree& other) 1332 // void swap(flat_tree& other)
1204 // void swap(flat_tree& lhs, flat_tree& rhs) 1333 // void swap(flat_tree& lhs, flat_tree& rhs)
1205 1334
1206 TEST(FlatTreeOurs, Swap) { 1335 TEST(FlatTreeOurs, Swap) {
1207 IntTree x{1, 2, 3}; 1336 IntTree x({1, 2, 3}, KEEP_FIRST_OF_DUPES);
1208 IntTree y{4}; 1337 IntTree y({4}, KEEP_FIRST_OF_DUPES);
1209 swap(x, y); 1338 swap(x, y);
1210 EXPECT_THAT(x, ElementsAre(4)); 1339 EXPECT_THAT(x, ElementsAre(4));
1211 EXPECT_THAT(y, ElementsAre(1, 2, 3)); 1340 EXPECT_THAT(y, ElementsAre(1, 2, 3));
1212 1341
1213 y.swap(x); 1342 y.swap(x);
1214 EXPECT_THAT(x, ElementsAre(1, 2, 3)); 1343 EXPECT_THAT(x, ElementsAre(1, 2, 3));
1215 EXPECT_THAT(y, ElementsAre(4)); 1344 EXPECT_THAT(y, ElementsAre(4));
1216 } 1345 }
1217 1346
1218 // bool operator==(const flat_tree& lhs, const flat_tree& rhs) 1347 // bool operator==(const flat_tree& lhs, const flat_tree& rhs)
1219 // bool operator!=(const flat_tree& lhs, const flat_tree& rhs) 1348 // bool operator!=(const flat_tree& lhs, const flat_tree& rhs)
1220 // bool operator<(const flat_tree& lhs, const flat_tree& rhs) 1349 // bool operator<(const flat_tree& lhs, const flat_tree& rhs)
1221 // bool operator>(const flat_tree& lhs, const flat_tree& rhs) 1350 // bool operator>(const flat_tree& lhs, const flat_tree& rhs)
1222 // bool operator<=(const flat_tree& lhs, const flat_tree& rhs) 1351 // bool operator<=(const flat_tree& lhs, const flat_tree& rhs)
1223 // bool operator>=(const flat_tree& lhs, const flat_tree& rhs) 1352 // bool operator>=(const flat_tree& lhs, const flat_tree& rhs)
1224 1353
1225 TEST(FlatTree, Comparison) { 1354 TEST(FlatTree, Comparison) {
1226 // Provided comparator does not participate in comparison. 1355 // Provided comparator does not participate in comparison.
1227 ReversedTree biggest{3}; 1356 ReversedTree biggest({3}, KEEP_FIRST_OF_DUPES);
1228 ReversedTree smallest{1}; 1357 ReversedTree smallest({1}, KEEP_FIRST_OF_DUPES);
1229 ReversedTree middle{1, 2}; 1358 ReversedTree middle({1, 2}, KEEP_FIRST_OF_DUPES);
1230 1359
1231 EXPECT_EQ(biggest, biggest); 1360 EXPECT_EQ(biggest, biggest);
1232 EXPECT_NE(biggest, smallest); 1361 EXPECT_NE(biggest, smallest);
1233 EXPECT_LT(smallest, middle); 1362 EXPECT_LT(smallest, middle);
1234 EXPECT_LE(smallest, middle); 1363 EXPECT_LE(smallest, middle);
1235 EXPECT_LE(middle, middle); 1364 EXPECT_LE(middle, middle);
1236 EXPECT_GT(biggest, middle); 1365 EXPECT_GT(biggest, middle);
1237 EXPECT_GE(biggest, middle); 1366 EXPECT_GE(biggest, middle);
1238 EXPECT_GE(biggest, biggest); 1367 EXPECT_GE(biggest, biggest);
1239 } 1368 }
1240 1369
1241 TEST(FlatSet, EraseIf) { 1370 TEST(FlatSet, EraseIf) {
1242 IntTree x; 1371 IntTree x;
1243 EraseIf(x, [](int) { return false; }); 1372 EraseIf(x, [](int) { return false; });
1244 EXPECT_THAT(x, ElementsAre()); 1373 EXPECT_THAT(x, ElementsAre());
1245 1374
1246 x = {1, 2, 3}; 1375 x = {1, 2, 3};
1247 EraseIf(x, [](int elem) { return !(elem & 1); }); 1376 EraseIf(x, [](int elem) { return !(elem & 1); });
1248 EXPECT_THAT(x, ElementsAre(1, 3)); 1377 EXPECT_THAT(x, ElementsAre(1, 3));
1249 1378
1250 x = {1, 2, 3, 4}; 1379 x = {1, 2, 3, 4};
1251 EraseIf(x, [](int elem) { return elem & 1; }); 1380 EraseIf(x, [](int elem) { return elem & 1; });
1252 EXPECT_THAT(x, ElementsAre(2, 4)); 1381 EXPECT_THAT(x, ElementsAre(2, 4));
1253 } 1382 }
1254 1383
1255 } // namespace internal 1384 } // namespace internal
1256 } // namespace base 1385 } // namespace base
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698