From 611615f10b2e7d8e37aa7a958b350d71e68dd59e Mon Sep 17 00:00:00 2001 From: Marco Bubke Date: Mon, 22 Mar 2021 17:59:07 +0100 Subject: [PATCH] Utils: Rebase SmallStringView on std::string_view There are still some methods missing but with C++20 we can maybe remove SmallStringView. Change-Id: I65a1eacda0a07cec824f1837e385faa01fc825e9 Reviewed-by: Tim Jenssen --- src/libs/clangsupport/filepathview.h | 12 ++-- src/libs/utils/smallstring.h | 9 +-- src/libs/utils/smallstringview.h | 96 ++++------------------------ 3 files changed, 23 insertions(+), 94 deletions(-) diff --git a/src/libs/clangsupport/filepathview.h b/src/libs/clangsupport/filepathview.h index 09b940fa61a..848ee3207f1 100644 --- a/src/libs/clangsupport/filepathview.h +++ b/src/libs/clangsupport/filepathview.h @@ -39,14 +39,13 @@ class AbstractFilePathView : public Utils::SmallStringView public: constexpr AbstractFilePathView() = default; explicit AbstractFilePathView(const char *const string, const size_type size) noexcept - : Utils::SmallStringView(string, size), - m_slashIndex(lastSlashIndex(*this)) + : AbstractFilePathView{Utils::SmallStringView{string, size}} { } explicit AbstractFilePathView(Utils::SmallStringView filePath) - : Utils::SmallStringView(filePath), - m_slashIndex(lastSlashIndex(filePath)) + : Utils::SmallStringView(filePath) + , m_slashIndex(lastSlashIndex(filePath)) { } @@ -91,9 +90,10 @@ public: constexpr char separator = Utils::HostOsInfo::isWindowsHost() ? WindowsSlash : '/'; auto foundReverse = std::find(filePath.rbegin(), filePath.rend(), separator); auto found = foundReverse.base(); - --found; - return std::distance(filePath.begin(), found); + auto distance = std::distance(filePath.begin(), found); + + return distance - 1; } friend bool operator==(const AbstractFilePathView &first, const AbstractFilePathView &second) diff --git a/src/libs/utils/smallstring.h b/src/libs/utils/smallstring.h index b04a2300a37..de94ceb9108 100644 --- a/src/libs/utils/smallstring.h +++ b/src/libs/utils/smallstring.h @@ -64,8 +64,8 @@ template class BasicSmallString { public: - using iterator = SmallStringView::iterator; - using const_iterator = SmallStringView::const_iterator; + using const_iterator = Internal::SmallStringIterator; + using iterator = Internal::SmallStringIterator; using reverse_iterator = std::reverse_iterator; using const_reverse_iterator = std::reverse_iterator; using size_type = std::size_t; @@ -116,11 +116,12 @@ public: {} explicit BasicSmallString(const_iterator begin, const_iterator end) - : BasicSmallString(SmallStringView{begin, end}) + : BasicSmallString{std::addressof(*begin), static_cast(std::distance(begin, end))} {} explicit BasicSmallString(iterator begin, iterator end) - : BasicSmallString(SmallStringView{begin, end}) + + : BasicSmallString{std::addressof(*begin), static_cast(std::distance(begin, end))} {} template::value>> diff --git a/src/libs/utils/smallstringview.h b/src/libs/utils/smallstringview.h index 6d3ea5d35fe..208d7034da4 100644 --- a/src/libs/utils/smallstringview.h +++ b/src/libs/utils/smallstringview.h @@ -32,6 +32,7 @@ #include #include +#include namespace Utils { @@ -45,45 +46,24 @@ using enable_if_has_char_data_pointer = typename std::enable_if_t< >, char>::value , int>; -class SmallStringView +class SmallStringView : public std::string_view { public: - using const_iterator = Internal::SmallStringIterator; - using iterator = Internal::SmallStringIterator; - using const_reverse_iterator = std::reverse_iterator; - using size_type = std::size_t; - - constexpr SmallStringView() = default; - - constexpr SmallStringView(const char *characterPointer) noexcept - : m_pointer(characterPointer) - , m_size(std::char_traits::length(characterPointer)) - {} - - constexpr SmallStringView(const char *const string, const size_type size) noexcept - : m_pointer(string) - , m_size(size) - {} - - constexpr SmallStringView(const char *const begin, const char *const end) noexcept - : m_pointer(begin) - , m_size(static_cast(std::distance(begin, end))) - {} + using std::string_view::string_view; constexpr SmallStringView(const_iterator begin, const_iterator end) noexcept - : m_pointer(begin.data()) - , m_size(std::size_t(end - begin)) + : std::string_view{std::addressof(*begin), static_cast(std::distance(begin, end))} {} - constexpr SmallStringView(iterator begin, iterator end) noexcept - : m_pointer(begin.data()) - , m_size(std::size_t(end - begin)) +#ifdef Q_OS_WINDOWS + constexpr SmallStringView(const char *const begin, const char *const end) noexcept + : std::string_view{begin, static_cast(std::distance(begin, end))} {} +#endif template = 0> constexpr SmallStringView(const String &string) noexcept - : m_pointer(string.data()) - , m_size(string.size()) + : std::string_view{string.data(), static_cast(string.size())} {} static constexpr SmallStringView fromUtf8(const char *const characterPointer) @@ -91,29 +71,7 @@ public: return SmallStringView(characterPointer); } - constexpr - const char *data() const noexcept - { - return m_pointer; - } - - constexpr - size_type size() const noexcept - { - return m_size; - } - - constexpr - size_type isEmpty() const noexcept - { - return m_size == 0; - } - - constexpr - size_type empty() const noexcept - { - return m_size == 0; - } + constexpr size_type isEmpty() const noexcept { return empty(); } constexpr SmallStringView mid(size_type position) const noexcept @@ -127,28 +85,6 @@ public: return SmallStringView(data() + position, length); } - constexpr - const_iterator begin() const noexcept - { - return data(); - } - - constexpr - const_iterator end() const noexcept - { - return data() + size(); - } - - constexpr const_reverse_iterator rbegin() const noexcept - { - return const_reverse_iterator(end()); - } - - constexpr const_reverse_iterator rend() const noexcept - { - return const_reverse_iterator(begin()); - } - constexpr20 operator std::string() const { return std::string(data(), size()); } explicit operator QString() const @@ -159,7 +95,7 @@ public: constexpr bool startsWith(SmallStringView subStringToSearch) const noexcept { if (size() >= subStringToSearch.size()) - return !std::char_traits::compare(m_pointer, + return !std::char_traits::compare(data(), subStringToSearch.data(), subStringToSearch.size()); @@ -168,16 +104,8 @@ public: constexpr bool startsWith(char characterToSearch) const noexcept { - return m_pointer[0] == characterToSearch; + return *begin() == characterToSearch; } - - constexpr char back() const { return m_pointer[m_size - 1]; } - - constexpr char operator[](std::size_t index) { return m_pointer[index]; } - -private: - const char *m_pointer = ""; - size_type m_size = 0; }; constexpr bool operator==(SmallStringView first, SmallStringView second) noexcept