From 3b6f0a5a67663662f183ae2c1cbcbc2d7ea54593 Mon Sep 17 00:00:00 2001 From: Maxim Prokhorov Date: Tue, 10 Sep 2024 22:02:49 +0300 Subject: [PATCH] light: token split as external func --- code/espurna/light.cpp | 73 ++++++++++++++++-------------------------- code/espurna/types.h | 4 +++ 2 files changed, 32 insertions(+), 45 deletions(-) diff --git a/code/espurna/light.cpp b/code/espurna/light.cpp index 36e62dc7..d97e746c 100644 --- a/code/espurna/light.cpp +++ b/code/espurna/light.cpp @@ -1204,26 +1204,6 @@ void _lightFromHexPayload(espurna::StringView payload) { } } -template -const char* _lightForEachToken(espurna::StringView payload, char sep, T&& callback) { - const auto begin = payload.begin(); - const auto end = payload.end(); - - auto it = begin; - for (auto last = it; it != end; ++it) { - last = it; - it = std::find(it, payload.end(), ','); - if (!callback(espurna::StringView(last, it))) { - break; - } - if (it == end) { - break; - } - } - - return it; -} - void _lightFromCommaSeparatedPayload(espurna::StringView payload, decltype(_light_channels.end()) end) { auto it = _light_channels.begin(); if (it == end) { @@ -1231,19 +1211,20 @@ void _lightFromCommaSeparatedPayload(espurna::StringView payload, decltype(_ligh } // every channel value is separated by a comma - _lightForEachToken(payload, ',', - [&](espurna::StringView token) { - if (it != end) { - const auto result = parseUnsigned(token, 10); - if (result.ok) { - (*it) = result.value; - ++it; - return true; - } - } + auto split = espurna::SplitStringView(payload, ','); + while (split.next()) { + if (it == end) { + break; + } - return false; - }); + const auto result = parseUnsigned(split.current(), 10); + if (!result.ok) { + break; + } + + (*it) = result.value; + ++it; + } // fill the rest with zeroes while (it != end) { @@ -1288,23 +1269,25 @@ espurna::light::Hsv _lightHsvFromPayload(espurna::StringView payload) { // - S [0...100] // - V [0...100] const auto end = std::end(values); - const auto parsed = _lightForEachToken(payload, ',', - [&](espurna::StringView token) { - if (it != end) { - const auto result = parseUnsigned(token, 10); - if (result.ok) { - (*it) = result.value; - ++it; - return true; - } - } - return false; - }); + auto split = espurna::SplitStringView(payload, ','); + while (split.next()) { + if (it == end) { + break; + } + + const auto result = parseUnsigned(split.current(), 10); + if (!result.ok) { + break; + } + + (*it) = result.value; + ++it; + } // discard partial or uneven payloads espurna::light::Hsv out; - if ((parsed != payload.end()) || (it != end)) { + if (split.remaining().length() || (it != end)) { return out; } diff --git a/code/espurna/types.h b/code/espurna/types.h index 43cc1228..0c5da0f7 100644 --- a/code/espurna/types.h +++ b/code/espurna/types.h @@ -537,6 +537,10 @@ struct SplitStringView { return _current; } + StringView remaining() const { + return _view; + } + bool next(); private: