OLD | NEW |
1 // Copyright 2012 The Chromium Authors. All rights reserved. | 1 // Copyright 2012 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_SCOPED_PTR_VECTOR_H_ | 5 #ifndef CC_BASE_SCOPED_PTR_VECTOR_H_ |
6 #define CC_BASE_SCOPED_PTR_VECTOR_H_ | 6 #define CC_BASE_SCOPED_PTR_VECTOR_H_ |
7 | 7 |
8 #include <algorithm> | 8 #include <algorithm> |
9 #include <vector> | 9 #include <vector> |
10 | 10 |
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
152 void swap(iterator a, iterator b) { | 152 void swap(iterator a, iterator b) { |
153 DCHECK(a < end()); | 153 DCHECK(a < end()); |
154 DCHECK(b < end()); | 154 DCHECK(b < end()); |
155 if (a == end() || b == end() || a == b) | 155 if (a == end() || b == end() || a == b) |
156 return; | 156 return; |
157 typename std::vector<T*>::iterator writable_a = a; | 157 typename std::vector<T*>::iterator writable_a = a; |
158 typename std::vector<T*>::iterator writable_b = b; | 158 typename std::vector<T*>::iterator writable_b = b; |
159 std::swap(*writable_a, *writable_b); | 159 std::swap(*writable_a, *writable_b); |
160 } | 160 } |
161 | 161 |
| 162 // This acts like std::remove_if but with one key difference. The values to be |
| 163 // removed to will each appear exactly once at or after the returned iterator, |
| 164 // so that erase(foo.remove_if(P), foo.end()) will not leak or double-free the |
| 165 // pointers in the vector. |
| 166 template <typename Predicate> |
| 167 iterator remove_if(Predicate predicate) { |
| 168 typename std::vector<T*>::iterator it = |
| 169 std::find_if(data_.begin(), data_.end(), predicate); |
| 170 typename std::vector<T*>::iterator end = data_.end(); |
| 171 if (it == end) |
| 172 return it; |
| 173 typename std::vector<T*>::iterator result = it; |
| 174 ++it; |
| 175 for (; it != end; ++it) { |
| 176 if (!static_cast<bool>(predicate(*it))) { |
| 177 // Swap here instead of just assign to |result| so that all the |
| 178 // pointers are preserved to be deleted afterward. |
| 179 std::swap(*result, *it); |
| 180 ++result; |
| 181 } |
| 182 } |
| 183 return result; |
| 184 } |
| 185 |
162 template<class Compare> | 186 template<class Compare> |
163 inline void sort(Compare comp) { | 187 inline void sort(Compare comp) { |
164 std::sort(data_.begin(), data_.end(), comp); | 188 std::sort(data_.begin(), data_.end(), comp); |
165 } | 189 } |
166 | 190 |
167 template <class Compare> | 191 template <class Compare> |
168 inline void make_heap(Compare comp) { | 192 inline void make_heap(Compare comp) { |
169 std::make_heap(data_.begin(), data_.end(), comp); | 193 std::make_heap(data_.begin(), data_.end(), comp); |
170 } | 194 } |
171 | 195 |
(...skipping 19 matching lines...) Expand all Loading... |
191 | 215 |
192 private: | 216 private: |
193 std::vector<T*> data_; | 217 std::vector<T*> data_; |
194 | 218 |
195 DISALLOW_COPY_AND_ASSIGN(ScopedPtrVector); | 219 DISALLOW_COPY_AND_ASSIGN(ScopedPtrVector); |
196 }; | 220 }; |
197 | 221 |
198 } // namespace cc | 222 } // namespace cc |
199 | 223 |
200 #endif // CC_BASE_SCOPED_PTR_VECTOR_H_ | 224 #endif // CC_BASE_SCOPED_PTR_VECTOR_H_ |
OLD | NEW |