blob: 5bfd94e319337ac8c1039f242862aa0b49887c85 [file] [log] [blame]
ajwong@chromium.org59f1fbb2012-01-20 09:03:45 +09001// Copyright (c) 2012 The Chromium Authors. All rights reserved.
ben@chromium.orgbc3bca72009-05-05 12:31:44 +09002// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
levin@chromium.org5c528682011-03-28 10:54:15 +09005#ifndef BASE_MEMORY_SCOPED_VECTOR_H_
6#define BASE_MEMORY_SCOPED_VECTOR_H_
ben@chromium.orgbc3bca72009-05-05 12:31:44 +09007
8#include <vector>
9
thestig@chromium.org76ed21e2010-08-28 06:39:48 +090010#include "base/basictypes.h"
pliard@chromium.org6446c172013-11-29 21:23:43 +090011#include "base/logging.h"
sky79645f92015-01-17 04:21:47 +090012#include "base/memory/scoped_ptr.h"
ajwong@chromium.org59f1fbb2012-01-20 09:03:45 +090013#include "base/move.h"
dilmah@chromium.orgdc4b9702011-07-20 07:13:24 +090014#include "base/stl_util.h"
ben@chromium.orgbc3bca72009-05-05 12:31:44 +090015
16// ScopedVector wraps a vector deleting the elements from its
17// destructor.
mgiuca246ac372015-11-12 12:21:55 +090018//
19// TODO(http://crbug.com/554289): DEPRECATED: Use std::vector instead (now that
20// we have support for moveable types inside containers).
ben@chromium.orgbc3bca72009-05-05 12:31:44 +090021template <class T>
22class ScopedVector {
dcheng8e5e0e62015-12-01 21:09:52 +090023 MOVE_ONLY_TYPE_FOR_CPP_03(ScopedVector)
ajwong@chromium.org59f1fbb2012-01-20 09:03:45 +090024
ben@chromium.orgbc3bca72009-05-05 12:31:44 +090025 public:
pkasting@chromium.org52282e52012-03-27 07:16:44 +090026 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.orgbc3bca72009-05-05 12:31:44 +090034 typedef typename std::vector<T*>::iterator iterator;
35 typedef typename std::vector<T*>::const_iterator const_iterator;
thakis@chromium.org5866c4d2010-02-17 08:45:38 +090036 typedef typename std::vector<T*>::reverse_iterator reverse_iterator;
37 typedef typename std::vector<T*>::const_reverse_iterator
38 const_reverse_iterator;
ben@chromium.orgbc3bca72009-05-05 12:31:44 +090039
40 ScopedVector() {}
derat@chromium.orgba463ee2012-07-19 09:38:58 +090041 ~ScopedVector() { clear(); }
dcheng8e5e0e62015-12-01 21:09:52 +090042 ScopedVector(ScopedVector&& other) { swap(other); }
ajwong@chromium.org59f1fbb2012-01-20 09:03:45 +090043
dcheng8e5e0e62015-12-01 21:09:52 +090044 ScopedVector& operator=(ScopedVector&& rhs) {
45 swap(rhs);
ajwong@chromium.org59f1fbb2012-01-20 09:03:45 +090046 return *this;
47 }
ben@chromium.orgbc3bca72009-05-05 12:31:44 +090048
groby@chromium.orgbcb50352013-07-02 08:26:14 +090049 reference operator[](size_t index) { return v_[index]; }
50 const_reference operator[](size_t index) const { return v_[index]; }
ben@chromium.orgbc3bca72009-05-05 12:31:44 +090051
tfarina@chromium.org920d2482012-07-24 15:08:48 +090052 bool empty() const { return v_.empty(); }
53 size_t size() const { return v_.size(); }
ben@chromium.orgbc3bca72009-05-05 12:31:44 +090054
tfarina@chromium.org920d2482012-07-24 15:08:48 +090055 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.org5866c4d2010-02-17 08:45:38 +090059
tfarina@chromium.org920d2482012-07-24 15:08:48 +090060 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.orgbc3bca72009-05-05 12:31:44 +090064
tfarina@chromium.org920d2482012-07-24 15:08:48 +090065 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.org6598ee82012-06-05 08:29:50 +090069
tfarina@chromium.org920d2482012-07-24 15:08:48 +090070 void push_back(T* elem) { v_.push_back(elem); }
sky79645f92015-01-17 04:21:47 +090071 void push_back(scoped_ptr<T> elem) { v_.push_back(elem.release()); }
ben@chromium.orgbc3bca72009-05-05 12:31:44 +090072
pliard@chromium.org6446c172013-11-29 21:23:43 +090073 void pop_back() {
74 DCHECK(!empty());
75 delete v_.back();
76 v_.pop_back();
77 }
78
tfarina@chromium.org920d2482012-07-24 15:08:48 +090079 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.combf6ce9f2010-01-27 08:08:02 +090083 void release(std::vector<T*>* out) {
tfarina@chromium.org920d2482012-07-24 15:08:48 +090084 out->swap(v_);
85 v_.clear();
erg@google.combf6ce9f2010-01-27 08:08:02 +090086 }
ben@chromium.orgbc3bca72009-05-05 12:31:44 +090087
tfarina@chromium.org920d2482012-07-24 15:08:48 +090088 void reserve(size_t capacity) { v_.reserve(capacity); }
gavinp@chromium.orgb2ca9682012-11-28 05:44:49 +090089
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.orgbc3bca72009-05-05 12:31:44 +090096
tfarina@chromium.orgd1f18682012-07-01 00:46:03 +090097 template<typename InputIterator>
98 void assign(InputIterator begin, InputIterator end) {
tfarina@chromium.org920d2482012-07-24 15:08:48 +090099 v_.assign(begin, end);
tfarina@chromium.orgd1f18682012-07-01 00:46:03 +0900100 }
101
tfarina@chromium.org920d2482012-07-24 15:08:48 +0900102 void clear() { STLDeleteElements(&v_); }
derat@chromium.orgba463ee2012-07-19 09:38:58 +0900103
104 // Like |clear()|, but doesn't delete any elements.
tfarina@chromium.org920d2482012-07-24 15:08:48 +0900105 void weak_clear() { v_.clear(); }
tfarina@chromium.orgd1f18682012-07-01 00:46:03 +0900106
thakis@chromium.org7e47e4a2010-08-31 05:52:46 +0900107 // Lets the ScopedVector take ownership of |x|.
108 iterator insert(iterator position, T* x) {
tfarina@chromium.org920d2482012-07-24 15:08:48 +0900109 return v_.insert(position, x);
thakis@chromium.org7e47e4a2010-08-31 05:52:46 +0900110 }
111
avi96071512015-06-24 00:43:37 +0900112 iterator insert(iterator position, scoped_ptr<T> x) {
113 return v_.insert(position, x.release());
114 }
115
scr@chromium.org80f0c1a2011-03-29 07:27:34 +0900116 // 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.org920d2482012-07-24 15:08:48 +0900119 v_.insert(position, first, last);
scr@chromium.org80f0c1a2011-03-29 07:27:34 +0900120 }
121
thakis@chromium.org7e47e4a2010-08-31 05:52:46 +0900122 iterator erase(iterator position) {
123 delete *position;
tfarina@chromium.org920d2482012-07-24 15:08:48 +0900124 return v_.erase(position);
thakis@chromium.org7e47e4a2010-08-31 05:52:46 +0900125 }
126
127 iterator erase(iterator first, iterator last) {
128 STLDeleteContainerPointers(first, last);
tfarina@chromium.org920d2482012-07-24 15:08:48 +0900129 return v_.erase(first, last);
thakis@chromium.org7e47e4a2010-08-31 05:52:46 +0900130 }
131
132 // Like |erase()|, but doesn't delete the element at |position|.
133 iterator weak_erase(iterator position) {
tfarina@chromium.org920d2482012-07-24 15:08:48 +0900134 return v_.erase(position);
thakis@chromium.org7e47e4a2010-08-31 05:52:46 +0900135 }
136
137 // Like |erase()|, but doesn't delete the elements in [first, last).
138 iterator weak_erase(iterator first, iterator last) {
tfarina@chromium.org920d2482012-07-24 15:08:48 +0900139 return v_.erase(first, last);
thakis@chromium.org7e47e4a2010-08-31 05:52:46 +0900140 }
tfarina@chromium.orgd1f18682012-07-01 00:46:03 +0900141
ben@chromium.orgbc3bca72009-05-05 12:31:44 +0900142 private:
tfarina@chromium.org920d2482012-07-24 15:08:48 +0900143 std::vector<T*> v_;
ben@chromium.orgbc3bca72009-05-05 12:31:44 +0900144};
145
levin@chromium.org5c528682011-03-28 10:54:15 +0900146#endif // BASE_MEMORY_SCOPED_VECTOR_H_