diff --git a/src/fs/Charset.cxx b/src/fs/Charset.cxx index 5f776abf4..0a89111e5 100644 --- a/src/fs/Charset.cxx +++ b/src/fs/Charset.cxx @@ -99,7 +99,7 @@ PathToUTF8(PathTraitsFS::const_pointer path_fs) #ifdef _WIN32 const auto buffer = WideCharToMultiByte(CP_UTF8, path_fs); - return FixSeparators(PathTraitsUTF8::string(buffer.c_str())); + return FixSeparators(PathTraitsUTF8::string(buffer)); #else #ifdef HAVE_FS_CHARSET if (fs_converter == nullptr) @@ -108,7 +108,7 @@ PathToUTF8(PathTraitsFS::const_pointer path_fs) #ifdef HAVE_FS_CHARSET const auto buffer = fs_converter->ToUTF8(path_fs); - return FixSeparators(PathTraitsUTF8::string(buffer.c_str())); + return FixSeparators(PathTraitsUTF8::string(buffer)); #endif #endif } @@ -125,13 +125,13 @@ PathFromUTF8(PathTraitsUTF8::const_pointer path_utf8) #ifdef _WIN32 const auto buffer = MultiByteToWideChar(CP_UTF8, path_utf8); - return PathTraitsFS::string(buffer.c_str()); + return PathTraitsFS::string(buffer); #else if (fs_converter == nullptr) return path_utf8; const auto buffer = fs_converter->FromUTF8(path_utf8); - return PathTraitsFS::string(buffer.c_str()); + return PathTraitsFS::string(buffer); #endif } diff --git a/src/lib/icu/Compare.hxx b/src/lib/icu/Compare.hxx index 8321abc28..356681f7d 100644 --- a/src/lib/icu/Compare.hxx +++ b/src/lib/icu/Compare.hxx @@ -38,12 +38,12 @@ public: IcuCompare(const IcuCompare &src) noexcept :needle(src - ? AllocatedString<>::Duplicate(src.needle.c_str()) + ? AllocatedString<>::Duplicate(src.needle) : nullptr) {} IcuCompare &operator=(const IcuCompare &src) noexcept { needle = src - ? AllocatedString<>::Duplicate(src.needle.c_str()) + ? AllocatedString<>::Duplicate(src.needle) : nullptr; return *this; } diff --git a/src/lib/icu/Converter.cxx b/src/lib/icu/Converter.cxx index b227fe755..2473e799e 100644 --- a/src/lib/icu/Converter.cxx +++ b/src/lib/icu/Converter.cxx @@ -95,7 +95,7 @@ DoConvert(iconv_t conv, const char *src) if (in_left > 0) throw std::runtime_error("Charset conversion failed"); - return AllocatedString<>::Duplicate(buffer, sizeof(buffer) - out_left); + return AllocatedString<>::Duplicate({buffer, sizeof(buffer) - out_left}); } #endif @@ -151,7 +151,7 @@ IcuConverter::FromUTF8(const char *s) const throw std::runtime_error(FormatString("Failed to convert from Unicode: %s", u_errorName(code)).c_str()); - return AllocatedString<>::Duplicate(buffer, target); + return AllocatedString<>::Duplicate({buffer, size_t(target - buffer)}); #elif defined(HAVE_ICONV) return DoConvert(from_utf8, s); diff --git a/src/util/AllocatedString.cxx b/src/util/AllocatedString.cxx deleted file mode 100644 index b7e8d391f..000000000 --- a/src/util/AllocatedString.cxx +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright (C) 2015 Max Kellermann - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * - Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * - Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the - * distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include "AllocatedString.hxx" -#include "StringAPI.hxx" - -template<> -AllocatedString -AllocatedString::Duplicate(const_pointer src) -{ - return Duplicate(src, StringLength(src)); -} - -#ifdef _UNICODE - -template<> -AllocatedString -AllocatedString::Duplicate(const_pointer src) -{ - return Duplicate(src, StringLength(src)); -} - -#endif diff --git a/src/util/AllocatedString.hxx b/src/util/AllocatedString.hxx index 202ed619b..162654e68 100644 --- a/src/util/AllocatedString.hxx +++ b/src/util/AllocatedString.hxx @@ -34,6 +34,7 @@ #include #include +#include /** * A string pointer whose memory is managed by this class. @@ -48,6 +49,7 @@ public: using const_reference = typename StringPointer::const_reference; using pointer = typename StringPointer::pointer; using const_pointer = typename StringPointer::const_pointer; + using string_view = std::basic_string_view; using size_type = std::size_t; static constexpr value_type SENTINEL = '\0'; @@ -83,19 +85,9 @@ public: return Donate(p); } - static AllocatedString Duplicate(const_pointer src); - - static AllocatedString Duplicate(const_pointer begin, - const_pointer end) { - auto p = new value_type[end - begin + 1]; - *std::copy(begin, end, p) = SENTINEL; - return Donate(p); - } - - static AllocatedString Duplicate(const_pointer begin, - size_type length) { - auto p = new value_type[length + 1]; - *std::copy_n(begin, length, p) = SENTINEL; + static AllocatedString Duplicate(string_view src) { + auto p = new value_type[src.size() + 1]; + *std::copy_n(src.data(), src.size(), p) = SENTINEL; return Donate(p); } @@ -116,6 +108,10 @@ public: return value == nullptr; } + operator string_view() const noexcept { + return value; + } + constexpr const_pointer c_str() const noexcept { return value; } @@ -141,7 +137,7 @@ public: } AllocatedString Clone() const { - return Duplicate(c_str()); + return Duplicate(*this); } }; diff --git a/src/util/meson.build b/src/util/meson.build index 2339d7702..dc37588cb 100644 --- a/src/util/meson.build +++ b/src/util/meson.build @@ -7,7 +7,6 @@ util = static_library( 'MimeType.cxx', 'NumberParser.cxx', 'StringView.cxx', - 'AllocatedString.cxx', 'TruncateString.cxx', 'StringStrip.cxx', 'StringUtil.cxx',