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:
Tim Jenssen
2016-11-01 17:15:17 +01:00
parent 601dc5fc07
commit b31c3e0dcb
4 changed files with 216 additions and 210 deletions

View File

@@ -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")