| OLD | NEW |
| 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 #ifndef CC_BASE_LIST_CONTAINER_H_ | 5 #ifndef CC_BASE_LIST_CONTAINER_H_ |
| 6 #define CC_BASE_LIST_CONTAINER_H_ | 6 #define CC_BASE_LIST_CONTAINER_H_ |
| 7 | 7 |
| 8 #include "base/logging.h" |
| 8 #include "base/macros.h" | 9 #include "base/macros.h" |
| 9 #include "base/memory/scoped_ptr.h" | 10 #include "base/memory/scoped_ptr.h" |
| 10 #include "cc/base/cc_export.h" | 11 #include "cc/base/cc_export.h" |
| 11 | 12 |
| 12 namespace cc { | 13 namespace cc { |
| 13 | 14 |
| 14 // ListContainer is a container type that handles allocating contiguous memory | 15 // ListContainer is a container type that handles allocating contiguous memory |
| 15 // for new elements and traversing through elements with either iterator or | 16 // for new elements and traversing through elements with either iterator or |
| 16 // reverse iterator. Since this container hands out raw pointers of its | 17 // reverse iterator. Since this container hands out raw pointers of its |
| 17 // elements, it is very important that this container never reallocate its | 18 // elements, it is very important that this container never reallocate its |
| (...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 134 size_t index() const; | 135 size_t index() const; |
| 135 | 136 |
| 136 protected: | 137 protected: |
| 137 // This is used to track how many increment has happened since rbegin(). It | 138 // This is used to track how many increment has happened since rbegin(). It |
| 138 // is used to avoid double increment at places an index reference is | 139 // is used to avoid double increment at places an index reference is |
| 139 // needed. For reverse iterator this means rbegin() corresponds to index 0 | 140 // needed. For reverse iterator this means rbegin() corresponds to index 0 |
| 140 // and rend() corresponds to index |size|. | 141 // and rend() corresponds to index |size|. |
| 141 size_t index_; | 142 size_t index_; |
| 142 }; | 143 }; |
| 143 | 144 |
| 144 // Unlike the ListContainer method, this one does not invoke element | 145 // Unlike the ListContainer methods, these do not invoke element destructors. |
| 145 // destructors. | 146 void RemoveLast(); |
| 146 void EraseAndInvalidateAllPointers(Iterator position); | 147 void EraseAndInvalidateAllPointers(Iterator position); |
| 147 | 148 |
| 148 ConstReverseIterator crbegin() const; | 149 ConstReverseIterator crbegin() const; |
| 149 ConstReverseIterator crend() const; | 150 ConstReverseIterator crend() const; |
| 150 ReverseIterator rbegin(); | 151 ReverseIterator rbegin(); |
| 151 ReverseIterator rend(); | 152 ReverseIterator rend(); |
| 152 ConstIterator cbegin() const; | 153 ConstIterator cbegin() const; |
| 153 ConstIterator cend() const; | 154 ConstIterator cend() const; |
| 154 Iterator begin(); | 155 Iterator begin(); |
| 155 Iterator end(); | 156 Iterator end(); |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 202 for (Iterator i = begin(); i != end(); ++i) { | 203 for (Iterator i = begin(); i != end(); ++i) { |
| 203 i->~BaseElementType(); | 204 i->~BaseElementType(); |
| 204 } | 205 } |
| 205 } | 206 } |
| 206 | 207 |
| 207 class Iterator; | 208 class Iterator; |
| 208 class ConstIterator; | 209 class ConstIterator; |
| 209 class ReverseIterator; | 210 class ReverseIterator; |
| 210 class ConstReverseIterator; | 211 class ConstReverseIterator; |
| 211 | 212 |
| 213 // Removes the last element of the list and makes its space available for |
| 214 // allocation. |
| 215 void RemoveLast() { |
| 216 DCHECK(!empty()); |
| 217 BaseElementType* item = *rbegin(); |
| 218 item->~BaseElementType(); |
| 219 ListContainerBase::RemoveLast(); |
| 220 } |
| 221 |
| 212 // When called, all raw pointers that have been handed out are no longer | 222 // When called, all raw pointers that have been handed out are no longer |
| 213 // valid. Use with caution. | 223 // valid. Use with caution. |
| 214 // This function does not deallocate memory. | 224 // This function does not deallocate memory. |
| 215 void EraseAndInvalidateAllPointers(Iterator position) { | 225 void EraseAndInvalidateAllPointers(Iterator position) { |
| 216 BaseElementType* item = *position; | 226 BaseElementType* item = *position; |
| 217 item->~BaseElementType(); | 227 item->~BaseElementType(); |
| 218 ListContainerBase::EraseAndInvalidateAllPointers(position); | 228 ListContainerBase::EraseAndInvalidateAllPointers(position); |
| 219 } | 229 } |
| 220 | 230 |
| 221 ConstReverseIterator crbegin() const { | 231 ConstReverseIterator crbegin() const { |
| (...skipping 216 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 438 ListContainerBase::ConstReverseIterator base_iterator) | 448 ListContainerBase::ConstReverseIterator base_iterator) |
| 439 : ListContainerBase::ConstReverseIterator(base_iterator) {} | 449 : ListContainerBase::ConstReverseIterator(base_iterator) {} |
| 440 friend ConstReverseIterator ListContainer<BaseElementType>::crbegin() const; | 450 friend ConstReverseIterator ListContainer<BaseElementType>::crbegin() const; |
| 441 friend ConstReverseIterator ListContainer<BaseElementType>::crend() const; | 451 friend ConstReverseIterator ListContainer<BaseElementType>::crend() const; |
| 442 }; | 452 }; |
| 443 }; | 453 }; |
| 444 | 454 |
| 445 } // namespace cc | 455 } // namespace cc |
| 446 | 456 |
| 447 #endif // CC_BASE_LIST_CONTAINER_H_ | 457 #endif // CC_BASE_LIST_CONTAINER_H_ |
| OLD | NEW |