diff options
author | pdr <pdr@chromium.org> | 2015-06-24 12:40:14 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-06-24 19:40:49 +0000 |
commit | d012546071380244dcadedbd4dc1eccaab004d00 (patch) | |
tree | 7b6d0d82907e7c4fb1d18aea8cb5cc8ccff95459 /cc/base | |
parent | 34d4a6c9a85d7b9e9442e5e29c1d68cf34ebab20 (diff) | |
download | chromium_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.h | 5 | ||||
-rw-r--r-- | cc/base/list_container_unittest.cc | 46 |
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 |