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