1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-31 05:08:13 +00:00

AK: Delete Vector::resize() from Nonnull{Own,Ref}PtrVector.

It's not possible to grow one of these vectors beyond what's already in them
since it's not possible to default-construct Nonnull{Own,Ref}Ptr.

Add Vector::shrink() which can be used when you want to shrink the Vector
and delete resize() from the specialized Vectors.
This commit is contained in:
Andreas Kling 2019-07-24 09:33:26 +02:00
parent 394168c0ca
commit 1686c4906b
3 changed files with 27 additions and 9 deletions

View file

@ -41,6 +41,12 @@ public:
const T& first() const { return at(0); } const T& first() const { return at(0); }
T& last() { return at(size() - 1); } T& last() { return at(size() - 1); }
const T& last() const { return at(size() - 1); } const T& last() const { return at(size() - 1); }
private:
// NOTE: You can't use resize() on a NonnullOwnPtrVector since making the vector
// bigger would require being able to default-construct NonnullOwnPtrs.
// Instead, use shrink(new_size).
void resize(int) = delete;
}; };
} }

View file

@ -41,6 +41,12 @@ public:
const T& first() const { return at(0); } const T& first() const { return at(0); }
T& last() { return at(size() - 1); } T& last() { return at(size() - 1); }
const T& last() const { return at(size() - 1); } const T& last() const { return at(size() - 1); }
private:
// NOTE: You can't use resize() on a NonnullRefPtrVector since making the vector
// bigger would require being able to default-construct NonnullRefPtrs.
// Instead, use shrink(new_size).
void resize(int) = delete;
}; };
} }

View file

@ -407,8 +407,9 @@ public:
m_capacity = new_capacity; m_capacity = new_capacity;
} }
void resize(int new_size) void shrink(int new_size)
{ {
ASSERT(new_size <= size());
if (new_size == size()) if (new_size == size())
return; return;
@ -417,14 +418,19 @@ public:
return; return;
} }
if (new_size > size()) { for (int i = new_size; i < size(); ++i)
ensure_capacity(new_size); at(i).~T();
for (int i = size(); i < new_size; ++i) m_size = new_size;
new (slot(i)) T; }
} else {
for (int i = new_size; i < size(); ++i) void resize(int new_size)
at(i).~T(); {
} if (new_size <= size())
return shrink(new_size);
ensure_capacity(new_size);
for (int i = size(); i < new_size; ++i)
new (slot(i)) T;
m_size = new_size; m_size = new_size;
} }