| Index: base/containers/flat_set_unittest.cc
|
| diff --git a/base/containers/flat_set_unittest.cc b/base/containers/flat_set_unittest.cc
|
| index dc024fcf0a9729a15d4987e3980da46306a6b143..af133638bee0b7421fd987bb8591de9d8e4c718c 100644
|
| --- a/base/containers/flat_set_unittest.cc
|
| +++ b/base/containers/flat_set_unittest.cc
|
| @@ -7,8 +7,9 @@
|
| #include <string>
|
| #include <vector>
|
|
|
| -#include "base/containers/container_test_utils.h"
|
| #include "base/macros.h"
|
| +#include "base/memory/ptr_util.h"
|
| +#include "base/test/move_only_int.h"
|
| #include "testing/gmock/include/gmock/gmock.h"
|
| #include "testing/gtest/include/gtest/gtest.h"
|
|
|
| @@ -20,6 +21,35 @@ using ::testing::ElementsAre;
|
|
|
| namespace base {
|
|
|
| +namespace {
|
| +
|
| +struct UniquePtrComparator {
|
| + // Mark your comparison as transparent.
|
| + using is_transparent = int;
|
| +
|
| + template <typename T>
|
| + bool operator()(const std::unique_ptr<T>& lhs,
|
| + const std::unique_ptr<T>& rhs) const {
|
| + return lhs < rhs;
|
| + }
|
| +
|
| + template <typename T>
|
| + bool operator()(const T* lhs, const std::unique_ptr<T>& rhs) const {
|
| + return lhs < rhs.get();
|
| + }
|
| +
|
| + template <typename T>
|
| + bool operator()(const std::unique_ptr<T>& lhs, const T* rhs) const {
|
| + return lhs.get() < rhs;
|
| + }
|
| +};
|
| +
|
| +// Declare a typedef.
|
| +template <typename T>
|
| +using UniquePtrSet = base::flat_set<std::unique_ptr<T>, UniquePtrComparator>;
|
| +
|
| +} // namespace
|
| +
|
| TEST(FlatSet, IncompleteType) {
|
| struct A {
|
| using Set = flat_set<A>;
|
| @@ -90,4 +120,46 @@ TEST(FlatSet, CopySwap) {
|
| EXPECT_THAT(copy, ElementsAre(1, 2));
|
| }
|
|
|
| +TEST(FlatSet, UsingTransparentCompare) {
|
| + using ExplicitInt = base::MoveOnlyInt;
|
| + base::flat_set<ExplicitInt> s;
|
| + const auto& s1 = s;
|
| + int x = 0;
|
| +
|
| + // Check if we can use lookup functions without converting to key_type.
|
| + // Correctness is checked in flat_tree tests.
|
| + s.count(x);
|
| + s1.count(x);
|
| + s.find(x);
|
| + s1.find(x);
|
| + s.equal_range(x);
|
| + s1.equal_range(x);
|
| + s.lower_bound(x);
|
| + s1.lower_bound(x);
|
| + s.upper_bound(x);
|
| + s1.upper_bound(x);
|
| + s.erase(x);
|
| +
|
| + // Check if we broke overload resolution.
|
| + s.emplace(0);
|
| + s.emplace(1);
|
| + s.erase(s.begin());
|
| + s.erase(s.cbegin());
|
| +}
|
| +
|
| +TEST(FlatSet, Examples) {
|
| + // Collect data.
|
| + std::vector<std::unique_ptr<int>> ptr_vec;
|
| + ptr_vec.reserve(5);
|
| + std::generate_n(std::back_inserter(ptr_vec), 5,
|
| + [] { return base::MakeUnique<int>(0); });
|
| +
|
| + // Construct set.
|
| + UniquePtrSet<int> ptr_set(std::move(ptr_vec), base::KEEP_FIRST_OF_DUPES);
|
| +
|
| + // Use it with plain pointers.
|
| + int* ptr = ptr_set.begin()->get();
|
| + EXPECT_TRUE(ptr_set.find(ptr) == ptr_set.begin());
|
| +}
|
| +
|
| } // namespace base
|
|
|