aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarco Bubke <marco.bubke@qt.io>2021-03-22 17:59:07 +0100
committerMarco Bubke <marco.bubke@qt.io>2021-03-24 14:12:12 +0000
commit611615f10b2e7d8e37aa7a958b350d71e68dd59e (patch)
tree755515da5f73b075afddc78ff5cc590e062e3896
parent8a82c8f4eeb123cd0301e3454a916a3e697528d0 (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.h12
-rw-r--r--src/libs/utils/smallstring.h9
-rw-r--r--src/libs/utils/smallstringview.h96
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