Commit 2294ef78 authored by Victor Costan's avatar Victor Costan Committed by Commit Bot

Blink: In-place element construction support for WebVector.

Bug: 798868
Change-Id: Ifca3a9be15fdc396f60b205c830be4cae0541821
Reviewed-on: https://chromium-review.googlesource.com/849474Reviewed-by: default avatarDaniel Cheng <dcheng@chromium.org>
Reviewed-by: default avatarKentaro Hara <haraken@chromium.org>
Commit-Queue: Victor Costan <pwnall@chromium.org>
Cr-Commit-Position: refs/heads/master@{#526924}
parent 41b464fd
...@@ -6,6 +6,7 @@ ...@@ -6,6 +6,7 @@
#include "platform/wtf/StdLibExtras.h" #include "platform/wtf/StdLibExtras.h"
#include "platform/wtf/Vector.h" #include "platform/wtf/Vector.h"
#include "public/platform/WebString.h"
#include "testing/gtest/include/gtest/gtest.h" #include "testing/gtest/include/gtest/gtest.h"
namespace blink { namespace blink {
...@@ -124,4 +125,30 @@ TEST(WebVectorTest, CreateFromStdVector) { ...@@ -124,4 +125,30 @@ TEST(WebVectorTest, CreateFromStdVector) {
EXPECT_EQ(input[i], assigned[i]); EXPECT_EQ(input[i], assigned[i]);
} }
TEST(WebVectorTest, Reserve) {
WebVector<int> vector;
vector.reserve(10);
EXPECT_EQ(10U, vector.capacity());
}
TEST(WebVectorTest, EmplaceBackArgumentForwarding) {
WebVector<WebString> vector;
vector.reserve(1);
WebUChar buffer[] = {'H', 'e', 'l', 'l', 'o', ' ', 'b', 'l', 'i', 'n', 'k'};
vector.emplace_back(buffer, WTF_ARRAY_LENGTH(buffer));
ASSERT_EQ(1U, vector.size());
EXPECT_EQ(WebString(buffer, WTF_ARRAY_LENGTH(buffer)), vector[0]);
}
TEST(WebVectorTest, EmplaceBackElementPlacement) {
WebVector<int> vector;
vector.reserve(10);
for (int i = 0; i < 10; ++i)
vector.emplace_back(i);
ASSERT_EQ(10U, vector.size());
for (int i = 0; i < 10; ++i)
EXPECT_EQ(i, vector[i]);
}
} // namespace blink } // namespace blink
...@@ -42,23 +42,30 @@ namespace blink { ...@@ -42,23 +42,30 @@ namespace blink {
// //
// Sample usage: // Sample usage:
// //
// void Foo(WebVector<int>& result) // void Foo(WebVector<int>& result) {
// { // WebVector<int> data(10);
// WebVector<int> data(10); // for (size_t i = 0; i < data.size(); ++i)
// for (size_t i = 0; i < data.size(); ++i) // data[i] = ...
// data[i] = ... // result.Swap(data);
// result.swap(data); // }
//
// In-place element construction:
//
// WebVector<WebString> Foo() {
// WebVector<WebString> data;
// data.reserve(10);
// WebUChar* buffer = ....;
// data.emplace_back(buffer, buffer_size);
// return data;
// } // }
// //
// It is also possible to assign from any container that implements begin() // It is also possible to assign from any container that implements begin()
// and end(). // and end().
// //
// void Foo(const std::vector<WTF::String>& input) // void Foo(const std::vector<WTF::String>& input) {
// { // WebVector<WebString> strings = input;
// WebVector<WebString> strings = input; // ...
// ...
// } // }
//
template <typename T> template <typename T>
class WebVector { class WebVector {
public: public:
...@@ -68,6 +75,7 @@ class WebVector { ...@@ -68,6 +75,7 @@ class WebVector {
~WebVector() = default; ~WebVector() = default;
// Create a vector with |size| default-constructed elements.
explicit WebVector(size_t size = 0) : data_(size) {} explicit WebVector(size_t size = 0) : data_(size) {}
template <typename U> template <typename U>
...@@ -123,6 +131,9 @@ class WebVector { ...@@ -123,6 +131,9 @@ class WebVector {
// TODO(slangley): Remove all uses of IsEmpty. // TODO(slangley): Remove all uses of IsEmpty.
bool IsEmpty() const { return empty(); } bool IsEmpty() const { return empty(); }
size_t capacity() const { return data_.capacity(); }
void reserve(size_t new_capacity) { data_.reserve(new_capacity); }
T& operator[](size_t i) { T& operator[](size_t i) {
DCHECK_LT(i, data_.size()); DCHECK_LT(i, data_.size());
return data_[i]; return data_[i];
...@@ -141,6 +152,12 @@ class WebVector { ...@@ -141,6 +152,12 @@ class WebVector {
const_iterator begin() const { return data_.begin(); } const_iterator begin() const { return data_.begin(); }
const_iterator end() const { return data_.end(); } const_iterator end() const { return data_.end(); }
template <typename... Args>
void emplace_back(Args&&... args) {
DCHECK_LT(data_.size(), data_.capacity());
data_.emplace_back(std::forward<Args>(args)...);
}
void Swap(WebVector<T>& other) { data_.swap(other.data_); } void Swap(WebVector<T>& other) { data_.swap(other.data_); }
private: private:
......
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