Utils: Add stringutils splitAtFirst

Change-Id: I221d6c6086f53ec5f94c1157ea533d862db38d52
Reviewed-by: hjk <hjk@qt.io>
This commit is contained in:
Marcus Tillmanns
2023-03-12 20:26:25 +01:00
parent c7e94d80c7
commit 9f1afb0318
3 changed files with 57 additions and 0 deletions

View File

@@ -527,4 +527,23 @@ QTCREATOR_UTILS_EXPORT FilePath appendHelper(const FilePath &base, int n)
return base.stringAppended(QString::number(n));
}
QTCREATOR_UTILS_EXPORT QPair<QStringView, QStringView> splitAtFirst(const QStringView &stringView,
QChar ch)
{
int splitIdx = stringView.indexOf(ch);
if (splitIdx == -1)
return {stringView, {}};
QStringView left = stringView.mid(0, splitIdx);
QStringView right = stringView.mid(splitIdx + 1);
return {left, right};
}
QTCREATOR_UTILS_EXPORT QPair<QStringView, QStringView> splitAtFirst(const QString &string, QChar ch)
{
QStringView view = string;
return splitAtFirst(view, ch);
}
} // namespace Utils

View File

@@ -115,4 +115,8 @@ QTCREATOR_UTILS_EXPORT QString trimFront(const QString &string, QChar ch);
QTCREATOR_UTILS_EXPORT QString trimBack(const QString &string, QChar ch);
QTCREATOR_UTILS_EXPORT QString trim(const QString &string, QChar ch);
QTCREATOR_UTILS_EXPORT QPair<QStringView, QStringView> splitAtFirst(const QString &string, QChar ch);
QTCREATOR_UTILS_EXPORT QPair<QStringView, QStringView> splitAtFirst(const QStringView &stringView,
QChar ch);
} // namespace Utils

View File

@@ -79,6 +79,8 @@ private slots:
void testTrim();
void testWildcardToRegularExpression_data();
void testWildcardToRegularExpression();
void testSplitAtFirst_data();
void testSplitAtFirst();
private:
TestMacroExpander mx;
@@ -404,6 +406,38 @@ void tst_StringUtils::testWildcardToRegularExpression()
QCOMPARE(string.contains(re), matches);
}
void tst_StringUtils::testSplitAtFirst_data()
{
QTest::addColumn<QString>("string");
QTest::addColumn<QChar>("separator");
QTest::addColumn<QString>("left");
QTest::addColumn<QString>("right");
QTest::newRow("Empty") << QString{} << QChar{} << QString{} << QString{};
QTest::newRow("EmptyString") << QString{} << QChar{'a'} << QString{} << QString{};
QTest::newRow("EmptySeparator") << QString{"abc"} << QChar{} << QString{"abc"} << QString{};
QTest::newRow("NoSeparator") << QString{"abc"} << QChar{'d'} << QString{"abc"} << QString{};
QTest::newRow("SeparatorAtStart") << QString{"abc"} << QChar{'a'} << QString{} << QString{"bc"};
QTest::newRow("SeparatorAtEnd") << QString{"abc"} << QChar{'c'} << QString{"ab"} << QString{};
QTest::newRow("SeparatorInMiddle")
<< QString{"abc"} << QChar{'b'} << QString{"a"} << QString{"c"};
QTest::newRow("SeparatorAtStartAndEnd")
<< QString{"abca"} << QChar{'a'} << QString{} << QString{"bca"};
}
void tst_StringUtils::testSplitAtFirst()
{
QFETCH(QString, string);
QFETCH(QChar, separator);
QFETCH(QString, left);
QFETCH(QString, right);
const auto [l, r] = Utils::splitAtFirst(string, separator);
QCOMPARE(l, left);
QCOMPARE(r, right);
}
QTEST_GUILESS_MAIN(tst_StringUtils)
#include "tst_stringutils.moc"