summaryrefslogtreecommitdiff
path: root/somebar/src/line_buffer.hpp
diff options
context:
space:
mode:
authortslil <tslil@posteo.de>2026-04-04 17:44:21 +0100
committertslil <tslil@posteo.de>2026-04-04 17:47:21 +0100
commit5413fb67d5454666cd4606ac51e8f8d1ae31aa6e (patch)
treeeffd7869b631e1e1a455b65eea1a1f12263b4bba /somebar/src/line_buffer.hpp
parent0c860a57966d4c0f4ef817b9c7f378de4623a236 (diff)
cleanup
Diffstat (limited to 'somebar/src/line_buffer.hpp')
-rw-r--r--somebar/src/line_buffer.hpp71
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;
- }
- }
-};