Add convenience std::string overload for toLowerAscii v2017.09.11.00
authorGiuseppe Ottaviano <ott@fb.com>
Sun, 10 Sep 2017 16:59:56 +0000 (09:59 -0700)
committerFacebook Github Bot <facebook-github-bot@users.noreply.github.com>
Sun, 10 Sep 2017 17:04:56 +0000 (10:04 -0700)
Summary:
`toLowerAscii` is surprisingly hard to use with `std::string` because (until C++17) `data()` returns a `const char*`. In addition, it is not widely known that `s[0]` is legal even if the string is empty. This can lead to a variety of suboptimal code, from explicitly checking emptiness, to casting away the `const` (which causes UB).

Let's just have a simple overload for it.

Reviewed By: pixelb, philippv, yfeldblum

Differential Revision: D5801970

fbshipit-source-id: 407e2e9e66147a0662a5e09c75921255adff0702

folly/String.h

index 53b54f42f8c7f022643941431341fc5bd2c98842..4262a9d1b4c88e630c873d5b855b1ec198e38c6c 100644 (file)
@@ -626,6 +626,11 @@ inline void toLowerAscii(MutableStringPiece str) {
   toLowerAscii(str.begin(), str.size());
 }
 
+inline void toLowerAscii(std::string& str) {
+  // str[0] is legal also if the string is empty.
+  toLowerAscii(&str[0], str.size());
+}
+
 template <
     class Iterator = const char*,
     class Base = folly::Range<boost::u8_to_u32_iterator<Iterator>>>