1d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner// Copyright 2014 The Android Open Source Project 2d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner// 3d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner// This software is licensed under the terms of the GNU General Public 4d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner// License version 2, as published by the Free Software Foundation, and 5d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner// may be copied, distributed, and modified under those terms. 6d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner// 7d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner// This program is distributed in the hope that it will be useful, 8d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner// but WITHOUT ANY WARRANTY; without even the implied warranty of 9d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 10d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner// GNU General Public License for more details. 11d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner 12d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner#ifndef ANDROID_BASE_CONTAINERS_STRING_VECTOR_H 13d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner#define ANDROID_BASE_CONTAINERS_STRING_VECTOR_H 14d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner 15d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner#include "android/base/containers/PodVector.h" 16d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner#include "android/base/String.h" 17d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner#include "android/base/StringView.h" 18d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner 19d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turnernamespace android { 20d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turnernamespace base { 21d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner 22d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner// A StringVector is a vector of strings. This implementation is optimized 23d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner// to use less memory and be more efficient than std::vector<std::string> 24d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner// for most operations. 25d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turnerclass StringVector : public PodVector<String> { 26d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turnerpublic: 27d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner // Default constructor. The vector will be empty. 28d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner StringVector() : PodVector<String>() {} 29d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner 30d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner // Copy-constructor. 31d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner StringVector(const StringVector& other); 32d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner 33d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner // Assignment operator 34d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner StringVector& operator=(const StringVector& other); 35d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner 36d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner // Destructor. 37d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner ~StringVector(); 38d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner 39d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner // Any operations that may change the underlying storage must be 40d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner // overriden. However, the behaviour / documentation should be 41d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner // identical to the one from PodVector<String> here. 42d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner void resize(size_t newSize); 43d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner void reserve(size_t newSize); 44d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner 45d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner void remove(size_t index); 46d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner String* emplace(size_t index); 47d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner void insert(size_t index, const String& str); 48d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner void prepend(const String& str); 49d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner void append(const String& str); 50d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner void swap(StringVector* other); 51d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner 52d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner // std::vector<> compatibility. 53d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner void push_back(const String& str) { append(str); } 54d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner void pop() { remove(0U); } 55d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner 56d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner // The following specializations allow one to add items with 57d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner // a StringView reference instead, this avoids the need-less 58d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner // creation of a String instance when one wants to append 59d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner // a simple C string. 60d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner void insert(size_t index, const StringView& view); 61d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner void prepend(const StringView& view); 62d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner void append(const StringView& view); 63d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner}; 64d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner 65d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner} // namespace base 66d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner} // namespace android 67d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner 68d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner#endif // ANDROID_BASE_CONTAINERS_STRING_VECTOR_H 69