summaryrefslogtreecommitdiff
path: root/src/mongo/base/owned_pointer_vector.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/mongo/base/owned_pointer_vector.h')
-rw-r--r--src/mongo/base/owned_pointer_vector.h236
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