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

Side by Side Diff: cc/base/list_container.cc

Issue 1336763006: cc: Switch ListContainer to use composition instead of inheritance. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 3 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
« cc/base/list_container.h ('K') | « cc/base/list_container.h ('k') | 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 // Copyright 2014 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "cc/base/list_container.h" 5 #include "cc/base/list_container.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <vector> 8 #include <vector>
9 9
10 #include "cc/base/scoped_ptr_vector.h" 10 #include "cc/base/scoped_ptr_vector.h"
11 11
12 namespace { 12 namespace {
13 const size_t kDefaultNumElementTypesToReserve = 32; 13 const size_t kDefaultNumElementTypesToReserve = 32;
14 } // namespace 14 } // namespace
15 15
16 namespace cc { 16 namespace cc {
17 17
18 // ListContainerCharAllocator 18 // ListContainerCharAllocator
19 //////////////////////////////////////////////////// 19 ////////////////////////////////////////////////////
20 // This class deals only with char* and void*. It does allocation and passing 20 // This class deals only with char* and void*. It does allocation and passing
21 // out raw pointers, as well as memory deallocation when being destroyed. 21 // out raw pointers, as well as memory deallocation when being destroyed.
22 class ListContainerBase::ListContainerCharAllocator { 22 class ListContainerHelper::ListContainerCharAllocator {
23 public: 23 public:
24 // ListContainerCharAllocator::InnerList 24 // ListContainerCharAllocator::InnerList
25 ///////////////////////////////////////////// 25 /////////////////////////////////////////////
26 // This class holds the raw memory chunk, as well as information about its 26 // This class holds the raw memory chunk, as well as information about its
27 // size and availability. 27 // size and availability.
28 struct InnerList { 28 struct InnerList {
29 scoped_ptr<char[]> data; 29 scoped_ptr<char[]> data;
30 // The number of elements in total the memory can hold. The difference 30 // The number of elements in total the memory can hold. The difference
31 // between capacity and size is the how many more elements this list can 31 // between capacity and size is the how many more elements this list can
32 // hold. 32 // hold.
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after
178 InnerList* list = storage_[position->vector_index]; 178 InnerList* list = storage_[position->vector_index];
179 char* item_iterator = position->item_iterator; 179 char* item_iterator = position->item_iterator;
180 if (item_iterator == list->LastElement()) 180 if (item_iterator == list->LastElement())
181 position->Increment(); 181 position->Increment();
182 182
183 list->Erase(item_iterator); 183 list->Erase(item_iterator);
184 // TODO(weiliangc): Free the InnerList if it is empty. 184 // TODO(weiliangc): Free the InnerList if it is empty.
185 --size_; 185 --size_;
186 } 186 }
187 187
188 void InsertBefore(ListContainerBase::Iterator* position, size_t count) { 188 void InsertBefore(ListContainerHelper::Iterator* position, size_t count) {
189 if (!count) 189 if (!count)
190 return; 190 return;
191 191
192 // If |position| is End(), then append |count| elements at the end. This 192 // If |position| is End(), then append |count| elements at the end. This
193 // will happen to not invalidate any iterators or memory. 193 // will happen to not invalidate any iterators or memory.
194 if (!position->item_iterator) { 194 if (!position->item_iterator) {
195 // Set |position| to be the first inserted element. 195 // Set |position| to be the first inserted element.
196 Allocate(); 196 Allocate();
197 position->vector_index = storage_.size() - 1; 197 position->vector_index = storage_.size() - 1;
198 position->item_iterator = storage_[position->vector_index]->LastElement(); 198 position->item_iterator = storage_[position->vector_index]->LastElement();
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
256 size_t last_list_index_; 256 size_t last_list_index_;
257 257
258 // This is equivalent to |storage_[last_list_index_]|. 258 // This is equivalent to |storage_[last_list_index_]|.
259 InnerList* last_list_; 259 InnerList* last_list_;
260 260
261 DISALLOW_COPY_AND_ASSIGN(ListContainerCharAllocator); 261 DISALLOW_COPY_AND_ASSIGN(ListContainerCharAllocator);
262 }; 262 };
263 263
264 // PositionInListContainerCharAllocator 264 // PositionInListContainerCharAllocator
265 ////////////////////////////////////////////////////// 265 //////////////////////////////////////////////////////
266 ListContainerBase::PositionInListContainerCharAllocator:: 266 ListContainerHelper::PositionInListContainerCharAllocator::
267 PositionInListContainerCharAllocator( 267 PositionInListContainerCharAllocator(
268 const ListContainerBase::PositionInListContainerCharAllocator& other) 268 const ListContainerHelper::PositionInListContainerCharAllocator& other)
269 : ptr_to_container(other.ptr_to_container), 269 : ptr_to_container(other.ptr_to_container),
270 vector_index(other.vector_index), 270 vector_index(other.vector_index),
271 item_iterator(other.item_iterator) { 271 item_iterator(other.item_iterator) {}
272 }
273 272
274 ListContainerBase::PositionInListContainerCharAllocator:: 273 ListContainerHelper::PositionInListContainerCharAllocator::
275 PositionInListContainerCharAllocator( 274 PositionInListContainerCharAllocator(
276 ListContainerBase::ListContainerCharAllocator* container, 275 ListContainerHelper::ListContainerCharAllocator* container,
277 size_t vector_ind, 276 size_t vector_ind,
278 char* item_iter) 277 char* item_iter)
279 : ptr_to_container(container), 278 : ptr_to_container(container),
280 vector_index(vector_ind), 279 vector_index(vector_ind),
281 item_iterator(item_iter) { 280 item_iterator(item_iter) {}
282 }
283 281
284 bool ListContainerBase::PositionInListContainerCharAllocator::operator==( 282 bool ListContainerHelper::PositionInListContainerCharAllocator::operator==(
285 const ListContainerBase::PositionInListContainerCharAllocator& other) 283 const ListContainerHelper::PositionInListContainerCharAllocator& other)
286 const { 284 const {
287 DCHECK_EQ(ptr_to_container, other.ptr_to_container); 285 DCHECK_EQ(ptr_to_container, other.ptr_to_container);
288 return vector_index == other.vector_index && 286 return vector_index == other.vector_index &&
289 item_iterator == other.item_iterator; 287 item_iterator == other.item_iterator;
290 } 288 }
291 289
292 bool ListContainerBase::PositionInListContainerCharAllocator::operator!=( 290 bool ListContainerHelper::PositionInListContainerCharAllocator::operator!=(
293 const ListContainerBase::PositionInListContainerCharAllocator& other) 291 const ListContainerHelper::PositionInListContainerCharAllocator& other)
294 const { 292 const {
295 return !(*this == other); 293 return !(*this == other);
296 } 294 }
297 295
298 ListContainerBase::PositionInListContainerCharAllocator 296 ListContainerHelper::PositionInListContainerCharAllocator
299 ListContainerBase::PositionInListContainerCharAllocator::Increment() { 297 ListContainerHelper::PositionInListContainerCharAllocator::Increment() {
300 ListContainerCharAllocator::InnerList* list = 298 ListContainerCharAllocator::InnerList* list =
301 ptr_to_container->InnerListById(vector_index); 299 ptr_to_container->InnerListById(vector_index);
302 if (item_iterator == list->LastElement()) { 300 if (item_iterator == list->LastElement()) {
303 ++vector_index; 301 ++vector_index;
304 while (vector_index < ptr_to_container->list_count()) { 302 while (vector_index < ptr_to_container->list_count()) {
305 if (ptr_to_container->InnerListById(vector_index)->size != 0) 303 if (ptr_to_container->InnerListById(vector_index)->size != 0)
306 break; 304 break;
307 ++vector_index; 305 ++vector_index;
308 } 306 }
309 if (vector_index < ptr_to_container->list_count()) 307 if (vector_index < ptr_to_container->list_count())
310 item_iterator = ptr_to_container->InnerListById(vector_index)->Begin(); 308 item_iterator = ptr_to_container->InnerListById(vector_index)->Begin();
311 else 309 else
312 item_iterator = NULL; 310 item_iterator = NULL;
313 } else { 311 } else {
314 item_iterator += list->step; 312 item_iterator += list->step;
315 } 313 }
316 return *this; 314 return *this;
317 } 315 }
318 316
319 ListContainerBase::PositionInListContainerCharAllocator 317 ListContainerHelper::PositionInListContainerCharAllocator
320 ListContainerBase::PositionInListContainerCharAllocator::ReverseIncrement() { 318 ListContainerHelper::PositionInListContainerCharAllocator::ReverseIncrement() {
321 ListContainerCharAllocator::InnerList* list = 319 ListContainerCharAllocator::InnerList* list =
322 ptr_to_container->InnerListById(vector_index); 320 ptr_to_container->InnerListById(vector_index);
323 if (item_iterator == list->Begin()) { 321 if (item_iterator == list->Begin()) {
324 --vector_index; 322 --vector_index;
325 // Since |vector_index| is unsigned, we compare < list_count() instead of 323 // Since |vector_index| is unsigned, we compare < list_count() instead of
326 // comparing >= 0, as the variable will wrap around when it goes out of 324 // comparing >= 0, as the variable will wrap around when it goes out of
327 // range (below 0). 325 // range (below 0).
328 while (vector_index < ptr_to_container->list_count()) { 326 while (vector_index < ptr_to_container->list_count()) {
329 if (ptr_to_container->InnerListById(vector_index)->size != 0) 327 if (ptr_to_container->InnerListById(vector_index)->size != 0)
330 break; 328 break;
331 --vector_index; 329 --vector_index;
332 } 330 }
333 if (vector_index < ptr_to_container->list_count()) { 331 if (vector_index < ptr_to_container->list_count()) {
334 item_iterator = 332 item_iterator =
335 ptr_to_container->InnerListById(vector_index)->LastElement(); 333 ptr_to_container->InnerListById(vector_index)->LastElement();
336 } else { 334 } else {
337 item_iterator = NULL; 335 item_iterator = NULL;
338 } 336 }
339 } else { 337 } else {
340 item_iterator -= list->step; 338 item_iterator -= list->step;
341 } 339 }
342 return *this; 340 return *this;
343 } 341 }
344 342
345 // ListContainerBase 343 // ListContainerHelper
346 //////////////////////////////////////////// 344 ////////////////////////////////////////////
347 ListContainerBase::ListContainerBase(size_t max_size_for_derived_class) 345 ListContainerHelper::ListContainerHelper(size_t max_size_for_derived_class)
348 : data_(new ListContainerCharAllocator(max_size_for_derived_class)) { 346 : data_(new ListContainerCharAllocator(max_size_for_derived_class)) {}
349 }
350 347
351 ListContainerBase::ListContainerBase(size_t max_size_for_derived_class, 348 ListContainerHelper::ListContainerHelper(size_t max_size_for_derived_class,
352 size_t num_of_elements_to_reserve_for) 349 size_t num_of_elements_to_reserve_for)
353 : data_(new ListContainerCharAllocator(max_size_for_derived_class, 350 : data_(new ListContainerCharAllocator(max_size_for_derived_class,
354 num_of_elements_to_reserve_for)) { 351 num_of_elements_to_reserve_for)) {}
355 }
356 352
357 ListContainerBase::~ListContainerBase() { 353 ListContainerHelper::~ListContainerHelper() {}
358 }
359 354
360 void ListContainerBase::RemoveLast() { 355 void ListContainerHelper::RemoveLast() {
361 data_->RemoveLast(); 356 data_->RemoveLast();
362 } 357 }
363 358
364 void ListContainerBase::EraseAndInvalidateAllPointers( 359 void ListContainerHelper::EraseAndInvalidateAllPointers(
365 ListContainerBase::Iterator* position) { 360 ListContainerHelper::Iterator* position) {
366 data_->Erase(position); 361 data_->Erase(position);
367 } 362 }
368 363
369 void ListContainerBase::InsertBeforeAndInvalidateAllPointers( 364 void ListContainerHelper::InsertBeforeAndInvalidateAllPointers(
370 ListContainerBase::Iterator* position, 365 ListContainerHelper::Iterator* position,
371 size_t count) { 366 size_t count) {
372 data_->InsertBefore(position, count); 367 data_->InsertBefore(position, count);
373 } 368 }
374 369
375 ListContainerBase::ConstReverseIterator ListContainerBase::crbegin() const { 370 ListContainerHelper::ConstReverseIterator ListContainerHelper::crbegin() const {
376 if (data_->IsEmpty()) 371 if (data_->IsEmpty())
377 return crend(); 372 return crend();
378 373
379 size_t id = data_->LastInnerListId(); 374 size_t id = data_->LastInnerListId();
380 return ConstReverseIterator(data_.get(), id, 375 return ConstReverseIterator(data_.get(), id,
381 data_->InnerListById(id)->LastElement(), 0); 376 data_->InnerListById(id)->LastElement(), 0);
382 } 377 }
383 378
384 ListContainerBase::ConstReverseIterator ListContainerBase::crend() const { 379 ListContainerHelper::ConstReverseIterator ListContainerHelper::crend() const {
385 return ConstReverseIterator(data_.get(), static_cast<size_t>(-1), NULL, 380 return ConstReverseIterator(data_.get(), static_cast<size_t>(-1), NULL,
386 size()); 381 size());
387 } 382 }
388 383
389 ListContainerBase::ReverseIterator ListContainerBase::rbegin() { 384 ListContainerHelper::ReverseIterator ListContainerHelper::rbegin() {
390 if (data_->IsEmpty()) 385 if (data_->IsEmpty())
391 return rend(); 386 return rend();
392 387
393 size_t id = data_->LastInnerListId(); 388 size_t id = data_->LastInnerListId();
394 return ReverseIterator(data_.get(), id, 389 return ReverseIterator(data_.get(), id,
395 data_->InnerListById(id)->LastElement(), 0); 390 data_->InnerListById(id)->LastElement(), 0);
396 } 391 }
397 392
398 ListContainerBase::ReverseIterator ListContainerBase::rend() { 393 ListContainerHelper::ReverseIterator ListContainerHelper::rend() {
399 return ReverseIterator(data_.get(), static_cast<size_t>(-1), NULL, size()); 394 return ReverseIterator(data_.get(), static_cast<size_t>(-1), NULL, size());
400 } 395 }
401 396
402 ListContainerBase::ConstIterator ListContainerBase::cbegin() const { 397 ListContainerHelper::ConstIterator ListContainerHelper::cbegin() const {
403 if (data_->IsEmpty()) 398 if (data_->IsEmpty())
404 return cend(); 399 return cend();
405 400
406 size_t id = data_->FirstInnerListId(); 401 size_t id = data_->FirstInnerListId();
407 return ConstIterator(data_.get(), id, data_->InnerListById(id)->Begin(), 0); 402 return ConstIterator(data_.get(), id, data_->InnerListById(id)->Begin(), 0);
408 } 403 }
409 404
410 ListContainerBase::ConstIterator ListContainerBase::cend() const { 405 ListContainerHelper::ConstIterator ListContainerHelper::cend() const {
411 if (data_->IsEmpty()) 406 if (data_->IsEmpty())
412 return ConstIterator(data_.get(), 0, NULL, size()); 407 return ConstIterator(data_.get(), 0, NULL, size());
413 408
414 size_t id = data_->list_count(); 409 size_t id = data_->list_count();
415 return ConstIterator(data_.get(), id, NULL, size()); 410 return ConstIterator(data_.get(), id, NULL, size());
416 } 411 }
417 412
418 ListContainerBase::Iterator ListContainerBase::begin() { 413 ListContainerHelper::Iterator ListContainerHelper::begin() {
419 if (data_->IsEmpty()) 414 if (data_->IsEmpty())
420 return end(); 415 return end();
421 416
422 size_t id = data_->FirstInnerListId(); 417 size_t id = data_->FirstInnerListId();
423 return Iterator(data_.get(), id, data_->InnerListById(id)->Begin(), 0); 418 return Iterator(data_.get(), id, data_->InnerListById(id)->Begin(), 0);
424 } 419 }
425 420
426 ListContainerBase::Iterator ListContainerBase::end() { 421 ListContainerHelper::Iterator ListContainerHelper::end() {
427 if (data_->IsEmpty()) 422 if (data_->IsEmpty())
428 return Iterator(data_.get(), 0, NULL, size()); 423 return Iterator(data_.get(), 0, NULL, size());
429 424
430 size_t id = data_->list_count(); 425 size_t id = data_->list_count();
431 return Iterator(data_.get(), id, NULL, size()); 426 return Iterator(data_.get(), id, NULL, size());
432 } 427 }
433 428
434 ListContainerBase::ConstIterator ListContainerBase::IteratorAt( 429 ListContainerHelper::ConstIterator ListContainerHelper::IteratorAt(
435 size_t index) const { 430 size_t index) const {
436 DCHECK_LT(index, size()); 431 DCHECK_LT(index, size());
437 size_t original_index = index; 432 size_t original_index = index;
438 size_t list_index; 433 size_t list_index;
439 for (list_index = 0; list_index < data_->list_count(); ++list_index) { 434 for (list_index = 0; list_index < data_->list_count(); ++list_index) {
440 size_t current_size = data_->InnerListById(list_index)->size; 435 size_t current_size = data_->InnerListById(list_index)->size;
441 if (index < current_size) 436 if (index < current_size)
442 break; 437 break;
443 index -= current_size; 438 index -= current_size;
444 } 439 }
445 return ConstIterator(data_.get(), list_index, 440 return ConstIterator(data_.get(), list_index,
446 data_->InnerListById(list_index)->ElementAt(index), 441 data_->InnerListById(list_index)->ElementAt(index),
447 original_index); 442 original_index);
448 } 443 }
449 444
450 ListContainerBase::Iterator ListContainerBase::IteratorAt(size_t index) { 445 ListContainerHelper::Iterator ListContainerHelper::IteratorAt(size_t index) {
451 DCHECK_LT(index, size()); 446 DCHECK_LT(index, size());
452 size_t original_index = index; 447 size_t original_index = index;
453 size_t list_index; 448 size_t list_index;
454 for (list_index = 0; list_index < data_->list_count(); ++list_index) { 449 for (list_index = 0; list_index < data_->list_count(); ++list_index) {
455 size_t current_size = data_->InnerListById(list_index)->size; 450 size_t current_size = data_->InnerListById(list_index)->size;
456 if (index < current_size) 451 if (index < current_size)
457 break; 452 break;
458 index -= current_size; 453 index -= current_size;
459 } 454 }
460 return Iterator(data_.get(), list_index, 455 return Iterator(data_.get(), list_index,
461 data_->InnerListById(list_index)->ElementAt(index), 456 data_->InnerListById(list_index)->ElementAt(index),
462 original_index); 457 original_index);
463 } 458 }
464 459
465 void* ListContainerBase::Allocate(size_t size_of_actual_element_in_bytes) { 460 void* ListContainerHelper::Allocate(size_t size_of_actual_element_in_bytes) {
466 DCHECK_LE(size_of_actual_element_in_bytes, data_->element_size()); 461 DCHECK_LE(size_of_actual_element_in_bytes, data_->element_size());
467 return data_->Allocate(); 462 return data_->Allocate();
468 } 463 }
469 464
470 size_t ListContainerBase::size() const { 465 size_t ListContainerHelper::size() const {
471 return data_->size(); 466 return data_->size();
472 } 467 }
473 468
474 bool ListContainerBase::empty() const { 469 bool ListContainerHelper::empty() const {
475 return data_->IsEmpty(); 470 return data_->IsEmpty();
476 } 471 }
477 472
478 size_t ListContainerBase::MaxSizeForDerivedClass() const { 473 size_t ListContainerHelper::MaxSizeForDerivedClass() const {
479 return data_->element_size(); 474 return data_->element_size();
480 } 475 }
481 476
482 size_t ListContainerBase::GetCapacityInBytes() const { 477 size_t ListContainerHelper::GetCapacityInBytes() const {
483 return data_->Capacity() * data_->element_size(); 478 return data_->Capacity() * data_->element_size();
484 } 479 }
485 480
486 void ListContainerBase::clear() { 481 void ListContainerHelper::clear() {
487 data_->Clear(); 482 data_->Clear();
488 } 483 }
489 484
490 size_t ListContainerBase::AvailableSizeWithoutAnotherAllocationForTesting() 485 size_t ListContainerHelper::AvailableSizeWithoutAnotherAllocationForTesting()
491 const { 486 const {
492 return data_->NumAvailableElementsInLastList(); 487 return data_->NumAvailableElementsInLastList();
493 } 488 }
494 489
495 // ListContainerBase::Iterator 490 // ListContainerHelper::Iterator
496 ///////////////////////////////////////////////// 491 /////////////////////////////////////////////////
497 ListContainerBase::Iterator::Iterator(ListContainerCharAllocator* container, 492 ListContainerHelper::Iterator::Iterator(ListContainerCharAllocator* container,
498 size_t vector_ind, 493 size_t vector_ind,
499 char* item_iter, 494 char* item_iter,
500 size_t index) 495 size_t index)
501 : PositionInListContainerCharAllocator(container, vector_ind, item_iter), 496 : PositionInListContainerCharAllocator(container, vector_ind, item_iter),
502 index_(index) { 497 index_(index) {}
503 }
504 498
505 ListContainerBase::Iterator::~Iterator() { 499 ListContainerHelper::Iterator::~Iterator() {}
506 }
507 500
508 size_t ListContainerBase::Iterator::index() const { 501 size_t ListContainerHelper::Iterator::index() const {
509 return index_; 502 return index_;
510 } 503 }
511 504
512 // ListContainerBase::ConstIterator 505 // ListContainerHelper::ConstIterator
513 ///////////////////////////////////////////////// 506 /////////////////////////////////////////////////
514 ListContainerBase::ConstIterator::ConstIterator( 507 ListContainerHelper::ConstIterator::ConstIterator(
515 const ListContainerBase::Iterator& other) 508 const ListContainerHelper::Iterator& other)
516 : PositionInListContainerCharAllocator(other), index_(other.index()) { 509 : PositionInListContainerCharAllocator(other), index_(other.index()) {}
517 }
518 510
519 ListContainerBase::ConstIterator::ConstIterator( 511 ListContainerHelper::ConstIterator::ConstIterator(
520 ListContainerCharAllocator* container, 512 ListContainerCharAllocator* container,
521 size_t vector_ind, 513 size_t vector_ind,
522 char* item_iter, 514 char* item_iter,
523 size_t index) 515 size_t index)
524 : PositionInListContainerCharAllocator(container, vector_ind, item_iter), 516 : PositionInListContainerCharAllocator(container, vector_ind, item_iter),
525 index_(index) { 517 index_(index) {}
526 }
527 518
528 ListContainerBase::ConstIterator::~ConstIterator() { 519 ListContainerHelper::ConstIterator::~ConstIterator() {}
529 }
530 520
531 size_t ListContainerBase::ConstIterator::index() const { 521 size_t ListContainerHelper::ConstIterator::index() const {
532 return index_; 522 return index_;
533 } 523 }
534 524
535 // ListContainerBase::ReverseIterator 525 // ListContainerHelper::ReverseIterator
536 ///////////////////////////////////////////////// 526 /////////////////////////////////////////////////
537 ListContainerBase::ReverseIterator::ReverseIterator( 527 ListContainerHelper::ReverseIterator::ReverseIterator(
538 ListContainerCharAllocator* container, 528 ListContainerCharAllocator* container,
539 size_t vector_ind, 529 size_t vector_ind,
540 char* item_iter, 530 char* item_iter,
541 size_t index) 531 size_t index)
542 : PositionInListContainerCharAllocator(container, vector_ind, item_iter), 532 : PositionInListContainerCharAllocator(container, vector_ind, item_iter),
543 index_(index) { 533 index_(index) {}
544 }
545 534
546 ListContainerBase::ReverseIterator::~ReverseIterator() { 535 ListContainerHelper::ReverseIterator::~ReverseIterator() {}
547 }
548 536
549 size_t ListContainerBase::ReverseIterator::index() const { 537 size_t ListContainerHelper::ReverseIterator::index() const {
550 return index_; 538 return index_;
551 } 539 }
552 540
553 // ListContainerBase::ConstReverseIterator 541 // ListContainerHelper::ConstReverseIterator
554 ///////////////////////////////////////////////// 542 /////////////////////////////////////////////////
555 ListContainerBase::ConstReverseIterator::ConstReverseIterator( 543 ListContainerHelper::ConstReverseIterator::ConstReverseIterator(
556 const ListContainerBase::ReverseIterator& other) 544 const ListContainerHelper::ReverseIterator& other)
557 : PositionInListContainerCharAllocator(other), index_(other.index()) { 545 : PositionInListContainerCharAllocator(other), index_(other.index()) {}
558 }
559 546
560 ListContainerBase::ConstReverseIterator::ConstReverseIterator( 547 ListContainerHelper::ConstReverseIterator::ConstReverseIterator(
561 ListContainerCharAllocator* container, 548 ListContainerCharAllocator* container,
562 size_t vector_ind, 549 size_t vector_ind,
563 char* item_iter, 550 char* item_iter,
564 size_t index) 551 size_t index)
565 : PositionInListContainerCharAllocator(container, vector_ind, item_iter), 552 : PositionInListContainerCharAllocator(container, vector_ind, item_iter),
566 index_(index) { 553 index_(index) {}
567 }
568 554
569 ListContainerBase::ConstReverseIterator::~ConstReverseIterator() { 555 ListContainerHelper::ConstReverseIterator::~ConstReverseIterator() {}
570 }
571 556
572 size_t ListContainerBase::ConstReverseIterator::index() const { 557 size_t ListContainerHelper::ConstReverseIterator::index() const {
573 return index_; 558 return index_;
574 } 559 }
575 560
576 } // namespace cc 561 } // namespace cc
OLDNEW
« cc/base/list_container.h ('K') | « cc/base/list_container.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698