Index: base/memory/scoped_deque.h |
diff --git a/base/memory/scoped_deque.h b/base/memory/scoped_deque.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..2a391a59b13097fdeb2e1ad271a38c829b2767d5 |
--- /dev/null |
+++ b/base/memory/scoped_deque.h |
@@ -0,0 +1,107 @@ |
+// 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_DEQUE_H_ |
+#define BASE_MEMORY_SCOPED_DEQUE_H_ |
+#pragma once |
+ |
+#include <deque> |
+ |
+#include "base/basictypes.h" |
+#include "base/stl_util.h" |
+ |
+// ScopedDeque wraps a deque deleting the elements from its destructor |
+template <class T> |
+class ScopedDeque { |
+ public: |
+ typedef typename std::deque<T*>::iterator iterator; |
+ typedef typename std::deque<T*>::const_iterator const_iterator; |
+ typedef typename std::deque<T*>::reverse_iterator reverse_iterator; |
+ typedef typename std::deque<T*>::const_reverse_iterator |
+ const_reverse_iterator; |
+ |
+ ScopedDeque() {} |
+ ~ScopedDeque() { clear(); } |
+ |
+ std::deque<T*>* operator->() { return &d; } |
+ const std::deque<T*>* operator->() const { return &d; } |
+ T*& operator[](size_t i) { return d[i]; } |
+ const T* operator[](size_t i) const { return d[i]; } |
+ |
+ bool empty() const { return d.empty(); } |
+ size_t size() const { return d.size(); } |
+ |
+ reverse_iterator rbegin() { return d.rbegin(); } |
+ const_reverse_iterator rbegin() const { return d.rbegin(); } |
+ reverse_iterator rend() { return d.rend(); } |
+ const_reverse_iterator rend() const { return d.rend(); } |
+ |
+ iterator begin() { return d.begin(); } |
+ const_iterator begin() const { return d.begin(); } |
+ iterator end() { return d.end(); } |
+ const_iterator end() const { return d.end(); } |
+ |
+ void push_back(T* elem) { d.push_back(elem); } |
+ void push_front(T* elem) { d.push_front(elem); } |
+ |
+ void pop_back() { delete d.back(); d.pop_back(); } |
+ void pop_front() { delete d.front(); d.pop_front(); } |
+ |
+ T*& front() { return d.front(); } |
+ const T* front() const { return d.front(); } |
+ T*& back() { return d.back(); } |
+ const T* back() const { return d.back(); } |
+ |
+ std::deque<T*>& get() { return d; } |
+ const std::deque<T*>& get() const { return d; } |
+ void swap(ScopedDeque<T>& other) { d.swap(other.d); } |
+ void release(std::deque<T*>* out) { |
+ out->swap(d); |
+ d.clear(); |
+ } |
+ |
+ void clear() { |
+ STLDeleteElements(&d); |
+ d.clear(); |
+ } |
+ void resize(size_t new_size) { d.resize(new_size); } |
+ |
+ // Lets the ScopedDeque take ownership of |x|. |
+ iterator insert(iterator position, T* x) { |
+ return d.insert(position, x); |
+ } |
+ |
+ // Lets the ScopedDeque take ownership of elements in [first,last). |
+ template<typename InputIterator> |
+ void insert(iterator position, InputIterator first, InputIterator last) { |
+ d.insert(position, first, last); |
+ } |
+ |
+ iterator erase(iterator position) { |
+ delete *position; |
+ return d.erase(position); |
+ } |
+ |
+ iterator erase(iterator first, iterator last) { |
+ STLDeleteContainerPointers(first, last); |
+ return d.erase(first, last); |
+ } |
+ |
+ // Like |erase()|, but doesn't delete the element at |position|. |
+ iterator weak_erase(iterator position) { |
+ return d.erase(position); |
+ } |
+ |
+ // Like |erase()|, but doesn't delete the elements in [first, last). |
+ iterator weak_erase(iterator first, iterator last) { |
+ return d.erase(first, last); |
+ } |
+ |
+ private: |
+ std::deque<T*> d; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(ScopedDeque); |
+}; |
+ |
+#endif // BASE_MEMORY_SCOPED_DEQUE_H_ |