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