11320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Copyright 2014 The Chromium Authors. All rights reserved. 21320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Use of this source code is governed by a BSD-style license that can be 31320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// found in the LICENSE file. 41320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifndef CC_QUADS_LIST_CONTAINER_H_ 61320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define CC_QUADS_LIST_CONTAINER_H_ 71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/macros.h" 91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/memory/scoped_ptr.h" 101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "cc/base/cc_export.h" 111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace cc { 131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass SharedQuadState; 141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass DrawQuad; 151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// This class is a container type that handles allocating contiguous memory for 171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// new elements and traversing through elements with either iterator or reverse 181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// iterator. Since this container hands out raw pointers of its elements, it is 191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// very important that this container never reallocate its memory so those raw 201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// pointer will continue to be valid. This class is used to contain 211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// SharedQuadState or DrawQuad. Since the size of each DrawQuad varies, to hold 221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// DrawQuads, the allocations size of each element in this class is 231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// kLargestDrawQuad while BaseElementType is DrawQuad. 241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccitemplate <class BaseElementType> 251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass CC_EXPORT ListContainer { 261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public: 271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // BaseElementType is the type of raw pointers this class hands out; however, 281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // its derived classes might require different memory sizes. 291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // max_size_for_derived_class the largest memory size required for all the 301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // derived classes to use for allocation. 311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci explicit ListContainer(size_t max_size_for_derived_class); 321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // This constructor omits input variable for max_size_for_derived_class. This 331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // is used when there is no derived classes from BaseElementType we need to 341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // worry about, and allocation size is just sizeof(BaseElementType). 351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ListContainer(); 361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // This constructor reserves the requested memory up front so only a single 371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // allocation is needed. 381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ListContainer(size_t max_size_for_derived_class, 391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci size_t num_of_elements_to_reserve_for); 401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ~ListContainer(); 421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // This class deals only with char* and void*. It does allocation and passing 441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // out raw pointers, as well as memory deallocation when being destroyed. 451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci class CC_EXPORT ListContainerCharAllocator; 461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // This class points to a certain position inside memory of 481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // ListContainerCharAllocator. It is a base class for ListContainer iterators. 491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci struct CC_EXPORT PositionInListContainerCharAllocator { 501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ListContainerCharAllocator* ptr_to_container; 511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci size_t vector_index; 521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci char* item_iterator; 531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci PositionInListContainerCharAllocator( 551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const PositionInListContainerCharAllocator& other); 561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci PositionInListContainerCharAllocator(ListContainerCharAllocator* container, 581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci size_t vector_ind, 591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci char* item_iter); 601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool operator==(const PositionInListContainerCharAllocator& other) const; 621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool operator!=(const PositionInListContainerCharAllocator& other) const; 631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci PositionInListContainerCharAllocator Increment(); 651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci PositionInListContainerCharAllocator ReverseIncrement(); 661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci }; 671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Iterator classes that can be used to access data. 691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ///////////////////////////////////////////////////////////////// 701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci class CC_EXPORT Iterator : public PositionInListContainerCharAllocator { 711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // This class is only defined to forward iterate through 721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // ListContainerCharAllocator. 731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public: 741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Iterator(ListContainerCharAllocator* container, 751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci size_t vector_ind, 761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci char* item_iter); 771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ~Iterator(); 781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci BaseElementType* operator->() const; 791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci BaseElementType& operator*() const; 801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Iterator operator++(int unused_post_increment); 811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Iterator operator++(); 821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci }; 831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci class CC_EXPORT ConstIterator : public PositionInListContainerCharAllocator { 851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // This class is only defined to forward iterate through 861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // ListContainerCharAllocator. 871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public: 881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ConstIterator(ListContainerCharAllocator* container, 891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci size_t vector_ind, 901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci char* item_iter); 911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ConstIterator(const Iterator& other); // NOLINT 921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ~ConstIterator(); 931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const BaseElementType* operator->() const; 941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const BaseElementType& operator*() const; 951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ConstIterator operator++(int unused_post_increment); 961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ConstIterator operator++(); 971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci }; 981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci class CC_EXPORT ReverseIterator 1001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci : public PositionInListContainerCharAllocator { 1011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // This class is only defined to reverse iterate through 1021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // ListContainerCharAllocator. 1031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public: 1041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ReverseIterator(ListContainerCharAllocator* container, 1051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci size_t vector_ind, 1061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci char* item_iter); 1071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ~ReverseIterator(); 1081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci BaseElementType* operator->() const; 1091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci BaseElementType& operator*() const; 1101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ReverseIterator operator++(int unused_post_increment); 1111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ReverseIterator operator++(); 1121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci }; 1131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci class CC_EXPORT ConstReverseIterator 1151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci : public PositionInListContainerCharAllocator { 1161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // This class is only defined to reverse iterate through 1171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // ListContainerCharAllocator. 1181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public: 1191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ConstReverseIterator(ListContainerCharAllocator* container, 1201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci size_t vector_ind, 1211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci char* item_iter); 1221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ConstReverseIterator(const ReverseIterator& other); // NOLINT 1231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ~ConstReverseIterator(); 1241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const BaseElementType* operator->() const; 1251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const BaseElementType& operator*() const; 1261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ConstReverseIterator operator++(int unused_post_increment); 1271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ConstReverseIterator operator++(); 1281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci }; 1291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // When called, all raw pointers that have been handed out are no longer 1311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // valid. Use with caution. 1321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // This function does not deallocate memory. 1331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void EraseAndInvalidateAllPointers(Iterator position); 1341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ConstReverseIterator rbegin() const; 1361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ConstReverseIterator rend() const; 1371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ReverseIterator rbegin(); 1381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ReverseIterator rend(); 1391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ConstIterator begin() const; 1401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ConstIterator end() const; 1411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Iterator begin(); 1421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Iterator end(); 1431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci BaseElementType* front(); 1451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci BaseElementType* back(); 1461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const BaseElementType* front() const; 1471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const BaseElementType* back() const; 1481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci BaseElementType* ElementAt(size_t index); 1501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const BaseElementType* ElementAt(size_t index) const; 1511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Take in derived element type and construct it at location generated by 1531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Allocate(). 1541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci template <typename DerivedElementType> 1551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DerivedElementType* AllocateAndConstruct() { 1561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return new (Allocate(sizeof(DerivedElementType))) DerivedElementType; 1571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 1581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Take in derived element type and copy construct it at location generated by 1591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Allocate(). 1601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci template <typename DerivedElementType> 1611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DerivedElementType* AllocateAndCopyFrom(const DerivedElementType* source) { 1621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return new (Allocate(sizeof(DerivedElementType))) 1631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DerivedElementType(*source); 1641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 1651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci size_t size() const; 1671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool empty() const; 1681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void clear(); 1691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci size_t AvailableSizeWithoutAnotherAllocationForTesting() const; 1711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci private: 1731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Hands out memory location for an element at the end of data structure. 1741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci BaseElementType* Allocate(size_t size_of_actual_element_in_bytes); 1751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<ListContainerCharAllocator> data_; 1771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DISALLOW_COPY_AND_ASSIGN(ListContainer); 1791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}; 1801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if !defined(COMPILER_MSVC) 1821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciextern template class ListContainer<SharedQuadState>; 1831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciextern template class ListContainer<DrawQuad>; 1841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif 1851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} // namespace cc 1861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif // CC_QUADS_LIST_CONTAINER_H_ 188