StringHelper.cpp revision 95b46238e9f0420e2e79ce2bda2cabc24aff4769
1af44014f7b42697be072a7bde111c432b313d684Steven Moreland/*
2af44014f7b42697be072a7bde111c432b313d684Steven Moreland * Copyright (C) 2016 The Android Open Source Project
3af44014f7b42697be072a7bde111c432b313d684Steven Moreland *
4af44014f7b42697be072a7bde111c432b313d684Steven Moreland * Licensed under the Apache License, Version 2.0 (the "License");
5af44014f7b42697be072a7bde111c432b313d684Steven Moreland * you may not use this file except in compliance with the License.
6af44014f7b42697be072a7bde111c432b313d684Steven Moreland * You may obtain a copy of the License at
7af44014f7b42697be072a7bde111c432b313d684Steven Moreland *
8af44014f7b42697be072a7bde111c432b313d684Steven Moreland *      http://www.apache.org/licenses/LICENSE-2.0
9af44014f7b42697be072a7bde111c432b313d684Steven Moreland *
10af44014f7b42697be072a7bde111c432b313d684Steven Moreland * Unless required by applicable law or agreed to in writing, software
11af44014f7b42697be072a7bde111c432b313d684Steven Moreland * distributed under the License is distributed on an "AS IS" BASIS,
12af44014f7b42697be072a7bde111c432b313d684Steven Moreland * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13af44014f7b42697be072a7bde111c432b313d684Steven Moreland * See the License for the specific language governing permissions and
14af44014f7b42697be072a7bde111c432b313d684Steven Moreland * limitations under the License.
15af44014f7b42697be072a7bde111c432b313d684Steven Moreland */
16af44014f7b42697be072a7bde111c432b313d684Steven Moreland
17af44014f7b42697be072a7bde111c432b313d684Steven Moreland#include "StringHelper.h"
18af44014f7b42697be072a7bde111c432b313d684Steven Moreland
19868aff8458f94a81cf932537c4b7354074df181eSteven Moreland#include <sstream>
20868aff8458f94a81cf932537c4b7354074df181eSteven Moreland
21af44014f7b42697be072a7bde111c432b313d684Steven Morelandnamespace android {
22af44014f7b42697be072a7bde111c432b313d684Steven Moreland
23af44014f7b42697be072a7bde111c432b313d684Steven Moreland// static
24af44014f7b42697be072a7bde111c432b313d684Steven Morelandstd::string StringHelper::Upcase(const std::string &in) {
25af44014f7b42697be072a7bde111c432b313d684Steven Moreland    std::string out{in};
26af44014f7b42697be072a7bde111c432b313d684Steven Moreland
27af44014f7b42697be072a7bde111c432b313d684Steven Moreland    for (auto &ch : out) {
28af44014f7b42697be072a7bde111c432b313d684Steven Moreland        ch = toupper(ch);
29af44014f7b42697be072a7bde111c432b313d684Steven Moreland    }
30af44014f7b42697be072a7bde111c432b313d684Steven Moreland
31af44014f7b42697be072a7bde111c432b313d684Steven Moreland    return out;
32af44014f7b42697be072a7bde111c432b313d684Steven Moreland}
33af44014f7b42697be072a7bde111c432b313d684Steven Moreland
34af44014f7b42697be072a7bde111c432b313d684Steven Moreland// static
35868aff8458f94a81cf932537c4b7354074df181eSteven Morelandstd::string StringHelper::Capitalize(const std::string &in) {
36868aff8458f94a81cf932537c4b7354074df181eSteven Moreland    std::string out{in};
37868aff8458f94a81cf932537c4b7354074df181eSteven Moreland
38868aff8458f94a81cf932537c4b7354074df181eSteven Moreland    if(!out.empty()) {
39868aff8458f94a81cf932537c4b7354074df181eSteven Moreland        out[0] = toupper(out[0]);
40868aff8458f94a81cf932537c4b7354074df181eSteven Moreland    }
41868aff8458f94a81cf932537c4b7354074df181eSteven Moreland
42868aff8458f94a81cf932537c4b7354074df181eSteven Moreland    return out;
43868aff8458f94a81cf932537c4b7354074df181eSteven Moreland}
44868aff8458f94a81cf932537c4b7354074df181eSteven Moreland
45868aff8458f94a81cf932537c4b7354074df181eSteven Moreland// static
46868aff8458f94a81cf932537c4b7354074df181eSteven Morelandstd::string StringHelper::SnakeCaseToCamelCase(const std::string &in) {
47868aff8458f94a81cf932537c4b7354074df181eSteven Moreland    std::istringstream ss(in);
48868aff8458f94a81cf932537c4b7354074df181eSteven Moreland    std::string word;
49868aff8458f94a81cf932537c4b7354074df181eSteven Moreland    std::string out;
50868aff8458f94a81cf932537c4b7354074df181eSteven Moreland
5195b46238e9f0420e2e79ce2bda2cabc24aff4769Steven Moreland    bool first = true;
5295b46238e9f0420e2e79ce2bda2cabc24aff4769Steven Moreland
5395b46238e9f0420e2e79ce2bda2cabc24aff4769Steven Moreland    while (std::getline(ss, word, '_')) {
5495b46238e9f0420e2e79ce2bda2cabc24aff4769Steven Moreland        if (first) {
5595b46238e9f0420e2e79ce2bda2cabc24aff4769Steven Moreland            out += word;
5695b46238e9f0420e2e79ce2bda2cabc24aff4769Steven Moreland            first = false;
5795b46238e9f0420e2e79ce2bda2cabc24aff4769Steven Moreland        } else {
5895b46238e9f0420e2e79ce2bda2cabc24aff4769Steven Moreland            out += Capitalize(word);
5995b46238e9f0420e2e79ce2bda2cabc24aff4769Steven Moreland        }
6095b46238e9f0420e2e79ce2bda2cabc24aff4769Steven Moreland    }
6195b46238e9f0420e2e79ce2bda2cabc24aff4769Steven Moreland
6295b46238e9f0420e2e79ce2bda2cabc24aff4769Steven Moreland    return out;
6395b46238e9f0420e2e79ce2bda2cabc24aff4769Steven Moreland}
6495b46238e9f0420e2e79ce2bda2cabc24aff4769Steven Moreland
6595b46238e9f0420e2e79ce2bda2cabc24aff4769Steven Moreland// static
6695b46238e9f0420e2e79ce2bda2cabc24aff4769Steven Morelandstd::string StringHelper::SnakeCaseToPascalCase(const std::string &in) {
6795b46238e9f0420e2e79ce2bda2cabc24aff4769Steven Moreland    std::istringstream ss(in);
6895b46238e9f0420e2e79ce2bda2cabc24aff4769Steven Moreland    std::string word;
6995b46238e9f0420e2e79ce2bda2cabc24aff4769Steven Moreland    std::string out;
7095b46238e9f0420e2e79ce2bda2cabc24aff4769Steven Moreland
71868aff8458f94a81cf932537c4b7354074df181eSteven Moreland    while (std::getline(ss, word, '_')) {
72868aff8458f94a81cf932537c4b7354074df181eSteven Moreland        out += Capitalize(word);
73868aff8458f94a81cf932537c4b7354074df181eSteven Moreland    }
74868aff8458f94a81cf932537c4b7354074df181eSteven Moreland
75868aff8458f94a81cf932537c4b7354074df181eSteven Moreland    return out;
76868aff8458f94a81cf932537c4b7354074df181eSteven Moreland}
77868aff8458f94a81cf932537c4b7354074df181eSteven Moreland
78868aff8458f94a81cf932537c4b7354074df181eSteven Moreland// static
7995b46238e9f0420e2e79ce2bda2cabc24aff4769Steven Morelandbool StringHelper::StartsWith(const std::string &in, const std::string &prefix) {
8095b46238e9f0420e2e79ce2bda2cabc24aff4769Steven Moreland    return in.size() >= prefix.size() &&
8195b46238e9f0420e2e79ce2bda2cabc24aff4769Steven Moreland           in.substr(0, prefix.size()) == prefix;
8295b46238e9f0420e2e79ce2bda2cabc24aff4769Steven Moreland}
8395b46238e9f0420e2e79ce2bda2cabc24aff4769Steven Moreland
8495b46238e9f0420e2e79ce2bda2cabc24aff4769Steven Moreland// static
8595b46238e9f0420e2e79ce2bda2cabc24aff4769Steven Morelandstd::string StringHelper::RTrim(const std::string &in, const std::string &end) {
8695b46238e9f0420e2e79ce2bda2cabc24aff4769Steven Moreland    if (in.size() >= end.size() &&
8795b46238e9f0420e2e79ce2bda2cabc24aff4769Steven Moreland        in.substr(in.size() - end.size()) == end) {
8895b46238e9f0420e2e79ce2bda2cabc24aff4769Steven Moreland
8995b46238e9f0420e2e79ce2bda2cabc24aff4769Steven Moreland        return in.substr(0, in.size() - end.size());
9095b46238e9f0420e2e79ce2bda2cabc24aff4769Steven Moreland    }
9195b46238e9f0420e2e79ce2bda2cabc24aff4769Steven Moreland
9295b46238e9f0420e2e79ce2bda2cabc24aff4769Steven Moreland    return in;
9395b46238e9f0420e2e79ce2bda2cabc24aff4769Steven Moreland}
9495b46238e9f0420e2e79ce2bda2cabc24aff4769Steven Moreland
9595b46238e9f0420e2e79ce2bda2cabc24aff4769Steven Moreland// static
96af44014f7b42697be072a7bde111c432b313d684Steven Morelandvoid StringHelper::SplitString(
97af44014f7b42697be072a7bde111c432b313d684Steven Moreland        const std::string &s, char c, std::vector<std::string> *components) {
98af44014f7b42697be072a7bde111c432b313d684Steven Moreland    components->clear();
99af44014f7b42697be072a7bde111c432b313d684Steven Moreland
100af44014f7b42697be072a7bde111c432b313d684Steven Moreland    size_t startPos = 0;
101af44014f7b42697be072a7bde111c432b313d684Steven Moreland    size_t matchPos;
102af44014f7b42697be072a7bde111c432b313d684Steven Moreland    while ((matchPos = s.find(c, startPos)) != std::string::npos) {
103af44014f7b42697be072a7bde111c432b313d684Steven Moreland        components->push_back(s.substr(startPos, matchPos - startPos));
104af44014f7b42697be072a7bde111c432b313d684Steven Moreland        startPos = matchPos + 1;
105af44014f7b42697be072a7bde111c432b313d684Steven Moreland    }
106af44014f7b42697be072a7bde111c432b313d684Steven Moreland
107af44014f7b42697be072a7bde111c432b313d684Steven Moreland    if (startPos + 1 < s.length()) {
108af44014f7b42697be072a7bde111c432b313d684Steven Moreland        components->push_back(s.substr(startPos));
109af44014f7b42697be072a7bde111c432b313d684Steven Moreland    }
110af44014f7b42697be072a7bde111c432b313d684Steven Moreland}
111af44014f7b42697be072a7bde111c432b313d684Steven Moreland
112af44014f7b42697be072a7bde111c432b313d684Steven Moreland// static
113af44014f7b42697be072a7bde111c432b313d684Steven Morelandstd::string StringHelper::JoinStrings(
114af44014f7b42697be072a7bde111c432b313d684Steven Moreland        const std::vector<std::string> &components,
115af44014f7b42697be072a7bde111c432b313d684Steven Moreland        const std::string &separator) {
116af44014f7b42697be072a7bde111c432b313d684Steven Moreland    std::string out;
117af44014f7b42697be072a7bde111c432b313d684Steven Moreland    bool first = true;
118af44014f7b42697be072a7bde111c432b313d684Steven Moreland    for (const auto &component : components) {
119af44014f7b42697be072a7bde111c432b313d684Steven Moreland        if (!first) {
120af44014f7b42697be072a7bde111c432b313d684Steven Moreland            out += separator;
121af44014f7b42697be072a7bde111c432b313d684Steven Moreland        }
122af44014f7b42697be072a7bde111c432b313d684Steven Moreland        out += component;
123af44014f7b42697be072a7bde111c432b313d684Steven Moreland
124af44014f7b42697be072a7bde111c432b313d684Steven Moreland        first = false;
125af44014f7b42697be072a7bde111c432b313d684Steven Moreland    }
126af44014f7b42697be072a7bde111c432b313d684Steven Moreland
127af44014f7b42697be072a7bde111c432b313d684Steven Moreland    return out;
128af44014f7b42697be072a7bde111c432b313d684Steven Moreland}
129af44014f7b42697be072a7bde111c432b313d684Steven Moreland
130af44014f7b42697be072a7bde111c432b313d684Steven Moreland}  // namespace android
131af44014f7b42697be072a7bde111c432b313d684Steven Moreland
132