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

Side by Side Diff: cc/quads/list_container.h

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 unified diff | Download patch
« no previous file with comments | « cc/playback/display_item_list.cc ('k') | cc/quads/list_container.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #ifndef CC_QUADS_LIST_CONTAINER_H_
6 #define CC_QUADS_LIST_CONTAINER_H_
7
8 #include "base/macros.h"
9 #include "base/memory/scoped_ptr.h"
10 #include "cc/base/cc_export.h"
11
12 namespace cc {
13 class DisplayItem;
14 class DrawQuad;
15 class SharedQuadState;
16
17 // This class is a container type that handles allocating contiguous memory for
18 // new elements and traversing through elements with either iterator or reverse
19 // iterator. Since this container hands out raw pointers of its elements, it is
20 // very important that this container never reallocate its memory so those raw
21 // pointer will continue to be valid. This class is used to contain
22 // SharedQuadState or DrawQuad. Since the size of each DrawQuad varies, to hold
23 // DrawQuads, the allocations size of each element in this class is
24 // LargestDrawQuadSize while BaseElementType is DrawQuad.
25 template <class BaseElementType>
26 class CC_EXPORT ListContainer {
27 public:
28 // BaseElementType is the type of raw pointers this class hands out; however,
29 // its derived classes might require different memory sizes.
30 // max_size_for_derived_class the largest memory size required for all the
31 // derived classes to use for allocation.
32 explicit ListContainer(size_t max_size_for_derived_class);
33 // This constructor omits input variable for max_size_for_derived_class. This
34 // is used when there is no derived classes from BaseElementType we need to
35 // worry about, and allocation size is just sizeof(BaseElementType).
36 ListContainer();
37 // This constructor reserves the requested memory up front so only single
38 // allocation is needed. When num_of_elements_to_reserve_for is zero, use the
39 // default size.
40 ListContainer(size_t max_size_for_derived_class,
41 size_t num_of_elements_to_reserve_for);
42
43 ~ListContainer();
44
45 // This class deals only with char* and void*. It does allocation and passing
46 // out raw pointers, as well as memory deallocation when being destroyed.
47 class CC_EXPORT ListContainerCharAllocator;
48
49 // This class points to a certain position inside memory of
50 // ListContainerCharAllocator. It is a base class for ListContainer iterators.
51 struct CC_EXPORT PositionInListContainerCharAllocator {
52 ListContainerCharAllocator* ptr_to_container;
53 size_t vector_index;
54 char* item_iterator;
55
56 PositionInListContainerCharAllocator(
57 const PositionInListContainerCharAllocator& other);
58
59 PositionInListContainerCharAllocator(ListContainerCharAllocator* container,
60 size_t vector_ind,
61 char* item_iter);
62
63 bool operator==(const PositionInListContainerCharAllocator& other) const;
64 bool operator!=(const PositionInListContainerCharAllocator& other) const;
65
66 PositionInListContainerCharAllocator Increment();
67 PositionInListContainerCharAllocator ReverseIncrement();
68 };
69
70 // Iterator classes that can be used to access data.
71 /////////////////////////////////////////////////////////////////
72 class CC_EXPORT Iterator : public PositionInListContainerCharAllocator {
73 // This class is only defined to forward iterate through
74 // ListContainerCharAllocator.
75 public:
76 Iterator(ListContainerCharAllocator* container,
77 size_t vector_ind,
78 char* item_iter,
79 size_t index);
80 ~Iterator();
81 BaseElementType* operator->() const;
82 BaseElementType* operator*() const;
83 Iterator operator++(int unused_post_increment);
84 Iterator& operator++();
85
86 size_t index() const;
87
88 private:
89 // This is used to track how many increment has happened since begin(). It
90 // is used to avoid double increment at places an index reference is
91 // needed. For iterator this means begin() corresponds to index 0 and end()
92 // corresponds to index |size|.
93 size_t index_;
94 };
95
96 class CC_EXPORT ConstIterator : public PositionInListContainerCharAllocator {
97 // This class is only defined to forward iterate through
98 // ListContainerCharAllocator.
99 public:
100 ConstIterator(ListContainerCharAllocator* container,
101 size_t vector_ind,
102 char* item_iter,
103 size_t index);
104 ConstIterator(const Iterator& other); // NOLINT
105 ~ConstIterator();
106 const BaseElementType* operator->() const;
107 const BaseElementType* operator*() const;
108 ConstIterator operator++(int unused_post_increment);
109 ConstIterator& operator++();
110
111 size_t index() const;
112
113 private:
114 // This is used to track how many increment has happened since begin(). It
115 // is used to avoid double increment at places an index reference is
116 // needed. For iterator this means begin() corresponds to index 0 and end()
117 // corresponds to index |size|.
118 size_t index_;
119 };
120
121 class CC_EXPORT ReverseIterator
122 : public PositionInListContainerCharAllocator {
123 // This class is only defined to reverse iterate through
124 // ListContainerCharAllocator.
125 public:
126 ReverseIterator(ListContainerCharAllocator* container,
127 size_t vector_ind,
128 char* item_iter,
129 size_t index);
130 ~ReverseIterator();
131 BaseElementType* operator->() const;
132 BaseElementType* operator*() const;
133 ReverseIterator operator++(int unused_post_increment);
134 ReverseIterator& operator++();
135
136 size_t index() const;
137
138 private:
139 // This is used to track how many increment has happened since rbegin(). It
140 // is used to avoid double increment at places an index reference is
141 // needed. For reverse iterator this means rbegin() corresponds to index 0
142 // and rend() corresponds to index |size|.
143 size_t index_;
144 };
145
146 class CC_EXPORT ConstReverseIterator
147 : public PositionInListContainerCharAllocator {
148 // This class is only defined to reverse iterate through
149 // ListContainerCharAllocator.
150 public:
151 ConstReverseIterator(ListContainerCharAllocator* container,
152 size_t vector_ind,
153 char* item_iter,
154 size_t index);
155 ConstReverseIterator(const ReverseIterator& other); // NOLINT
156 ~ConstReverseIterator();
157 const BaseElementType* operator->() const;
158 const BaseElementType* operator*() const;
159 ConstReverseIterator operator++(int unused_post_increment);
160 ConstReverseIterator& operator++();
161
162 size_t index() const;
163
164 private:
165 // This is used to track how many increment has happened since rbegin(). It
166 // is used to avoid double increment at places an index reference is
167 // needed. For reverse iterator this means rbegin() corresponds to index 0
168 // and rend() corresponds to index |size|.
169 size_t index_;
170 };
171
172 // When called, all raw pointers that have been handed out are no longer
173 // valid. Use with caution.
174 // This function does not deallocate memory.
175 void EraseAndInvalidateAllPointers(Iterator position);
176
177 ConstReverseIterator crbegin() const;
178 ConstReverseIterator crend() const;
179 ConstReverseIterator rbegin() const;
180 ConstReverseIterator rend() const;
181 ReverseIterator rbegin();
182 ReverseIterator rend();
183 ConstIterator cbegin() const;
184 ConstIterator cend() const;
185 ConstIterator begin() const;
186 ConstIterator end() const;
187 Iterator begin();
188 Iterator end();
189
190 // TODO(weiliangc): front(), back() and ElementAt() function should return
191 // reference, consistent with container-of-object.
192 BaseElementType* front();
193 BaseElementType* back();
194 const BaseElementType* front() const;
195 const BaseElementType* back() const;
196
197 BaseElementType* ElementAt(size_t index);
198 const BaseElementType* ElementAt(size_t index) const;
199
200 // Take in derived element type and construct it at location generated by
201 // Allocate().
202 template <typename DerivedElementType>
203 DerivedElementType* AllocateAndConstruct() {
204 return new (Allocate(sizeof(DerivedElementType))) DerivedElementType;
205 }
206 // Take in derived element type and copy construct it at location generated by
207 // Allocate().
208 template <typename DerivedElementType>
209 DerivedElementType* AllocateAndCopyFrom(const DerivedElementType* source) {
210 return new (Allocate(sizeof(DerivedElementType)))
211 DerivedElementType(*source);
212 }
213 // Construct a new element on top of an existing one.
214 template <typename DerivedElementType>
215 DerivedElementType* ReplaceExistingElement(Iterator at) {
216 at->~BaseElementType();
217 return new (*at) DerivedElementType();
218 }
219
220 size_t size() const;
221 bool empty() const;
222 void clear();
223
224 size_t AvailableSizeWithoutAnotherAllocationForTesting() const;
225
226 private:
227 // Hands out memory location for an element at the end of data structure.
228 void* Allocate(size_t size_of_actual_element_in_bytes);
229
230 scoped_ptr<ListContainerCharAllocator> data_;
231
232 DISALLOW_COPY_AND_ASSIGN(ListContainer);
233 };
234
235 #if !defined(COMPILER_MSVC)
236 extern template class ListContainer<SharedQuadState>;
237 extern template class ListContainer<DrawQuad>;
238 extern template class ListContainer<DisplayItem>;
239 #endif
240 } // namespace cc
241
242 #endif // CC_QUADS_LIST_CONTAINER_H_
OLDNEW
« no previous file with comments | « cc/playback/display_item_list.cc ('k') | cc/quads/list_container.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698