szaszm commented on code in PR #1543:
URL: https://github.com/apache/nifi-minifi-cpp/pull/1543#discussion_r1158428649


##########
libminifi/include/utils/StringUtils.h:
##########
@@ -88,7 +87,15 @@ class StringUtils {
    */
   static std::optional<bool> toBool(const std::string& input);
 
-  static std::string toLower(std::string_view str);
+  static inline std::string toLower(std::string_view str) {
+    const auto tolower = [](auto c) { return std::tolower(static_cast<unsigned 
char>(c)); };
+    return str | ranges::views::transform(tolower) | ranges::to<std::string>();
+  }
+
+  static inline std::string toUpper(std::string_view str)  {
+    const auto toupper = [](auto c) { return std::toupper(static_cast<unsigned 
char>(c)); };
+    return str | ranges::views::transform(toupper) | ranges::to<std::string>();
+  }

Review Comment:
   The dumber version of taking a `std::string` by value, and doing in-place 
transform would be more efficient, because it allows NRVO, and better 
optimization
   demonstration: https://godbolt.org/z/q5qWqGbnx
   above version: 3 allocations, 1 copy
   std::string version: 1 allocation (of the passed-in string)
   
   We need 1 allocation either way, to construct the result, but by taking a 
std::string by value, we push this responsibility to the caller, who may be 
able to avoid it by reusing an existing std::string object. If the string is 
moved in from an existing object, the resulting assembly is basically 
equivalent to passing in a pointer to the string, and doing an in-place 
transform, with no extra allocation, but the interface keeps the 
value-semantics, and falls back to copy when necessary.
   
   ```suggestion
     static inline std::string toLower(std::string str) {
       const auto tolower = [](auto c) { return 
std::tolower(static_cast<unsigned char>(c)); };
       std::transform(std::begin(str), std::end(str), std::begin(str), tolower);
       return str;
     }
   
     static inline std::string toUpper(std::string str)  {
       const auto toupper = [](auto c) { return 
std::toupper(static_cast<unsigned char>(c)); };
       std::transform(std::begin(str), std::end(str), std::begin(str), toupper);
       return str;
     }
   ```



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: issues-unsubscr...@nifi.apache.org

For queries about this service, please contact Infrastructure at:
us...@infra.apache.org

Reply via email to