Chromium Code Reviews| 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..34f2fe4e1cf8f7ebcf4bd8b4290f8ea9a70dc641 |
| --- /dev/null |
| +++ b/base/memory/scoped_deque.h |
| @@ -0,0 +1,106 @@ |
| +// 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: |
|
sky
2011/10/20 16:33:03
newline between 99 and 100.
|
| + std::deque<T*> d; |
| + |
| + DISALLOW_COPY_AND_ASSIGN(ScopedDeque); |
| +}; |
| + |
| +#endif // BASE_MEMORY_SCOPED_DEQUE_H_ |