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

Unified Diff: cc/base/list_container.cc

Issue 1163803003: cc: Implement RemoveLast for DisplayItemList. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: basic unit tests Created 5 years, 7 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: cc/base/list_container.cc
diff --git a/cc/base/list_container.cc b/cc/base/list_container.cc
index df21a5b2e486a144736e9c817c66aa30d5acccda..e91a45bf84b236abf104fb70f9141f182e9ce8c4 100644
--- a/cc/base/list_container.cc
+++ b/cc/base/list_container.cc
@@ -53,6 +53,7 @@ class ListContainerBase::ListContainerCharAllocator {
--capacity;
}
+ bool IsEmpty() const { return !size; }
bool IsFull() { return capacity == size; }
size_t NumElementsAvailable() const { return capacity - size; }
@@ -62,6 +63,11 @@ class ListContainerBase::ListContainerCharAllocator {
return LastElement();
}
+ void RemoveLast() {
+ DCHECK(!IsEmpty());
+ --size;
+ }
+
char* Begin() const { return data.get(); }
char* End() const { return data.get() + size * step; }
char* LastElement() const { return data.get() + (size - 1) * step; }
@@ -121,6 +127,14 @@ class ListContainerBase::ListContainerCharAllocator {
AllocateNewList(initial_allocation_size);
}
+ void RemoveLast() {
+ DCHECK(!IsEmpty());
+ last_list_->RemoveLast();
+ if (last_list_->IsEmpty())
+ DeallocateLastList();
danakj 2015/06/02 20:04:32 Is it possible to avoid this deallocate and just l
+ --size_;
+ }
+
void Erase(PositionInListContainerCharAllocator position) {
DCHECK_EQ(this, position.ptr_to_container);
storage_[position.vector_index]->Erase(position.item_iterator);
@@ -170,6 +184,15 @@ class ListContainerBase::ListContainerCharAllocator {
}
private:
+ void DeallocateLastList() {
+ // Don't deallocate the only list; we always expect there to be one.
+ if (list_count_ <= 1)
+ return;
+ --list_count_;
+ storage_.pop_back();
+ last_list_ = list_count_ ? storage_.back() : nullptr;
+ }
+
ScopedPtrVector<InnerList> storage_;
const size_t element_size_;
size_t size_;
@@ -275,6 +298,10 @@ ListContainerBase::ListContainerBase(size_t max_size_for_derived_class,
ListContainerBase::~ListContainerBase() {
}
+void ListContainerBase::RemoveLast() {
+ data_->RemoveLast();
+}
+
void ListContainerBase::EraseAndInvalidateAllPointers(
ListContainerBase::Iterator position) {
data_->Erase(position);

Powered by Google App Engine
This is Rietveld 408576698