10daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.org/* 20daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.org * Copyright (c) 2014 The WebRTC project authors. All Rights Reserved. 30daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.org * 40daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.org * Use of this source code is governed by a BSD-style license 50daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.org * that can be found in the LICENSE file in the root of the source 60daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.org * tree. An additional intellectual property rights grant can be found 70daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.org * in the file PATENTS. All contributing project authors may 80daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.org * be found in the AUTHORS file in the root of the source tree. 90daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.org */ 100daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.org 110daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.org// Borrowed from Chromium's src/base/memory/scoped_vector.h. 120daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.org 13d56d68cd272783ae0cfe11834c2a141ec62519c2kjellander#ifndef WEBRTC_SYSTEM_WRAPPERS_INCLUDE_SCOPED_VECTOR_H_ 14d56d68cd272783ae0cfe11834c2a141ec62519c2kjellander#define WEBRTC_SYSTEM_WRAPPERS_INCLUDE_SCOPED_VECTOR_H_ 150daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.org 160daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.org#include <vector> 170daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.org 18df429882af5dc876432b4a3d4b67353be0492745andrew@webrtc.org#include "webrtc/base/checks.h" 1936220ae24f8f5d34b660d6c4c91dd4260886dcb9kwiberg#include "webrtc/base/deprecation.h" 2098f53510b222f71fdd8b799b2f33737ceeb28c61Henrik Kjellander#include "webrtc/system_wrappers/include/stl_util.h" 210daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.org 220daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.orgnamespace webrtc { 230daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.org 240daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.org// ScopedVector wraps a vector deleting the elements from its 250daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.org// destructor. 260daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.orgtemplate <class T> 270daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.orgclass ScopedVector { 280daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.org public: 290daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.org typedef typename std::vector<T*>::allocator_type allocator_type; 300daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.org typedef typename std::vector<T*>::size_type size_type; 310daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.org typedef typename std::vector<T*>::difference_type difference_type; 320daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.org typedef typename std::vector<T*>::pointer pointer; 330daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.org typedef typename std::vector<T*>::const_pointer const_pointer; 340daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.org typedef typename std::vector<T*>::reference reference; 350daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.org typedef typename std::vector<T*>::const_reference const_reference; 360daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.org typedef typename std::vector<T*>::value_type value_type; 370daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.org typedef typename std::vector<T*>::iterator iterator; 380daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.org typedef typename std::vector<T*>::const_iterator const_iterator; 390daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.org typedef typename std::vector<T*>::reverse_iterator reverse_iterator; 400daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.org typedef typename std::vector<T*>::const_reverse_iterator 410daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.org const_reverse_iterator; 420daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.org 430daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.org ScopedVector() {} 440daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.org ~ScopedVector() { clear(); } 450daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.org 46a8e285d1934f2dc739d8a9f810fb4372d8d782b1Karl Wiberg // Move construction and assignment. 47cea7c2f7839eef81ecbd6dd10d103190ef68875ckwiberg ScopedVector(ScopedVector&& other) { *this = std::move(other); } 48a8e285d1934f2dc739d8a9f810fb4372d8d782b1Karl Wiberg ScopedVector& operator=(ScopedVector&& other) { 49a8e285d1934f2dc739d8a9f810fb4372d8d782b1Karl Wiberg std::swap(v_, other.v_); // The arguments are std::vectors, so std::swap 50a8e285d1934f2dc739d8a9f810fb4372d8d782b1Karl Wiberg // is the one that we want. 51a8e285d1934f2dc739d8a9f810fb4372d8d782b1Karl Wiberg other.clear(); 520daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.org return *this; 530daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.org } 540daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.org 55a8e285d1934f2dc739d8a9f810fb4372d8d782b1Karl Wiberg // Deleted copy constructor and copy assignment, to make the type move-only. 56a8e285d1934f2dc739d8a9f810fb4372d8d782b1Karl Wiberg ScopedVector(const ScopedVector& other) = delete; 57a8e285d1934f2dc739d8a9f810fb4372d8d782b1Karl Wiberg ScopedVector& operator=(const ScopedVector& other) = delete; 58a8e285d1934f2dc739d8a9f810fb4372d8d782b1Karl Wiberg 59a8e285d1934f2dc739d8a9f810fb4372d8d782b1Karl Wiberg // Get an rvalue reference. (sv.Pass() does the same thing as std::move(sv).) 6036220ae24f8f5d34b660d6c4c91dd4260886dcb9kwiberg // Deprecated; remove in March 2016 (bug 5373). 6136220ae24f8f5d34b660d6c4c91dd4260886dcb9kwiberg RTC_DEPRECATED ScopedVector&& Pass() { return DEPRECATED_Pass(); } 6236220ae24f8f5d34b660d6c4c91dd4260886dcb9kwiberg ScopedVector&& DEPRECATED_Pass() { 6336220ae24f8f5d34b660d6c4c91dd4260886dcb9kwiberg return std::move(*this); 6436220ae24f8f5d34b660d6c4c91dd4260886dcb9kwiberg } 65a8e285d1934f2dc739d8a9f810fb4372d8d782b1Karl Wiberg 660daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.org reference operator[](size_t index) { return v_[index]; } 670daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.org const_reference operator[](size_t index) const { return v_[index]; } 680daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.org 690daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.org bool empty() const { return v_.empty(); } 700daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.org size_t size() const { return v_.size(); } 710daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.org 720daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.org reverse_iterator rbegin() { return v_.rbegin(); } 730daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.org const_reverse_iterator rbegin() const { return v_.rbegin(); } 740daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.org reverse_iterator rend() { return v_.rend(); } 750daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.org const_reverse_iterator rend() const { return v_.rend(); } 760daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.org 770daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.org iterator begin() { return v_.begin(); } 780daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.org const_iterator begin() const { return v_.begin(); } 790daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.org iterator end() { return v_.end(); } 800daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.org const_iterator end() const { return v_.end(); } 810daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.org 820daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.org const_reference front() const { return v_.front(); } 830daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.org reference front() { return v_.front(); } 840daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.org const_reference back() const { return v_.back(); } 850daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.org reference back() { return v_.back(); } 860daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.org 870daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.org void push_back(T* elem) { v_.push_back(elem); } 880daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.org 890daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.org void pop_back() { 9091d6edef35e7275879c30ce16ecb8b6dc73c6e4ahenrikg RTC_DCHECK(!empty()); 910daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.org delete v_.back(); 920daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.org v_.pop_back(); 930daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.org } 940daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.org 950daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.org std::vector<T*>& get() { return v_; } 960daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.org const std::vector<T*>& get() const { return v_; } 970daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.org void swap(std::vector<T*>& other) { v_.swap(other); } 980daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.org void swap(ScopedVector<T>& other) { v_.swap(other.v_); } 990daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.org void release(std::vector<T*>* out) { 1000daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.org out->swap(v_); 1010daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.org v_.clear(); 1020daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.org } 1030daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.org 1040daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.org void reserve(size_t capacity) { v_.reserve(capacity); } 1050daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.org 1060daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.org // Resize, deleting elements in the disappearing range if we are shrinking. 1070daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.org void resize(size_t new_size) { 1080daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.org if (v_.size() > new_size) 1090daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.org STLDeleteContainerPointers(v_.begin() + new_size, v_.end()); 1100daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.org v_.resize(new_size); 1110daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.org } 1120daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.org 1130daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.org template<typename InputIterator> 1140daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.org void assign(InputIterator begin, InputIterator end) { 1150daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.org v_.assign(begin, end); 1160daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.org } 1170daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.org 1180daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.org void clear() { STLDeleteElements(&v_); } 1190daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.org 1200daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.org // Like |clear()|, but doesn't delete any elements. 1210daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.org void weak_clear() { v_.clear(); } 1220daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.org 1230daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.org // Lets the ScopedVector take ownership of |x|. 1240daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.org iterator insert(iterator position, T* x) { 1250daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.org return v_.insert(position, x); 1260daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.org } 1270daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.org 1280daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.org // Lets the ScopedVector take ownership of elements in [first,last). 1290daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.org template<typename InputIterator> 1300daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.org void insert(iterator position, InputIterator first, InputIterator last) { 1310daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.org v_.insert(position, first, last); 1320daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.org } 1330daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.org 1340daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.org iterator erase(iterator position) { 1350daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.org delete *position; 1360daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.org return v_.erase(position); 1370daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.org } 1380daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.org 1390daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.org iterator erase(iterator first, iterator last) { 1400daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.org STLDeleteContainerPointers(first, last); 1410daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.org return v_.erase(first, last); 1420daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.org } 1430daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.org 1440daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.org // Like |erase()|, but doesn't delete the element at |position|. 1450daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.org iterator weak_erase(iterator position) { 1460daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.org return v_.erase(position); 1470daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.org } 1480daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.org 1490daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.org // Like |erase()|, but doesn't delete the elements in [first, last). 1500daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.org iterator weak_erase(iterator first, iterator last) { 1510daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.org return v_.erase(first, last); 1520daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.org } 1530daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.org 1540daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.org private: 1550daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.org std::vector<T*> v_; 1560daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.org}; 1570daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.org 1580daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.org} // namespace webrtc 1590daa8be9d6addfbafa09f54aeef62b1c5a360ac6andrew@webrtc.org 160d56d68cd272783ae0cfe11834c2a141ec62519c2kjellander#endif // WEBRTC_SYSTEM_WRAPPERS_INCLUDE_SCOPED_VECTOR_H_ 161