| Index: cc/base/list_container.h
|
| diff --git a/cc/base/list_container.h b/cc/base/list_container.h
|
| index e504c290df686d62339c484addfc24799723622f..ec9c62dce52a7838bace6307cc0cdb3757a1a0e3 100644
|
| --- a/cc/base/list_container.h
|
| +++ b/cc/base/list_container.h
|
| @@ -9,6 +9,7 @@
|
| #include "base/macros.h"
|
| #include "base/memory/scoped_ptr.h"
|
| #include "cc/base/cc_export.h"
|
| +#include "cc/base/list_container_helper.h"
|
|
|
| namespace cc {
|
|
|
| @@ -20,190 +21,27 @@ namespace cc {
|
| // contain SharedQuadState or DrawQuad. Since the size of each DrawQuad varies,
|
| // to hold DrawQuads, the allocations size of each element in this class is
|
| // LargestDrawQuadSize while BaseElementType is DrawQuad.
|
| -
|
| -// Base class for non-templated logic. All methods are protected, and only
|
| -// exposed by ListContainer<BaseElementType>.
|
| -// For usage, see comments in ListContainer.
|
| -class CC_EXPORT ListContainerBase {
|
| - protected:
|
| - explicit ListContainerBase(size_t max_size_for_derived_class);
|
| - ListContainerBase(size_t max_size_for_derived_class,
|
| - size_t num_of_elements_to_reserve_for);
|
| - ~ListContainerBase();
|
| -
|
| - // This class deals only with char* and void*. It does allocation and passing
|
| - // out raw pointers, as well as memory deallocation when being destroyed.
|
| - class ListContainerCharAllocator;
|
| -
|
| - // This class points to a certain position inside memory of
|
| - // ListContainerCharAllocator. It is a base class for ListContainer iterators.
|
| - struct CC_EXPORT PositionInListContainerCharAllocator {
|
| - ListContainerCharAllocator* ptr_to_container;
|
| - size_t vector_index;
|
| - char* item_iterator;
|
| -
|
| - PositionInListContainerCharAllocator(
|
| - const PositionInListContainerCharAllocator& other);
|
| -
|
| - PositionInListContainerCharAllocator(ListContainerCharAllocator* container,
|
| - size_t vector_ind,
|
| - char* item_iter);
|
| -
|
| - bool operator==(const PositionInListContainerCharAllocator& other) const;
|
| - bool operator!=(const PositionInListContainerCharAllocator& other) const;
|
| -
|
| - PositionInListContainerCharAllocator Increment();
|
| - PositionInListContainerCharAllocator ReverseIncrement();
|
| - };
|
| -
|
| - // Iterator classes that can be used to access data.
|
| - /////////////////////////////////////////////////////////////////
|
| - class CC_EXPORT Iterator : public PositionInListContainerCharAllocator {
|
| - // This class is only defined to forward iterate through
|
| - // ListContainerCharAllocator.
|
| - public:
|
| - Iterator(ListContainerCharAllocator* container,
|
| - size_t vector_ind,
|
| - char* item_iter,
|
| - size_t index);
|
| - ~Iterator();
|
| -
|
| - size_t index() const;
|
| -
|
| - protected:
|
| - // This is used to track how many increment has happened since begin(). It
|
| - // is used to avoid double increment at places an index reference is
|
| - // needed. For iterator this means begin() corresponds to index 0 and end()
|
| - // corresponds to index |size|.
|
| - size_t index_;
|
| - };
|
| -
|
| - class CC_EXPORT ConstIterator : public PositionInListContainerCharAllocator {
|
| - // This class is only defined to forward iterate through
|
| - // ListContainerCharAllocator.
|
| - public:
|
| - ConstIterator(ListContainerCharAllocator* container,
|
| - size_t vector_ind,
|
| - char* item_iter,
|
| - size_t index);
|
| - ConstIterator(const Iterator& other); // NOLINT
|
| - ~ConstIterator();
|
| -
|
| - size_t index() const;
|
| -
|
| - protected:
|
| - // This is used to track how many increment has happened since begin(). It
|
| - // is used to avoid double increment at places an index reference is
|
| - // needed. For iterator this means begin() corresponds to index 0 and end()
|
| - // corresponds to index |size|.
|
| - size_t index_;
|
| - };
|
| -
|
| - class CC_EXPORT ReverseIterator
|
| - : public PositionInListContainerCharAllocator {
|
| - // This class is only defined to reverse iterate through
|
| - // ListContainerCharAllocator.
|
| - public:
|
| - ReverseIterator(ListContainerCharAllocator* container,
|
| - size_t vector_ind,
|
| - char* item_iter,
|
| - size_t index);
|
| - ~ReverseIterator();
|
| -
|
| - size_t index() const;
|
| -
|
| - protected:
|
| - // This is used to track how many increment has happened since rbegin(). It
|
| - // is used to avoid double increment at places an index reference is
|
| - // needed. For reverse iterator this means rbegin() corresponds to index 0
|
| - // and rend() corresponds to index |size|.
|
| - size_t index_;
|
| - };
|
| -
|
| - class CC_EXPORT ConstReverseIterator
|
| - : public PositionInListContainerCharAllocator {
|
| - // This class is only defined to reverse iterate through
|
| - // ListContainerCharAllocator.
|
| - public:
|
| - ConstReverseIterator(ListContainerCharAllocator* container,
|
| - size_t vector_ind,
|
| - char* item_iter,
|
| - size_t index);
|
| - ConstReverseIterator(const ReverseIterator& other); // NOLINT
|
| - ~ConstReverseIterator();
|
| -
|
| - size_t index() const;
|
| -
|
| - protected:
|
| - // This is used to track how many increment has happened since rbegin(). It
|
| - // is used to avoid double increment at places an index reference is
|
| - // needed. For reverse iterator this means rbegin() corresponds to index 0
|
| - // and rend() corresponds to index |size|.
|
| - size_t index_;
|
| - };
|
| -
|
| - // Unlike the ListContainer methods, these do not invoke element destructors.
|
| - void RemoveLast();
|
| - void EraseAndInvalidateAllPointers(Iterator* position);
|
| - void InsertBeforeAndInvalidateAllPointers(Iterator* position,
|
| - size_t number_of_elements);
|
| -
|
| - ConstReverseIterator crbegin() const;
|
| - ConstReverseIterator crend() const;
|
| - ReverseIterator rbegin();
|
| - ReverseIterator rend();
|
| - ConstIterator cbegin() const;
|
| - ConstIterator cend() const;
|
| - Iterator begin();
|
| - Iterator end();
|
| -
|
| - Iterator IteratorAt(size_t index);
|
| - ConstIterator IteratorAt(size_t index) const;
|
| -
|
| - size_t size() const;
|
| - bool empty() const;
|
| -
|
| - size_t MaxSizeForDerivedClass() const;
|
| -
|
| - size_t GetCapacityInBytes() const;
|
| -
|
| - // Unlike the ListContainer method, this one does not invoke element
|
| - // destructors.
|
| - void clear();
|
| -
|
| - size_t AvailableSizeWithoutAnotherAllocationForTesting() const;
|
| -
|
| - // Hands out memory location for an element at the end of data structure.
|
| - void* Allocate(size_t size_of_actual_element_in_bytes);
|
| -
|
| - scoped_ptr<ListContainerCharAllocator> data_;
|
| -
|
| - private:
|
| - DISALLOW_COPY_AND_ASSIGN(ListContainerBase);
|
| -};
|
| -
|
| template <class BaseElementType>
|
| -class ListContainer : public ListContainerBase {
|
| +class ListContainer {
|
| public:
|
| // BaseElementType is the type of raw pointers this class hands out; however,
|
| // its derived classes might require different memory sizes.
|
| // max_size_for_derived_class the largest memory size required for all the
|
| // derived classes to use for allocation.
|
| explicit ListContainer(size_t max_size_for_derived_class)
|
| - : ListContainerBase(max_size_for_derived_class) {}
|
| + : helper_(max_size_for_derived_class) {}
|
|
|
| // This constructor omits input variable for max_size_for_derived_class. This
|
| // is used when there is no derived classes from BaseElementType we need to
|
| // worry about, and allocation size is just sizeof(BaseElementType).
|
| - ListContainer() : ListContainerBase(sizeof(BaseElementType)) {}
|
| + ListContainer() : helper_(sizeof(BaseElementType)) {}
|
|
|
| // This constructor reserves the requested memory up front so only single
|
| // allocation is needed. When num_of_elements_to_reserve_for is zero, use the
|
| // default size.
|
| ListContainer(size_t max_size_for_derived_class,
|
| size_t num_of_elements_to_reserve_for)
|
| - : ListContainerBase(max_size_for_derived_class,
|
| - num_of_elements_to_reserve_for) {}
|
| + : helper_(max_size_for_derived_class, num_of_elements_to_reserve_for) {}
|
|
|
| ~ListContainer() {
|
| for (Iterator i = begin(); i != end(); ++i) {
|
| @@ -221,7 +59,7 @@ class ListContainer : public ListContainerBase {
|
| void RemoveLast() {
|
| DCHECK(!empty());
|
| back()->~BaseElementType();
|
| - ListContainerBase::RemoveLast();
|
| + helper_.RemoveLast();
|
| }
|
|
|
| // When called, all raw pointers that have been handed out are no longer
|
| @@ -231,32 +69,26 @@ class ListContainer : public ListContainerBase {
|
| Iterator EraseAndInvalidateAllPointers(Iterator position) {
|
| BaseElementType* item = *position;
|
| item->~BaseElementType();
|
| - ListContainerBase::EraseAndInvalidateAllPointers(&position);
|
| + helper_.EraseAndInvalidateAllPointers(&position);
|
| return empty() ? end() : position;
|
| }
|
|
|
| ConstReverseIterator crbegin() const {
|
| - return ConstReverseIterator(ListContainerBase::crbegin());
|
| + return ConstReverseIterator(helper_.crbegin());
|
| }
|
| ConstReverseIterator crend() const {
|
| - return ConstReverseIterator(ListContainerBase::crend());
|
| + return ConstReverseIterator(helper_.crend());
|
| }
|
| ConstReverseIterator rbegin() const { return crbegin(); }
|
| ConstReverseIterator rend() const { return crend(); }
|
| - ReverseIterator rbegin() {
|
| - return ReverseIterator(ListContainerBase::rbegin());
|
| - }
|
| - ReverseIterator rend() { return ReverseIterator(ListContainerBase::rend()); }
|
| - ConstIterator cbegin() const {
|
| - return ConstIterator(ListContainerBase::cbegin());
|
| - }
|
| - ConstIterator cend() const {
|
| - return ConstIterator(ListContainerBase::cend());
|
| - }
|
| + ReverseIterator rbegin() { return ReverseIterator(helper_.rbegin()); }
|
| + ReverseIterator rend() { return ReverseIterator(helper_.rend()); }
|
| + ConstIterator cbegin() const { return ConstIterator(helper_.cbegin()); }
|
| + ConstIterator cend() const { return ConstIterator(helper_.cend()); }
|
| ConstIterator begin() const { return cbegin(); }
|
| ConstIterator end() const { return cend(); }
|
| - Iterator begin() { return Iterator(ListContainerBase::begin()); }
|
| - Iterator end() { return Iterator(ListContainerBase::end()); }
|
| + Iterator begin() { return Iterator(helper_.begin()); }
|
| + Iterator end() { return Iterator(helper_.end()); }
|
|
|
| // TODO(weiliangc): front(), back() and ElementAt() function should return
|
| // reference, consistent with container-of-object.
|
| @@ -266,24 +98,25 @@ class ListContainer : public ListContainerBase {
|
| const BaseElementType* back() const { return *rbegin(); }
|
|
|
| BaseElementType* ElementAt(size_t index) {
|
| - return *Iterator(IteratorAt(index));
|
| + return *Iterator(helper_.IteratorAt(index));
|
| }
|
| const BaseElementType* ElementAt(size_t index) const {
|
| - return *ConstIterator(IteratorAt(index));
|
| + return *ConstIterator(helper_.IteratorAt(index));
|
| }
|
|
|
| // Take in derived element type and construct it at location generated by
|
| // Allocate().
|
| template <typename DerivedElementType>
|
| DerivedElementType* AllocateAndConstruct() {
|
| - return new (Allocate(sizeof(DerivedElementType))) DerivedElementType;
|
| + return new (helper_.Allocate(sizeof(DerivedElementType)))
|
| + DerivedElementType;
|
| }
|
|
|
| // Take in derived element type and copy construct it at location generated by
|
| // Allocate().
|
| template <typename DerivedElementType>
|
| DerivedElementType* AllocateAndCopyFrom(const DerivedElementType* source) {
|
| - return new (Allocate(sizeof(DerivedElementType)))
|
| + return new (helper_.Allocate(sizeof(DerivedElementType)))
|
| DerivedElementType(*source);
|
| }
|
|
|
| @@ -299,7 +132,7 @@ class ListContainer : public ListContainerBase {
|
| // for the beginning of the newly inserted segment.
|
| template <typename DerivedElementType>
|
| Iterator InsertBeforeAndInvalidateAllPointers(Iterator at, size_t count) {
|
| - ListContainerBase::InsertBeforeAndInvalidateAllPointers(&at, count);
|
| + helper_.InsertBeforeAndInvalidateAllPointers(&at, count);
|
| Iterator result = at;
|
| for (size_t i = 0; i < count; ++i) {
|
| new (*at) DerivedElementType();
|
| @@ -310,7 +143,7 @@ class ListContainer : public ListContainerBase {
|
|
|
| template <typename DerivedElementType>
|
| void swap(ListContainer<DerivedElementType>& other) {
|
| - data_.swap(other.data_);
|
| + helper_.data_.swap(other.helper_.data_);
|
| }
|
|
|
| // Appends a new item without copying. The original item will not be
|
| @@ -320,39 +153,43 @@ class ListContainer : public ListContainerBase {
|
| // the moved element is returned.
|
| template <typename DerivedElementType>
|
| DerivedElementType* AppendByMoving(DerivedElementType* item) {
|
| - size_t max_size_for_derived_class = MaxSizeForDerivedClass();
|
| - void* new_item = Allocate(max_size_for_derived_class);
|
| + size_t max_size_for_derived_class = helper_.MaxSizeForDerivedClass();
|
| + void* new_item = helper_.Allocate(max_size_for_derived_class);
|
| memcpy(new_item, static_cast<void*>(item), max_size_for_derived_class);
|
| // Construct a new element in-place so it can be destructed safely.
|
| new (item) DerivedElementType;
|
| return static_cast<DerivedElementType*>(new_item);
|
| }
|
|
|
| - using ListContainerBase::size;
|
| - using ListContainerBase::empty;
|
| - using ListContainerBase::GetCapacityInBytes;
|
| + size_t size() const { return helper_.size(); }
|
| + bool empty() const { return helper_.empty(); }
|
| + size_t GetCapacityInBytes() const { return helper_.GetCapacityInBytes(); }
|
|
|
| void clear() {
|
| for (Iterator i = begin(); i != end(); ++i) {
|
| i->~BaseElementType();
|
| }
|
| - ListContainerBase::clear();
|
| + helper_.clear();
|
| }
|
|
|
| - using ListContainerBase::AvailableSizeWithoutAnotherAllocationForTesting;
|
| + size_t AvailableSizeWithoutAnotherAllocationForTesting() const {
|
| + return helper_.AvailableSizeWithoutAnotherAllocationForTesting();
|
| + }
|
|
|
| // Iterator classes that can be used to access data.
|
| /////////////////////////////////////////////////////////////////
|
| - class Iterator : public ListContainerBase::Iterator {
|
| + class Iterator : public ListContainerHelper::Iterator {
|
| // This class is only defined to forward iterate through
|
| - // ListContainerCharAllocator.
|
| + // CharAllocator.
|
| public:
|
| - Iterator(ListContainerCharAllocator* container,
|
| + Iterator(ListContainerHelper::CharAllocator* container,
|
| size_t vector_ind,
|
| char* item_iter,
|
| size_t index)
|
| - : ListContainerBase::Iterator(container, vector_ind, item_iter, index) {
|
| - }
|
| + : ListContainerHelper::Iterator(container,
|
| + vector_ind,
|
| + item_iter,
|
| + index) {}
|
| BaseElementType* operator->() const {
|
| return reinterpret_cast<BaseElementType*>(item_iterator);
|
| }
|
| @@ -371,28 +208,28 @@ class ListContainer : public ListContainerBase {
|
| }
|
|
|
| private:
|
| - explicit Iterator(const ListContainerBase::Iterator& base_iterator)
|
| - : ListContainerBase::Iterator(base_iterator) {}
|
| + explicit Iterator(const ListContainerHelper::Iterator& base_iterator)
|
| + : ListContainerHelper::Iterator(base_iterator) {}
|
| friend Iterator ListContainer<BaseElementType>::begin();
|
| friend Iterator ListContainer<BaseElementType>::end();
|
| friend BaseElementType* ListContainer<BaseElementType>::ElementAt(
|
| size_t index);
|
| };
|
|
|
| - class ConstIterator : public ListContainerBase::ConstIterator {
|
| + class ConstIterator : public ListContainerHelper::ConstIterator {
|
| // This class is only defined to forward iterate through
|
| - // ListContainerCharAllocator.
|
| + // CharAllocator.
|
| public:
|
| - ConstIterator(ListContainerCharAllocator* container,
|
| + ConstIterator(ListContainerHelper::CharAllocator* container,
|
| size_t vector_ind,
|
| char* item_iter,
|
| size_t index)
|
| - : ListContainerBase::ConstIterator(container,
|
| - vector_ind,
|
| - item_iter,
|
| - index) {}
|
| + : ListContainerHelper::ConstIterator(container,
|
| + vector_ind,
|
| + item_iter,
|
| + index) {}
|
| ConstIterator(const Iterator& other) // NOLINT
|
| - : ListContainerBase::ConstIterator(other) {}
|
| + : ListContainerHelper::ConstIterator(other) {}
|
| const BaseElementType* operator->() const {
|
| return reinterpret_cast<const BaseElementType*>(item_iterator);
|
| }
|
| @@ -412,26 +249,26 @@ class ListContainer : public ListContainerBase {
|
|
|
| private:
|
| explicit ConstIterator(
|
| - const ListContainerBase::ConstIterator& base_iterator)
|
| - : ListContainerBase::ConstIterator(base_iterator) {}
|
| + const ListContainerHelper::ConstIterator& base_iterator)
|
| + : ListContainerHelper::ConstIterator(base_iterator) {}
|
| friend ConstIterator ListContainer<BaseElementType>::cbegin() const;
|
| friend ConstIterator ListContainer<BaseElementType>::cend() const;
|
| friend const BaseElementType* ListContainer<BaseElementType>::ElementAt(
|
| size_t index) const;
|
| };
|
|
|
| - class ReverseIterator : public ListContainerBase::ReverseIterator {
|
| + class ReverseIterator : public ListContainerHelper::ReverseIterator {
|
| // This class is only defined to reverse iterate through
|
| - // ListContainerCharAllocator.
|
| + // CharAllocator.
|
| public:
|
| - ReverseIterator(ListContainerCharAllocator* container,
|
| + ReverseIterator(ListContainerHelper::CharAllocator* container,
|
| size_t vector_ind,
|
| char* item_iter,
|
| size_t index)
|
| - : ListContainerBase::ReverseIterator(container,
|
| - vector_ind,
|
| - item_iter,
|
| - index) {}
|
| + : ListContainerHelper::ReverseIterator(container,
|
| + vector_ind,
|
| + item_iter,
|
| + index) {}
|
| BaseElementType* operator->() const {
|
| return reinterpret_cast<BaseElementType*>(item_iterator);
|
| }
|
| @@ -450,26 +287,27 @@ class ListContainer : public ListContainerBase {
|
| }
|
|
|
| private:
|
| - explicit ReverseIterator(ListContainerBase::ReverseIterator base_iterator)
|
| - : ListContainerBase::ReverseIterator(base_iterator) {}
|
| + explicit ReverseIterator(ListContainerHelper::ReverseIterator base_iterator)
|
| + : ListContainerHelper::ReverseIterator(base_iterator) {}
|
| friend ReverseIterator ListContainer<BaseElementType>::rbegin();
|
| friend ReverseIterator ListContainer<BaseElementType>::rend();
|
| };
|
|
|
| - class ConstReverseIterator : public ListContainerBase::ConstReverseIterator {
|
| + class ConstReverseIterator
|
| + : public ListContainerHelper::ConstReverseIterator {
|
| // This class is only defined to reverse iterate through
|
| - // ListContainerCharAllocator.
|
| + // CharAllocator.
|
| public:
|
| - ConstReverseIterator(ListContainerCharAllocator* container,
|
| + ConstReverseIterator(ListContainerHelper::CharAllocator* container,
|
| size_t vector_ind,
|
| char* item_iter,
|
| size_t index)
|
| - : ListContainerBase::ConstReverseIterator(container,
|
| - vector_ind,
|
| - item_iter,
|
| - index) {}
|
| + : ListContainerHelper::ConstReverseIterator(container,
|
| + vector_ind,
|
| + item_iter,
|
| + index) {}
|
| ConstReverseIterator(const ReverseIterator& other) // NOLINT
|
| - : ListContainerBase::ConstReverseIterator(other) {}
|
| + : ListContainerHelper::ConstReverseIterator(other) {}
|
| const BaseElementType* operator->() const {
|
| return reinterpret_cast<const BaseElementType*>(item_iterator);
|
| }
|
| @@ -489,11 +327,16 @@ class ListContainer : public ListContainerBase {
|
|
|
| private:
|
| explicit ConstReverseIterator(
|
| - ListContainerBase::ConstReverseIterator base_iterator)
|
| - : ListContainerBase::ConstReverseIterator(base_iterator) {}
|
| + ListContainerHelper::ConstReverseIterator base_iterator)
|
| + : ListContainerHelper::ConstReverseIterator(base_iterator) {}
|
| friend ConstReverseIterator ListContainer<BaseElementType>::crbegin() const;
|
| friend ConstReverseIterator ListContainer<BaseElementType>::crend() const;
|
| };
|
| +
|
| + private:
|
| + ListContainerHelper helper_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(ListContainer);
|
| };
|
|
|
| } // namespace cc
|
|
|