From 51adf3785338e45d550d9028d13e4abcaba567a2 Mon Sep 17 00:00:00 2001 From: mniip Date: Mon, 7 May 2018 08:10:50 +0300 Subject: [PATCH] Fix order and composition of String(char[]) operators to make clang happy --- src/common/String.h | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/src/common/String.h b/src/common/String.h index dc95c30e7..a75550a84 100644 --- a/src/common/String.h +++ b/src/common/String.h @@ -11,6 +11,10 @@ identical interfaces, except that one stores 8-bit octets (bytes) and the other stores Unicode codepoints. + For ease of use, a String can be constructed from a string literal + (char const[]) however not char const *. Exercise care when working + with char arrays. + Both classes inherit from std::basic_string (std::string is an instatiation of that), so all the familiar string interface is there however some helper methods have been defined: @@ -488,8 +492,6 @@ inline String operator+(String const &lhs, String::value_type rhs) { return stat inline String operator+(String &&lhs, String::value_type rhs) { return static_cast &&>(lhs) + rhs; } inline String operator+(String const &lhs, String::value_type const *rhs) { return static_cast const &>(lhs) + rhs; } inline String operator+(String &&lhs, String::value_type const *rhs) { return static_cast &&>(lhs) + rhs; } -template inline String operator+(String const &lhs, ByteString::value_type const (&rhs)[N]) { return static_cast const &>(lhs) + std::move(ByteString(rhs).FromAscii()); } -template inline String operator+(String &&lhs, ByteString::value_type const (&rhs)[N]) { return static_cast &&>(lhs) + std::move(ByteString(rhs).FromAscii()); } inline String operator+(std::basic_string const &lhs, String const &rhs) { return lhs + static_cast const &>(rhs); } inline String operator+(std::basic_string const &lhs, String &&rhs) { return lhs + static_cast &&>(rhs); } inline String operator+(std::basic_string &&lhs, String const &rhs) { return std::move(lhs) + static_cast const &>(rhs); } @@ -498,24 +500,26 @@ inline String operator+(String::value_type lhs, String const &rhs) { return lhs inline String operator+(String::value_type lhs, String &&rhs) { return lhs + static_cast &&>(rhs); } inline String operator+(String::value_type const *lhs, String const &rhs) { return lhs + static_cast const &>(rhs); } inline String operator+(String::value_type const *lhs, String &&rhs) { return lhs + static_cast &&>(rhs); } -template inline String operator+(ByteString::value_type const (&lhs)[N], String const &rhs) { return std::move(ByteString(lhs).FromAscii()) + static_cast const &>(rhs); } -template inline String operator+(ByteString::value_type const (&lhs)[N], String &&rhs) { return std::move(ByteString(lhs).FromAscii()) + static_cast &&>(rhs); } +template inline String operator+(String const &lhs, ByteString::value_type const (&rhs)[N]) { return static_cast const &>(lhs) + ByteString(rhs).FromAscii(); } +template inline String operator+(String &&lhs, ByteString::value_type const (&rhs)[N]) { return static_cast &&>(lhs) + ByteString(rhs).FromAscii(); } +template inline String operator+(ByteString::value_type const (&lhs)[N], String const &rhs) { return ByteString(lhs).FromAscii() + static_cast const &>(rhs); } +template inline String operator+(ByteString::value_type const (&lhs)[N], String &&rhs) { return ByteString(lhs).FromAscii() + static_cast &&>(rhs); } inline bool operator==(String const &lhs, String const &rhs) { return static_cast const &>(lhs) == static_cast const &>(rhs); } inline bool operator==(String const &lhs, std::basic_string const &rhs) { return static_cast const &>(lhs) == rhs; } inline bool operator==(String const &lhs, String::value_type const *rhs) { return static_cast const &>(lhs) == rhs; } -template inline bool operator==(String const &lhs, ByteString::value_type const (&rhs)[N]) { return static_cast const &>(lhs) == std::move(ByteString(rhs).FromAscii()); } inline bool operator==(std::basic_string const &lhs, String const &rhs) { return lhs == static_cast const &>(rhs); } inline bool operator==(String::value_type const *lhs, String const &rhs) { return lhs == static_cast const &>(rhs); } -template inline bool operator==(ByteString::value_type const (&lhs)[N], String const &rhs) { return std::move(ByteString(lhs).FromAscii()) == static_cast const &>(rhs); } +template inline bool operator==(String const &lhs, ByteString::value_type const (&rhs)[N]) { return static_cast const &>(lhs) == ByteString(rhs).FromAscii(); } +template inline bool operator==(ByteString::value_type const (&lhs)[N], String const &rhs) { return ByteString(lhs).FromAscii() == static_cast const &>(rhs); } inline bool operator!=(String const &lhs, String const &rhs) { return static_cast const &>(lhs) != static_cast const &>(rhs); } inline bool operator!=(String const &lhs, std::basic_string const &rhs) { return static_cast const &>(lhs) != rhs; } inline bool operator!=(String const &lhs, String::value_type const *rhs) { return static_cast const &>(lhs) != rhs; } -template inline bool operator!=(String const &lhs, ByteString::value_type const (&rhs)[N]) { return static_cast const &>(lhs) != std::move(ByteString(rhs).FromAscii()); } inline bool operator!=(std::basic_string const &lhs, String const &rhs) { return lhs != static_cast const &>(rhs); } inline bool operator!=(String::value_type const *lhs, String const &rhs) { return lhs != static_cast const &>(rhs); } -template inline bool operator!=(ByteString::value_type const (&lhs)[N], String const &rhs) { return std::move(ByteString(lhs).FromAscii()) != static_cast const &>(rhs); } +template inline bool operator!=(String const &lhs, ByteString::value_type const (&rhs)[N]) { return static_cast const &>(lhs) != ByteString(rhs).FromAscii(); } +template inline bool operator!=(ByteString::value_type const (&lhs)[N], String const &rhs) { return ByteString(lhs).FromAscii() != static_cast const &>(rhs); } inline String ByteString::FromAscii() const {