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

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

Issue 2552343003: First implementation of flat sets (Closed)
Patch Set: Initial commit Created 4 years 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
(Empty)
1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "base/containers/flat_set.h"
6
7 #include <algorithm>
8 #include <functional>
9 #include <set>
10 #include <string>
11 #include <utility>
12
13 #include "testing/gtest/include/gtest/gtest.h"
14
15 namespace {
16
17 class MoveOnlyInt {
18 public:
19 MoveOnlyInt() = default;
20 explicit MoveOnlyInt(int rhs) : body_(rhs) {}
21
22 operator int() const { return body_; }
23
24 MoveOnlyInt(const MoveOnlyInt&) = delete;
25 MoveOnlyInt(MoveOnlyInt&& rhs) : body_(rhs.body_) { rhs.body_ = 0; }
26 MoveOnlyInt& operator=(const MoveOnlyInt&) = delete;
27 MoveOnlyInt& operator=(MoveOnlyInt&& rhs) {
28 body_ = rhs.body_;
29 rhs.body_ = 0;
30 return *this;
31 }
32 ~MoveOnlyInt() = default;
33
34 friend bool operator<(const MoveOnlyInt& lhs, const MoveOnlyInt& rhs) {
35 return lhs.body_ < rhs.body_;
36 }
37
38 private:
39 int body_ = 0;
40 };
41
42 struct LessByFirst {
43 template <typename FirstPair, typename SecondPair>
44 bool operator()(const FirstPair& lhs, const SecondPair& rhs) {
45 return std::less<typename FirstPair::first_type>()(lhs.first, rhs.first);
46 }
47 };
48
49 class NonDefaultConstructableCompare {
50 public:
51 NonDefaultConstructableCompare(int) {}
52
53 template <typename T>
54 bool operator()(const T& lhs, const T& rhs) {
55 return std::less<T>()(lhs, rhs);
56 }
57 };
58
59 NonDefaultConstructableCompare MakeWeiredCmp() {
60 return NonDefaultConstructableCompare(0);
61 }
62
63 template <typename LhsSet, typename RhsSet>
64 bool EqualRanges(const LhsSet& lhs, const RhsSet& rhs) {
65 if (lhs.size() != rhs.size())
66 return false;
67 return std::equal(lhs.begin(), lhs.end(), rhs.begin());
68 }
69
70 template <typename T, typename Cmp>
71 void ExpectSetsAreEqual(const base::flat_set<T, Cmp>& fl_set,
72 const std::set<T, Cmp>& std_set) {
73 if (EqualRanges(fl_set, std_set))
74 return;
75 std::string error_msg("\nExpected values are: [");
76 for (const auto& v : std_set)
77 error_msg += std::to_string(v) + ' ';
78 error_msg += "]\nActual values are: [";
79 for (const auto& v : fl_set)
80 error_msg += std::to_string(v) + ' ';
81 error_msg += "]";
82
83 ASSERT_TRUE(false) << error_msg;
84 }
85
86 #define TEST_INTEGERS_LIST 5, 3, 5, 1, 1, 9, 0,
87
88 constexpr int kIntRange[] = {TEST_INTEGERS_LIST};
89
90 const std::initializer_list<int> kInitList = {TEST_INTEGERS_LIST};
91
92 #undef TEST_INTEGERS_LIST
93
94 } // namespace
95
96 namespace base {
97
98 using CopySet = flat_set<int>;
99 using CopyStdSet = std::set<int>;
100 using CopyVec = std::vector<int>;
101 using MoveSet = flat_set<MoveOnlyInt>;
102 using MoveStdSet = std::set<MoveOnlyInt>;
103 using MoveVec = std::vector<MoveOnlyInt>;
104 using PairSet = flat_set<std::pair<int, int>, LessByFirst>;
105 using PairVec = std::vector<std::pair<int, int>>;
106 using WeiredCmpSet = flat_set<int, NonDefaultConstructableCompare>;
107 using WeiredCmpStdSet = std::set<int, NonDefaultConstructableCompare>;
108
109 TEST(FlatSetOurs, Swap) {
110 using M = flat_set<int>;
111 M lhs{1, 2, 3};
112 M rhs{4};
113 swap(lhs, rhs);
114 EXPECT_EQ(lhs.size(), static_cast<M::size_type>(1));
115 EXPECT_EQ(rhs.size(), static_cast<M::size_type>(3));
116 EXPECT_EQ(rhs.count(1), static_cast<M::size_type>(1));
117 EXPECT_EQ(rhs.count(2), static_cast<M::size_type>(1));
118 EXPECT_EQ(rhs.count(3), static_cast<M::size_type>(1));
119 EXPECT_EQ(lhs.count(1), static_cast<M::size_type>(0));
120 EXPECT_EQ(lhs.count(4), static_cast<M::size_type>(1));
121
122 rhs.swap(lhs); // member function wokrs too;
123 }
124
125 TEST(FlatSetOurs, Comparison) {
126 using M = flat_set<int>;
127 M biggest{3};
128 M smallest{1};
129 M middle{1, 2};
130
131 EXPECT_TRUE(biggest == biggest);
132 EXPECT_TRUE(biggest != smallest);
133 EXPECT_TRUE(smallest < middle);
134 EXPECT_TRUE(smallest <= middle);
135 EXPECT_TRUE(biggest >= middle);
136 EXPECT_TRUE(biggest > middle);
137 }
138
139 TEST(FlatSetOurs, Constructors) {
140 // default constructable
141 { CopySet s1; }
142 // constructable with Compare()
143 {
144 CopySet s1{std::less<int>()};
145 WeiredCmpSet s3{MakeWeiredCmp()};
146 }
147 // constructable with Compare() and Allocator()
148 { CopySet s1{std::less<int>(), std::allocator<int>()}; }
149 // constructable with range
150 {
151 CopySet s1(std::begin(kIntRange), std::end(kIntRange));
152 CopyStdSet std_s1(std::begin(kIntRange), std::end(kIntRange));
153 ExpectSetsAreEqual(s1, std_s1);
154 }
155 // constructable with range and compare
156 {
157 WeiredCmpSet s1(std::begin(kIntRange), std::end(kIntRange),
158 MakeWeiredCmp());
159 WeiredCmpStdSet std_s1(std::begin(kIntRange), std::end(kIntRange),
160 MakeWeiredCmp());
161 ExpectSetsAreEqual(s1, std_s1);
162 }
163 // constructable with range, compare and allocator
164 {
165 WeiredCmpSet s1(std::begin(kIntRange), std::end(kIntRange),
166 NonDefaultConstructableCompare(0), std::allocator<int>());
167 WeiredCmpStdSet std_s1(std::begin(kIntRange), std::end(kIntRange),
168 MakeWeiredCmp());
169 ExpectSetsAreEqual(s1, std_s1);
170 }
171 // copy constructable
172 {
173 WeiredCmpStdSet test_set(std::begin(kIntRange), std::end(kIntRange),
174 MakeWeiredCmp());
175
176 WeiredCmpSet s1(std::begin(kIntRange), std::end(kIntRange),
177 MakeWeiredCmp());
178 WeiredCmpSet s2(s1);
179
180 ExpectSetsAreEqual(s1, test_set);
181 ExpectSetsAreEqual(s2, test_set);
182 }
183 // move constructable
184 {
185 MoveStdSet test_set(std::begin(kIntRange), std::end(kIntRange));
186
187 MoveVec vec(std::begin(kIntRange), std::end(kIntRange));
188 MoveSet s1(std::make_move_iterator(vec.begin()),
189 std::make_move_iterator(vec.end()));
190
191 MoveSet s2(std::move(s1));
192 ExpectSetsAreEqual(s2, test_set);
193 }
194 // constructable with an allocator
195 { CopySet s1{std::allocator<int>()}; }
196 // copy constructable with an allocator
197 {
198 WeiredCmpStdSet test_set(std::begin(kIntRange), std::end(kIntRange),
199 MakeWeiredCmp());
200
201 WeiredCmpSet s1(std::begin(kIntRange), std::end(kIntRange),
202 MakeWeiredCmp());
203
204 WeiredCmpSet s2(s1, std::allocator<int>());
205
206 ExpectSetsAreEqual(s1, test_set);
207 ExpectSetsAreEqual(s2, test_set);
208 }
209 // move constructable with an allocator
210 {
211 MoveStdSet test_set(std::begin(kIntRange), std::end(kIntRange));
212
213 MoveVec vec(std::begin(kIntRange), std::end(kIntRange));
214 MoveSet s1(std::make_move_iterator(vec.begin()),
215 std::make_move_iterator(vec.end()));
216
217 MoveSet s2(std::move(s1), std::allocator<MoveOnlyInt>());
218 ExpectSetsAreEqual(s2, test_set);
219 }
220 // constructable with an initializer list
221 {
222 CopyStdSet test_set(kInitList);
223 CopySet s1(kInitList);
224
225 ExpectSetsAreEqual(s1, test_set);
226 }
227 // constructable with an initializer list and compare
228 {
229 WeiredCmpStdSet test_set(kInitList, MakeWeiredCmp());
230 WeiredCmpSet s1(kInitList, MakeWeiredCmp());
231
232 ExpectSetsAreEqual(s1, test_set);
233 }
234 // constructable with an initializer list, compare and an allocator
235 {
236 WeiredCmpStdSet test_set(kInitList, MakeWeiredCmp());
237 WeiredCmpSet s1(kInitList, MakeWeiredCmp(), std::allocator<int>());
238
239 ExpectSetsAreEqual(s1, test_set);
240 }
241 // constructable with a range and an allocator
242 {
243 CopyStdSet test_set(std::begin(kIntRange), std::end(kIntRange));
244 CopySet s1(std::begin(kIntRange), std::end(kIntRange),
245 std::allocator<int>());
246
247 ExpectSetsAreEqual(s1, test_set);
248 }
249 // constructable with an initializer list and an allocator
250 {
251 CopyStdSet test_set(kInitList);
252 CopySet s1(kInitList, std::allocator<int>());
253
254 ExpectSetsAreEqual(s1, test_set);
255 }
256 }
257
258 TEST(FlatSetOurs, Assigments) {
259 using MoveVec = std::vector<MoveOnlyInt>;
260
261 // copy assimgnable
262 {
263 CopyStdSet test_set(kInitList);
264
265 CopySet s1(kInitList);
266 CopySet s2;
267 s2 = s1;
268
269 ExpectSetsAreEqual(s1, test_set);
270 ExpectSetsAreEqual(s2, test_set);
271 }
272 // move assignable
273 {
274 MoveStdSet test_set(std::begin(kIntRange), std::end(kIntRange));
275
276 MoveVec vec(std::begin(kIntRange), std::end(kIntRange));
277 MoveSet s1(std::make_move_iterator(vec.begin()),
278 std::make_move_iterator(vec.end()));
279 MoveSet s2;
280
281 s2 = std::move(s1);
282 ExpectSetsAreEqual(s2, test_set);
283 }
284 // assignable to an initializer list
285 {
286 CopyStdSet test_set;
287 test_set = kInitList;
288
289 CopySet s1;
290 s1 = kInitList;
291 ExpectSetsAreEqual(s1, test_set);
292 }
293 }
294
295 TEST(FlatSetOurs, MemoryManagment) {
296 constexpr CopySet::size_type kReserveSize = 5;
297
298 // get allocator
299 {
300 CopyVec test;
301 CopySet s1;
302
303 EXPECT_TRUE(test.get_allocator() == s1.get_allocator());
304 }
305 // capacity
306 {
307 CopyVec test;
308 CopySet s1;
309
310 EXPECT_EQ(s1.capacity(), test.capacity());
311 }
312 // reserve
313 {
314 CopySet s1;
315
316 s1.reserve(kReserveSize);
317 EXPECT_GE(s1.capacity(), kReserveSize);
318 }
319 // shrink to fit
320 {
321 CopySet s1;
322
323 s1.reserve(kReserveSize);
324 s1.insert(kInitList);
325 auto capacity_before = s1.capacity();
326 s1.shrink_to_fit();
327 EXPECT_GE(capacity_before, s1.capacity()); // Shrink to fit is not binding.
328 }
329 }
330
331 TEST(FlatSetOurs, Iterators) {
332 // begin, end
333 {
334 CopyStdSet test_set(kInitList);
335 CopySet s1(kInitList);
336
337 EXPECT_EQ(CopyVec(test_set.begin(), test_set.end()),
338 CopyVec(s1.begin(), s1.end()));
339 }
340 // const begin, end
341 {
342 CopyStdSet test_set(kInitList);
343 const CopySet s1(kInitList);
344
345 EXPECT_EQ(CopyVec(test_set.begin(), test_set.end()),
346 CopyVec(s1.begin(), s1.end()));
347 }
348 // rbegin, rend
349 {
350 CopyStdSet test_set(kInitList);
351 CopySet s1(kInitList);
352
353 EXPECT_EQ(CopyVec(test_set.rbegin(), test_set.rend()),
354 CopyVec(s1.rbegin(), s1.rend()));
355 }
356 // const rbegin, rend
357 {
358 CopyStdSet test_set(kInitList);
359 const CopySet s1(kInitList);
360
361 EXPECT_EQ(CopyVec(test_set.rbegin(), test_set.rend()),
362 CopyVec(s1.rbegin(), s1.rend()));
363 }
364 // cbegin, cend
365 {
366 CopyStdSet test_set(kInitList);
367 const CopySet s1(kInitList);
368
369 EXPECT_EQ(CopyVec(test_set.cbegin(), test_set.cend()),
370 CopyVec(s1.cbegin(), s1.cend()));
371 }
372 // crbegin, crend
373 {
374 CopyStdSet test_set(kInitList);
375 CopySet s1(kInitList);
376
377 EXPECT_EQ(CopyVec(test_set.crbegin(), test_set.crend()),
378 CopyVec(s1.crbegin(), s1.crend()));
379 }
380 }
381
382 TEST(FlatSetOurs, CapasityAccessors) {
383 // empty
384 {
385 CopySet s1;
386 EXPECT_TRUE(s1.empty());
387 }
388 // size
389 {
390 CopySet s1;
391 EXPECT_EQ(s1.size(), static_cast<CopySet::size_type>(0));
392 }
393 // max size
394 {
395 CopySet s1;
396 EXPECT_EQ(s1.max_size(), CopyVec().max_size());
397 }
398 }
399
400 TEST(FlatSetOurs, OneValueInsertionsWithoutHints) {
401 // insert (const value_type&) in the beginning successful
402 {
403 CopySet s1{2, 3, 4};
404
405 const int val1 = 1;
406 auto pos_suc = s1.insert(val1);
407
408 EXPECT_EQ(pos_suc.first - s1.begin(), 0);
409 EXPECT_TRUE(pos_suc.second);
410 EXPECT_EQ(CopyVec(s1.begin(), s1.end()), CopyVec({1, 2, 3, 4}));
411 }
412
413 // insert (const value_type&) in the middle successful
414 {
415 CopySet s1{1, 2, 4};
416
417 const int val1 = 3;
418 auto pos_suc = s1.insert(val1);
419
420 EXPECT_EQ(pos_suc.first - s1.begin(), 2);
421 EXPECT_TRUE(pos_suc.second);
422 EXPECT_EQ(CopyVec(s1.begin(), s1.end()), CopyVec({1, 2, 3, 4}));
423 }
424
425 // insert (const value_type&) in the end successful
426 {
427 CopySet s1{1, 2, 3};
428
429 const int val1 = 4;
430 auto pos_suc = s1.insert(val1);
431
432 EXPECT_EQ(pos_suc.first - s1.begin(), 3);
433 EXPECT_TRUE(pos_suc.second);
434 EXPECT_EQ(CopyVec(s1.begin(), s1.end()), CopyVec({1, 2, 3, 4}));
435 }
436
437 // insert (const value_type&) not successful
438 {
439 CopySet s1{1, 2, 3};
440
441 const int val1 = 1;
442 auto pos_suc = s1.insert(val1);
443
444 EXPECT_EQ(pos_suc.first - s1.begin(), 0);
445 EXPECT_FALSE(pos_suc.second);
446 EXPECT_EQ(CopyVec(s1.begin(), s1.end()), CopyVec({1, 2, 3}));
447 }
448
449 // insert (value_type&&) in the beginning successful
450 {
451 constexpr int kIntRange[] = {2, 3, 4};
452
453 MoveVec vec(std::begin(kIntRange), std::end(kIntRange));
454 MoveSet s1(std::make_move_iterator(vec.begin()),
455 std::make_move_iterator(vec.end()));
456
457 auto pos_suc = s1.insert(MoveOnlyInt(1));
458
459 EXPECT_EQ(pos_suc.first - s1.begin(), 0);
460 EXPECT_TRUE(pos_suc.second);
461 EXPECT_EQ(CopyVec(s1.begin(), s1.end()), CopyVec({1, 2, 3, 4}));
462 }
463
464 // insert (value_type&&) in the middle successful
465 {
466 constexpr int kIntRange[] = {1, 2, 4};
467
468 MoveVec vec(std::begin(kIntRange), std::end(kIntRange));
469 MoveSet s1(std::make_move_iterator(vec.begin()),
470 std::make_move_iterator(vec.end()));
471
472 auto pos_suc = s1.insert(MoveOnlyInt(3));
473
474 EXPECT_EQ(pos_suc.first - s1.begin(), 2);
475 EXPECT_TRUE(pos_suc.second);
476 EXPECT_EQ(CopyVec(s1.begin(), s1.end()), CopyVec({1, 2, 3, 4}));
477 }
478
479 // insert (value_type&&) in the end successful
480 {
481 constexpr int kIntRange[] = {1, 2, 3};
482
483 MoveVec vec(std::begin(kIntRange), std::end(kIntRange));
484 MoveSet s1(std::make_move_iterator(vec.begin()),
485 std::make_move_iterator(vec.end()));
486
487 auto pos_suc = s1.insert(MoveOnlyInt(4));
488
489 EXPECT_EQ(pos_suc.first - s1.begin(), 3);
490 EXPECT_TRUE(pos_suc.second);
491 EXPECT_EQ(CopyVec(s1.begin(), s1.end()), CopyVec({1, 2, 3, 4}));
492 }
493 // insert (value_type&&) not successful
494 {
495 constexpr int kIntRange[] = {1, 2, 3};
496
497 MoveVec vec(std::begin(kIntRange), std::end(kIntRange));
498 MoveSet s1(std::make_move_iterator(vec.begin()),
499 std::make_move_iterator(vec.end()));
500
501 auto pos_suc = s1.insert(MoveOnlyInt(1));
502
503 EXPECT_EQ(pos_suc.first - s1.begin(), 0);
504 EXPECT_FALSE(pos_suc.second);
505 EXPECT_EQ(CopyVec(s1.begin(), s1.end()), CopyVec({1, 2, 3}));
506 }
507
508 // emplace (Args&&...) in the beginning successful
509 {
510 PairSet s1{{2, 0}, {3, 0}, {4, 0}};
511
512 auto pos_suc = s1.emplace(1, 0);
513
514 EXPECT_EQ(pos_suc.first - s1.begin(), 0);
515 EXPECT_TRUE(pos_suc.second);
516 EXPECT_EQ(PairVec(s1.begin(), s1.end()),
517 PairVec({{1, 0}, {2, 0}, {3, 0}, {4, 0}}));
518 }
519 // emplace (Args&&...) in the middle successful
520 {
521 PairSet s1{{1, 0}, {2, 0}, {4, 0}};
522
523 auto pos_suc = s1.emplace(3, 0);
524
525 EXPECT_EQ(pos_suc.first - s1.begin(), 2);
526 EXPECT_TRUE(pos_suc.second);
527 EXPECT_EQ(PairVec(s1.begin(), s1.end()),
528 PairVec({{1, 0}, {2, 0}, {3, 0}, {4, 0}}));
529 }
530 // emplace (Args&&...) in the end successful
531 {
532 PairSet s1{{1, 0}, {2, 0}, {3, 0}};
533
534 auto pos_suc = s1.emplace(4, 0);
535
536 EXPECT_EQ(pos_suc.first - s1.begin(), 3);
537 EXPECT_TRUE(pos_suc.second);
538 EXPECT_EQ(PairVec(s1.begin(), s1.end()),
539 PairVec({{1, 0}, {2, 0}, {3, 0}, {4, 0}}));
540 }
541 // emplace (Args&&...) is not successful
542 {
543 PairSet s1{{1, 0}, {2, 0}, {3, 0}};
544
545 auto pos_suc = s1.emplace(3, 1); // checking that we keep the old one
546
547 EXPECT_EQ(pos_suc.first - s1.begin(), 2);
548 EXPECT_FALSE(pos_suc.second);
549 EXPECT_EQ(PairVec(s1.begin(), s1.end()), PairVec({{1, 0}, {2, 0}, {3, 0}}));
550 }
551 }
552
553 TEST(FlatSetOurs, InsertingWithAHint) {
554 // inserting (position, const &) with correct hint in the beginning is
555 // succesfull
556 {
557 CopySet s1{2, 3, 4};
558
559 const int val1 = 1;
560 auto pos = s1.insert(s1.begin(), val1);
561
562 EXPECT_EQ(pos - s1.begin(), 0);
563 EXPECT_EQ(CopyVec(s1.begin(), s1.end()), CopyVec({1, 2, 3, 4}));
564 }
565 // inserting (position, const &) with correct hint in the middle is succesfull
566 {
567 CopySet s1{1, 2, 4};
568
569 const int val1 = 3;
570 auto pos = s1.insert(s1.begin() + 2, val1);
571
572 EXPECT_EQ(pos - s1.begin(), 2);
573 EXPECT_EQ(CopyVec(s1.begin(), s1.end()), CopyVec({1, 2, 3, 4}));
574 }
575 // inserting (position, const &) with correct hint in the end is succesfull
576 {
577 CopySet s1{1, 2, 3};
578
579 const int val1 = 4;
580 auto pos = s1.insert(s1.end(), val1);
581
582 EXPECT_EQ(pos - s1.begin(), 3);
583 EXPECT_EQ(CopyVec(s1.begin(), s1.end()), CopyVec({1, 2, 3, 4}));
584 }
585 // inserting (position, const &) with hint is not succefful
586 {
587 CopySet s1{1, 2, 3};
588
589 const int val1 = 2;
590 auto pos = s1.insert(s1.begin(), val1);
591
592 EXPECT_EQ(pos - s1.begin(), 1);
593 EXPECT_EQ(CopyVec(s1.begin(), s1.end()), CopyVec({1, 2, 3}));
594 }
595
596 // inserting (position, &&) with correct hint in the beginning is succefful
597 {
598 constexpr int kIntRange[] = {2, 3, 4};
599
600 MoveVec vec(std::begin(kIntRange), std::end(kIntRange));
601 MoveSet s1(std::make_move_iterator(vec.begin()),
602 std::make_move_iterator(vec.end()));
603
604 auto pos = s1.insert(s1.begin(), MoveOnlyInt(1));
605
606 EXPECT_EQ(pos - s1.begin(), 0);
607 EXPECT_EQ(CopyVec(s1.begin(), s1.end()), CopyVec({1, 2, 3, 4}));
608 }
609 // inserting (position, &&) with correct hint in the middle is succefful
610 {
611 constexpr int kIntRange[] = {1, 2, 4};
612
613 MoveVec vec(std::begin(kIntRange), std::end(kIntRange));
614 MoveSet s1(std::make_move_iterator(vec.begin()),
615 std::make_move_iterator(vec.end()));
616
617 auto pos = s1.insert(s1.begin() + 2, MoveOnlyInt(3));
618
619 EXPECT_EQ(pos - s1.begin(), 2);
620 EXPECT_EQ(CopyVec(s1.begin(), s1.end()), CopyVec({1, 2, 3, 4}));
621 }
622 // inserting (position, &&) with correct hint in the end is succesfull
623 {
624 constexpr int kIntRange[] = {1, 2, 3};
625
626 MoveVec vec(std::begin(kIntRange), std::end(kIntRange));
627 MoveSet s1(std::make_move_iterator(vec.begin()),
628 std::make_move_iterator(vec.end()));
629
630 auto pos = s1.insert(s1.end(), MoveOnlyInt(4));
631
632 EXPECT_EQ(pos - s1.begin(), 3);
633 EXPECT_EQ(CopyVec(s1.begin(), s1.end()), CopyVec({1, 2, 3, 4}));
634 }
635 // inserting (position, &&) with hint is not succefful
636 {
637 constexpr int kIntRange[] = {1, 2, 3};
638
639 MoveVec vec(std::begin(kIntRange), std::end(kIntRange));
640 MoveSet s1(std::make_move_iterator(vec.begin()),
641 std::make_move_iterator(vec.end()));
642
643 auto pos = s1.insert(s1.begin(), MoveOnlyInt(2));
644
645 EXPECT_EQ(pos - s1.begin(), 1);
646 EXPECT_EQ(CopyVec(s1.begin(), s1.end()), CopyVec({1, 2, 3}));
647 }
648
649 // emplace_hint (position Args&&...) with correct hint in the beginning
650 // successful
651 {
652 PairSet s1{{2, 0}, {3, 0}, {4, 0}};
653
654 auto pos = s1.emplace_hint(s1.begin(), 1, 0);
655
656 EXPECT_EQ(pos - s1.begin(), 0);
657 EXPECT_EQ(PairVec(s1.begin(), s1.end()),
658 PairVec({{1, 0}, {2, 0}, {3, 0}, {4, 0}}));
659 }
660 // emplace_hint (position Args&&...) with correct hint in the middle
661 // successful
662 {
663 PairSet s1{{1, 0}, {2, 0}, {4, 0}};
664
665 auto pos = s1.emplace_hint(s1.begin() + 2, 3, 0);
666
667 EXPECT_EQ(pos - s1.begin(), 2);
668 EXPECT_EQ(PairVec(s1.begin(), s1.end()),
669 PairVec({{1, 0}, {2, 0}, {3, 0}, {4, 0}}));
670 }
671 // emplace_hint (position Args&&...) with correct hint in the end successful
672 {
673 PairSet s1{{1, 0}, {2, 0}, {3, 0}};
674
675 auto pos = s1.emplace_hint(s1.end(), 4, 0);
676
677 EXPECT_EQ(pos - s1.begin(), 3);
678 EXPECT_EQ(PairVec(s1.begin(), s1.end()),
679 PairVec({{1, 0}, {2, 0}, {3, 0}, {4, 0}}));
680 }
681 // emplace_hint (position Args&&...) is not successful
682 {
683 PairSet s1{{1, 0}, {2, 0}, {3, 0}};
684
685 auto pos = s1.emplace_hint(s1.begin(), 2, 0);
686
687 EXPECT_EQ(pos - s1.begin(), 1);
688 EXPECT_EQ(PairVec(s1.begin(), s1.end()), PairVec({{1, 0}, {2, 0}, {3, 0}}));
689 }
690 }
691
692 TEST(FlatSetOurs, InsertRange) {
693 // insert (first, last) simple
694 {
695 CopyStdSet test_set(std::begin(kIntRange), std::end(kIntRange));
696 CopySet s1;
697
698 s1.insert(std::begin(kIntRange), std::end(kIntRange));
699
700 ExpectSetsAreEqual(s1, test_set);
701 }
702 // insert ({}) simple
703 {
704 CopyStdSet test_set(kInitList);
705 CopySet s1;
706
707 s1.insert(kInitList);
708
709 ExpectSetsAreEqual(s1, test_set);
710 }
711
712 // insert (first, last) move only
713 {
714 MoveStdSet test_set(std::begin(kIntRange), std::end(kIntRange));
715 MoveSet s1;
716
717 MoveVec vec(std::begin(kIntRange), std::end(kIntRange));
718
719 s1.insert(std::make_move_iterator(vec.begin()),
720 std::make_move_iterator(vec.end()));
721
722 ExpectSetsAreEqual(s1, test_set);
723 }
724
725 // insert (first, last) simple merge
726 {
727 CopySet s1{1, 2, 3};
728 constexpr int kMergingRange[] = {1, 4};
729 s1.insert(std::begin(kMergingRange), std::end(kMergingRange));
730
731 EXPECT_EQ(CopyVec(s1.begin(), s1.end()), CopyVec({1, 2, 3, 4}));
732 }
733 // insert ({}) simple merge
734 {
735 CopySet s1{1, 2, 3};
736 s1.insert({1, 4});
737
738 EXPECT_EQ(CopyVec(s1.begin(), s1.end()), CopyVec({1, 2, 3, 4}));
739 }
740
741 // insert (first, last) stable regarding already inserted
742 {
743 PairSet s1{{1, 0}, {2, 0}, {3, 0}, {4, 0}};
744 const std::pair<int, int> kMergingRange[] = {
745 {1, 1}, {2, 1}, {1, 2}, {3, 1}};
746 s1.insert(std::begin(kMergingRange), std::end(kMergingRange));
747
748 EXPECT_EQ(PairVec(s1.begin(), s1.end()),
749 PairVec({{1, 0}, {2, 0}, {3, 0}, {4, 0}}));
750 }
751 // insert ({}) stable regarding already inserted
752 {
753 PairSet s1{{1, 0}, {2, 0}, {3, 0}, {4, 0}};
754 s1.insert({{1, 1}, {2, 1}, {1, 2}, {3, 1}});
755
756 EXPECT_EQ(PairVec(s1.begin(), s1.end()),
757 PairVec({{1, 0}, {2, 0}, {3, 0}, {4, 0}}));
758 }
759 }
760
761 } // namespace base
OLDNEW
« base/containers/flat_set.h ('K') | « base/containers/flat_set_libcpp_unittest.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698