Skip to content

Commit 3b6f0a5

Browse files
committed
light: token split as external func
1 parent 412fc58 commit 3b6f0a5

File tree

2 files changed

+32
-45
lines changed

2 files changed

+32
-45
lines changed

code/espurna/light.cpp

+28-45
Original file line numberDiff line numberDiff line change
@@ -1204,46 +1204,27 @@ void _lightFromHexPayload(espurna::StringView payload) {
12041204
}
12051205
}
12061206

1207-
template <typename T>
1208-
const char* _lightForEachToken(espurna::StringView payload, char sep, T&& callback) {
1209-
const auto begin = payload.begin();
1210-
const auto end = payload.end();
1211-
1212-
auto it = begin;
1213-
for (auto last = it; it != end; ++it) {
1214-
last = it;
1215-
it = std::find(it, payload.end(), ',');
1216-
if (!callback(espurna::StringView(last, it))) {
1217-
break;
1218-
}
1219-
if (it == end) {
1220-
break;
1221-
}
1222-
}
1223-
1224-
return it;
1225-
}
1226-
12271207
void _lightFromCommaSeparatedPayload(espurna::StringView payload, decltype(_light_channels.end()) end) {
12281208
auto it = _light_channels.begin();
12291209
if (it == end) {
12301210
return;
12311211
}
12321212

12331213
// every channel value is separated by a comma
1234-
_lightForEachToken(payload, ',',
1235-
[&](espurna::StringView token) {
1236-
if (it != end) {
1237-
const auto result = parseUnsigned(token, 10);
1238-
if (result.ok) {
1239-
(*it) = result.value;
1240-
++it;
1241-
return true;
1242-
}
1243-
}
1214+
auto split = espurna::SplitStringView(payload, ',');
1215+
while (split.next()) {
1216+
if (it == end) {
1217+
break;
1218+
}
12441219

1245-
return false;
1246-
});
1220+
const auto result = parseUnsigned(split.current(), 10);
1221+
if (!result.ok) {
1222+
break;
1223+
}
1224+
1225+
(*it) = result.value;
1226+
++it;
1227+
}
12471228

12481229
// fill the rest with zeroes
12491230
while (it != end) {
@@ -1288,23 +1269,25 @@ espurna::light::Hsv _lightHsvFromPayload(espurna::StringView payload) {
12881269
// - S [0...100]
12891270
// - V [0...100]
12901271
const auto end = std::end(values);
1291-
const auto parsed = _lightForEachToken(payload, ',',
1292-
[&](espurna::StringView token) {
1293-
if (it != end) {
1294-
const auto result = parseUnsigned(token, 10);
1295-
if (result.ok) {
1296-
(*it) = result.value;
1297-
++it;
1298-
return true;
1299-
}
1300-
}
13011272

1302-
return false;
1303-
});
1273+
auto split = espurna::SplitStringView(payload, ',');
1274+
while (split.next()) {
1275+
if (it == end) {
1276+
break;
1277+
}
1278+
1279+
const auto result = parseUnsigned(split.current(), 10);
1280+
if (!result.ok) {
1281+
break;
1282+
}
1283+
1284+
(*it) = result.value;
1285+
++it;
1286+
}
13041287

13051288
// discard partial or uneven payloads
13061289
espurna::light::Hsv out;
1307-
if ((parsed != payload.end()) || (it != end)) {
1290+
if (split.remaining().length() || (it != end)) {
13081291
return out;
13091292
}
13101293

code/espurna/types.h

+4
Original file line numberDiff line numberDiff line change
@@ -537,6 +537,10 @@ struct SplitStringView {
537537
return _current;
538538
}
539539
540+
StringView remaining() const {
541+
return _view;
542+
}
543+
540544
bool next();
541545
542546
private:

0 commit comments

Comments
 (0)