Modified: trunk/Source/WTF/wtf/Vector.h (223121 => 223122)
--- trunk/Source/WTF/wtf/Vector.h 2017-10-10 04:28:18 UTC (rev 223121)
+++ trunk/Source/WTF/wtf/Vector.h 2017-10-10 04:44:51 UTC (rev 223122)
@@ -625,6 +625,20 @@
uncheckedAppend(element);
}
+ template<typename... Items>
+ static Vector from(Items&&... items)
+ {
+ Vector result;
+ auto size = sizeof...(items);
+
+ result.reserveInitialCapacity(size);
+ result.asanSetInitialBufferSizeTo(size);
+ result.m_size = size;
+
+ result.uncheckedInitialize<0>(std::forward<Items>(items)...);
+ return result;
+ }
+
~Vector()
{
if (m_size)
@@ -793,6 +807,20 @@
template<typename... Args> void constructAndAppendSlowCase(Args&&...);
template<typename... Args> bool tryConstructAndAppendSlowCase(Args&&...);
+ template<size_t position, typename U, typename... Items>
+ void uncheckedInitialize(U&& item, Items&&... items)
+ {
+ uncheckedInitialize<position>(std::forward<U>(item));
+ uncheckedInitialize<position + 1>(std::forward<Items>(items)...);
+ }
+ template<size_t position, typename U>
+ void uncheckedInitialize(U&& value)
+ {
+ ASSERT(position < size());
+ ASSERT(position < capacity());
+ new (NotNull, begin() + position) T(std::forward<U>(value));
+ }
+
void asanSetInitialBufferSizeTo(size_t);
void asanSetBufferSizeToFullCapacity(size_t);
void asanSetBufferSizeToFullCapacity() { asanSetBufferSizeToFullCapacity(size()); }
@@ -1327,8 +1355,7 @@
asanBufferSizeWillChangeTo(m_size + 1);
- auto ptr = std::addressof(value);
- new (NotNull, end()) T(std::forward<U>(*ptr));
+ new (NotNull, end()) T(std::forward<U>(value));
++m_size;
}
Modified: trunk/Tools/TestWebKitAPI/Tests/WTF/Vector.cpp (223121 => 223122)
--- trunk/Tools/TestWebKitAPI/Tests/WTF/Vector.cpp 2017-10-10 04:28:18 UTC (rev 223121)
+++ trunk/Tools/TestWebKitAPI/Tests/WTF/Vector.cpp 2017-10-10 04:44:51 UTC (rev 223122)
@@ -99,6 +99,51 @@
EXPECT_EQ(4, vector[3]);
}
+TEST(WTF_Vector, ConstructWithFrom)
+{
+ auto vector = Vector<int>::from(1, 2, 3, 4, 5);
+ EXPECT_EQ(5U, vector.size());
+ EXPECT_EQ(5U, vector.capacity());
+
+ EXPECT_EQ(1, vector[0]);
+ EXPECT_EQ(2, vector[1]);
+ EXPECT_EQ(3, vector[2]);
+ EXPECT_EQ(4, vector[3]);
+ EXPECT_EQ(5, vector[4]);
+}
+
+TEST(WTF_Vector, ConstructWithFromString)
+{
+ String s1 = "s1";
+ String s2 = "s2";
+ String s3 = s1;
+ auto vector = Vector<String>::from(s1, s2, WTFMove(s3));
+ EXPECT_EQ(3U, vector.size());
+ EXPECT_EQ(3U, vector.capacity());
+
+ EXPECT_TRUE(s1 == vector[0]);
+ EXPECT_TRUE(s2 == vector[1]);
+ EXPECT_TRUE(s1 == vector[2]);
+ EXPECT_TRUE(s3.isNull());
+}
+
+TEST(WTF_Vector, ConstructWithFromMoveOnly)
+{
+ auto vector1 = Vector<MoveOnly>::from(MoveOnly(1));
+ auto vector3 = Vector<MoveOnly>::from(MoveOnly(1), MoveOnly(2), MoveOnly(3));
+
+ EXPECT_EQ(1U, vector1.size());
+ EXPECT_EQ(1U, vector1.capacity());
+
+ EXPECT_EQ(3U, vector3.size());
+ EXPECT_EQ(3U, vector3.capacity());
+
+ EXPECT_EQ(1U, vector1[0].value());
+ EXPECT_EQ(1U, vector3[0].value());
+ EXPECT_EQ(2U, vector3[1].value());
+ EXPECT_EQ(3U, vector3[2].value());
+}
+
TEST(WTF_Vector, InitializeFromOtherInitialCapacity)
{
Vector<int, 3> vector = { 1, 3, 2, 4 };
@@ -350,16 +395,16 @@
EXPECT_EQ(1U, x.size());
EXPECT_EQ(42, x[0]);
-
+
Vector<Vector<int, 1>, 1> y;
y.append(x);
-
+
EXPECT_EQ(1U, x.size());
EXPECT_EQ(42, x[0]);
EXPECT_EQ(1U, y.size());
EXPECT_EQ(1U, y[0].size());
EXPECT_EQ(42, y[0][0]);
-
+
a.append(y);
EXPECT_EQ(1U, x.size());
@@ -371,7 +416,7 @@
EXPECT_EQ(1U, a[0].size());
EXPECT_EQ(1U, a[0][0].size());
EXPECT_EQ(42, a[0][0][0]);
-
+
a.swap(b);
EXPECT_EQ(0U, a.size());
@@ -384,7 +429,7 @@
EXPECT_EQ(1U, b[0].size());
EXPECT_EQ(1U, b[0][0].size());
EXPECT_EQ(42, b[0][0][0]);
-
+
b.swap(c);
EXPECT_EQ(0U, a.size());
@@ -398,7 +443,7 @@
EXPECT_EQ(1U, c[0].size());
EXPECT_EQ(1U, c[0][0].size());
EXPECT_EQ(42, c[0][0][0]);
-
+
y[0][0] = 24;
EXPECT_EQ(1U, x.size());
@@ -406,7 +451,7 @@
EXPECT_EQ(1U, y.size());
EXPECT_EQ(1U, y[0].size());
EXPECT_EQ(24, y[0][0]);
-
+
a.append(y);
EXPECT_EQ(1U, x.size());