15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef BASE_MEMORY_SCOPED_VECTOR_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define BASE_MEMORY_SCOPED_VECTOR_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h" 11a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "base/logging.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/move.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/stl_util.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ScopedVector wraps a vector deleting the elements from its 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// destructor. 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <class T> 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ScopedVector { 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOVE_ONLY_TYPE_FOR_CPP_03(ScopedVector, RValue) 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef typename std::vector<T*>::allocator_type allocator_type; 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef typename std::vector<T*>::size_type size_type; 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef typename std::vector<T*>::difference_type difference_type; 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef typename std::vector<T*>::pointer pointer; 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef typename std::vector<T*>::const_pointer const_pointer; 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef typename std::vector<T*>::reference reference; 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef typename std::vector<T*>::const_reference const_reference; 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef typename std::vector<T*>::value_type value_type; 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef typename std::vector<T*>::iterator iterator; 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef typename std::vector<T*>::const_iterator const_iterator; 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef typename std::vector<T*>::reverse_iterator reverse_iterator; 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef typename std::vector<T*>::const_reverse_iterator 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const_reverse_iterator; 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedVector() {} 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~ScopedVector() { clear(); } 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedVector(RValue other) { swap(*other.object); } 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedVector& operator=(RValue rhs) { 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) swap(*rhs.object); 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return *this; 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 45eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch reference operator[](size_t index) { return v_[index]; } 46eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const_reference operator[](size_t index) const { return v_[index]; } 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool empty() const { return v_.empty(); } 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t size() const { return v_.size(); } 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reverse_iterator rbegin() { return v_.rbegin(); } 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const_reverse_iterator rbegin() const { return v_.rbegin(); } 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reverse_iterator rend() { return v_.rend(); } 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const_reverse_iterator rend() const { return v_.rend(); } 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iterator begin() { return v_.begin(); } 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const_iterator begin() const { return v_.begin(); } 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iterator end() { return v_.end(); } 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const_iterator end() const { return v_.end(); } 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const_reference front() const { return v_.front(); } 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reference front() { return v_.front(); } 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const_reference back() const { return v_.back(); } 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reference back() { return v_.back(); } 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void push_back(T* elem) { v_.push_back(elem); } 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 68a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void pop_back() { 69a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK(!empty()); 70a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) delete v_.back(); 71a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) v_.pop_back(); 72a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 73a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<T*>& get() { return v_; } 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<T*>& get() const { return v_; } 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void swap(std::vector<T*>& other) { v_.swap(other); } 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void swap(ScopedVector<T>& other) { v_.swap(other.v_); } 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void release(std::vector<T*>* out) { 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) out->swap(v_); 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v_.clear(); 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void reserve(size_t capacity) { v_.reserve(capacity); } 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Resize, deleting elements in the disappearing range if we are shrinking. 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void resize(size_t new_size) { 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (v_.size() > new_size) 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) STLDeleteContainerPointers(v_.begin() + new_size, v_.end()); 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) v_.resize(new_size); 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) template<typename InputIterator> 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void assign(InputIterator begin, InputIterator end) { 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v_.assign(begin, end); 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void clear() { STLDeleteElements(&v_); } 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Like |clear()|, but doesn't delete any elements. 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void weak_clear() { v_.clear(); } 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Lets the ScopedVector take ownership of |x|. 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iterator insert(iterator position, T* x) { 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return v_.insert(position, x); 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Lets the ScopedVector take ownership of elements in [first,last). 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) template<typename InputIterator> 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void insert(iterator position, InputIterator first, InputIterator last) { 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v_.insert(position, first, last); 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iterator erase(iterator position) { 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete *position; 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return v_.erase(position); 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iterator erase(iterator first, iterator last) { 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) STLDeleteContainerPointers(first, last); 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return v_.erase(first, last); 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Like |erase()|, but doesn't delete the element at |position|. 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iterator weak_erase(iterator position) { 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return v_.erase(position); 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Like |erase()|, but doesn't delete the elements in [first, last). 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iterator weak_erase(iterator first, iterator last) { 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return v_.erase(first, last); 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<T*> v_; 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // BASE_MEMORY_SCOPED_VECTOR_H_ 138