aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Support/StringExtras.cpp
diff options
context:
space:
mode:
authorRiver Riddle <riddleriver@gmail.com>2020-04-14 18:54:23 -0700
committerRiver Riddle <riddleriver@gmail.com>2020-04-14 18:57:22 -0700
commit229e392b4edb65b69caa49644cdeaa358095146d (patch)
tree9265657b92885ef6dea5efee82ef09e4c9c1cab7 /llvm/lib/Support/StringExtras.cpp
parent8da5b9083691b557f50f72ab099598bb291aec5f (diff)
downloadllvm-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.cpp43
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;
+}