Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1408)

Unified Diff: Source/wtf/Vector.h

Issue 390983010: Fix Deque.swap for deques with inline capacity Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Use more fullnesses in test to improve coverage Created 6 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: Source/wtf/Vector.h
diff --git a/Source/wtf/Vector.h b/Source/wtf/Vector.h
index 8833e499b2eb63cdb3173454dd103e161b32f962..bbaf5c48bc48c7a3c2c31ff1418be592e8fd3981 100644
--- a/Source/wtf/Vector.h
+++ b/Source/wtf/Vector.h
@@ -311,6 +311,8 @@ static const size_t kInitialVectorSize = WTF_VECTOR_INITIAL_SIZE;
}
protected:
+ static const size_t sizeFieldSize = sizeof(unsigned) * 2 > sizeof(double) ? sizeof(unsigned) * 2 : sizeof(double);
Mads Ager (chromium) 2014/07/18 11:03:14 I can't find any usages of this?
Erik Corry 2014/07/22 15:49:26 Removed.
+
VectorBufferBase()
: m_buffer(0)
, m_capacity(0)
@@ -323,9 +325,41 @@ static const size_t kInitialVectorSize = WTF_VECTOR_INITIAL_SIZE;
{
}
+ // Ends are exclusive and if they point at the same element as their
+ // start then the range is empty. The end can point one above the last
+ // element in the capacity (this only happens for Vector, not for
+ // Deque).
+ struct Range {
+ Range(unsigned s = 0, unsigned e = 0)
+ : start(s)
+ , end(e)
+ {
+ }
+
+ bool IsEmpty() { return start == end; }
+
+ unsigned start;
+ unsigned end;
+ };
+
+ // Takes a range, which may wrap around at capacity and
+ // decomposes it into 0, 1, or 2 ranges, returning a pointer to the
+ // element past the last one.
+ Range* findRanges(Range* buffer, const Range in, unsigned capacity)
+ {
+ if (in.end > in.start) {
+ *buffer++ = in;
+ } else if (in.end < in.start) {
+ if (in.end)
+ *buffer++ = Range(0, in.end);
+ ASSERT(in.start != capacity);
+ *buffer++ = Range(in.start, capacity);
+ }
+ return buffer;
+ }
+
T* m_buffer;
unsigned m_capacity;
- unsigned m_size;
};
template<typename T, size_t inlineCapacity, typename Allocator = DefaultAllocator>
@@ -335,6 +369,10 @@ static const size_t kInitialVectorSize = WTF_VECTOR_INITIAL_SIZE;
class VectorBuffer<T, 0, Allocator> : protected VectorBufferBase<T, Allocator> {
private:
typedef VectorBufferBase<T, Allocator> Base;
+
+ protected:
+ typedef typename Base::Range Range;
+
public:
VectorBuffer()
{
@@ -365,7 +403,7 @@ static const size_t kInitialVectorSize = WTF_VECTOR_INITIAL_SIZE;
m_capacity = 0;
}
- void swapVectorBuffer(VectorBuffer<T, 0, Allocator>& other)
+ void swapVectorBuffer(VectorBuffer<T, 0, Allocator>& other, Range, Range)
{
std::swap(m_buffer, other.m_buffer);
std::swap(m_capacity, other.m_capacity);
@@ -376,6 +414,7 @@ static const size_t kInitialVectorSize = WTF_VECTOR_INITIAL_SIZE;
using Base::buffer;
using Base::capacity;
+ using Base::findRanges;
using Base::clearUnusedSlots;
@@ -385,9 +424,6 @@ static const size_t kInitialVectorSize = WTF_VECTOR_INITIAL_SIZE;
return buffer();
}
- protected:
- using Base::m_size;
-
private:
using Base::m_buffer;
using Base::m_capacity;
@@ -398,6 +434,10 @@ static const size_t kInitialVectorSize = WTF_VECTOR_INITIAL_SIZE;
WTF_MAKE_NONCOPYABLE(VectorBuffer);
private:
typedef VectorBufferBase<T, Allocator> Base;
+
+ protected:
+ typedef typename Base::Range Range;
+
public:
VectorBuffer()
: Base(inlineBuffer(), inlineCapacity)
@@ -450,46 +490,93 @@ static const size_t kInitialVectorSize = WTF_VECTOR_INITIAL_SIZE;
return Base::allocationSize(capacity);
}
- void swapVectorBuffer(VectorBuffer<T, inlineCapacity, Allocator>& other)
+ void swapVectorBuffer(VectorBuffer<T, inlineCapacity, Allocator>& other, Range thisRange, Range otherRange)
Ken Russell (switch to Gerrit) 2014/07/21 20:44:09 What are the invariants of this method? What does
Erik Corry 2014/07/22 15:49:26 There's no problem with the ranges having a differ
{
typedef VectorTypeOperations<T> TypeOperations;
- if (buffer() == inlineBuffer() && other.buffer() == other.inlineBuffer()) {
- ASSERT(m_capacity == other.m_capacity);
- if (m_size > other.m_size) {
- TypeOperations::swap(inlineBuffer(), inlineBuffer() + other.m_size, other.inlineBuffer());
- TypeOperations::move(inlineBuffer() + other.m_size, inlineBuffer() + m_size, other.inlineBuffer() + other.m_size);
+ Range thisRanges[2];
+ Range otherRanges[2];
+ Range* thisRangePtr = thisRanges;
+ Range* otherRangePtr = otherRanges;
+
+ std::swap(m_capacity, other.m_capacity);
+ if (buffer() != inlineBuffer() && other.buffer() != other.inlineBuffer()) {
+ std::swap(m_buffer, other.m_buffer);
+ } else {
Ken Russell (switch to Gerrit) 2014/07/21 20:44:09 I can't in good faith review this method. It isn't
Erik Corry 2014/07/22 15:49:26 I managed to simplify this function quite a bit, w
+ T* otherBuffer = other.m_buffer;
+ if (buffer() == inlineBuffer()) {
+ thisRangePtr = findRanges(thisRanges, thisRange, inlineCapacity);
} else {
- TypeOperations::swap(inlineBuffer(), inlineBuffer() + m_size, other.inlineBuffer());
- TypeOperations::move(other.inlineBuffer() + m_size, other.inlineBuffer() + other.m_size, inlineBuffer() + m_size);
+ other.m_buffer = m_buffer;
+ m_buffer = inlineBuffer();
+ }
+ if (otherBuffer == other.inlineBuffer()) {
+ otherRangePtr = findRanges(otherRanges, otherRange, inlineCapacity);
+ } else {
+ m_buffer = otherBuffer;
+ other.m_buffer = other.inlineBuffer();
}
- } else if (buffer() == inlineBuffer()) {
- m_buffer = other.m_buffer;
- other.m_buffer = other.inlineBuffer();
- TypeOperations::move(inlineBuffer(), inlineBuffer() + m_size, other.inlineBuffer());
- std::swap(m_capacity, other.m_capacity);
- } else if (other.buffer() == other.inlineBuffer()) {
- other.m_buffer = m_buffer;
- m_buffer = inlineBuffer();
- TypeOperations::move(other.inlineBuffer(), other.inlineBuffer() + other.m_size, inlineBuffer());
- std::swap(m_capacity, other.m_capacity);
- } else {
- std::swap(m_buffer, other.m_buffer);
- std::swap(m_capacity, other.m_capacity);
+ }
+
+ while (thisRangePtr != thisRanges || otherRangePtr != otherRanges) {
+ if (thisRangePtr == thisRanges) {
+ // Ran out of ranges in this: process a range in the other.
+ Range otherRange = *--otherRangePtr;
+ TypeOperations::move(other.inlineBuffer() + otherRange.start, other.inlineBuffer() + otherRange.end, inlineBuffer() + otherRange.start);
+ continue;
+ }
+ if (otherRangePtr == otherRanges) {
+ // Ran out of ranges in the other: process a range in this.
+ Range thisRange = *--thisRangePtr;
+ TypeOperations::move(inlineBuffer() + thisRange.start, inlineBuffer() + thisRange.end, other.inlineBuffer() + thisRange.start);
+ continue;
+ }
+ // We have a rightmost range in both. Find out which extends furthest to the right.
+ Range otherRange = *--otherRangePtr;
+ Range thisRange = *--thisRangePtr;
+ if (otherRange.end == thisRange.end) {
+ // They end together: Find the start of the overlap.
+ unsigned startOfOverlap = std::max(thisRange.start, otherRange.start);
+ TypeOperations::swap(inlineBuffer() + startOfOverlap, inlineBuffer() + thisRange.end, other.inlineBuffer() + startOfOverlap);
+ if (otherRange.start == thisRange.start)
+ continue; // Common left edge - we are done with these entries.
+ if (otherRange.start < thisRange.start) {
+ // The other extends further to the left, make a new range.
+ *otherRangePtr++ = Range(otherRange.start, thisRange.start);
Ken Russell (switch to Gerrit) 2014/07/21 20:44:09 Where is the guarantee that the new range being pu
Erik Corry 2014/07/22 15:49:26 There's no restriction on the ranges pushed on the
+ continue;
+ }
+ // This extends further to the left, make a new range.
+ *thisRangePtr++ = Range(thisRange.start, otherRange.start);
+ continue;
+ }
+ if (otherRange.end > thisRange.end) {
+ // Other one hangs over the edge.
+ unsigned startOfOverhang = std::max(otherRange.start, thisRange.end);
+ TypeOperations::move(other.inlineBuffer() + startOfOverhang, other.inlineBuffer() + otherRange.end, inlineBuffer() + startOfOverhang);
+ if (otherRange.start != startOfOverhang)
+ *otherRangePtr++ = Range(otherRange.start, startOfOverhang);
+ *thisRangePtr++ = thisRange;
+ continue;
+ }
+ ASSERT(thisRange.end > otherRange.end);
+ // This one hangs over the edge.
+ unsigned startOfOverhang = std::max(thisRange.start, otherRange.end);
+ TypeOperations::move(inlineBuffer() + startOfOverhang, inlineBuffer() + thisRange.end, other.inlineBuffer() + startOfOverhang);
+ if (thisRange.start != startOfOverhang)
+ *thisRangePtr++ = Range(thisRange.start, startOfOverhang);
+ *otherRangePtr++ = otherRange;
}
}
using Base::buffer;
using Base::capacity;
+ using Base::findRanges;
bool hasOutOfLineBuffer() const
{
return buffer() && buffer() != inlineBuffer();
}
- protected:
- using Base::m_size;
-
private:
using Base::m_buffer;
using Base::m_capacity;
@@ -550,6 +637,7 @@ static const size_t kInitialVectorSize = WTF_VECTOR_INITIAL_SIZE;
private:
typedef VectorBuffer<T, inlineCapacity, Allocator> Base;
typedef VectorTypeOperations<T> TypeOperations;
+ typedef typename Base::Range Range;
public:
typedef T ValueType;
@@ -560,6 +648,7 @@ static const size_t kInitialVectorSize = WTF_VECTOR_INITIAL_SIZE;
typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
Vector()
+ : m_size(0)
{
// Unused slots are initialized to zero so that the visitor and the
// finalizer can visit them safely. canInitializeWithMemset tells us
@@ -567,18 +656,17 @@ static const size_t kInitialVectorSize = WTF_VECTOR_INITIAL_SIZE;
// destructor calls as long as the memory is zeroed.
COMPILE_ASSERT(!Allocator::isGarbageCollected || !VectorTraits<T>::needsDestruction || VectorTraits<T>::canInitializeWithMemset, ClassHasProblemsWithFinalizersCalledOnClearedMemory);
COMPILE_ASSERT(!WTF::IsPolymorphic<T>::value || !VectorTraits<T>::canInitializeWithMemset, CantInitializeWithMemsetIfThereIsAVtable);
- m_size = 0;
}
explicit Vector(size_t size)
: Base(size)
{
+ setSize(size);
// Unused slots are initialized to zero so that the visitor and the
// finalizer can visit them safely. canInitializeWithMemset tells us
// that the class does not expect matching constructor and
// destructor calls as long as the memory is zeroed.
COMPILE_ASSERT(!Allocator::isGarbageCollected || !VectorTraits<T>::needsDestruction || VectorTraits<T>::canInitializeWithMemset, ClassHasProblemsWithFinalizersCalledOnClearedMemory);
- m_size = size;
TypeOperations::initialize(begin(), end());
}
@@ -592,9 +680,9 @@ static const size_t kInitialVectorSize = WTF_VECTOR_INITIAL_SIZE;
if (LIKELY(!Base::buffer()))
return;
}
- if (LIKELY(m_size) && !(Allocator::isGarbageCollected && this->hasOutOfLineBuffer())) {
+ if (LIKELY(size()) && !(Allocator::isGarbageCollected && this->hasOutOfLineBuffer())) {
TypeOperations::destruct(begin(), end());
- m_size = 0; // Partial protection against use-after-free.
+ setSize(0); // Partial protection against use-after-free.
}
Base::destruct();
@@ -606,19 +694,18 @@ static const size_t kInitialVectorSize = WTF_VECTOR_INITIAL_SIZE;
}
Vector(const Vector&);
- template<size_t otherCapacity>
- explicit Vector(const Vector<T, otherCapacity, Allocator>&);
+ template<size_t otherInlineCapacity>
+ explicit Vector(const Vector<T, otherInlineCapacity, Allocator>&);
Vector& operator=(const Vector&);
- template<size_t otherCapacity>
- Vector& operator=(const Vector<T, otherCapacity, Allocator>&);
+ template<size_t otherInlineCapacity>
+ Vector& operator=(const Vector<T, otherInlineCapacity, Allocator>&);
#if COMPILER_SUPPORTS(CXX_RVALUE_REFERENCES)
Vector(Vector&&);
Vector& operator=(Vector&&);
#endif
- size_t size() const { return m_size; }
size_t capacity() const { return Base::capacity(); }
bool isEmpty() const { return !size(); }
@@ -640,9 +727,9 @@ static const size_t kInitialVectorSize = WTF_VECTOR_INITIAL_SIZE;
const T* data() const { return Base::buffer(); }
iterator begin() { return data(); }
- iterator end() { return begin() + m_size; }
+ iterator end() { return begin() + size(); }
const_iterator begin() const { return data(); }
- const_iterator end() const { return begin() + m_size; }
+ const_iterator end() const { return begin() + size(); }
reverse_iterator rbegin() { return reverse_iterator(end()); }
reverse_iterator rend() { return reverse_iterator(begin()); }
@@ -675,7 +762,7 @@ static const size_t kInitialVectorSize = WTF_VECTOR_INITIAL_SIZE;
template<typename U> void append(const U*, size_t);
template<typename U> void append(const U&);
template<typename U> void uncheckedAppend(const U& val);
- template<typename U, size_t otherCapacity, typename V> void appendVector(const Vector<U, otherCapacity, V>&);
+ template<typename U, size_t otherInlineCapacity, typename V> void appendVector(const Vector<U, otherInlineCapacity, V>&);
template<typename U> void insert(size_t position, const U*, size_t);
template<typename U> void insert(size_t position, const U&);
@@ -697,7 +784,7 @@ static const size_t kInitialVectorSize = WTF_VECTOR_INITIAL_SIZE;
Vector(size_t size, const T& val)
: Base(size)
{
- m_size = size;
+ setSize(size);
TypeOperations::uninitializedFill(begin(), end(), val);
}
@@ -706,16 +793,13 @@ static const size_t kInitialVectorSize = WTF_VECTOR_INITIAL_SIZE;
template<typename Iterator> void appendRange(Iterator start, Iterator end);
- void swap(Vector& other)
- {
- Base::swapVectorBuffer(other);
- std::swap(m_size, other.m_size);
- }
+ void swap(Vector& other);
void reverse();
void trace(typename Allocator::Visitor*);
+ size_t size() const { return m_size; }
private:
void expandCapacity(size_t newMinCapacity);
const T* expandCapacity(size_t newMinCapacity, const T*);
@@ -723,29 +807,44 @@ static const size_t kInitialVectorSize = WTF_VECTOR_INITIAL_SIZE;
void shrinkCapacity(size_t newCapacity);
template<typename U> void appendSlowCase(const U&);
- using Base::m_size;
+ void setSize(unsigned size)
+ {
+ m_size = size;
+ }
+
+ unsigned m_size;
+
using Base::buffer;
using Base::capacity;
- using Base::swapVectorBuffer;
using Base::allocateBuffer;
using Base::allocationSize;
using Base::clearUnusedSlots;
+ using Base::hasOutOfLineBuffer;
+
+ friend class VectorBuffer<T, inlineCapacity, Allocator>;
Mads Ager (chromium) 2014/07/18 11:03:14 Do you need this friend declaration?
Erik Corry 2014/07/22 15:49:26 Removed.
};
template<typename T, size_t inlineCapacity, typename Allocator>
+ void Vector<T, inlineCapacity, Allocator>::swap(Vector<T, inlineCapacity, Allocator>& other)
+ {
+ Base::swapVectorBuffer(other, Range(0, m_size), Range(0, other.m_size));
+ std::swap(m_size, other.m_size);
+ }
+
+ template<typename T, size_t inlineCapacity, typename Allocator>
Vector<T, inlineCapacity, Allocator>::Vector(const Vector& other)
: Base(other.capacity())
{
- m_size = other.size();
+ setSize(other.size());
TypeOperations::uninitializedCopy(other.begin(), other.end(), begin());
}
template<typename T, size_t inlineCapacity, typename Allocator>
- template<size_t otherCapacity>
- Vector<T, inlineCapacity, Allocator>::Vector(const Vector<T, otherCapacity, Allocator>& other)
+ template<size_t otherInlineCapacity>
+ Vector<T, inlineCapacity, Allocator>::Vector(const Vector<T, otherInlineCapacity, Allocator>& other)
: Base(other.capacity())
{
- m_size = other.size();
+ setSize(other.size());
TypeOperations::uninitializedCopy(other.begin(), other.end(), begin());
}
@@ -771,7 +870,7 @@ static const size_t kInitialVectorSize = WTF_VECTOR_INITIAL_SIZE;
std::copy(other.begin(), other.begin() + size(), begin());
TypeOperations::uninitializedCopy(other.begin() + size(), other.end(), end());
- m_size = other.size();
+ setSize(other.size());
return *this;
}
@@ -779,8 +878,8 @@ static const size_t kInitialVectorSize = WTF_VECTOR_INITIAL_SIZE;
inline bool typelessPointersAreEqual(const void* a, const void* b) { return a == b; }
template<typename T, size_t inlineCapacity, typename Allocator>
- template<size_t otherCapacity>
- Vector<T, inlineCapacity, Allocator>& Vector<T, inlineCapacity, Allocator>::operator=(const Vector<T, otherCapacity, Allocator>& other)
+ template<size_t otherInlineCapacity>
+ Vector<T, inlineCapacity, Allocator>& Vector<T, inlineCapacity, Allocator>::operator=(const Vector<T, otherInlineCapacity, Allocator>& other)
{
// If the inline capacities match, we should call the more specific
// template. If the inline capacities don't match, the two objects
@@ -803,7 +902,7 @@ static const size_t kInitialVectorSize = WTF_VECTOR_INITIAL_SIZE;
std::copy(other.begin(), other.begin() + size(), begin());
TypeOperations::uninitializedCopy(other.begin() + size(), other.end(), end());
- m_size = other.size();
+ setSize(other.size());
return *this;
}
@@ -812,7 +911,7 @@ static const size_t kInitialVectorSize = WTF_VECTOR_INITIAL_SIZE;
template<typename T, size_t inlineCapacity, typename Allocator>
Vector<T, inlineCapacity, Allocator>::Vector(Vector<T, inlineCapacity, Allocator>&& other)
{
- m_size = 0;
+ setSize(0);
// It's a little weird to implement a move constructor using swap but this way we
// don't have to add a move constructor to VectorBuffer.
swap(other);
@@ -873,7 +972,7 @@ static const size_t kInitialVectorSize = WTF_VECTOR_INITIAL_SIZE;
std::fill(begin(), end(), val);
TypeOperations::uninitializedFill(end(), begin() + newSize, val);
- m_size = newSize;
+ setSize(newSize);
}
template<typename T, size_t inlineCapacity, typename Allocator>
@@ -926,36 +1025,36 @@ static const size_t kInitialVectorSize = WTF_VECTOR_INITIAL_SIZE;
}
template<typename T, size_t inlineCapacity, typename Allocator>
- inline void Vector<T, inlineCapacity, Allocator>::resize(size_t size)
+ inline void Vector<T, inlineCapacity, Allocator>::resize(size_t sizeArg)
{
- if (size <= m_size)
- TypeOperations::destruct(begin() + size, end());
+ if (sizeArg <= size())
+ TypeOperations::destruct(begin() + sizeArg, end());
else {
- if (size > capacity())
- expandCapacity(size);
- TypeOperations::initialize(end(), begin() + size);
+ if (sizeArg > capacity())
+ expandCapacity(sizeArg);
+ TypeOperations::initialize(end(), begin() + sizeArg);
}
- m_size = size;
+ setSize(sizeArg);
}
template<typename T, size_t inlineCapacity, typename Allocator>
- void Vector<T, inlineCapacity, Allocator>::shrink(size_t size)
+ void Vector<T, inlineCapacity, Allocator>::shrink(size_t sizeArg)
{
- ASSERT(size <= m_size);
- TypeOperations::destruct(begin() + size, end());
- clearUnusedSlots(begin() + size, end());
- m_size = size;
+ ASSERT(sizeArg <= size());
+ TypeOperations::destruct(begin() + sizeArg, end());
+ clearUnusedSlots(begin() + sizeArg, end());
+ setSize(sizeArg);
}
template<typename T, size_t inlineCapacity, typename Allocator>
- void Vector<T, inlineCapacity, Allocator>::grow(size_t size)
+ void Vector<T, inlineCapacity, Allocator>::grow(size_t sizeArg)
{
- ASSERT(size >= m_size);
- if (size > capacity())
- expandCapacity(size);
- TypeOperations::initialize(end(), begin() + size);
- m_size = size;
+ ASSERT(sizeArg >= size());
+ if (sizeArg > capacity())
+ expandCapacity(sizeArg);
+ TypeOperations::initialize(end(), begin() + sizeArg);
+ setSize(sizeArg);
}
template<typename T, size_t inlineCapacity, typename Allocator>
@@ -973,7 +1072,7 @@ static const size_t kInitialVectorSize = WTF_VECTOR_INITIAL_SIZE;
template<typename T, size_t inlineCapacity, typename Allocator>
inline void Vector<T, inlineCapacity, Allocator>::reserveInitialCapacity(size_t initialCapacity)
{
- ASSERT(!m_size);
+ ASSERT(!size());
ASSERT(capacity() == inlineCapacity);
if (initialCapacity > inlineCapacity)
Base::allocateBuffer(initialCapacity);
@@ -1012,15 +1111,15 @@ static const size_t kInitialVectorSize = WTF_VECTOR_INITIAL_SIZE;
template<typename T, size_t inlineCapacity, typename Allocator> template<typename U>
void Vector<T, inlineCapacity, Allocator>::append(const U* data, size_t dataSize)
{
- size_t newSize = m_size + dataSize;
+ size_t newSize = size() + dataSize;
if (newSize > capacity()) {
data = expandCapacity(newSize, data);
ASSERT(begin());
}
- RELEASE_ASSERT(newSize >= m_size);
+ RELEASE_ASSERT(newSize >= size());
T* dest = end();
VectorCopier<VectorTraits<T>::canCopyWithMemcpy, T>::uninitializedCopy(data, &data[dataSize], dest);
- m_size = newSize;
+ setSize(newSize);
}
template<typename T, size_t inlineCapacity, typename Allocator> template<typename U>
@@ -1028,7 +1127,7 @@ static const size_t kInitialVectorSize = WTF_VECTOR_INITIAL_SIZE;
{
if (LIKELY(size() != capacity())) {
new (NotNull, end()) T(val);
- ++m_size;
+ setSize(size() + 1);
return;
}
@@ -1045,7 +1144,7 @@ static const size_t kInitialVectorSize = WTF_VECTOR_INITIAL_SIZE;
ASSERT(begin());
new (NotNull, end()) T(*ptr);
- ++m_size;
+ setSize(size() + 1);
}
// This version of append saves a branch in the case where you know that the
@@ -1057,11 +1156,11 @@ static const size_t kInitialVectorSize = WTF_VECTOR_INITIAL_SIZE;
ASSERT(size() < capacity());
const U* ptr = &val;
new (NotNull, end()) T(*ptr);
- ++m_size;
+ setSize(size() + 1);
}
- template<typename T, size_t inlineCapacity, typename Allocator> template<typename U, size_t otherCapacity, typename OtherAllocator>
- inline void Vector<T, inlineCapacity, Allocator>::appendVector(const Vector<U, otherCapacity, OtherAllocator>& val)
+ template<typename T, size_t inlineCapacity, typename Allocator> template<typename U, size_t otherInlineCapacity, typename OtherAllocator>
+ inline void Vector<T, inlineCapacity, Allocator>::appendVector(const Vector<U, otherInlineCapacity, OtherAllocator>& val)
{
append(val.begin(), val.size());
}
@@ -1070,16 +1169,16 @@ static const size_t kInitialVectorSize = WTF_VECTOR_INITIAL_SIZE;
void Vector<T, inlineCapacity, Allocator>::insert(size_t position, const U* data, size_t dataSize)
{
RELEASE_ASSERT(position <= size());
- size_t newSize = m_size + dataSize;
+ size_t newSize = size() + dataSize;
if (newSize > capacity()) {
data = expandCapacity(newSize, data);
ASSERT(begin());
}
- RELEASE_ASSERT(newSize >= m_size);
+ RELEASE_ASSERT(newSize >= size());
T* spot = begin() + position;
TypeOperations::moveOverlapping(spot, end(), spot + dataSize);
VectorCopier<VectorTraits<T>::canCopyWithMemcpy, T>::uninitializedCopy(data, &data[dataSize], spot);
- m_size = newSize;
+ setSize(newSize);
}
template<typename T, size_t inlineCapacity, typename Allocator> template<typename U>
@@ -1094,7 +1193,7 @@ static const size_t kInitialVectorSize = WTF_VECTOR_INITIAL_SIZE;
T* spot = begin() + position;
TypeOperations::moveOverlapping(spot, end(), spot + 1);
new (NotNull, spot) T(*data);
- ++m_size;
+ setSize(size() + 1);
}
template<typename T, size_t inlineCapacity, typename Allocator> template<typename U, size_t c, typename OtherAllocator>
@@ -1129,7 +1228,7 @@ static const size_t kInitialVectorSize = WTF_VECTOR_INITIAL_SIZE;
spot->~T();
TypeOperations::moveOverlapping(spot + 1, end(), spot);
clearUnusedSlots(end() - 1, end());
- --m_size;
+ setSize(size() - 1);
}
template<typename T, size_t inlineCapacity, typename Allocator>
@@ -1142,14 +1241,14 @@ static const size_t kInitialVectorSize = WTF_VECTOR_INITIAL_SIZE;
TypeOperations::destruct(beginSpot, endSpot);
TypeOperations::moveOverlapping(endSpot, end(), beginSpot);
clearUnusedSlots(end() - length, end());
- m_size -= length;
+ setSize(size() - length);
}
template<typename T, size_t inlineCapacity, typename Allocator>
inline void Vector<T, inlineCapacity, Allocator>::reverse()
{
- for (size_t i = 0; i < m_size / 2; ++i)
- std::swap(at(i), at(m_size - 1 - i));
+ for (size_t i = 0; i < size() / 2; ++i)
+ std::swap(at(i), at(size() - 1 - i));
}
template<typename T, size_t inlineCapacity, typename Allocator>

Powered by Google App Engine
This is Rietveld 408576698