forked from OSchip/llvm-project
SmallVector's growth policies don't like starting from zero capacity.
I think there are good reasons to change this, but in the interests of short-term stability, make SmallVector<...,0> reserve non-zero capacity in its constructors. This means that SmallVector<...,0> uses more memory than SmallVector<...,1> and should really only be used (unless/until this workaround is removed) by clients that care about using SmallVector with an incomplete type. llvm-svn: 112147
This commit is contained in:
parent
2a9898f0a2
commit
c13b797e23
|
@ -712,25 +712,33 @@ public:
|
|||
/// members are required.
|
||||
template <typename T>
|
||||
class SmallVector<T,0> : public SmallVectorImpl<T> {
|
||||
// SmallVector doesn't like growing from zero capacity. As a
|
||||
// temporary workaround, avoid changing the growth algorithm by
|
||||
// forcing capacity to be at least 1 in the constructors.
|
||||
|
||||
public:
|
||||
SmallVector() : SmallVectorImpl<T>(0) {
|
||||
this->reserve(1); // workaround
|
||||
}
|
||||
|
||||
explicit SmallVector(unsigned Size, const T &Value = T())
|
||||
: SmallVectorImpl<T>(0) {
|
||||
this->reserve(Size);
|
||||
this->reserve(Size ? Size : 1); // workaround
|
||||
while (Size--)
|
||||
this->push_back(Value);
|
||||
}
|
||||
|
||||
template<typename ItTy>
|
||||
SmallVector(ItTy S, ItTy E) : SmallVectorImpl<T>(0) {
|
||||
if (S == E) this->reserve(1); // workaround
|
||||
this->append(S, E);
|
||||
}
|
||||
|
||||
SmallVector(const SmallVector &RHS) : SmallVectorImpl<T>(0) {
|
||||
if (!RHS.empty())
|
||||
SmallVectorImpl<T>::operator=(RHS);
|
||||
else
|
||||
this->reserve(1); // workaround
|
||||
}
|
||||
|
||||
const SmallVector &operator=(const SmallVector &RHS) {
|
||||
|
|
Loading…
Reference in New Issue