diff options
Diffstat (limited to 'base/scoped_vector.h')
-rw-r--r-- | base/scoped_vector.h | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/base/scoped_vector.h b/base/scoped_vector.h new file mode 100644 index 0000000..0c7449d --- /dev/null +++ b/base/scoped_vector.h @@ -0,0 +1,55 @@ +// Copyright (c) 2006-2008 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_SCOPED_VECTOR_H_ +#define BASE_SCOPED_VECTOR_H_ + +#include <vector> + +#include "base/logging.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; + + 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(); } + + 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); } + + private: + std::vector<T*> v; + + DISALLOW_COPY_AND_ASSIGN(ScopedVector); +}; + +#endif // BASE_SCOPED_VECTOR_H_ |