diff options
author | River Riddle <riddleriver@gmail.com> | 2020-04-14 18:54:23 -0700 |
---|---|---|
committer | River Riddle <riddleriver@gmail.com> | 2020-04-14 18:57:22 -0700 |
commit | 229e392b4edb65b69caa49644cdeaa358095146d (patch) | |
tree | 9265657b92885ef6dea5efee82ef09e4c9c1cab7 /llvm/lib/Support/StringExtras.cpp | |
parent | 8da5b9083691b557f50f72ab099598bb291aec5f (diff) | |
download | llvm-229e392b4edb65b69caa49644cdeaa358095146d.zip llvm-229e392b4edb65b69caa49644cdeaa358095146d.tar.gz llvm-229e392b4edb65b69caa49644cdeaa358095146d.tar.bz2 |
[llvm][StringExtras] Merge StringExtras from MLIR into LLVM
Summary:
This revision adds two utilities currently present in MLIR to LLVM StringExtras:
* convertToSnakeFromCamelCase
Convert a string from a camel case naming scheme, to a snake case scheme
* convertToCamelFromSnakeCase
Convert a string from a snake case naming scheme, to a camel case scheme
Differential Revision: https://reviews.llvm.org/D78167
Diffstat (limited to 'llvm/lib/Support/StringExtras.cpp')
-rw-r--r-- | llvm/lib/Support/StringExtras.cpp | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/llvm/lib/Support/StringExtras.cpp b/llvm/lib/Support/StringExtras.cpp index af8dd46..015dd9fb 100644 --- a/llvm/lib/Support/StringExtras.cpp +++ b/llvm/lib/Support/StringExtras.cpp @@ -90,3 +90,46 @@ void llvm::printLowerCase(StringRef String, raw_ostream &Out) { for (const char C : String) Out << toLower(C); } + +std::string llvm::convertToSnakeFromCamelCase(StringRef input) { + if (input.empty()) + return ""; + + std::string snakeCase; + snakeCase.reserve(input.size()); + for (char c : input) { + if (!std::isupper(c)) { + snakeCase.push_back(c); + continue; + } + + if (!snakeCase.empty() && snakeCase.back() != '_') + snakeCase.push_back('_'); + snakeCase.push_back(llvm::toLower(c)); + } + return snakeCase; +} + +std::string llvm::convertToCamelFromSnakeCase(StringRef input, + bool capitalizeFirst) { + if (input.empty()) + return ""; + + std::string output; + output.reserve(input.size()); + + // Push the first character, capatilizing if necessary. + if (capitalizeFirst && std::islower(input.front())) + output.push_back(llvm::toUpper(input.front())); + else + output.push_back(input.front()); + + // Walk the input converting any `*_[a-z]` snake case into `*[A-Z]` camelCase. + for (size_t pos = 1, e = input.size(); pos < e; ++pos) { + if (input[pos] == '_' && pos != (e - 1) && std::islower(input[pos + 1])) + output.push_back(llvm::toUpper(input[++pos])); + else + output.push_back(input[pos]); + } + return output; +} |