diff options
author | Marco Bubke <marco.bubke@qt.io> | 2021-03-22 17:59:07 +0100 |
---|---|---|
committer | Marco Bubke <marco.bubke@qt.io> | 2021-03-24 14:12:12 +0000 |
commit | 611615f10b2e7d8e37aa7a958b350d71e68dd59e (patch) | |
tree | 755515da5f73b075afddc78ff5cc590e062e3896 | |
parent | 8a82c8f4eeb123cd0301e3454a916a3e697528d0 (diff) |
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 <tim.jenssen@qt.io>
-rw-r--r-- | src/libs/clangsupport/filepathview.h | 12 | ||||
-rw-r--r-- | src/libs/utils/smallstring.h | 9 | ||||
-rw-r--r-- | 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 09b940fa61..848ee3207f 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 b04a2300a3..de94ceb910 100644 --- a/src/libs/utils/smallstring.h +++ b/src/libs/utils/smallstring.h @@ -64,8 +64,8 @@ template<uint Size> class BasicSmallString { public: - using iterator = SmallStringView::iterator; - using const_iterator = SmallStringView::const_iterator; + using const_iterator = Internal::SmallStringIterator<std::random_access_iterator_tag, const char>; + using iterator = Internal::SmallStringIterator<std::random_access_iterator_tag, char>; using reverse_iterator = std::reverse_iterator<iterator>; using const_reverse_iterator = std::reverse_iterator<const_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::size_t>(std::distance(begin, end))} {} explicit BasicSmallString(iterator begin, iterator end) - : BasicSmallString(SmallStringView{begin, end}) + + : BasicSmallString{std::addressof(*begin), static_cast<std::size_t>(std::distance(begin, end))} {} template<typename Type, typename = std::enable_if_t<std::is_pointer<Type>::value>> diff --git a/src/libs/utils/smallstringview.h b/src/libs/utils/smallstringview.h index 6d3ea5d35f..208d7034da 100644 --- a/src/libs/utils/smallstringview.h +++ b/src/libs/utils/smallstringview.h @@ -32,6 +32,7 @@ #include <cstring> #include <string> +#include <string_view> 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<std::random_access_iterator_tag, const char>; - using iterator = Internal::SmallStringIterator<std::random_access_iterator_tag, char>; - using const_reverse_iterator = std::reverse_iterator<const_iterator>; - using size_type = std::size_t; - - constexpr SmallStringView() = default; - - constexpr SmallStringView(const char *characterPointer) noexcept - : m_pointer(characterPointer) - , m_size(std::char_traits<char>::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::size_t>(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::size_t>(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::size_t>(std::distance(begin, end))} {} +#endif template<typename String, typename Utils::enable_if_has_char_data_pointer<String> = 0> constexpr SmallStringView(const String &string) noexcept - : m_pointer(string.data()) - , m_size(string.size()) + : std::string_view{string.data(), static_cast<std::size_t>(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<char>::compare(m_pointer, + return !std::char_traits<char>::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 |