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 @@
#include "platform/wtf/StdLibExtras.h"
#include "platform/wtf/Vector.h"
#include "public/platform/WebString.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace blink {
......@@ -124,4 +125,30 @@ TEST(WebVectorTest, CreateFromStdVector) {
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
......@@ -42,23 +42,30 @@ namespace blink {
//
// Sample usage:
//
// void Foo(WebVector<int>& result)
// {
// WebVector<int> data(10);
// for (size_t i = 0; i < data.size(); ++i)
// data[i] = ...
// result.swap(data);
// void Foo(WebVector<int>& result) {
// WebVector<int> data(10);
// for (size_t i = 0; i < data.size(); ++i)
// data[i] = ...
// 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()
// and end().
//
// void Foo(const std::vector<WTF::String>& input)
// {
// WebVector<WebString> strings = input;
// ...
// void Foo(const std::vector<WTF::String>& input) {
// WebVector<WebString> strings = input;
// ...
// }
//
template <typename T>
class WebVector {
public:
......@@ -68,6 +75,7 @@ class WebVector {
~WebVector() = default;
// Create a vector with |size| default-constructed elements.
explicit WebVector(size_t size = 0) : data_(size) {}
template <typename U>
......@@ -123,6 +131,9 @@ class WebVector {
// TODO(slangley): Remove all uses of IsEmpty.
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) {
DCHECK_LT(i, data_.size());
return data_[i];
......@@ -141,6 +152,12 @@ class WebVector {
const_iterator begin() const { return data_.begin(); }
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_); }
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