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#include "android/base/containers/StringVector.h" 13d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner 14d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner#include "android/base/StringView.h" 15d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner 16d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner#include <stdio.h> 17d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner 18d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turnernamespace android { 19d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turnernamespace base { 20d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner 21d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' TurnerStringVector::StringVector(const StringVector& other) : PodVector<String>() { 22d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner size_t count = other.size(); 23d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner // We rely on the fact that an all-0 String instance is properly 24d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner // initialized to the empty string. 25d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner resize(count); 26d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner for (size_t n = 0; n < count; ++n) { 27d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner (*this) [n] = other[n]; 28d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner } 29d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner} 30d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner 31d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' TurnerStringVector& StringVector::operator=(const StringVector& other) { 32d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner reserve(0U); 33d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner resize(other.size()); 34d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner for (size_t n = 0; n < other.size(); ++n) { 35d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner (*this)[n] = other[n]; 36d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner } 37d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner return *this; 38d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner} 39d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner 40d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' TurnerStringVector::~StringVector() { 41d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner reserve(0U); 42d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner} 43d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner 44d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turnervoid StringVector::resize(size_t newSize) { 45d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner size_t oldSize = size(); 46d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner String* oldStrings = begin(); 47d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner if (newSize < oldSize) { 48d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner String::finalizeSlice(oldStrings + newSize, oldSize - newSize); 49d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner } 50d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner PodVectorBase::resize(newSize, sizeof(String)); 51d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner if (oldStrings != begin()) { 52d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner String::adjustMovedSlice(oldStrings, begin(), newSize); 53d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner } 54d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner} 55d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner 56d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turnervoid StringVector::reserve(size_t newSize) { 57d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner size_t oldSize = size(); 58d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner String* oldStrings = begin(); 59d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner if (newSize < oldSize) { 60d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner String::finalizeSlice(oldStrings + newSize, oldSize - newSize); 61d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner } 62d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner PodVectorBase::reserve(newSize, sizeof(String)); 63d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner if (oldStrings != begin()) { 64d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner String::adjustMovedSlice(oldStrings, begin(), newSize); 65d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner } 66d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner} 67d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner 68d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turnervoid StringVector::remove(size_t index) { 69d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner size_t oldSize = size(); 70d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner if (index >= oldSize) 71d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner return; 72d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner String::finalizeSlice(begin(), 1U); 73d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner String::moveSlice(begin(), index + 1, index, oldSize - index); 74d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner} 75d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner 76d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' TurnerString* StringVector::emplace(size_t index) { 77d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner size_t oldSize = size(); 78d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner DCHECK(index <= oldSize); 79d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner resize(oldSize + 1U); 80d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner String::moveSlice(begin(), index, index + 1, oldSize - index); 81d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner String* result = begin() + index; 82d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner ::memset(result, 0, sizeof(String)); 83d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner return result; 84d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner} 85d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner 86d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turnervoid StringVector::append(const String& str) { 87d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner *(this->emplace(this->size())) = str; 88d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner} 89d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner 90d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turnervoid StringVector::prepend(const String& str) { 91d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner *(this->emplace(0U)) = str; 92d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner} 93d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner 94d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turnervoid StringVector::insert(size_t index, const String& str) { 95d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner *(this->emplace(index)) = str; 96d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner} 97d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner 98d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turnervoid StringVector::append(const StringView& view) { 99d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner *(this->emplace(this->size())) = view; 100d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner} 101d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner 102d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turnervoid StringVector::prepend(const StringView& view) { 103d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner *(this->emplace(0U)) = view; 104d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner} 105d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner 106d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turnervoid StringVector::insert(size_t index, const StringView& view) { 107d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner *(this->emplace(index)) = view; 108d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner} 109d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner 110d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turnervoid StringVector::swap(StringVector* other) { 111d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner size_t mySize = size(); 112d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner size_t otherSize = other->size(); 113d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner PodVectorBase::swapAll(other); 114d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner String::adjustMovedSlice(this->begin(), other->begin(), mySize); 115d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner String::adjustMovedSlice(other->begin(), this->begin(), otherSize); 116d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner} 117d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner 118d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner} // namespace base 119d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner} // namespace android 120