Skip to content

Commit

Permalink
added reserve
Browse files Browse the repository at this point in the history
  • Loading branch information
silverqx committed Dec 5, 2022
1 parent 1968b40 commit 82b3331
Show file tree
Hide file tree
Showing 3 changed files with 36 additions and 0 deletions.
5 changes: 5 additions & 0 deletions include/orm/ormconcepts.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,11 @@ namespace Query
concept DelimiterConcept = std::convertible_to<T, QString> ||
std::convertible_to<T, QChar>;

/*! QString container concept (QStringList or QVector<QString>). */
template<typename T>
concept QStringContainer = std::convertible_to<T, QStringList> ||
std::convertible_to<T, QVector<QString>>;

} // namespace Orm

TINYORM_END_COMMON_NAMESPACE
Expand Down
30 changes: 30 additions & 0 deletions include/orm/utils/container.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,11 @@ namespace Orm::Utils
template<JoinContainer T, DelimiterConcept D = const QString &>
static QString
join(const T &container, D &&delimiter = Constants::COMMA);

/*! Get a size of the greatest element in the container. */
template<QStringContainer T>
static QVector<QString>::size_type
maxElementSize(const T &container, QVector<QString>::size_type addToElement = 0);
};

template<JoinContainer T, DelimiterConcept D>
Expand All @@ -53,6 +58,31 @@ namespace Orm::Utils
return columnized;
}

template<QStringContainer T>
QVector<QString>::size_type
Container::maxElementSize(const T &container,
const QVector<QString>::size_type addToElement)
{
// Nothing to do
if (container.empty())
return 0;

QVector<QString>::size_type result = 0;

for (const auto &element : container)
if (const auto elementSize = element.size();
elementSize > result
)
result = elementSize;

/* This is the reason for the addToElement argument, this algorithm returns 0,
if the result is 0. */
if (result == 0)
return 0;

return result + addToElement;
}

} // namespace Orm::Utils

TINYORM_END_COMMON_NAMESPACE
Expand Down
1 change: 1 addition & 0 deletions src/orm/query/grammars/grammar.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -580,6 +580,7 @@ QString Grammar::compileDeleteWithJoins(const QueryBuilder &query, const QString
QString Grammar::concatenate(const QStringList &segments)
{
QString result;
result.reserve(ContainerUtils::maxElementSize(segments, 1));

for (const auto &segment : segments) {
if (segment.isEmpty())
Expand Down

0 comments on commit 82b3331

Please sign in to comment.