diff options
| author | tslil <tslil@posteo.de> | 2026-04-04 17:44:21 +0100 |
|---|---|---|
| committer | tslil <tslil@posteo.de> | 2026-04-04 17:47:21 +0100 |
| commit | 5413fb67d5454666cd4606ac51e8f8d1ae31aa6e (patch) | |
| tree | effd7869b631e1e1a455b65eea1a1f12263b4bba /somebar/src/line_buffer.hpp | |
| parent | 0c860a57966d4c0f4ef817b9c7f378de4623a236 (diff) | |
cleanup
Diffstat (limited to 'somebar/src/line_buffer.hpp')
| -rw-r--r-- | somebar/src/line_buffer.hpp | 71 |
1 files changed, 0 insertions, 71 deletions
diff --git a/somebar/src/line_buffer.hpp b/somebar/src/line_buffer.hpp deleted file mode 100644 index a5497bf..0000000 --- a/somebar/src/line_buffer.hpp +++ /dev/null @@ -1,71 +0,0 @@ -// somebar - dwl bar -// See LICENSE file for copyright and license details. - -#pragma once -#include <array> -#include <algorithm> -#include <sys/types.h> - -// reads data from Reader, and passes complete lines to Consumer. -template<size_t BufSize> -class LineBuffer { - using Iterator = typename std::array<char, BufSize>::iterator; - std::array<char, BufSize> _buffer; - Iterator _bufferedTo; - Iterator _consumedTo; - bool _discardLine {false}; -public: - LineBuffer() - : _bufferedTo {_buffer.begin()} - , _consumedTo {_buffer.begin()} - { - } - - template<typename Reader, typename Consumer> - ssize_t readLines(const Reader& reader, const Consumer& consumer) - { - while (true) { - auto bytesRead = reader(_bufferedTo, _buffer.end() - _bufferedTo); - if (bytesRead <= 0) { - return bytesRead; - } - _bufferedTo += bytesRead; - dispatchLines(consumer); - resetBuffer(); - } - } -private: - template<typename Consumer> - void dispatchLines(const Consumer& consumer) - { - while (true) { - auto separator = std::find(_consumedTo, _bufferedTo, '\n'); - if (separator == _bufferedTo) { - break; - } - size_t lineLength = separator - _consumedTo; - if (!_discardLine) { - consumer(_consumedTo, lineLength); - } - _consumedTo = separator + 1; - _discardLine = false; - } - } - - void resetBuffer() - { - size_t bytesRemaining = _bufferedTo - _consumedTo; - if (bytesRemaining == _buffer.size()) { - // line too long - _discardLine = true; - _consumedTo = _buffer.begin(); - _bufferedTo = _buffer.begin(); - } else { - // move the last partial message to the front of the buffer, so a full-sized - // message will fit - std::copy(_consumedTo, _bufferedTo, _buffer.begin()); - _consumedTo = _buffer.begin(); - _bufferedTo = _consumedTo + bytesRemaining; - } - } -}; |
