forked from qt-creator/qt-creator
Utils: Changeable SmallString stack size
The size of the small string optimization was hard coded. For some use cases you want a bigger or smaller size. It is now configurable by a template parameter. For that we changed the name to BasicSmallString and added an alias of BasicSmallString<31> to SmallString. Change-Id: I844b4420d260290307a6018bb6cc4cf3ba7bd449 Reviewed-by: Tim Jenssen <tim.jenssen@qt.io>
This commit is contained in:
@@ -40,100 +40,103 @@
|
||||
|
||||
namespace Utils {
|
||||
|
||||
class SmallStringVector : public std::vector<Utils::SmallString>
|
||||
template<uint SmallStringSize>
|
||||
class BasicSmallStringVector : public std::vector<BasicSmallString<SmallStringSize>>
|
||||
{
|
||||
using SmallString =BasicSmallString<SmallStringSize>;
|
||||
using Base = std::vector<SmallString>;
|
||||
public:
|
||||
SmallStringVector() = default;
|
||||
BasicSmallStringVector() = default;
|
||||
|
||||
SmallStringVector(std::initializer_list<Utils::SmallString> list)
|
||||
BasicSmallStringVector(std::initializer_list<SmallString> list)
|
||||
{
|
||||
reserve(list.size());
|
||||
Base::reserve(list.size());
|
||||
|
||||
for (auto &&entry : list)
|
||||
push_back(entry.clone());
|
||||
Base::push_back(entry.clone());
|
||||
}
|
||||
|
||||
explicit SmallStringVector(const QStringList &stringList)
|
||||
explicit BasicSmallStringVector(const QStringList &stringList)
|
||||
{
|
||||
reserve(std::size_t(stringList.count()));
|
||||
std::vector<SmallString>::reserve(std::size_t(stringList.count()));
|
||||
|
||||
for (const QString &string : stringList)
|
||||
push_back(Utils::SmallString::fromQString(string));
|
||||
Base::push_back(SmallString::fromQString(string));
|
||||
}
|
||||
|
||||
explicit SmallStringVector(const std::vector<std::string> &stringVector)
|
||||
explicit BasicSmallStringVector(const std::vector<std::string> &stringVector)
|
||||
{
|
||||
reserve(std::size_t(stringVector.size()));
|
||||
Base::reserve(std::size_t(stringVector.size()));
|
||||
|
||||
for (const std::string &string : stringVector)
|
||||
emplace_back(string);
|
||||
Base::emplace_back(string);
|
||||
}
|
||||
|
||||
#if !defined(UNIT_TESTS) && !(defined(_MSC_VER) && _MSC_VER < 1900)
|
||||
SmallStringVector(const SmallStringVector &) = delete;
|
||||
SmallStringVector &operator=(const SmallStringVector &) = delete;
|
||||
BasicSmallStringVector(const BasicSmallStringVector &) = delete;
|
||||
BasicSmallStringVector &operator=(const BasicSmallStringVector &) = delete;
|
||||
#else
|
||||
SmallStringVector(const SmallStringVector &) = default;
|
||||
SmallStringVector &operator=(const SmallStringVector &) = default;
|
||||
BasicSmallStringVector(const BasicSmallStringVector &) = default;
|
||||
BasicSmallStringVector &operator=(const BasicSmallStringVector &) = default;
|
||||
#endif
|
||||
|
||||
#if !(defined(_MSC_VER) && _MSC_VER < 1900)
|
||||
SmallStringVector(SmallStringVector &&) noexcept = default;
|
||||
SmallStringVector &operator=(SmallStringVector &&) noexcept = default;
|
||||
BasicSmallStringVector(BasicSmallStringVector &&) noexcept = default;
|
||||
BasicSmallStringVector &operator=(BasicSmallStringVector &&) noexcept = default;
|
||||
#else
|
||||
SmallStringVector(SmallStringVector &&other)
|
||||
: std::vector<Utils::SmallString>(std::move(other))
|
||||
BasicSmallStringVector(BasicSmallStringVector &&other)
|
||||
: Base(std::move(other))
|
||||
{
|
||||
}
|
||||
|
||||
SmallStringVector &operator=(SmallStringVector &&other)
|
||||
BasicSmallStringVector &operator=(BasicSmallStringVector &&other)
|
||||
{
|
||||
std::vector<Utils::SmallString>(std::move(other));
|
||||
Base(std::move(other));
|
||||
|
||||
return *this;
|
||||
}
|
||||
#endif
|
||||
|
||||
Utils::SmallString join(Utils::SmallString &&separator) const
|
||||
SmallString join(SmallString &&separator) const
|
||||
{
|
||||
Utils::SmallString joinedString;
|
||||
SmallString joinedString;
|
||||
|
||||
joinedString.reserve(totalByteSize() + separator.size() * std::size_t(size()));
|
||||
joinedString.reserve(totalByteSize() + separator.size() * std::size_t(Base::size()));
|
||||
|
||||
for (auto stringIterator = begin(); stringIterator != end(); ++stringIterator) {
|
||||
for (auto stringIterator = Base::begin(); stringIterator != Base::end(); ++stringIterator) {
|
||||
joinedString.append(*stringIterator);
|
||||
if (std::next(stringIterator) != end())
|
||||
if (std::next(stringIterator) != Base::end())
|
||||
joinedString.append(separator);
|
||||
}
|
||||
|
||||
return joinedString;
|
||||
}
|
||||
|
||||
bool contains(const Utils::SmallString &string) const noexcept
|
||||
bool contains(SmallStringView string) const noexcept
|
||||
{
|
||||
return std::find(cbegin(), cend(), string) != cend();
|
||||
return std::find(Base::begin(), Base::end(), string) != Base::end();
|
||||
}
|
||||
|
||||
bool removeFast(Utils::SmallStringView valueToBeRemoved)
|
||||
bool removeFast(SmallStringView valueToBeRemoved)
|
||||
{
|
||||
auto position = std::remove(begin(), end(), valueToBeRemoved);
|
||||
auto position = std::remove(Base::begin(), Base::end(), valueToBeRemoved);
|
||||
|
||||
const bool hasEntry = position != end();
|
||||
const bool hasEntry = position != Base::end();
|
||||
|
||||
erase(position, end());
|
||||
erase(position, Base::end());
|
||||
|
||||
return hasEntry;
|
||||
}
|
||||
|
||||
void append(Utils::SmallString &&string)
|
||||
void append(SmallString &&string)
|
||||
{
|
||||
push_back(std::move(string));
|
||||
}
|
||||
|
||||
SmallStringVector clone() const
|
||||
BasicSmallStringVector clone() const
|
||||
{
|
||||
SmallStringVector clonedVector;
|
||||
clonedVector.reserve(size());
|
||||
BasicSmallStringVector clonedVector;
|
||||
clonedVector.reserve(Base::size());
|
||||
|
||||
for (auto &&entry : *this)
|
||||
clonedVector.push_back(entry.clone());
|
||||
@@ -143,7 +146,7 @@ public:
|
||||
|
||||
operator std::vector<std::string>() const
|
||||
{
|
||||
return std::vector<std::string>(begin(), end());
|
||||
return std::vector<std::string>(Base::begin(), Base::end());
|
||||
}
|
||||
|
||||
private:
|
||||
@@ -158,6 +161,8 @@ private:
|
||||
}
|
||||
};
|
||||
|
||||
using SmallStringVector = BasicSmallStringVector<31>;
|
||||
|
||||
} // namespace Utils;
|
||||
|
||||
#pragma pop_macro("noexcept")
|
||||
|
||||
Reference in New Issue
Block a user