Skip to content

Commit b4effed

Browse files
committed
Apply Qt's string literal operators liberally
With approximately equivalend fallback string literal operators for Qt versions earlier than 6.4 (since Qt's string literal operators were first added in Qt 6.4). Squashed commit of the following: commit ceefebb Author: Paul Colby <[email protected]> Date: Sat Apr 26 09:42:14 2025 +1000 Add stringliterals_p.h as a unit test dependency commit d358d6d Author: Paul Colby <[email protected]> Date: Sat Apr 26 09:36:42 2025 +1000 Apply literal operators for wrapped regex strings commit 440e000 Author: Paul Colby <[email protected]> Date: Sat Apr 26 09:15:08 2025 +1000 Add remaining string literals to cli unit tests commit 047627b Author: Paul Colby <[email protected]> Date: Sat Apr 26 09:10:20 2025 +1000 Add unit test L1 char literals via `sed` commit 97cdb60 Author: Paul Colby <[email protected]> Date: Sat Apr 26 09:01:52 2025 +1000 Add unit test raw string literals via `sed` commit d32fdf9 Author: Paul Colby <[email protected]> Date: Sat Apr 26 08:59:04 2025 +1000 Add unit test string literals via `sed` commit d593286 Author: Paul Colby <[email protected]> Date: Sat Apr 26 08:46:20 2025 +1000 Rename the DOKIT_USE_STRINGLITERALS macro Because its internal to the Dokit project, not part of the exposed QtPokit library interface. commit 6f4d626 Author: Paul Colby <[email protected]> Date: Fri Apr 25 21:36:49 2025 +1000 Apply more string literals to `cli` commit 64ab722 Author: Paul Colby <[email protected]> Date: Fri Apr 25 21:04:04 2025 +1000 Apply string literals to the `cli` code commit 6b91ce6 Author: Paul Colby <[email protected]> Date: Fri Apr 25 20:35:37 2025 +1000 Apply string literals to the `gui` code commit 3b2e740 Author: Paul Colby <[email protected]> Date: Fri Apr 25 20:10:48 2025 +1000 Document the (internal) QTPOKIT_USE_STRINGLITERALS macro commit ac41b72 Author: Paul Colby <[email protected]> Date: Fri Apr 25 20:03:51 2025 +1000 Update i18n files commit e057210 Author: Paul Colby <[email protected]> Date: Fri Apr 25 19:58:57 2025 +1000 Apply string literals to the rest of `lib` commit 411e79d Author: Paul Colby <[email protected]> Date: Fri Apr 25 19:44:32 2025 +1000 Move stringliterals_p.h up so it can be shared commit 064a3e4 Author: Paul Colby <[email protected]> Date: Fri Apr 25 13:20:48 2025 +1000 Update i18n files commit 7c7fbb2 Author: Paul Colby <[email protected]> Date: Fri Apr 25 12:53:02 2025 +1000 Cast size to the expected type per Qt version commit 0ee4909 Author: Paul Colby <[email protected]> Date: Fri Apr 25 09:45:52 2025 +1000 Add some initial string literal operators
1 parent 1f76816 commit b4effed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

64 files changed

+2052
-1891
lines changed

src/cli/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ target_link_libraries(
4242
PRIVATE Qt${QT_VERSION_MAJOR}::Core
4343
PRIVATE Qt${QT_VERSION_MAJOR}::Bluetooth)
4444

45-
add_executable(cli main.cpp)
45+
add_executable(cli main.cpp ../stringliterals_p.h)
4646

4747
set_target_properties(cli PROPERTIES OUTPUT_NAME dokit)
4848

src/cli/abstractcommand.cpp

Lines changed: 37 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
// SPDX-License-Identifier: LGPL-3.0-or-later
33

44
#include "abstractcommand.h"
5+
#include "../stringliterals_p.h"
56

67
#include <qtpokit/pokitdevice.h>
78
#include <qtpokit/pokitdiscoveryagent.h>
@@ -12,6 +13,8 @@
1213
#include <cmath>
1314
#include <ratio>
1415

16+
DOKIT_USE_STRINGLITERALS
17+
1518
/*!
1619
* \class AbstractCommand
1720
*
@@ -84,10 +87,10 @@ QStringList AbstractCommand::requiredOptions(const QCommandLineParser &parser) c
8487
QStringList AbstractCommand::supportedOptions(const QCommandLineParser &parser) const
8588
{
8689
return requiredOptions(parser) + QStringList{
87-
QLatin1String("debug"),
88-
QLatin1String("device"), QLatin1String("d"),
89-
QLatin1String("output"),
90-
QLatin1String("timeout"),
90+
u"debug"_s,
91+
u"device"_s, u"d"_s,
92+
u"output"_s,
93+
u"timeout"_s,
9194
};
9295
}
9396

@@ -105,11 +108,8 @@ QStringList AbstractCommand::supportedOptions(const QCommandLineParser &parser)
105108
*/
106109
QString AbstractCommand::escapeCsvField(const QString &field)
107110
{
108-
if (field.contains(QLatin1Char(','))||field.contains(QLatin1Char('\r'))||
109-
field.contains(QLatin1Char('"'))||field.contains(QLatin1Char('\n')))
110-
{
111-
return QString::fromLatin1(R"("%1")").arg(
112-
QString(field).replace(QLatin1Char('"'), QLatin1String(R"("")")));
111+
if (field.contains(','_L1) || field.contains('\r'_L1) || field.contains('"'_L1) || field.contains('\n'_L1)) {
112+
return uR"("%1")"_s.arg(QString(field).replace('"'_L1, uR"("")"_s));
113113
} else return field;
114114
}
115115

@@ -150,23 +150,23 @@ template<typename R>
150150
quint32 AbstractCommand::parseNumber(const QString &value, const QString &unit, const quint32 sensibleMinimum)
151151
{
152152
static const QMap<QChar, Ratio> unitPrefixScaleMap {
153-
{ QLatin1Char('E'), makeRatio<std::exa>() },
154-
{ QLatin1Char('P'), makeRatio<std::peta>() },
155-
{ QLatin1Char('T'), makeRatio<std::tera>() },
156-
{ QLatin1Char('G'), makeRatio<std::giga>() },
157-
{ QLatin1Char('M'), makeRatio<std::mega>() },
158-
{ QLatin1Char('K'), makeRatio<std::kilo>() }, // Not official SI unit prefix, but commonly used.
159-
{ QLatin1Char('k'), makeRatio<std::kilo>() },
160-
{ QLatin1Char('h'), makeRatio<std::hecto>() },
161-
{ QLatin1Char('d'), makeRatio<std::deci>() },
162-
{ QLatin1Char('c'), makeRatio<std::centi>() },
163-
{ QLatin1Char('m'), makeRatio<std::milli>() },
164-
{ QLatin1Char('u'), makeRatio<std::micro>() }, // Not official SI unit prefix, but commonly used.
165-
{ QChar (0x00B5), makeRatio<std::micro>() }, // Unicode micro symbol (μ).
166-
{ QLatin1Char('n'), makeRatio<std::nano>() },
167-
{ QLatin1Char('p'), makeRatio<std::pico>() },
168-
{ QLatin1Char('f'), makeRatio<std::femto>() },
169-
{ QLatin1Char('a'), makeRatio<std::atto>() },
153+
{ 'E'_L1, makeRatio<std::exa>() },
154+
{ 'P'_L1, makeRatio<std::peta>() },
155+
{ 'T'_L1, makeRatio<std::tera>() },
156+
{ 'G'_L1, makeRatio<std::giga>() },
157+
{ 'M'_L1, makeRatio<std::mega>() },
158+
{ 'K'_L1, makeRatio<std::kilo>() }, // Not official SI unit prefix, but commonly used.
159+
{ 'k'_L1, makeRatio<std::kilo>() },
160+
{ 'h'_L1, makeRatio<std::hecto>() },
161+
{ 'd'_L1, makeRatio<std::deci>() },
162+
{ 'c'_L1, makeRatio<std::centi>() },
163+
{ 'm'_L1, makeRatio<std::milli>() },
164+
{ 'u'_L1, makeRatio<std::micro>() }, // Not official SI unit prefix, but commonly used.
165+
{ QChar(0x00B5), makeRatio<std::micro>() }, // Unicode micro symbol (μ).
166+
{ 'n'_L1, makeRatio<std::nano>() },
167+
{ 'p'_L1, makeRatio<std::pico>() },
168+
{ 'f'_L1, makeRatio<std::femto>() },
169+
{ 'a'_L1, makeRatio<std::atto>() },
170170
};
171171

172172
// Remove the optional (whole) unit suffix.
@@ -275,31 +275,31 @@ QStringList AbstractCommand::processOptions(const QCommandLineParser &parser)
275275
QStringList errors;
276276

277277
// Parse the device (name/addr/uuid) option.
278-
if (parser.isSet(QLatin1String("device"))) {
279-
deviceToScanFor = parser.value(QLatin1String("device"));
278+
if (parser.isSet(u"device"_s)) {
279+
deviceToScanFor = parser.value(u"device"_s);
280280
}
281281

282282
// Parse the output format options (if supported, and supplied).
283-
if ((supportedOptionNames.contains(QLatin1String("output"))) && // Derived classes may have removed.
284-
(parser.isSet(QLatin1String("output"))))
283+
if ((supportedOptionNames.contains(u"output"_s)) && // Derived classes may have removed.
284+
(parser.isSet(u"output"_s)))
285285
{
286-
const QString output = parser.value(QLatin1String("output")).toLower();
287-
if (output == QLatin1String("csv")) {
286+
const QString output = parser.value(u"output"_s).toLower();
287+
if (output == u"csv"_s) {
288288
format = OutputFormat::Csv;
289-
} else if (output == QLatin1String("json")) {
289+
} else if (output == u"json"_s) {
290290
format = OutputFormat::Json;
291-
} else if (output == QLatin1String("text")) {
291+
} else if (output == u"text"_s) {
292292
format = OutputFormat::Text;
293293
} else {
294294
errors.append(tr("Unknown output format: %1").arg(output));
295295
}
296296
}
297297

298298
// Parse the device scan timeout option.
299-
if (parser.isSet(QLatin1String("timeout"))) {
300-
const quint32 timeout = parseNumber<std::milli>(parser.value(QLatin1String("timeout")), QLatin1String("s"), 500);
299+
if (parser.isSet(u"timeout"_s)) {
300+
const quint32 timeout = parseNumber<std::milli>(parser.value(u"timeout"_s), u"s"_s, 500);
301301
if (timeout == 0) {
302-
errors.append(tr("Invalid timeout: %1").arg(parser.value(QLatin1String("timeout"))));
302+
errors.append(tr("Invalid timeout: %1").arg(parser.value(u"timeout"_s)));
303303
} else if (discoveryAgent->lowEnergyDiscoveryTimeout() == -1) {
304304
qCWarning(lc).noquote() << tr("Platform does not support Bluetooth scan timeout");
305305
} else {

src/cli/calibratecommand.cpp

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
// SPDX-License-Identifier: LGPL-3.0-or-later
33

44
#include "calibratecommand.h"
5+
#include "../stringliterals_p.h"
56

67
#include <qtpokit/calibrationservice.h>
78
#include <qtpokit/pokitdevice.h>
@@ -11,6 +12,8 @@
1112

1213
#include <iostream>
1314

15+
DOKIT_USE_STRINGLITERALS
16+
1417
/*!
1518
* \class CalibrateCommand
1619
*
@@ -28,7 +31,7 @@ CalibrateCommand::CalibrateCommand(QObject * const parent) : DeviceCommand(paren
2831
QStringList CalibrateCommand::requiredOptions(const QCommandLineParser &parser) const
2932
{
3033
return DeviceCommand::requiredOptions(parser) + QStringList{
31-
QLatin1String("temperature"),
34+
u"temperature"_s,
3235
};
3336
}
3437

@@ -50,7 +53,7 @@ QStringList CalibrateCommand::processOptions(const QCommandLineParser &parser)
5053
return errors;
5154
}
5255

53-
const QString temperatureString = parser.value(QLatin1String("temperature"));
56+
const QString temperatureString = parser.value(u"temperature"_s);
5457
bool ok;
5558
const float temperatureFloat = temperatureString.toFloat(&ok);
5659
if (ok) {
@@ -103,7 +106,7 @@ void CalibrateCommand::temperatureCalibrated()
103106
std::cout << qUtf8Printable(tr("calibration_result\nsuccess\n"));
104107
break;
105108
case OutputFormat::Json:
106-
std::cout << qUtf8Printable(QLatin1String("true\n"));
109+
std::cout << qUtf8Printable(u"true\n"_s);
107110
break;
108111
case OutputFormat::Text:
109112
std::cout << qUtf8Printable(tr("Done.\n"));

src/cli/dsocommand.cpp

Lines changed: 41 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
// SPDX-License-Identifier: LGPL-3.0-or-later
33

44
#include "dsocommand.h"
5+
#include "../stringliterals_p.h"
56

67
#include <qtpokit/pokitdevice.h>
78

@@ -10,6 +11,8 @@
1011

1112
#include <iostream>
1213

14+
DOKIT_USE_STRINGLITERALS
15+
1316
/*!
1417
* \class DsoCommand
1518
*
@@ -27,18 +30,18 @@ DsoCommand::DsoCommand(QObject * const parent) : DeviceCommand(parent)
2730
QStringList DsoCommand::requiredOptions(const QCommandLineParser &parser) const
2831
{
2932
return DeviceCommand::requiredOptions(parser) + QStringList{
30-
QLatin1String("mode"),
31-
QLatin1String("range"),
33+
u"mode"_s,
34+
u"range"_s,
3235
};
3336
}
3437

3538
QStringList DsoCommand::supportedOptions(const QCommandLineParser &parser) const
3639
{
3740
return DeviceCommand::supportedOptions(parser) + QStringList{
38-
QLatin1String("interval"),
39-
QLatin1String("samples"),
40-
QLatin1String("trigger-level"),
41-
QLatin1String("trigger-mode"),
41+
u"interval"_s,
42+
u"samples"_s,
43+
u"trigger-level"_s,
44+
u"trigger-mode"_s,
4245
};
4346
}
4447

@@ -56,24 +59,24 @@ QStringList DsoCommand::processOptions(const QCommandLineParser &parser)
5659
}
5760

5861
// Parse the (required) mode option.
59-
if (const QString mode = parser.value(QLatin1String("mode")).trimmed().toLower();
60-
mode.startsWith(QLatin1String("ac v")) || mode.startsWith(QLatin1String("vac"))) {
62+
if (const QString mode = parser.value(u"mode"_s).trimmed().toLower();
63+
mode.startsWith(u"ac v"_s) || mode.startsWith(u"vac"_s)) {
6164
settings.mode = DsoService::Mode::AcVoltage;
62-
} else if (mode.startsWith(QLatin1String("dc v")) || mode.startsWith(QLatin1String("vdc"))) {
65+
} else if (mode.startsWith(u"dc v"_s) || mode.startsWith(u"vdc"_s)) {
6366
settings.mode = DsoService::Mode::DcVoltage;
64-
} else if (mode.startsWith(QLatin1String("ac c")) || mode.startsWith(QLatin1String("aac"))) {
67+
} else if (mode.startsWith(u"ac c"_s) || mode.startsWith(u"aac"_s)) {
6568
settings.mode = DsoService::Mode::AcCurrent;
66-
} else if (mode.startsWith(QLatin1String("dc c")) || mode.startsWith(QLatin1String("adc"))) {
69+
} else if (mode.startsWith(u"dc c"_s) || mode.startsWith(u"adc"_s)) {
6770
settings.mode = DsoService::Mode::DcCurrent;
6871
} else {
69-
errors.append(tr("Unknown DSO mode: %1").arg(parser.value(QLatin1String("mode"))));
72+
errors.append(tr("Unknown DSO mode: %1").arg(parser.value(u"mode"_s)));
7073
return errors;
7174
}
7275

7376
// Parse the (required) range option.
7477
QString unit;
7578
{
76-
const QString value = parser.value(QLatin1String("range"));
79+
const QString value = parser.value(u"range"_s);
7780
quint32 sensibleMinimum = 0;
7881
switch (settings.mode) {
7982
case DsoService::Mode::Idle:
@@ -82,13 +85,13 @@ QStringList DsoCommand::processOptions(const QCommandLineParser &parser)
8285
case DsoService::Mode::DcVoltage:
8386
case DsoService::Mode::AcVoltage:
8487
minRangeFunc = minVoltageRange;
85-
unit = QLatin1String("V");
88+
unit = u"V"_s;
8689
sensibleMinimum = 50; // mV.
8790
break;
8891
case DsoService::Mode::DcCurrent:
8992
case DsoService::Mode::AcCurrent:
9093
minRangeFunc = minCurrentRange;
91-
unit = QLatin1String("A");
94+
unit = u"A"_s;
9295
sensibleMinimum = 5; // mA.
9396
break;
9497
}
@@ -100,8 +103,8 @@ QStringList DsoCommand::processOptions(const QCommandLineParser &parser)
100103
}
101104

102105
// Parse the trigger-level option.
103-
if (parser.isSet(QLatin1String("trigger-level"))) {
104-
const QString value = parser.value(QLatin1String("trigger-level"));
106+
if (parser.isSet(u"trigger-level"_s)) {
107+
const QString value = parser.value(u"trigger-level"_s);
105108
const quint32 level = parseNumber<std::micro>(value, unit);
106109
if (level == 0) {
107110
errors.append(tr("Invalid trigger-level value: %1").arg(value));
@@ -111,30 +114,28 @@ QStringList DsoCommand::processOptions(const QCommandLineParser &parser)
111114
}
112115

113116
// Parse the trigger-mode option.
114-
if (parser.isSet(QLatin1String("trigger-mode"))) {
115-
const QString triggerMode = parser.value(QLatin1String("trigger-mode")).trimmed().toLower();
116-
if (triggerMode.startsWith(QLatin1String("free"))) {
117+
if (parser.isSet(u"trigger-mode"_s)) {
118+
const QString triggerMode = parser.value(u"trigger-mode"_s).trimmed().toLower();
119+
if (triggerMode.startsWith(u"free"_s)) {
117120
settings.command = DsoService::Command::FreeRunning;
118-
} else if (triggerMode.startsWith(QLatin1String("ris"))) {
121+
} else if (triggerMode.startsWith(u"ris"_s)) {
119122
settings.command = DsoService::Command::RisingEdgeTrigger;
120-
} else if (triggerMode.startsWith(QLatin1String("fall"))) {
123+
} else if (triggerMode.startsWith(u"fall"_s)) {
121124
settings.command = DsoService::Command::FallingEdgeTrigger;
122125
} else {
123-
errors.append(tr("Unknown trigger mode: %1").arg(
124-
parser.value(QLatin1String("trigger-mode"))));
126+
errors.append(tr("Unknown trigger mode: %1").arg(parser.value(u"trigger-mode"_s)));
125127
}
126128
}
127129

128130
// Ensure that if either trigger option is present, then both are.
129-
if (parser.isSet(QLatin1String("trigger-level")) !=
130-
parser.isSet(QLatin1String("trigger-mode"))) {
131+
if (parser.isSet(u"trigger-level"_s) != parser.isSet(u"trigger-mode"_s)) {
131132
errors.append(tr("If either option is provided, then both must be: trigger-level, trigger-mode"));
132133
}
133134

134135
// Parse the interval option.
135-
if (parser.isSet(QLatin1String("interval"))) {
136-
const QString value = parser.value(QLatin1String("interval"));
137-
const quint32 interval = parseNumber<std::micro>(value, QLatin1String("s"), 500'000);
136+
if (parser.isSet(u"interval"_s)) {
137+
const QString value = parser.value(u"interval"_s);
138+
const quint32 interval = parseNumber<std::micro>(value, u"s"_s, 500'000);
138139
if (interval == 0) {
139140
errors.append(tr("Invalid interval value: %1").arg(value));
140141
} else {
@@ -143,9 +144,9 @@ QStringList DsoCommand::processOptions(const QCommandLineParser &parser)
143144
}
144145

145146
// Parse the samples option.
146-
if (parser.isSet(QLatin1String("samples"))) {
147-
const QString value = parser.value(QLatin1String("samples"));
148-
const quint32 samples = parseNumber<std::ratio<1>>(value, QLatin1String("S"));
147+
if (parser.isSet(u"samples"_s)) {
148+
const QString value = parser.value(u"samples"_s);
149+
const quint32 samples = parseNumber<std::ratio<1>>(value, u"S"_s);
149150
if (samples == 0) {
150151
errors.append(tr("Invalid samples value: %1").arg(value));
151152
} else if (samples > std::numeric_limits<quint16>::max()) {
@@ -244,10 +245,10 @@ void DsoCommand::outputSamples(const DsoService::Samples &samples)
244245
{
245246
QString unit;
246247
switch (metadata.mode) {
247-
case DsoService::Mode::DcVoltage: unit = QLatin1String("Vdc"); break;
248-
case DsoService::Mode::AcVoltage: unit = QLatin1String("Vac"); break;
249-
case DsoService::Mode::DcCurrent: unit = QLatin1String("Adc"); break;
250-
case DsoService::Mode::AcCurrent: unit = QLatin1String("Aac"); break;
248+
case DsoService::Mode::DcVoltage: unit = u"Vdc"_s; break;
249+
case DsoService::Mode::AcVoltage: unit = u"Vac"_s; break;
250+
case DsoService::Mode::DcCurrent: unit = u"Adc"_s; break;
251+
case DsoService::Mode::AcCurrent: unit = u"Aac"_s; break;
251252
default:
252253
qCDebug(lc).noquote() << tr(R"(No known unit for mode %1 "%2".)").arg((int)metadata.mode)
253254
.arg(DsoService::toString(metadata.mode));
@@ -267,10 +268,10 @@ void DsoCommand::outputSamples(const DsoService::Samples &samples)
267268
break;
268269
case OutputFormat::Json:
269270
std::cout << QJsonDocument(QJsonObject{
270-
{ QLatin1String("value"), value },
271-
{ QLatin1String("unit"), unit },
272-
{ QLatin1String("range"), range },
273-
{ QLatin1String("mode"), DsoService::toString(metadata.mode) },
271+
{ u"value"_s, value },
272+
{ u"unit"_s, unit },
273+
{ u"range"_s, range },
274+
{ u"mode"_s, DsoService::toString(metadata.mode) },
274275
}).toJson().toStdString();
275276
break;
276277
case OutputFormat::Text:

src/cli/flashledcommand.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,15 @@
22
// SPDX-License-Identifier: LGPL-3.0-or-later
33

44
#include "flashledcommand.h"
5+
#include "../stringliterals_p.h"
56

67
#include <qtpokit/pokitdevice.h>
78
#include <qtpokit/statusservice.h>
89

910
#include <iostream>
1011

12+
DOKIT_USE_STRINGLITERALS
13+
1114
/*!
1215
* \class FlashLedCommand
1316
*
@@ -90,7 +93,7 @@ void FlashLedCommand::deviceLedFlashed()
9093
std::cout << qUtf8Printable(tr("flash_led_result\nsuccess\n"));
9194
break;
9295
case OutputFormat::Json:
93-
std::cout << qUtf8Printable(QLatin1String("true\n"));
96+
std::cout << qUtf8Printable(u"true\n"_s);
9497
break;
9598
case OutputFormat::Text:
9699
std::cout << qUtf8Printable(tr("Done.\n"));

0 commit comments

Comments
 (0)