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

Unified Diff: cc/quads/list_container.cc

Issue 1159573002: cc: Move cc/quads/list_container.* files to cc/base. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Merging list_container.cc in list_container.h 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
« no previous file with comments | « cc/quads/list_container.h ('k') | cc/quads/list_container_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: cc/quads/list_container.cc
diff --git a/cc/quads/list_container.cc b/cc/quads/list_container.cc
deleted file mode 100644
index 4edcbdfab560a86af305e7946f53852ede0a43ef..0000000000000000000000000000000000000000
--- a/cc/quads/list_container.cc
+++ /dev/null
@@ -1,720 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "cc/quads/list_container.h"
-
-#include <algorithm>
-#include <vector>
-
-#include "cc/base/scoped_ptr_vector.h"
-#include "cc/playback/display_item.h"
-#include "cc/quads/draw_quad.h"
-#include "cc/quads/shared_quad_state.h"
-
-namespace {
-const size_t kDefaultNumElementTypesToReserve = 32;
-} // namespace
-
-namespace cc {
-
-// ListContainerCharAllocator
-////////////////////////////////////////////////////
-// This class deals only with char* and void*. It does allocation and passing
-// out raw pointers, as well as memory deallocation when being destroyed.
-template <typename BaseElementType>
-class ListContainer<BaseElementType>::ListContainerCharAllocator {
- public:
- // ListContainerCharAllocator::InnerList
- /////////////////////////////////////////////
- // This class holds the raw memory chunk, as well as information about its
- // size and availability.
- struct InnerList {
- scoped_ptr<char[]> data;
- // The number of elements in total the memory can hold. The difference
- // between capacity and size is the how many more elements this list can
- // hold.
- size_t capacity;
- // The number of elements have been put into this list.
- size_t size;
- // The size of each element is in bytes. This is used to move from between
- // elements' memory locations.
- size_t step;
-
- InnerList() : capacity(0), size(0), step(0) {}
-
- void Erase(char* position) {
- // Confident that destructor is called by caller of this function. Since
- // ListContainerCharAllocator does not handle construction after
- // allocation, it doesn't handle desctrution before deallocation.
- DCHECK_LE(position, LastElement());
- DCHECK_GE(position, Begin());
- char* start = position + step;
- std::copy(start, End(), position);
-
- --size;
- // Decrease capacity to avoid creating not full not last InnerList.
- --capacity;
- }
-
- bool IsFull() { return capacity == size; }
- size_t NumElementsAvailable() const { return capacity - size; }
-
- void* AddElement() {
- DCHECK_LT(size, capacity);
- ++size;
- return LastElement();
- }
-
- char* Begin() const { return data.get(); }
- char* End() const { return data.get() + size * step; }
- char* LastElement() const { return data.get() + (size - 1) * step; }
- char* ElementAt(size_t index) const { return data.get() + index * step; }
-
- private:
- DISALLOW_COPY_AND_ASSIGN(InnerList);
- };
-
- explicit ListContainerCharAllocator(size_t element_size)
- : element_size_(element_size),
- size_(0),
- list_count_(0),
- last_list_(NULL) {
- AllocateNewList(kDefaultNumElementTypesToReserve);
- }
-
- ListContainerCharAllocator(size_t element_size, size_t element_count)
- : element_size_(element_size),
- size_(0),
- list_count_(0),
- last_list_(NULL) {
- AllocateNewList(element_count > 0 ? element_count
- : kDefaultNumElementTypesToReserve);
- }
-
- ~ListContainerCharAllocator() {}
-
- void* Allocate() {
- if (last_list_->IsFull())
- AllocateNewList(last_list_->capacity * 2);
-
- ++size_;
- return last_list_->AddElement();
- }
-
- size_t element_size() const { return element_size_; }
- size_t list_count() const { return list_count_; }
- size_t size() const { return size_; }
- bool IsEmpty() const { return size() == 0; }
-
- size_t Capacity() const {
- size_t capacity_sum = 0;
- for (typename ScopedPtrVector<InnerList>::const_iterator iter =
- storage_.begin();
- iter != storage_.end();
- ++iter) {
- capacity_sum += (*iter)->capacity;
- }
- return capacity_sum;
- }
-
- void Clear() {
- size_t initial_allocation_size = storage_.front()->capacity;
- storage_.clear();
- list_count_ = 0;
- last_list_ = NULL;
- size_ = 0;
- AllocateNewList(initial_allocation_size);
- }
-
- void Erase(PositionInListContainerCharAllocator position) {
- DCHECK_EQ(this, position.ptr_to_container);
- storage_[position.vector_index]->Erase(position.item_iterator);
- // TODO(weiliangc): Free the InnerList if it is empty.
- --size_;
- }
-
- InnerList* InnerListById(size_t id) const {
- DCHECK_LT(id, list_count_);
- return storage_[id];
- }
-
- size_t FirstInnerListId() const {
- // |size_| > 0 means that at least one vector in |storage_| will be
- // non-empty.
- DCHECK_GT(size_, 0u);
- size_t id = 0;
- while (storage_[id]->size == 0)
- ++id;
- return id;
- }
-
- size_t LastInnerListId() const {
- // |size_| > 0 means that at least one vector in |storage_| will be
- // non-empty.
- DCHECK_GT(size_, 0u);
- size_t id = list_count_ - 1;
- while (storage_[id]->size == 0)
- --id;
- return id;
- }
-
- void AllocateNewList(size_t list_size) {
- ++list_count_;
- scoped_ptr<InnerList> new_list(new InnerList);
- storage_.push_back(new_list.Pass());
- last_list_ = storage_.back();
- InnerList* list = last_list_;
- list->capacity = list_size;
- list->size = 0;
- list->step = element_size_;
- list->data.reset(new char[list->capacity * list->step]);
- }
-
- size_t NumAvailableElementsInLastList() const {
- return last_list_->NumElementsAvailable();
- }
-
- private:
- ScopedPtrVector<InnerList> storage_;
- const size_t element_size_;
- size_t size_;
- size_t list_count_;
- InnerList* last_list_;
-
- DISALLOW_COPY_AND_ASSIGN(ListContainerCharAllocator);
-};
-
-// PositionInListContainerCharAllocator
-//////////////////////////////////////////////////////
-template <typename BaseElementType>
-ListContainer<BaseElementType>::PositionInListContainerCharAllocator::
- PositionInListContainerCharAllocator(const typename ListContainer<
- BaseElementType>::PositionInListContainerCharAllocator& other)
- : ptr_to_container(other.ptr_to_container),
- vector_index(other.vector_index),
- item_iterator(other.item_iterator) {
-}
-
-template <typename BaseElementType>
-ListContainer<BaseElementType>::PositionInListContainerCharAllocator::
- PositionInListContainerCharAllocator(
- typename ListContainer<BaseElementType>::ListContainerCharAllocator*
- container,
- size_t vector_ind,
- char* item_iter)
- : ptr_to_container(container),
- vector_index(vector_ind),
- item_iterator(item_iter) {
-}
-
-template <typename BaseElementType>
-bool ListContainer<BaseElementType>::PositionInListContainerCharAllocator::
-operator==(const typename ListContainer<
- BaseElementType>::PositionInListContainerCharAllocator& other) const {
- DCHECK_EQ(ptr_to_container, other.ptr_to_container);
- return vector_index == other.vector_index &&
- item_iterator == other.item_iterator;
-}
-
-template <typename BaseElementType>
-bool ListContainer<BaseElementType>::PositionInListContainerCharAllocator::
-operator!=(const typename ListContainer<
- BaseElementType>::PositionInListContainerCharAllocator& other) const {
- return !(*this == other);
-}
-
-template <typename BaseElementType>
-typename ListContainer<BaseElementType>::PositionInListContainerCharAllocator
-ListContainer<
- BaseElementType>::PositionInListContainerCharAllocator::Increment() {
- typename ListContainerCharAllocator::InnerList* list =
- ptr_to_container->InnerListById(vector_index);
- if (item_iterator == list->LastElement()) {
- ++vector_index;
- while (vector_index < ptr_to_container->list_count()) {
- if (ptr_to_container->InnerListById(vector_index)->size != 0)
- break;
- ++vector_index;
- }
- if (vector_index < ptr_to_container->list_count())
- item_iterator = ptr_to_container->InnerListById(vector_index)->Begin();
- else
- item_iterator = NULL;
- } else {
- item_iterator += list->step;
- }
- return *this;
-}
-
-template <typename BaseElementType>
-typename ListContainer<BaseElementType>::PositionInListContainerCharAllocator
-ListContainer<
- BaseElementType>::PositionInListContainerCharAllocator::ReverseIncrement() {
- typename ListContainerCharAllocator::InnerList* list =
- ptr_to_container->InnerListById(vector_index);
- if (item_iterator == list->Begin()) {
- --vector_index;
- // Since |vector_index| is unsigned, we compare < list_count() instead of
- // comparing >= 0, as the variable will wrap around when it goes out of
- // range (below 0).
- while (vector_index < ptr_to_container->list_count()) {
- if (ptr_to_container->InnerListById(vector_index)->size != 0)
- break;
- --vector_index;
- }
- if (vector_index < ptr_to_container->list_count()) {
- item_iterator =
- ptr_to_container->InnerListById(vector_index)->LastElement();
- } else {
- item_iterator = NULL;
- }
- } else {
- item_iterator -= list->step;
- }
- return *this;
-}
-
-// ListContainer
-////////////////////////////////////////////
-template <typename BaseElementType>
-ListContainer<BaseElementType>::ListContainer(size_t max_size_for_derived_class)
- : data_(new ListContainerCharAllocator(max_size_for_derived_class)) {
-}
-
-template <typename BaseElementType>
-ListContainer<BaseElementType>::ListContainer(
- size_t max_size_for_derived_class,
- size_t num_of_elements_to_reserve_for)
- : data_(new ListContainerCharAllocator(max_size_for_derived_class,
- num_of_elements_to_reserve_for)) {
-}
-
-template <typename BaseElementType>
-ListContainer<BaseElementType>::ListContainer()
- : data_(new ListContainerCharAllocator(sizeof(BaseElementType))) {
-}
-
-template <typename BaseElementType>
-ListContainer<BaseElementType>::~ListContainer() {
- for (Iterator i = begin(); i != end(); ++i) {
- i->~BaseElementType();
- }
-}
-
-template <typename BaseElementType>
-void ListContainer<BaseElementType>::EraseAndInvalidateAllPointers(
- typename ListContainer<BaseElementType>::Iterator position) {
- BaseElementType* item = *position;
- item->~BaseElementType();
- data_->Erase(position);
-}
-
-template <typename BaseElementType>
-typename ListContainer<BaseElementType>::ConstReverseIterator
-ListContainer<BaseElementType>::crbegin() const {
- if (data_->IsEmpty())
- return crend();
-
- size_t id = data_->LastInnerListId();
- return ConstReverseIterator(data_.get(), id,
- data_->InnerListById(id)->LastElement(), 0);
-}
-
-template <typename BaseElementType>
-typename ListContainer<BaseElementType>::ConstReverseIterator
-ListContainer<BaseElementType>::crend() const {
- return ConstReverseIterator(data_.get(), static_cast<size_t>(-1), NULL,
- size());
-}
-
-template <typename BaseElementType>
-typename ListContainer<BaseElementType>::ConstReverseIterator
-ListContainer<BaseElementType>::rbegin() const {
- return crbegin();
-}
-
-template <typename BaseElementType>
-typename ListContainer<BaseElementType>::ConstReverseIterator
-ListContainer<BaseElementType>::rend() const {
- return crend();
-}
-
-template <typename BaseElementType>
-typename ListContainer<BaseElementType>::ReverseIterator
-ListContainer<BaseElementType>::rbegin() {
- if (data_->IsEmpty())
- return rend();
-
- size_t id = data_->LastInnerListId();
- return ReverseIterator(data_.get(), id,
- data_->InnerListById(id)->LastElement(), 0);
-}
-
-template <typename BaseElementType>
-typename ListContainer<BaseElementType>::ReverseIterator
-ListContainer<BaseElementType>::rend() {
- return ReverseIterator(data_.get(), static_cast<size_t>(-1), NULL, size());
-}
-
-template <typename BaseElementType>
-typename ListContainer<BaseElementType>::ConstIterator
-ListContainer<BaseElementType>::cbegin() const {
- if (data_->IsEmpty())
- return cend();
-
- size_t id = data_->FirstInnerListId();
- return ConstIterator(data_.get(), id, data_->InnerListById(id)->Begin(), 0);
-}
-
-template <typename BaseElementType>
-typename ListContainer<BaseElementType>::ConstIterator
-ListContainer<BaseElementType>::cend() const {
- if (data_->IsEmpty())
- return ConstIterator(data_.get(), 0, NULL, size());
-
- size_t id = data_->list_count();
- return ConstIterator(data_.get(), id, NULL, size());
-}
-
-template <typename BaseElementType>
-typename ListContainer<BaseElementType>::ConstIterator
-ListContainer<BaseElementType>::begin() const {
- return cbegin();
-}
-
-template <typename BaseElementType>
-typename ListContainer<BaseElementType>::ConstIterator
-ListContainer<BaseElementType>::end() const {
- return cend();
-}
-
-template <typename BaseElementType>
-typename ListContainer<BaseElementType>::Iterator
-ListContainer<BaseElementType>::begin() {
- if (data_->IsEmpty())
- return end();
-
- size_t id = data_->FirstInnerListId();
- return Iterator(data_.get(), id, data_->InnerListById(id)->Begin(), 0);
-}
-
-template <typename BaseElementType>
-typename ListContainer<BaseElementType>::Iterator
-ListContainer<BaseElementType>::end() {
- if (data_->IsEmpty())
- return Iterator(data_.get(), 0, NULL, size());
-
- size_t id = data_->list_count();
- return Iterator(data_.get(), id, NULL, size());
-}
-
-template <typename BaseElementType>
-BaseElementType* ListContainer<BaseElementType>::front() {
- Iterator iter = begin();
- return *iter;
-}
-
-template <typename BaseElementType>
-BaseElementType* ListContainer<BaseElementType>::back() {
- ReverseIterator iter = rbegin();
- return *iter;
-}
-
-template <typename BaseElementType>
-const BaseElementType* ListContainer<BaseElementType>::front() const {
- ConstIterator iter = begin();
- return *iter;
-}
-
-template <typename BaseElementType>
-const BaseElementType* ListContainer<BaseElementType>::back() const {
- ConstReverseIterator iter = rbegin();
- return *iter;
-}
-
-template <typename BaseElementType>
-const BaseElementType* ListContainer<BaseElementType>::ElementAt(
- size_t index) const {
- DCHECK_LT(index, size());
- size_t original_index = index;
- size_t list_index;
- for (list_index = 0; list_index < data_->list_count(); ++list_index) {
- size_t current_size = data_->InnerListById(list_index)->size;
- if (index < current_size)
- break;
- index -= current_size;
- }
- return *ConstIterator(data_.get(),
- list_index,
- data_->InnerListById(list_index)->ElementAt(index),
- original_index);
-}
-
-template <typename BaseElementType>
-BaseElementType* ListContainer<BaseElementType>::ElementAt(size_t index) {
- DCHECK_LT(index, size());
- size_t original_index = index;
- size_t list_index;
- for (list_index = 0; list_index < data_->list_count(); ++list_index) {
- size_t current_size = data_->InnerListById(list_index)->size;
- if (index < current_size)
- break;
- index -= current_size;
- }
- return *Iterator(data_.get(),
- list_index,
- data_->InnerListById(list_index)->ElementAt(index),
- original_index);
-}
-
-template <typename BaseElementType>
-void* ListContainer<BaseElementType>::Allocate(
- size_t size_of_actual_element_in_bytes) {
- DCHECK_LE(size_of_actual_element_in_bytes, data_->element_size());
- return data_->Allocate();
-}
-
-template <typename BaseElementType>
-size_t ListContainer<BaseElementType>::size() const {
- return data_->size();
-}
-
-template <typename BaseElementType>
-bool ListContainer<BaseElementType>::empty() const {
- return data_->IsEmpty();
-}
-
-template <typename BaseElementType>
-void ListContainer<BaseElementType>::clear() {
- for (Iterator i = begin(); i != end(); ++i) {
- i->~BaseElementType();
- }
- data_->Clear();
-}
-
-template <typename BaseElementType>
-size_t ListContainer<
- BaseElementType>::AvailableSizeWithoutAnotherAllocationForTesting() const {
- return data_->NumAvailableElementsInLastList();
-}
-
-// ListContainer::Iterator
-/////////////////////////////////////////////////
-template <typename BaseElementType>
-ListContainer<BaseElementType>::Iterator::Iterator(
- ListContainerCharAllocator* container,
- size_t vector_ind,
- char* item_iter,
- size_t index)
- : PositionInListContainerCharAllocator(container, vector_ind, item_iter),
- index_(index) {
-}
-
-template <typename BaseElementType>
-ListContainer<BaseElementType>::Iterator::~Iterator() {
-}
-
-template <typename BaseElementType>
-BaseElementType* ListContainer<BaseElementType>::Iterator::operator->() const {
- return reinterpret_cast<BaseElementType*>(this->item_iterator);
-}
-
-template <typename BaseElementType>
-BaseElementType* ListContainer<BaseElementType>::Iterator::operator*() const {
- return reinterpret_cast<BaseElementType*>(this->item_iterator);
-}
-
-template <typename BaseElementType>
-typename ListContainer<BaseElementType>::Iterator
-ListContainer<BaseElementType>::Iterator::
-operator++(int unused_post_increment) {
- Iterator tmp = *this;
- operator++();
- return tmp;
-}
-
-template <typename BaseElementType>
-typename ListContainer<BaseElementType>::Iterator&
- ListContainer<BaseElementType>::Iterator::
- operator++() {
- this->Increment();
- ++index_;
- return *this;
-}
-
-template <typename BaseElementType>
-size_t ListContainer<BaseElementType>::Iterator::index() const {
- return index_;
-}
-
-// ListContainer::ConstIterator
-/////////////////////////////////////////////////
-template <typename BaseElementType>
-ListContainer<BaseElementType>::ConstIterator::ConstIterator(
- const typename ListContainer<BaseElementType>::Iterator& other)
- : PositionInListContainerCharAllocator(other), index_(other.index()) {
-}
-
-template <typename BaseElementType>
-ListContainer<BaseElementType>::ConstIterator::ConstIterator(
- ListContainerCharAllocator* container,
- size_t vector_ind,
- char* item_iter,
- size_t index)
- : PositionInListContainerCharAllocator(container, vector_ind, item_iter),
- index_(index) {
-}
-
-template <typename BaseElementType>
-ListContainer<BaseElementType>::ConstIterator::~ConstIterator() {
-}
-
-template <typename BaseElementType>
-const BaseElementType* ListContainer<BaseElementType>::ConstIterator::
-operator->() const {
- return reinterpret_cast<const BaseElementType*>(this->item_iterator);
-}
-
-template <typename BaseElementType>
-const BaseElementType* ListContainer<BaseElementType>::ConstIterator::
-operator*() const {
- return reinterpret_cast<const BaseElementType*>(this->item_iterator);
-}
-
-template <typename BaseElementType>
-typename ListContainer<BaseElementType>::ConstIterator
-ListContainer<BaseElementType>::ConstIterator::
-operator++(int unused_post_increment) {
- ConstIterator tmp = *this;
- operator++();
- return tmp;
-}
-
-template <typename BaseElementType>
-typename ListContainer<BaseElementType>::ConstIterator&
- ListContainer<BaseElementType>::ConstIterator::
- operator++() {
- this->Increment();
- ++index_;
- return *this;
-}
-
-template <typename BaseElementType>
-size_t ListContainer<BaseElementType>::ConstIterator::index() const {
- return index_;
-}
-
-// ListContainer::ReverseIterator
-/////////////////////////////////////////////////
-template <typename BaseElementType>
-ListContainer<BaseElementType>::ReverseIterator::ReverseIterator(
- ListContainerCharAllocator* container,
- size_t vector_ind,
- char* item_iter,
- size_t index)
- : PositionInListContainerCharAllocator(container, vector_ind, item_iter),
- index_(index) {
-}
-
-template <typename BaseElementType>
-ListContainer<BaseElementType>::ReverseIterator::~ReverseIterator() {
-}
-
-template <typename BaseElementType>
-BaseElementType* ListContainer<BaseElementType>::ReverseIterator::operator->()
- const {
- return reinterpret_cast<BaseElementType*>(this->item_iterator);
-}
-
-template <typename BaseElementType>
-BaseElementType* ListContainer<BaseElementType>::ReverseIterator::operator*()
- const {
- return reinterpret_cast<BaseElementType*>(this->item_iterator);
-}
-
-template <typename BaseElementType>
-typename ListContainer<BaseElementType>::ReverseIterator
-ListContainer<BaseElementType>::ReverseIterator::
-operator++(int unused_post_increment) {
- ReverseIterator tmp = *this;
- operator++();
- return tmp;
-}
-
-template <typename BaseElementType>
-typename ListContainer<BaseElementType>::ReverseIterator&
- ListContainer<BaseElementType>::ReverseIterator::
- operator++() {
- this->ReverseIncrement();
- ++index_;
- return *this;
-}
-
-template <typename BaseElementType>
-size_t ListContainer<BaseElementType>::ReverseIterator::index() const {
- return index_;
-}
-
-// ListContainer::ConstReverseIterator
-/////////////////////////////////////////////////
-template <typename BaseElementType>
-ListContainer<BaseElementType>::ConstReverseIterator::ConstReverseIterator(
- const typename ListContainer<BaseElementType>::ReverseIterator& other)
- : PositionInListContainerCharAllocator(other), index_(other.index()) {
-}
-
-template <typename BaseElementType>
-ListContainer<BaseElementType>::ConstReverseIterator::ConstReverseIterator(
- ListContainerCharAllocator* container,
- size_t vector_ind,
- char* item_iter,
- size_t index)
- : PositionInListContainerCharAllocator(container, vector_ind, item_iter),
- index_(index) {
-}
-
-template <typename BaseElementType>
-ListContainer<BaseElementType>::ConstReverseIterator::~ConstReverseIterator() {
-}
-
-template <typename BaseElementType>
-const BaseElementType* ListContainer<BaseElementType>::ConstReverseIterator::
-operator->() const {
- return reinterpret_cast<const BaseElementType*>(this->item_iterator);
-}
-
-template <typename BaseElementType>
-const BaseElementType* ListContainer<BaseElementType>::ConstReverseIterator::
-operator*() const {
- return reinterpret_cast<const BaseElementType*>(this->item_iterator);
-}
-
-template <typename BaseElementType>
-typename ListContainer<BaseElementType>::ConstReverseIterator
-ListContainer<BaseElementType>::ConstReverseIterator::
-operator++(int unused_post_increment) {
- ConstReverseIterator tmp = *this;
- operator++();
- return tmp;
-}
-
-template <typename BaseElementType>
-typename ListContainer<BaseElementType>::ConstReverseIterator&
- ListContainer<BaseElementType>::ConstReverseIterator::
- operator++() {
- this->ReverseIncrement();
- ++index_;
- return *this;
-}
-
-template <typename BaseElementType>
-size_t ListContainer<BaseElementType>::ConstReverseIterator::index() const {
- return index_;
-}
-
-template class ListContainer<SharedQuadState>;
-template class ListContainer<DrawQuad>;
-template class ListContainer<DisplayItem>;
-
-} // namespace cc
« no previous file with comments | « cc/quads/list_container.h ('k') | cc/quads/list_container_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698