| // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef BASE_MEMORY_SCOPED_VECTOR_H_ |
| #define BASE_MEMORY_SCOPED_VECTOR_H_ |
| #pragma once |
| |
| #include <vector> |
| |
| #include "base/basictypes.h" |
| #include "base/stl_util-inl.h" |
| |
| // ScopedVector wraps a vector deleting the elements from its |
| // destructor. |
| template <class T> |
| class ScopedVector { |
| public: |
| typedef typename std::vector<T*>::iterator iterator; |
| typedef typename std::vector<T*>::const_iterator const_iterator; |
| typedef typename std::vector<T*>::reverse_iterator reverse_iterator; |
| typedef typename std::vector<T*>::const_reverse_iterator |
| const_reverse_iterator; |
| |
| ScopedVector() {} |
| ~ScopedVector() { reset(); } |
| |
| std::vector<T*>* operator->() { return &v; } |
| const std::vector<T*>* operator->() const { return &v; } |
| T*& operator[](size_t i) { return v[i]; } |
| const T* operator[](size_t i) const { return v[i]; } |
| |
| bool empty() const { return v.empty(); } |
| size_t size() const { return v.size(); } |
| |
| reverse_iterator rbegin() { return v.rbegin(); } |
| const_reverse_iterator rbegin() const { return v.rbegin(); } |
| reverse_iterator rend() { return v.rend(); } |
| const_reverse_iterator rend() const { return v.rend(); } |
| |
| iterator begin() { return v.begin(); } |
| const_iterator begin() const { return v.begin(); } |
| iterator end() { return v.end(); } |
| const_iterator end() const { return v.end(); } |
| |
| void push_back(T* elem) { v.push_back(elem); } |
| |
| std::vector<T*>& get() { return v; } |
| const std::vector<T*>& get() const { return v; } |
| void swap(ScopedVector<T>& other) { v.swap(other.v); } |
| void release(std::vector<T*>* out) { |
| out->swap(v); |
| v.clear(); |
| } |
| |
| void reset() { STLDeleteElements(&v); } |
| void reserve(size_t capacity) { v.reserve(capacity); } |
| void resize(size_t new_size) { v.resize(new_size); } |
| |
| // Lets the ScopedVector take ownership of |x|. |
| iterator insert(iterator position, T* x) { |
| return v.insert(position, x); |
| } |
| |
| // Lets the ScopedVector take ownership of elements in [first,last). |
| template<typename InputIterator> |
| void insert(iterator position, InputIterator first, InputIterator last) { |
| v.insert(position, first, last); |
| } |
| |
| iterator erase(iterator position) { |
| delete *position; |
| return v.erase(position); |
| } |
| |
| iterator erase(iterator first, iterator last) { |
| STLDeleteContainerPointers(first, last); |
| return v.erase(first, last); |
| } |
| |
| // Like |erase()|, but doesn't delete the element at |position|. |
| iterator weak_erase(iterator position) { |
| return v.erase(position); |
| } |
| |
| // Like |erase()|, but doesn't delete the elements in [first, last). |
| iterator weak_erase(iterator first, iterator last) { |
| return v.erase(first, last); |
| } |
| private: |
| std::vector<T*> v; |
| |
| DISALLOW_COPY_AND_ASSIGN(ScopedVector); |
| }; |
| |
| #endif // BASE_MEMORY_SCOPED_VECTOR_H_ |