diff options
Diffstat (limited to 'src/mongo/base/owned_pointer_vector.h')
-rw-r--r-- | src/mongo/base/owned_pointer_vector.h | 236 |
1 files changed, 132 insertions, 104 deletions
diff --git a/src/mongo/base/owned_pointer_vector.h b/src/mongo/base/owned_pointer_vector.h index 167401824de..79ff19bd8e0 100644 --- a/src/mongo/base/owned_pointer_vector.h +++ b/src/mongo/base/owned_pointer_vector.h @@ -34,129 +34,157 @@ namespace mongo { +/** + * An std::vector wrapper that deletes pointers within a vector on destruction. The objects + * referenced by the vector's pointers are 'owned' by an object of this class. + * NOTE that an OwnedPointerVector<T> wraps an std::vector<T*>. + */ +template <class T> +class OwnedPointerVector { + MONGO_DISALLOW_COPYING(OwnedPointerVector); + +public: + OwnedPointerVector() {} + ~OwnedPointerVector() { + clear(); + } + /** - * An std::vector wrapper that deletes pointers within a vector on destruction. The objects - * referenced by the vector's pointers are 'owned' by an object of this class. - * NOTE that an OwnedPointerVector<T> wraps an std::vector<T*>. + * Takes ownership of all pointers contained in 'other'. + * NOTE: argument is intentionally taken by value. */ - template<class T> - class OwnedPointerVector { - MONGO_DISALLOW_COPYING(OwnedPointerVector); - - public: - OwnedPointerVector() {} - ~OwnedPointerVector() { clear(); } - - /** - * Takes ownership of all pointers contained in 'other'. - * NOTE: argument is intentionally taken by value. - */ - OwnedPointerVector(std::vector<T*> other) { _vector.swap(other); } - - /** - * Takes ownership of all pointers contained in 'other'. - * NOTE: argument is intentionally taken by value. - */ - OwnedPointerVector& operator=(std::vector<T*> other) { - clear(); - _vector.swap(other); - return *this; - } + OwnedPointerVector(std::vector<T*> other) { + _vector.swap(other); + } - typedef typename std::vector<T*>::const_iterator const_iterator; - typedef typename std::vector<T*>::const_reverse_iterator const_reverse_iterator; + /** + * Takes ownership of all pointers contained in 'other'. + * NOTE: argument is intentionally taken by value. + */ + OwnedPointerVector& operator=(std::vector<T*> other) { + clear(); + _vector.swap(other); + return *this; + } + + typedef typename std::vector<T*>::const_iterator const_iterator; + typedef typename std::vector<T*>::const_reverse_iterator const_reverse_iterator; + + /** Access the vector. */ + const std::vector<T*>& vector() const { + return _vector; + } + std::vector<T*>& mutableVector() { + return _vector; + } - /** Access the vector. */ - const std::vector<T*>& vector() const { return _vector; } - std::vector<T*>& mutableVector() { return _vector; } + std::size_t size() const { + return _vector.size(); + } + bool empty() const { + return _vector.empty(); + } - std::size_t size() const { return _vector.size(); } - bool empty() const { return _vector.empty(); } + const_iterator begin() const { + return _vector.begin(); + } + const_reverse_iterator rbegin() const { + return _vector.rbegin(); + } + const_iterator end() const { + return _vector.end(); + } + const_reverse_iterator rend() const { + return _vector.rend(); + } - const_iterator begin() const { return _vector.begin(); } - const_reverse_iterator rbegin() const { return _vector.rbegin(); } - const_iterator end() const { return _vector.end(); } - const_reverse_iterator rend() const { return _vector.rend(); } + T* operator[](size_t i) const { + return _vector[i]; + } + T* back() const { + return _vector.back(); + } + T* front() const { + return _vector.front(); + } - T* operator[] (size_t i) const { return _vector[i]; } - T* back() const { return _vector.back(); } - T* front() const { return _vector.front(); } + void push_back(T* ptr) { + _vector.push_back(ptr); + } - void push_back(T* ptr) { _vector.push_back(ptr); } + /** + * Deletes all pointers in the vector, then sets its size to 0. + */ + void clear(); - /** - * Deletes all pointers in the vector, then sets its size to 0. - */ - void clear(); + /** + * Deletes the pointer at 'it', then erases it from the vector. + */ + void erase(const_iterator it) { + delete *it; + _vector.erase(toNonConstIter(it)); + } - /** - * Deletes the pointer at 'it', then erases it from the vector. - */ - void erase(const_iterator it) { + void erase(const_iterator begin, const_iterator end) { + for (const_iterator it = begin; it != end; ++it) { delete *it; - _vector.erase(toNonConstIter(it)); } + _vector.erase(toNonConstIter(begin), toNonConstIter(end)); + } - void erase(const_iterator begin, const_iterator end) { - for (const_iterator it = begin; it != end; ++it) { - delete *it; - } - _vector.erase(toNonConstIter(begin), toNonConstIter(end)); - } + // + // extensions + // - // - // extensions - // - - /** - * Releases the entire vector to allow you to transfer ownership. - * - * Leaves the OwnedPointerVector empty. - * Named after the similar method and pattern in std::unique_ptr. - */ - std::vector<T*> release() { - std::vector<T*> out; - out.swap(_vector); - return out; - } + /** + * Releases the entire vector to allow you to transfer ownership. + * + * Leaves the OwnedPointerVector empty. + * Named after the similar method and pattern in std::unique_ptr. + */ + std::vector<T*> release() { + std::vector<T*> out; + out.swap(_vector); + return out; + } - /** - * Releases ownership of a single element. - * - * Sets that element to NULL and does not change size(). - */ - T* releaseAt(size_t i) { - T* out = _vector[i]; - _vector[i] = NULL; - return out; - } + /** + * Releases ownership of a single element. + * + * Sets that element to NULL and does not change size(). + */ + T* releaseAt(size_t i) { + T* out = _vector[i]; + _vector[i] = NULL; + return out; + } - T* popAndReleaseBack() { - T* out = _vector.back(); - _vector.pop_back(); - return out; - } + T* popAndReleaseBack() { + T* out = _vector.back(); + _vector.pop_back(); + return out; + } - void popAndDeleteBack() { - delete popAndReleaseBack(); - } + void popAndDeleteBack() { + delete popAndReleaseBack(); + } - private: - typename std::vector<T*>::iterator toNonConstIter(const_iterator it) { - // This is needed for a few cases where c++03 vectors require non-const iterators that - // were relaxed in c++11 to allow const_iterators. It can go away when we require c++11. - return _vector.begin() + (it - begin()); - } +private: + typename std::vector<T*>::iterator toNonConstIter(const_iterator it) { + // This is needed for a few cases where c++03 vectors require non-const iterators that + // were relaxed in c++11 to allow const_iterators. It can go away when we require c++11. + return _vector.begin() + (it - begin()); + } - std::vector<T*> _vector; - }; + std::vector<T*> _vector; +}; - template<class T> - inline void OwnedPointerVector<T>::clear() { - for( typename std::vector<T*>::iterator i = _vector.begin(); i != _vector.end(); ++i ) { - delete *i; - } - _vector.clear(); +template <class T> +inline void OwnedPointerVector<T>::clear() { + for (typename std::vector<T*>::iterator i = _vector.begin(); i != _vector.end(); ++i) { + delete *i; } + _vector.clear(); +} -} // namespace mongo +} // namespace mongo |