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

Side by Side Diff: include/core/SkTArray.h

Issue 15949021: Fixup some conventions in SkTArray and add reset to count method. (Closed) Base URL: https://skia.googlecode.com/svn/trunk
Patch Set: Created 7 years, 6 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 | Annotate | Revision Log
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2011 Google Inc. 2 * Copyright 2011 Google Inc.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license that can be 4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file. 5 * found in the LICENSE file.
6 */ 6 */
7 7
8 #ifndef SkTArray_DEFINED 8 #ifndef SkTArray_DEFINED
9 #define SkTArray_DEFINED 9 #define SkTArray_DEFINED
10 10
(...skipping 10 matching lines...) Expand all
21 memcpy(self->fMemArray, array, self->fCount * sizeof(T)); 21 memcpy(self->fMemArray, array, self->fCount * sizeof(T));
22 } 22 }
23 template<typename T> 23 template<typename T>
24 inline void copyAndDelete(SkTArray<T, true>* self, char* newMemArray) { 24 inline void copyAndDelete(SkTArray<T, true>* self, char* newMemArray) {
25 memcpy(newMemArray, self->fMemArray, self->fCount * sizeof(T)); 25 memcpy(newMemArray, self->fMemArray, self->fCount * sizeof(T));
26 } 26 }
27 27
28 template<typename T> 28 template<typename T>
29 inline void copy(SkTArray<T, false>* self, const T* array) { 29 inline void copy(SkTArray<T, false>* self, const T* array) {
30 for (int i = 0; i < self->fCount; ++i) { 30 for (int i = 0; i < self->fCount; ++i) {
31 new (self->fItemArray + i) T(array[i]); 31 SkNEW_PLACEMENT_ARGS(self->fItemArray + i, T, (array[i]));
32 } 32 }
33 } 33 }
34 template<typename T> 34 template<typename T>
35 inline void copyAndDelete(SkTArray<T, false>* self, char* newMemArray) { 35 inline void copyAndDelete(SkTArray<T, false>* self, char* newMemArray) {
36 for (int i = 0; i < self->fCount; ++i) { 36 for (int i = 0; i < self->fCount; ++i) {
37 new (newMemArray + sizeof(T) * i) T(self->fItemArray[i]); 37 SkNEW_PLACEMENT_ARGS(newMemArray + sizeof(T) * i, T, (self->fItemArray[i ]));
38 self->fItemArray[i].~T(); 38 self->fItemArray[i].~T();
39 } 39 }
40 } 40 }
41 41
42 } 42 }
43 43
44 /** When MEM_COPY is true T will be bit copied when moved. 44 /** When MEM_COPY is true T will be bit copied when moved.
45 When MEM_COPY is false, T will be copy constructed / destructed. 45 When MEM_COPY is false, T will be copy constructed / destructed.
46 In all cases T's constructor will be called on allocation, 46 In all cases T's constructor will be called on allocation,
47 and its destructor will be called from this object's destructor. 47 and its destructor will be called from this object's destructor.
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
105 sk_free(fMemArray); 105 sk_free(fMemArray);
106 } 106 }
107 } 107 }
108 108
109 /** 109 /**
110 * Resets to count() == 0 110 * Resets to count() == 0
111 */ 111 */
112 void reset() { this->pop_back_n(fCount); } 112 void reset() { this->pop_back_n(fCount); }
113 113
114 /** 114 /**
115 * Resets to count() = n newly constructed T objects.
116 */
117 void reset(int n) {
118 SkASSERT(n >= 0);
119 for (int i = 0; i < fCount; ++i) {
120 fItemArray[i].~T();
121 }
122 // set fCount to 0 before calling checkRealloc so that no copy cons. are called.
123 fCount = 0;
124 this->checkRealloc(n);
125 fCount = n;
126 for (int i = 0; i < fCount; ++i) {
127 SkNEW_PLACEMENT(fItemArray + i, T);
128 }
129 }
130
131 /**
115 * Resets to a copy of a C array. 132 * Resets to a copy of a C array.
116 */ 133 */
117 void reset(const T* array, int count) { 134 void reset(const T* array, int count) {
118 for (int i = 0; i < fCount; ++i) { 135 for (int i = 0; i < fCount; ++i) {
119 fItemArray[i].~T(); 136 fItemArray[i].~T();
120 } 137 }
121 int delta = count - fCount; 138 int delta = count - fCount;
122 this->checkRealloc(delta); 139 this->checkRealloc(delta);
123 fCount = count; 140 fCount = count;
124 for (int i = 0; i < count; ++i) { 141 for (int i = 0; i < count; ++i) {
(...skipping 10 matching lines...) Expand all
135 * Is the array empty. 152 * Is the array empty.
136 */ 153 */
137 bool empty() const { return !fCount; } 154 bool empty() const { return !fCount; }
138 155
139 /** 156 /**
140 * Adds 1 new default-constructed T value and returns in by reference. Note 157 * Adds 1 new default-constructed T value and returns in by reference. Note
141 * the reference only remains valid until the next call that adds or removes 158 * the reference only remains valid until the next call that adds or removes
142 * elements. 159 * elements.
143 */ 160 */
144 T& push_back() { 161 T& push_back() {
145 checkRealloc(1); 162 this->checkRealloc(1);
146 new ((char*)fMemArray+sizeof(T)*fCount) T; 163 SkNEW_PLACEMENT((char*)fMemArray + sizeof(T) * fCount, T);
147 ++fCount; 164 ++fCount;
148 return fItemArray[fCount-1]; 165 return fItemArray[fCount-1];
149 } 166 }
150 167
151 /** 168 /**
152 * Version of above that uses a copy constructor to initialize the new item 169 * Version of above that uses a copy constructor to initialize the new item
153 */ 170 */
154 T& push_back(const T& t) { 171 T& push_back(const T& t) {
155 checkRealloc(1); 172 this->checkRealloc(1);
156 new ((char*)fMemArray+sizeof(T)*fCount) T(t); 173 SkNEW_PLACEMENT_ARGS((char*)fMemArray + sizeof(T) * fCount, T, (t));
157 ++fCount; 174 ++fCount;
158 return fItemArray[fCount-1]; 175 return fItemArray[fCount-1];
159 } 176 }
160 177
161 /** 178 /**
162 * Allocates n more default T values, and returns the address of the start 179 * Allocates n more default T values, and returns the address of the start
163 * of that new range. Note: this address is only valid until the next API 180 * of that new range. Note: this address is only valid until the next API
164 * call made on the array that might add or remove elements. 181 * call made on the array that might add or remove elements.
165 */ 182 */
166 T* push_back_n(int n) { 183 T* push_back_n(int n) {
167 SkASSERT(n >= 0); 184 SkASSERT(n >= 0);
168 checkRealloc(n); 185 this->checkRealloc(n);
169 for (int i = 0; i < n; ++i) { 186 for (int i = 0; i < n; ++i) {
170 new (fItemArray + fCount + i) T; 187 SkNEW_PLACEMENT(fItemArray + fCount + i, T);
171 } 188 }
172 fCount += n; 189 fCount += n;
173 return fItemArray + fCount - n; 190 return fItemArray + fCount - n;
174 } 191 }
175 192
176 /** 193 /**
177 * Version of above that uses a copy constructor to initialize all n items 194 * Version of above that uses a copy constructor to initialize all n items
178 * to the same T. 195 * to the same T.
179 */ 196 */
180 T* push_back_n(int n, const T& t) { 197 T* push_back_n(int n, const T& t) {
181 SkASSERT(n >= 0); 198 SkASSERT(n >= 0);
182 checkRealloc(n); 199 this->checkRealloc(n);
183 for (int i = 0; i < n; ++i) { 200 for (int i = 0; i < n; ++i) {
184 new (fItemArray + fCount + i) T(t); 201 SkNEW_PLACEMENT_ARGS(fItemArray + fCount + i, T, (t));
185 } 202 }
186 fCount += n; 203 fCount += n;
187 return fItemArray + fCount - n; 204 return fItemArray + fCount - n;
188 } 205 }
189 206
190 /** 207 /**
191 * Version of above that uses a copy constructor to initialize the n items 208 * Version of above that uses a copy constructor to initialize the n items
192 * to separate T values. 209 * to separate T values.
193 */ 210 */
194 T* push_back_n(int n, const T t[]) { 211 T* push_back_n(int n, const T t[]) {
195 SkASSERT(n >= 0); 212 SkASSERT(n >= 0);
196 checkRealloc(n); 213 this->checkRealloc(n);
197 for (int i = 0; i < n; ++i) { 214 for (int i = 0; i < n; ++i) {
198 new (fItemArray + fCount + i) T(t[i]); 215 SkNEW_PLACEMENT_ARGS(fItemArray + fCount + i, T, (t[i]));
199 } 216 }
200 fCount += n; 217 fCount += n;
201 return fItemArray + fCount - n; 218 return fItemArray + fCount - n;
202 } 219 }
203 220
204 /** 221 /**
205 * Removes the last element. Not safe to call when count() == 0. 222 * Removes the last element. Not safe to call when count() == 0.
206 */ 223 */
207 void pop_back() { 224 void pop_back() {
208 SkASSERT(fCount > 0); 225 SkASSERT(fCount > 0);
209 --fCount; 226 --fCount;
210 fItemArray[fCount].~T(); 227 fItemArray[fCount].~T();
211 checkRealloc(0); 228 this->checkRealloc(0);
212 } 229 }
213 230
214 /** 231 /**
215 * Removes the last n elements. Not safe to call when count() < n. 232 * Removes the last n elements. Not safe to call when count() < n.
216 */ 233 */
217 void pop_back_n(int n) { 234 void pop_back_n(int n) {
218 SkASSERT(n >= 0); 235 SkASSERT(n >= 0);
219 SkASSERT(fCount >= n); 236 SkASSERT(fCount >= n);
220 fCount -= n; 237 fCount -= n;
221 for (int i = 0; i < n; ++i) { 238 for (int i = 0; i < n; ++i) {
222 fItemArray[i].~T(); 239 fItemArray[i].~T();
223 } 240 }
224 checkRealloc(0); 241 this->checkRealloc(0);
225 } 242 }
226 243
227 /** 244 /**
228 * Pushes or pops from the back to resize. Pushes will be default 245 * Pushes or pops from the back to resize. Pushes will be default
229 * initialized. 246 * initialized.
230 */ 247 */
231 void resize_back(int newCount) { 248 void resize_back(int newCount) {
232 SkASSERT(newCount >= 0); 249 SkASSERT(newCount >= 0);
233 250
234 if (newCount > fCount) { 251 if (newCount > fCount) {
235 push_back_n(newCount - fCount); 252 this->push_back_n(newCount - fCount);
236 } else if (newCount < fCount) { 253 } else if (newCount < fCount) {
237 pop_back_n(fCount - newCount); 254 this->pop_back_n(fCount - newCount);
238 } 255 }
239 } 256 }
240 257
241 T* begin() { 258 T* begin() {
242 return fItemArray; 259 return fItemArray;
243 } 260 }
244 const T* begin() const { 261 const T* begin() const {
245 return fItemArray; 262 return fItemArray;
246 } 263 }
247 T* end() { 264 T* end() {
(...skipping 200 matching lines...) Expand 10 before | Expand all | Expand 10 after
448 SkSTArray& operator= (const INHERITED& array) { 465 SkSTArray& operator= (const INHERITED& array) {
449 INHERITED::operator=(array); 466 INHERITED::operator=(array);
450 return *this; 467 return *this;
451 } 468 }
452 469
453 private: 470 private:
454 SkAlignedSTStorage<N,T> fStorage; 471 SkAlignedSTStorage<N,T> fStorage;
455 }; 472 };
456 473
457 #endif 474 #endif
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698