11 bool empty()
override {
return true; }
12 T
pop()
override {
return T{}; }
13 bool full()
override {
return false; }
14 void push(T &&)
override { }
22 enum Lvl {NONE, INFO, WARN};
23 const char *color[3] = {
"\u001b[0m",
"\u001b[32m",
"\u001b[31m"};
29 virtual void mklog(Lvl lvl,
const char *fmt, va_list args) {
32 b.
len += snprintf((
char*)b.buf+b.
len, b.
size-b.
len,
"%s", color[lvl]);
34 b.
len += vsnprintf((
char*)b.buf+b.
len, b.
size-b.
len, fmt, args);
36 b.
len += snprintf((
char*)b.buf+b.
len, b.
size-b.
len,
"%s", color[NONE]);
43 void info(
const char *fmt, ...) {
46 mklog(INFO, fmt, args);
50 void warn(
const char *fmt, ...) {
53 mklog(WARN, fmt, args);
57 void print(
const char *fmt, ...) {
60 mklog(NONE, fmt, args);
69 for (
auto &c : b) { tmp.
append(c); }
70 out.
push(std::move(tmp));
75 void *
operator new(size_t,
Logger *where) {
82 static constexpr int MAXLEN = 256;
86 void mklog(Lvl lvl,
const char *fmt, va_list args)
override {
87 size_t need = snprintf(buf, 0,
"%s", color[lvl]);
88 if (need >= MAXLEN - ix) {
91 ix += snprintf(buf+ix, MAXLEN - ix,
"%s", color[lvl]);
93 need = vsnprintf(buf, 0, fmt, args);
94 if (need >= MAXLEN - ix) {
97 ix += vsnprintf(buf+ix, MAXLEN - ix, fmt, args);
99 need = snprintf(buf, 0,
"%s", color[NONE]);
100 if (need >= MAXLEN - ix) {
103 ix += snprintf(buf+ix, MAXLEN - ix,
"%s", color[NONE]);
DevNull< T > devnull
black-hole sink & source, just drops all data, provides none
Definition logger.h:18
dynamically allocated, but fixed-size buffer template
Definition buffer.h:18
Buffer & append(T b)
simple append single item
Definition buffer.h:44
size_t size
total capacity of buffer
Definition buffer.h:23
size_t len
number of items stored in buffer
Definition buffer.h:21
buffered logging facility
Definition logger.h:81
bool full() override
check if sink is full
Definition logger.h:114
simple printf-style logging infrastructure
Definition logger.h:21
void print(const char *fmt,...)
None log level.
Definition logger.h:57
void info(const char *fmt,...)
Info log level.
Definition logger.h:43
void push(Buffer< uint8_t > &&b) override
push otherwisely prepared Buffer through Logger
Definition logger.h:67
bool full() override
check if sink is full
Definition logger.h:63
Logger(Sink< Buffer< uint8_t > > &snk)
create Logger wrapping a Buffer Sink
Definition logger.h:73
void warn(const char *fmt,...)
Warn log level.
Definition logger.h:50
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