| 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_
|
|
|