forked from qt-creator/qt-creator
Utils: Modernize SmallString
Use more C++ api and constexpr. With C++ 17 we can use even more. Change-Id: I33934cd7e087c311bf98501442df848bdb108279 Reviewed-by: Thomas Hartmann <thomas.hartmann@qt.io>
This commit is contained in:
@@ -90,39 +90,35 @@ public:
|
||||
constexpr
|
||||
BasicSmallString(const char(&string)[ArraySize])
|
||||
: m_data(string)
|
||||
{
|
||||
}
|
||||
{}
|
||||
|
||||
BasicSmallString(const char *string, size_type size, size_type capacity)
|
||||
{
|
||||
if (Q_LIKELY(capacity <= shortStringCapacity())) {
|
||||
std::memcpy(m_data.shortString.string, string, size);
|
||||
std::char_traits<char>::copy(m_data.shortString.string, string, size);
|
||||
m_data.shortString.string[size] = 0;
|
||||
m_data.shortString.control.setShortStringSize(size);
|
||||
m_data.shortString.control.setIsShortString(true);
|
||||
m_data.shortString.control.setIsReadOnlyReference(false);
|
||||
} else {
|
||||
m_data.allocated.data.pointer = Memory::allocate(capacity + 1);
|
||||
std::memcpy(m_data.allocated.data.pointer, string, size);
|
||||
std::char_traits<char>::copy(m_data.allocated.data.pointer, string, size);
|
||||
initializeLongString(size, capacity);
|
||||
}
|
||||
}
|
||||
|
||||
explicit BasicSmallString(SmallStringView stringView)
|
||||
: BasicSmallString(stringView.data(), stringView.size(), stringView.size())
|
||||
{
|
||||
}
|
||||
{}
|
||||
|
||||
BasicSmallString(const char *string, size_type size)
|
||||
: BasicSmallString(string, size, size)
|
||||
{
|
||||
}
|
||||
|
||||
template<typename Type,
|
||||
typename = std::enable_if_t<std::is_pointer<Type>::value>
|
||||
>
|
||||
template<typename Type, typename = std::enable_if_t<std::is_pointer<Type>::value>>
|
||||
BasicSmallString(Type characterPointer)
|
||||
: BasicSmallString(characterPointer, std::strlen(characterPointer))
|
||||
: BasicSmallString(characterPointer, std::char_traits<char>::length(characterPointer))
|
||||
{
|
||||
static_assert(!std::is_array<Type>::value, "Input type is array and not char pointer!");
|
||||
}
|
||||
@@ -253,7 +249,7 @@ public:
|
||||
static
|
||||
BasicSmallString fromUtf8(const char *characterPointer)
|
||||
{
|
||||
return BasicSmallString(characterPointer, std::strlen(characterPointer));
|
||||
return BasicSmallString(characterPointer, std::char_traits<char>::length(characterPointer));
|
||||
}
|
||||
|
||||
void reserve(size_type newCapacity)
|
||||
@@ -271,7 +267,7 @@ public:
|
||||
const char *oldData = data();
|
||||
|
||||
char *newData = Memory::allocate(newCapacity + 1);
|
||||
std::memcpy(newData, oldData, oldSize);
|
||||
std::char_traits<char>::copy(newData, oldData, oldSize);
|
||||
m_data.allocated.data.pointer = newData;
|
||||
initializeLongString(oldSize, newCapacity);
|
||||
}
|
||||
@@ -380,7 +376,7 @@ public:
|
||||
|
||||
bool contains(char characterToSearch) const
|
||||
{
|
||||
auto found = std::memchr(data(), characterToSearch, size());
|
||||
auto found = std::char_traits<char>::find(data(), size(), characterToSearch);
|
||||
|
||||
return found != nullptr;
|
||||
}
|
||||
@@ -388,7 +384,9 @@ public:
|
||||
bool startsWith(SmallStringView subStringToSearch) const noexcept
|
||||
{
|
||||
if (size() >= subStringToSearch.size())
|
||||
return !std::memcmp(data(), subStringToSearch.data(), subStringToSearch.size());
|
||||
return !std::char_traits<char>::compare(data(),
|
||||
subStringToSearch.data(),
|
||||
subStringToSearch.size());
|
||||
|
||||
return false;
|
||||
}
|
||||
@@ -401,9 +399,10 @@ public:
|
||||
bool endsWith(SmallStringView subStringToSearch) const noexcept
|
||||
{
|
||||
if (size() >= subStringToSearch.size()) {
|
||||
const int comparison = std::memcmp(end().data() - subStringToSearch.size(),
|
||||
subStringToSearch.data(),
|
||||
subStringToSearch.size());
|
||||
const int comparison = std::char_traits<char>::compare(end().data()
|
||||
- subStringToSearch.size(),
|
||||
subStringToSearch.data(),
|
||||
subStringToSearch.size());
|
||||
return comparison == 0;
|
||||
}
|
||||
|
||||
@@ -462,7 +461,7 @@ public:
|
||||
size_type newSize = oldSize + string.size();
|
||||
|
||||
reserve(optimalCapacity(newSize));
|
||||
std::memcpy(data() + oldSize, string.data(), string.size());
|
||||
std::char_traits<char>::copy(data() + oldSize, string.data(), string.size());
|
||||
at(newSize) = 0;
|
||||
setSize(newSize);
|
||||
}
|
||||
@@ -724,7 +723,7 @@ private:
|
||||
at(size) = 0;
|
||||
}
|
||||
|
||||
void initializeLongString(size_type size, size_type capacity)
|
||||
constexpr void initializeLongString(size_type size, size_type capacity)
|
||||
{
|
||||
m_data.allocated.data.pointer[size] = 0;
|
||||
m_data.allocated.data.size = size;
|
||||
@@ -757,7 +756,7 @@ private:
|
||||
while (found != end()) {
|
||||
start = found + toText.size();
|
||||
|
||||
std::memcpy(found.data(), toText.data(), toText.size());
|
||||
std::char_traits<char>::copy(found.data(), toText.data(), toText.size());
|
||||
|
||||
found = std::search(start,
|
||||
end(),
|
||||
|
||||
Reference in New Issue
Block a user