summaryrefslogtreecommitdiffstats
path: root/cc/base
diff options
context:
space:
mode:
authorpdr <pdr@chromium.org>2015-06-24 12:40:14 -0700
committerCommit bot <commit-bot@chromium.org>2015-06-24 19:40:49 +0000
commitd012546071380244dcadedbd4dc1eccaab004d00 (patch)
tree7b6d0d82907e7c4fb1d18aea8cb5cc8ccff95459 /cc/base
parent34d4a6c9a85d7b9e9442e5e29c1d68cf34ebab20 (diff)
downloadchromium_src-d012546071380244dcadedbd4dc1eccaab004d00.zip
chromium_src-d012546071380244dcadedbd4dc1eccaab004d00.tar.gz
chromium_src-d012546071380244dcadedbd4dc1eccaab004d00.tar.bz2
Add ListContainer::swap
This patch implements a simple swap function on ListContainer. Users can use this function to swap a list container with... wait for it... another list container! BUG=484943 CQ_INCLUDE_TRYBOTS=tryserver.blink:linux_blink_rel Review URL: https://codereview.chromium.org/1199343004 Cr-Commit-Position: refs/heads/master@{#335977}
Diffstat (limited to 'cc/base')
-rw-r--r--cc/base/list_container.h5
-rw-r--r--cc/base/list_container_unittest.cc46
2 files changed, 49 insertions, 2 deletions
diff --git a/cc/base/list_container.h b/cc/base/list_container.h
index 5463ca2..a9444cd 100644
--- a/cc/base/list_container.h
+++ b/cc/base/list_container.h
@@ -288,6 +288,11 @@ class ListContainer : public ListContainerBase {
return new (*at) DerivedElementType();
}
+ template <typename DerivedElementType>
+ void swap(ListContainer<DerivedElementType>& other) {
+ data_.swap(other.data_);
+ }
+
// Appends a new item without copying. The original item will not be
// destructed and will be replaced with a new DerivedElementType. The
// DerivedElementType does not have to match the moved type as a full block
diff --git a/cc/base/list_container_unittest.cc b/cc/base/list_container_unittest.cc
index 2c56e85..536a55e 100644
--- a/cc/base/list_container_unittest.cc
+++ b/cc/base/list_container_unittest.cc
@@ -107,6 +107,14 @@ class SimpleDerivedElementConstructMagicNumberTwo
}
};
+class SimpleDerivedElementConstructMagicNumberThree
+ : public SimpleDerivedElement {
+ public:
+ SimpleDerivedElementConstructMagicNumberThree() {
+ set_value(kMagicNumberToUseForSimpleDerivedElementThree);
+ }
+};
+
class MockDerivedElement : public SimpleDerivedElementConstructMagicNumberOne {
public:
~MockDerivedElement() override { Destruct(); }
@@ -881,8 +889,7 @@ TEST(ListContainerTest, AppendByMovingReplacesSourceWithNewDerivedElement) {
// AppendByMoving replaces the source element with a new derived element so
// we do not expect sizes to shrink after AppendByMoving is called.
- EXPECT_EQ(2u,
- list_1.size()); // One direct allocation and one AppendByMoving.
+ EXPECT_EQ(2u, list_1.size()); // One direct allocation, one AppendByMoving.
EXPECT_EQ(1u, list_2.size()); // One AppendByMoving.
}
@@ -954,5 +961,40 @@ TEST(ListContainerTest, AppendByMovingLongAndSimpleDerivedElements) {
list.back()->get_value());
}
+TEST(ListContainerTest, Swap) {
+ ListContainer<SimpleDerivedElement> list_1(kCurrentLargestDerivedElementSize);
+ list_1.AllocateAndConstruct<SimpleDerivedElementConstructMagicNumberOne>();
+ ListContainer<SimpleDerivedElement> list_2(kCurrentLargestDerivedElementSize);
+ list_2.AllocateAndConstruct<SimpleDerivedElementConstructMagicNumberTwo>();
+ list_2.AllocateAndConstruct<SimpleDerivedElementConstructMagicNumberThree>();
+
+ SimpleDerivedElement* pre_swap_list_1_front = list_1.front();
+
+ EXPECT_EQ(kMagicNumberToUseForSimpleDerivedElementOne,
+ list_1.front()->get_value());
+ EXPECT_EQ(1u, list_1.size());
+
+ EXPECT_EQ(kMagicNumberToUseForSimpleDerivedElementTwo,
+ list_2.front()->get_value());
+ EXPECT_EQ(kMagicNumberToUseForSimpleDerivedElementThree,
+ list_2.back()->get_value());
+ EXPECT_EQ(2u, list_2.size());
+
+ list_2.swap(list_1);
+
+ EXPECT_EQ(kMagicNumberToUseForSimpleDerivedElementTwo,
+ list_1.front()->get_value());
+ EXPECT_EQ(kMagicNumberToUseForSimpleDerivedElementThree,
+ list_1.back()->get_value());
+ EXPECT_EQ(2u, list_1.size());
+
+ EXPECT_EQ(kMagicNumberToUseForSimpleDerivedElementOne,
+ list_2.front()->get_value());
+ EXPECT_EQ(1u, list_2.size());
+
+ // Ensure pointers are still valid after swapping.
+ EXPECT_EQ(pre_swap_list_1_front, list_2.front());
+}
+
} // namespace
} // namespace cc