From 229e392b4edb65b69caa49644cdeaa358095146d Mon Sep 17 00:00:00 2001 From: River Riddle Date: Tue, 14 Apr 2020 18:54:23 -0700 Subject: [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 --- llvm/lib/Support/StringExtras.cpp | 43 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) (limited to 'llvm/lib/Support/StringExtras.cpp') 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; +} -- cgit v1.1