59 struct splitter :
Source<Buffer<uint8_t>>,
Sink<Buffer<uint8_t>> {
63 bool empty()
override {
64 while (!q.full() && !from.
empty()) {
74 bool full()
override {
129 : from(from), to(to) { }
137 static constexpr uint8_t map[]=
"0123456789abcdef";
138 static constexpr size_t blen = 512*3;
146 work.
append({
'\\', map[b >> 4], map[b & 0xf]});
148 down.
push(std::move(work));
simple Buffer backed queue implementation
Definition queue.h:12
T pop() override
remove front of queue and return it
Definition queue.h:65
bool empty() override
check if queue is empty
Definition queue.h:83
bool full() override
return true if queue is full
Definition queue.h:87
void push(T &&val) override
move element into queue
Definition queue.h:49
dynamically allocated, but fixed-size buffer template
Definition buffer.h:18
Buffer & append(T b)
simple append single item
Definition buffer.h:44
convert Sink stream into printable hex
Definition bufferutils.h:136
void push(Buffer< uint8_t > &&in) override
move semantics does not check for space. guard by using 'if (!full) { ... }'
Definition bufferutils.h:144
bool full() override
check if sink is full
Definition bufferutils.h:141
generic object sink, i.e.
Definition streams.h:15
virtual bool full()=0
check if sink is full
void trypush(T &&t)
use this if you don't care if it's going to be successful. data gets discarded if sink is full.
Definition streams.h:28
virtual void push(const T &t)
copy semantics does not check for space. guard by using 'if (!full) { ... }'
Definition streams.h:20
generic object source, i.e.
Definition streams.h:40
virtual T pop()=0
pull object from source does not check for data. guard by using 'if (!empty) { ......
virtual bool empty()=0
check if source is empty
stream splitter
Definition bufferutils.h:58
splitter b
split data Source
Definition bufferutils.h:85
splitter a
split data Source
Definition bufferutils.h:83
SplitPull(Source< Buffer< uint8_t > > &f)
set underlying data Source
Definition bufferutils.h:87
stream splitter
Definition bufferutils.h:24
void push(Buffer< uint8_t > &&in) override
move semantics does not check for space. guard by using 'if (!full) { ... }'
Definition bufferutils.h:29
SplitPush(Sink< Buffer< uint8_t > > &left, Sink< Buffer< uint8_t > > &right)
set sinks for splitter
Definition bufferutils.h:34
bool full() override
check if sink is full
Definition bufferutils.h:26
stream splitter
Definition bufferutils.h:110
bool empty() override
check source and push available data to sink
Definition bufferutils.h:115
Buffer< uint8_t > pop() override
get available data
Definition bufferutils.h:124
Tee(Source< Buffer< uint8_t > > &from, Sink< Buffer< uint8_t > > &to)
set underlying source and sink
Definition bufferutils.h:128