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