Index: base/containers/flat_tree_unittest.cc |
diff --git a/base/containers/flat_tree_unittest.cc b/base/containers/flat_tree_unittest.cc |
index 91a853c736ca6df5547383ca25826cff2d28a1a0..825f6feb38415807504fb796a35c7f804d86e1cf 100644 |
--- a/base/containers/flat_tree_unittest.cc |
+++ b/base/containers/flat_tree_unittest.cc |
@@ -130,6 +130,13 @@ class NonDefaultConstructibleCompare { |
} |
}; |
+template <class PairType> |
+struct LessByFirst { |
+ bool operator()(const PairType& lhs, const PairType& rhs) const { |
+ return lhs.first < rhs.first; |
+ } |
+}; |
+ |
// Common test trees. |
// TODO(dyaroshev): replace less<int> with less<>, once we have it |
@@ -181,36 +188,30 @@ TEST(FlatTree, IncompleteType) { |
TEST(FlatTree, Stability) { |
using Pair = std::pair<int, int>; |
- struct LessByFirst { |
- bool operator()(const Pair& lhs, const Pair& rhs) const { |
- return lhs.first < rhs.first; |
- } |
- }; |
- |
using Tree = |
- flat_tree<Pair, Pair, GetKeyFromValueIdentity<Pair>, LessByFirst>; |
+ flat_tree<Pair, Pair, GetKeyFromValueIdentity<Pair>, LessByFirst<Pair>>; |
- // Constructors are not stable. |
+ // Constructors are stable. |
Tree cont{{0, 0}, {1, 0}, {0, 1}, {2, 0}, {0, 2}, {1, 1}}; |
- auto NoneOfSecondsAreTwo = [&cont] { |
- return std::none_of(cont.begin(), cont.end(), |
- [](const Pair& elem) { return elem.second == 2; }); |
+ auto AllOfSecondsAreZero = [&cont] { |
+ return std::all_of(cont.begin(), cont.end(), |
+ [](const Pair& elem) { return elem.second == 0; }); |
}; |
+ EXPECT_TRUE(AllOfSecondsAreZero()) << "constructor should be stable"; |
+ |
// Should not replace existing. |
cont.insert(Pair(0, 2)); |
cont.insert(Pair(1, 2)); |
cont.insert(Pair(2, 2)); |
- EXPECT_TRUE(NoneOfSecondsAreTwo()) |
- << "insert should be stable with respect to constructor"; |
+ EXPECT_TRUE(AllOfSecondsAreZero()) << "insert should be stable"; |
cont.insert(Pair(3, 0)); |
cont.insert(Pair(3, 2)); |
- EXPECT_TRUE(NoneOfSecondsAreTwo()) |
- << "insert should be stable with respect to previous insert"; |
+ EXPECT_TRUE(AllOfSecondsAreZero()) << "insert should be stable"; |
} |
// ---------------------------------------------------------------------------- |
@@ -312,7 +313,35 @@ TEST(FlatTree, MoveConstructor) { |
EXPECT_EQ(1U, moved.count(MoveOnlyInt(4))); |
} |
-// flat_tree(std::initializer_list<value_type> ilist, |
+// flat_tree(std::vector<value_type>&&) |
+ |
+TEST(FlatTree, MoveVectorConstructor) { |
+ using Pair = std::pair<int, MoveOnlyInt>; |
+ |
+ // Construct an unsorted vector with a duplicate item in it. Sorted by the |
+ // first item, the second allows us to test for stability. Using a move |
+ // only type to ensure the vector is not copied. |
+ std::vector<Pair> storage; |
+ storage.push_back(Pair(2, MoveOnlyInt(0))); |
+ storage.push_back(Pair(1, MoveOnlyInt(0))); |
+ storage.push_back(Pair(2, MoveOnlyInt(1))); |
+ |
+ using Tree = |
+ flat_tree<Pair, Pair, GetKeyFromValueIdentity<Pair>, LessByFirst<Pair>>; |
+ Tree tree(std::move(storage)); |
+ |
+ // The list should be two items long, with only the first "2" saved. |
+ ASSERT_EQ(2u, tree.size()); |
+ const Pair& zeroth = *tree.begin(); |
+ ASSERT_EQ(1, zeroth.first); |
+ ASSERT_EQ(0, zeroth.second.data()); |
+ |
+ const Pair& first = *(tree.begin() + 1); |
+ ASSERT_EQ(2, first.first); |
+ ASSERT_EQ(0, first.second.data()); |
+} |
+ |
+// flat_tree(std::initializer_list<value_type> ilist, |
// const Compare& comp = Compare()) |
TEST(FlatTree, InitializerListConstructor) { |