Commit 561375a0 authored by Kei Nakashima's avatar Kei Nakashima Committed by Commit Bot

Added new class LinkedListInVector

LinkedListInVector maintains a linked list in a vector.
It uses prev/next indices instead of pointers.
Implemented iterators and insert functions.

Change-Id: I7e15734b5c209618c4760efe65b7e68f1f827b62
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2089543Reviewed-by: default avatarKentaro Hara <haraken@chromium.org>
Reviewed-by: default avatarYuki Shiino <yukishiino@chromium.org>
Commit-Queue: Kei Nakashima <keinakashima@google.com>
Cr-Commit-Position: refs/heads/master@{#748125}
parent 44c20432
......@@ -175,6 +175,7 @@ jumbo_component("wtf") {
"uuid.cc",
"uuid.h",
"vector.h",
"vector_backed_linked_list.h",
"vector_traits.h",
"wtf.cc",
"wtf.h",
......@@ -296,6 +297,7 @@ jumbo_source_set("wtf_unittests_sources") {
"tree_node_test.cc",
"type_traits_test.cc",
"uuid_test.cc",
"vector_backed_linked_list_test.cc",
"vector_test.cc",
]
......
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "third_party/blink/renderer/platform/wtf/vector_backed_linked_list.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace WTF {
TEST(VectorBackedLinkedListTest, Insert) {
using List = VectorBackedLinkedList<int>;
List list;
EXPECT_TRUE(list.empty());
EXPECT_TRUE(list.begin() == list.end());
list.insert(list.end(), 1);
list.insert(list.begin(), -2);
list.insert(list.end(), 2);
List::iterator it = list.begin();
++it;
list.insert(it, -1);
list.insert(it, 0);
EXPECT_EQ(list.front(), -2);
EXPECT_EQ(list.back(), 2);
EXPECT_EQ(list.size(), 5u);
int i = -2;
for (auto element : list) {
EXPECT_EQ(element, i);
i++;
}
}
TEST(VectorBackedLinkedList, PushFront) {
using List = VectorBackedLinkedList<int>;
List list;
EXPECT_TRUE(list.empty());
list.push_front(3);
EXPECT_EQ(list.front(), 3);
list.push_front(2);
EXPECT_EQ(list.front(), 2);
list.push_front(1);
EXPECT_EQ(list.front(), 1);
int i = 1;
for (auto element : list) {
EXPECT_EQ(element, i);
i++;
}
}
TEST(VectorBackedLinkedList, PushBack) {
using List = VectorBackedLinkedList<int>;
List list;
EXPECT_TRUE(list.empty());
list.push_back(1);
EXPECT_EQ(list.back(), 1);
list.push_back(2);
EXPECT_EQ(list.back(), 2);
list.push_back(3);
EXPECT_EQ(list.back(), 3);
int i = 1;
for (auto element : list) {
EXPECT_EQ(element, i);
i++;
}
}
TEST(VectorBackedLinkedList, Iterator) {
using List = VectorBackedLinkedList<int>;
List list;
list.push_back(1);
list.push_back(2);
list.push_back(3);
List::iterator it = list.begin();
EXPECT_EQ(*it, 1);
++it;
EXPECT_EQ(*it, 2);
++it;
EXPECT_EQ(*it, 3);
*it = 4; // list: {1, 2, 4}
EXPECT_EQ(list.back(), 4);
++it;
EXPECT_TRUE(it == list.end());
--it;
--it;
--it;
EXPECT_TRUE(it == list.begin());
EXPECT_EQ(list.front(), 1);
*it = 0;
EXPECT_EQ(list.front(), 0); // list: {0, 2, 4}
List::reverse_iterator rit = list.rbegin();
EXPECT_EQ(*rit, 4);
++rit;
EXPECT_EQ(*rit, 2);
++rit;
EXPECT_EQ(*rit, 0);
EXPECT_FALSE(rit == list.rend());
*rit = 1; // list: {1, 2, 4}
EXPECT_EQ(list.front(), 1);
++rit;
EXPECT_TRUE(rit == list.rend());
--rit;
EXPECT_EQ(*rit, 1);
}
TEST(VectorBackedLinkedList, ConstIterator) {
using List = VectorBackedLinkedList<int>;
List list;
list.push_back(1);
list.push_back(2);
list.push_back(3);
List::const_iterator cit = list.cbegin();
EXPECT_EQ(*cit, 1);
++cit;
EXPECT_EQ(*cit, 2);
++cit;
EXPECT_EQ(*cit, 3);
++cit;
EXPECT_TRUE(cit == list.cend());
--cit;
--cit;
--cit;
EXPECT_TRUE(cit == list.cbegin());
EXPECT_EQ(list.front(), 1);
List::const_reverse_iterator crit = list.crbegin();
EXPECT_EQ(*crit, 3);
++crit;
EXPECT_EQ(*crit, 2);
++crit;
EXPECT_EQ(*crit, 1);
++crit;
EXPECT_TRUE(crit == list.crend());
--crit;
EXPECT_EQ(*crit, 1);
}
} // namespace WTF
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment