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

Unified Diff: base/containers/flat_set_unittest.cc

Issue 2944523002: Improving flat containers interface. (Closed)
Patch Set: Hopefuly, fix for git issue. Created 3 years, 6 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 side-by-side diff with in-line comments
Download patch
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) {
danakj 2017/06/27 23:48:25 same
dyaroshev 2017/06/28 09:13:59 Done
+ // 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

Powered by Google App Engine
This is Rietveld 408576698