From 9f1afb0318a0cdf63603dcb9bfcf3685a34a7ed6 Mon Sep 17 00:00:00 2001 From: Marcus Tillmanns Date: Sun, 12 Mar 2023 20:26:25 +0100 Subject: [PATCH] Utils: Add stringutils splitAtFirst Change-Id: I221d6c6086f53ec5f94c1157ea533d862db38d52 Reviewed-by: hjk --- src/libs/utils/stringutils.cpp | 19 +++++++++++ src/libs/utils/stringutils.h | 4 +++ .../utils/stringutils/tst_stringutils.cpp | 34 +++++++++++++++++++ 3 files changed, 57 insertions(+) diff --git a/src/libs/utils/stringutils.cpp b/src/libs/utils/stringutils.cpp index 3a1afe1fa18..7315a69da2a 100644 --- a/src/libs/utils/stringutils.cpp +++ b/src/libs/utils/stringutils.cpp @@ -527,4 +527,23 @@ QTCREATOR_UTILS_EXPORT FilePath appendHelper(const FilePath &base, int n) return base.stringAppended(QString::number(n)); } +QTCREATOR_UTILS_EXPORT QPair 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 splitAtFirst(const QString &string, QChar ch) +{ + QStringView view = string; + return splitAtFirst(view, ch); +} + } // namespace Utils diff --git a/src/libs/utils/stringutils.h b/src/libs/utils/stringutils.h index 5cf2978c07b..865a1dea122 100644 --- a/src/libs/utils/stringutils.h +++ b/src/libs/utils/stringutils.h @@ -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 splitAtFirst(const QString &string, QChar ch); +QTCREATOR_UTILS_EXPORT QPair splitAtFirst(const QStringView &stringView, + QChar ch); + } // namespace Utils diff --git a/tests/auto/utils/stringutils/tst_stringutils.cpp b/tests/auto/utils/stringutils/tst_stringutils.cpp index e13e8411a5b..4863bfd9508 100644 --- a/tests/auto/utils/stringutils/tst_stringutils.cpp +++ b/tests/auto/utils/stringutils/tst_stringutils.cpp @@ -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("string"); + QTest::addColumn("separator"); + QTest::addColumn("left"); + QTest::addColumn("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"