Index: base/containers/small_map_unittest.cc |
diff --git a/base/containers/small_map_unittest.cc b/base/containers/small_map_unittest.cc |
index f87a8f09cbf5fcc75ffa338ba48fb549f2449f22..d76d93a9ab4d5eb4f16d0e7f27e54d63f47cd281 100644 |
--- a/base/containers/small_map_unittest.cc |
+++ b/base/containers/small_map_unittest.cc |
@@ -479,4 +479,58 @@ TEST(SmallMap, SubclassInitializationWithFunctionObject) { |
EXPECT_EQ(1u, m.count(-1)); |
} |
+// This class acts as a basic implementation of a move-only type. The canonical |
+// example of such a type is scoped_ptr/unique_ptr. |
+class MoveOnlyType { |
+ public: |
+ MoveOnlyType() : value_(0) {} |
+ explicit MoveOnlyType(int value) : value_(value) {} |
+ |
+ MoveOnlyType(MoveOnlyType&& other) { |
+ *this = std::move(other); |
+ } |
+ |
+ MoveOnlyType& operator=(MoveOnlyType&& other) { |
+ value_ = other.value_; |
+ other.value_ = 0; |
+ return *this; |
+ } |
+ |
+ MoveOnlyType(const MoveOnlyType&) = delete; |
+ MoveOnlyType& operator=(const MoveOnlyType&) = delete; |
+ |
+ int value() const { return value_; } |
+ |
+ private: |
+ int value_; |
+}; |
+ |
+TEST(SmallMap, MoveOnlyValueType) { |
+ SmallMap<std::map<int, MoveOnlyType>, 2> m; |
+ |
+ m[0] = MoveOnlyType(1); |
+ m[1] = MoveOnlyType(2); |
+ m.erase(m.begin()); |
+ |
+ // SmallMap will move m[1] to an earlier index in the internal array. |
+ EXPECT_EQ(m.size(), 1u); |
+ EXPECT_EQ(m[1].value(), 2); |
+ |
+ m[0] = MoveOnlyType(1); |
+ // SmallMap must move the values from the array into the internal std::map. |
+ m[2] = MoveOnlyType(3); |
+ |
+ EXPECT_EQ(m.size(), 3u); |
+ EXPECT_EQ(m[0].value(), 1); |
+ EXPECT_EQ(m[1].value(), 2); |
+ EXPECT_EQ(m[2].value(), 3); |
+ |
+ m.erase(m.begin()); |
+ |
+ // SmallMap should also let internal std::map erase with a move-only type. |
+ EXPECT_EQ(m.size(), 2u); |
+ EXPECT_EQ(m[1].value(), 2); |
+ EXPECT_EQ(m[2].value(), 3); |
+} |
+ |
} // namespace base |