ajwong@chromium.org | 59f1fbb | 2012-01-20 09:03:45 +0900 | [diff] [blame] | 1 | // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
ben@chromium.org | bc3bca7 | 2009-05-05 12:31:44 +0900 | [diff] [blame] | 2 | // Use of this source code is governed by a BSD-style license that can be |
| 3 | // found in the LICENSE file. |
| 4 | |
levin@chromium.org | 5c52868 | 2011-03-28 10:54:15 +0900 | [diff] [blame] | 5 | #ifndef BASE_MEMORY_SCOPED_VECTOR_H_ |
| 6 | #define BASE_MEMORY_SCOPED_VECTOR_H_ |
ben@chromium.org | bc3bca7 | 2009-05-05 12:31:44 +0900 | [diff] [blame] | 7 | |
| 8 | #include <vector> |
| 9 | |
thestig@chromium.org | 76ed21e | 2010-08-28 06:39:48 +0900 | [diff] [blame] | 10 | #include "base/basictypes.h" |
pliard@chromium.org | 6446c17 | 2013-11-29 21:23:43 +0900 | [diff] [blame] | 11 | #include "base/logging.h" |
sky | 79645f9 | 2015-01-17 04:21:47 +0900 | [diff] [blame] | 12 | #include "base/memory/scoped_ptr.h" |
ajwong@chromium.org | 59f1fbb | 2012-01-20 09:03:45 +0900 | [diff] [blame] | 13 | #include "base/move.h" |
dilmah@chromium.org | dc4b970 | 2011-07-20 07:13:24 +0900 | [diff] [blame] | 14 | #include "base/stl_util.h" |
ben@chromium.org | bc3bca7 | 2009-05-05 12:31:44 +0900 | [diff] [blame] | 15 | |
| 16 | // ScopedVector wraps a vector deleting the elements from its |
| 17 | // destructor. |
mgiuca | 246ac37 | 2015-11-12 12:21:55 +0900 | [diff] [blame] | 18 | // |
| 19 | // TODO(http://crbug.com/554289): DEPRECATED: Use std::vector instead (now that |
| 20 | // we have support for moveable types inside containers). |
ben@chromium.org | bc3bca7 | 2009-05-05 12:31:44 +0900 | [diff] [blame] | 21 | template <class T> |
| 22 | class ScopedVector { |
dcheng | 8e5e0e6 | 2015-12-01 21:09:52 +0900 | [diff] [blame^] | 23 | MOVE_ONLY_TYPE_FOR_CPP_03(ScopedVector) |
ajwong@chromium.org | 59f1fbb | 2012-01-20 09:03:45 +0900 | [diff] [blame] | 24 | |
ben@chromium.org | bc3bca7 | 2009-05-05 12:31:44 +0900 | [diff] [blame] | 25 | public: |
pkasting@chromium.org | 52282e5 | 2012-03-27 07:16:44 +0900 | [diff] [blame] | 26 | typedef typename std::vector<T*>::allocator_type allocator_type; |
| 27 | typedef typename std::vector<T*>::size_type size_type; |
| 28 | typedef typename std::vector<T*>::difference_type difference_type; |
| 29 | typedef typename std::vector<T*>::pointer pointer; |
| 30 | typedef typename std::vector<T*>::const_pointer const_pointer; |
| 31 | typedef typename std::vector<T*>::reference reference; |
| 32 | typedef typename std::vector<T*>::const_reference const_reference; |
| 33 | typedef typename std::vector<T*>::value_type value_type; |
ben@chromium.org | bc3bca7 | 2009-05-05 12:31:44 +0900 | [diff] [blame] | 34 | typedef typename std::vector<T*>::iterator iterator; |
| 35 | typedef typename std::vector<T*>::const_iterator const_iterator; |
thakis@chromium.org | 5866c4d | 2010-02-17 08:45:38 +0900 | [diff] [blame] | 36 | typedef typename std::vector<T*>::reverse_iterator reverse_iterator; |
| 37 | typedef typename std::vector<T*>::const_reverse_iterator |
| 38 | const_reverse_iterator; |
ben@chromium.org | bc3bca7 | 2009-05-05 12:31:44 +0900 | [diff] [blame] | 39 | |
| 40 | ScopedVector() {} |
derat@chromium.org | ba463ee | 2012-07-19 09:38:58 +0900 | [diff] [blame] | 41 | ~ScopedVector() { clear(); } |
dcheng | 8e5e0e6 | 2015-12-01 21:09:52 +0900 | [diff] [blame^] | 42 | ScopedVector(ScopedVector&& other) { swap(other); } |
ajwong@chromium.org | 59f1fbb | 2012-01-20 09:03:45 +0900 | [diff] [blame] | 43 | |
dcheng | 8e5e0e6 | 2015-12-01 21:09:52 +0900 | [diff] [blame^] | 44 | ScopedVector& operator=(ScopedVector&& rhs) { |
| 45 | swap(rhs); |
ajwong@chromium.org | 59f1fbb | 2012-01-20 09:03:45 +0900 | [diff] [blame] | 46 | return *this; |
| 47 | } |
ben@chromium.org | bc3bca7 | 2009-05-05 12:31:44 +0900 | [diff] [blame] | 48 | |
groby@chromium.org | bcb5035 | 2013-07-02 08:26:14 +0900 | [diff] [blame] | 49 | reference operator[](size_t index) { return v_[index]; } |
| 50 | const_reference operator[](size_t index) const { return v_[index]; } |
ben@chromium.org | bc3bca7 | 2009-05-05 12:31:44 +0900 | [diff] [blame] | 51 | |
tfarina@chromium.org | 920d248 | 2012-07-24 15:08:48 +0900 | [diff] [blame] | 52 | bool empty() const { return v_.empty(); } |
| 53 | size_t size() const { return v_.size(); } |
ben@chromium.org | bc3bca7 | 2009-05-05 12:31:44 +0900 | [diff] [blame] | 54 | |
tfarina@chromium.org | 920d248 | 2012-07-24 15:08:48 +0900 | [diff] [blame] | 55 | reverse_iterator rbegin() { return v_.rbegin(); } |
| 56 | const_reverse_iterator rbegin() const { return v_.rbegin(); } |
| 57 | reverse_iterator rend() { return v_.rend(); } |
| 58 | const_reverse_iterator rend() const { return v_.rend(); } |
thakis@chromium.org | 5866c4d | 2010-02-17 08:45:38 +0900 | [diff] [blame] | 59 | |
tfarina@chromium.org | 920d248 | 2012-07-24 15:08:48 +0900 | [diff] [blame] | 60 | iterator begin() { return v_.begin(); } |
| 61 | const_iterator begin() const { return v_.begin(); } |
| 62 | iterator end() { return v_.end(); } |
| 63 | const_iterator end() const { return v_.end(); } |
ben@chromium.org | bc3bca7 | 2009-05-05 12:31:44 +0900 | [diff] [blame] | 64 | |
tfarina@chromium.org | 920d248 | 2012-07-24 15:08:48 +0900 | [diff] [blame] | 65 | const_reference front() const { return v_.front(); } |
| 66 | reference front() { return v_.front(); } |
| 67 | const_reference back() const { return v_.back(); } |
| 68 | reference back() { return v_.back(); } |
asvitkine@chromium.org | 6598ee8 | 2012-06-05 08:29:50 +0900 | [diff] [blame] | 69 | |
tfarina@chromium.org | 920d248 | 2012-07-24 15:08:48 +0900 | [diff] [blame] | 70 | void push_back(T* elem) { v_.push_back(elem); } |
sky | 79645f9 | 2015-01-17 04:21:47 +0900 | [diff] [blame] | 71 | void push_back(scoped_ptr<T> elem) { v_.push_back(elem.release()); } |
ben@chromium.org | bc3bca7 | 2009-05-05 12:31:44 +0900 | [diff] [blame] | 72 | |
pliard@chromium.org | 6446c17 | 2013-11-29 21:23:43 +0900 | [diff] [blame] | 73 | void pop_back() { |
| 74 | DCHECK(!empty()); |
| 75 | delete v_.back(); |
| 76 | v_.pop_back(); |
| 77 | } |
| 78 | |
tfarina@chromium.org | 920d248 | 2012-07-24 15:08:48 +0900 | [diff] [blame] | 79 | std::vector<T*>& get() { return v_; } |
| 80 | const std::vector<T*>& get() const { return v_; } |
| 81 | void swap(std::vector<T*>& other) { v_.swap(other); } |
| 82 | void swap(ScopedVector<T>& other) { v_.swap(other.v_); } |
erg@google.com | bf6ce9f | 2010-01-27 08:08:02 +0900 | [diff] [blame] | 83 | void release(std::vector<T*>* out) { |
tfarina@chromium.org | 920d248 | 2012-07-24 15:08:48 +0900 | [diff] [blame] | 84 | out->swap(v_); |
| 85 | v_.clear(); |
erg@google.com | bf6ce9f | 2010-01-27 08:08:02 +0900 | [diff] [blame] | 86 | } |
ben@chromium.org | bc3bca7 | 2009-05-05 12:31:44 +0900 | [diff] [blame] | 87 | |
tfarina@chromium.org | 920d248 | 2012-07-24 15:08:48 +0900 | [diff] [blame] | 88 | void reserve(size_t capacity) { v_.reserve(capacity); } |
gavinp@chromium.org | b2ca968 | 2012-11-28 05:44:49 +0900 | [diff] [blame] | 89 | |
| 90 | // Resize, deleting elements in the disappearing range if we are shrinking. |
| 91 | void resize(size_t new_size) { |
| 92 | if (v_.size() > new_size) |
| 93 | STLDeleteContainerPointers(v_.begin() + new_size, v_.end()); |
| 94 | v_.resize(new_size); |
| 95 | } |
ben@chromium.org | bc3bca7 | 2009-05-05 12:31:44 +0900 | [diff] [blame] | 96 | |
tfarina@chromium.org | d1f1868 | 2012-07-01 00:46:03 +0900 | [diff] [blame] | 97 | template<typename InputIterator> |
| 98 | void assign(InputIterator begin, InputIterator end) { |
tfarina@chromium.org | 920d248 | 2012-07-24 15:08:48 +0900 | [diff] [blame] | 99 | v_.assign(begin, end); |
tfarina@chromium.org | d1f1868 | 2012-07-01 00:46:03 +0900 | [diff] [blame] | 100 | } |
| 101 | |
tfarina@chromium.org | 920d248 | 2012-07-24 15:08:48 +0900 | [diff] [blame] | 102 | void clear() { STLDeleteElements(&v_); } |
derat@chromium.org | ba463ee | 2012-07-19 09:38:58 +0900 | [diff] [blame] | 103 | |
| 104 | // Like |clear()|, but doesn't delete any elements. |
tfarina@chromium.org | 920d248 | 2012-07-24 15:08:48 +0900 | [diff] [blame] | 105 | void weak_clear() { v_.clear(); } |
tfarina@chromium.org | d1f1868 | 2012-07-01 00:46:03 +0900 | [diff] [blame] | 106 | |
thakis@chromium.org | 7e47e4a | 2010-08-31 05:52:46 +0900 | [diff] [blame] | 107 | // Lets the ScopedVector take ownership of |x|. |
| 108 | iterator insert(iterator position, T* x) { |
tfarina@chromium.org | 920d248 | 2012-07-24 15:08:48 +0900 | [diff] [blame] | 109 | return v_.insert(position, x); |
thakis@chromium.org | 7e47e4a | 2010-08-31 05:52:46 +0900 | [diff] [blame] | 110 | } |
| 111 | |
avi | 9607151 | 2015-06-24 00:43:37 +0900 | [diff] [blame] | 112 | iterator insert(iterator position, scoped_ptr<T> x) { |
| 113 | return v_.insert(position, x.release()); |
| 114 | } |
| 115 | |
scr@chromium.org | 80f0c1a | 2011-03-29 07:27:34 +0900 | [diff] [blame] | 116 | // Lets the ScopedVector take ownership of elements in [first,last). |
| 117 | template<typename InputIterator> |
| 118 | void insert(iterator position, InputIterator first, InputIterator last) { |
tfarina@chromium.org | 920d248 | 2012-07-24 15:08:48 +0900 | [diff] [blame] | 119 | v_.insert(position, first, last); |
scr@chromium.org | 80f0c1a | 2011-03-29 07:27:34 +0900 | [diff] [blame] | 120 | } |
| 121 | |
thakis@chromium.org | 7e47e4a | 2010-08-31 05:52:46 +0900 | [diff] [blame] | 122 | iterator erase(iterator position) { |
| 123 | delete *position; |
tfarina@chromium.org | 920d248 | 2012-07-24 15:08:48 +0900 | [diff] [blame] | 124 | return v_.erase(position); |
thakis@chromium.org | 7e47e4a | 2010-08-31 05:52:46 +0900 | [diff] [blame] | 125 | } |
| 126 | |
| 127 | iterator erase(iterator first, iterator last) { |
| 128 | STLDeleteContainerPointers(first, last); |
tfarina@chromium.org | 920d248 | 2012-07-24 15:08:48 +0900 | [diff] [blame] | 129 | return v_.erase(first, last); |
thakis@chromium.org | 7e47e4a | 2010-08-31 05:52:46 +0900 | [diff] [blame] | 130 | } |
| 131 | |
| 132 | // Like |erase()|, but doesn't delete the element at |position|. |
| 133 | iterator weak_erase(iterator position) { |
tfarina@chromium.org | 920d248 | 2012-07-24 15:08:48 +0900 | [diff] [blame] | 134 | return v_.erase(position); |
thakis@chromium.org | 7e47e4a | 2010-08-31 05:52:46 +0900 | [diff] [blame] | 135 | } |
| 136 | |
| 137 | // Like |erase()|, but doesn't delete the elements in [first, last). |
| 138 | iterator weak_erase(iterator first, iterator last) { |
tfarina@chromium.org | 920d248 | 2012-07-24 15:08:48 +0900 | [diff] [blame] | 139 | return v_.erase(first, last); |
thakis@chromium.org | 7e47e4a | 2010-08-31 05:52:46 +0900 | [diff] [blame] | 140 | } |
tfarina@chromium.org | d1f1868 | 2012-07-01 00:46:03 +0900 | [diff] [blame] | 141 | |
ben@chromium.org | bc3bca7 | 2009-05-05 12:31:44 +0900 | [diff] [blame] | 142 | private: |
tfarina@chromium.org | 920d248 | 2012-07-24 15:08:48 +0900 | [diff] [blame] | 143 | std::vector<T*> v_; |
ben@chromium.org | bc3bca7 | 2009-05-05 12:31:44 +0900 | [diff] [blame] | 144 | }; |
| 145 | |
levin@chromium.org | 5c52868 | 2011-03-28 10:54:15 +0900 | [diff] [blame] | 146 | #endif // BASE_MEMORY_SCOPED_VECTOR_H_ |