mirror of
https://github.com/IoTManagerProject/IoTManager.git
synced 2026-03-26 22:22:16 +03:00
73 lines
1.5 KiB
C++
73 lines
1.5 KiB
C++
#pragma once
|
|
|
|
#include <Arduino.h>
|
|
|
|
class CharBuffer : Print {
|
|
public:
|
|
CharBuffer(size_t size) : _capacity(size < 2 ? 2 : size), _write(0), _read(0) {
|
|
_pool = new char[_capacity + 1];
|
|
memset(_pool, 0, _capacity + 1);
|
|
}
|
|
|
|
CharBuffer(const CharBuffer &src) {
|
|
_capacity = src._capacity;
|
|
_write = src._write;
|
|
memcpy(_pool, src._pool, src._write);
|
|
}
|
|
|
|
CharBuffer(const char *str) : CharBuffer(strlen(str) + 1) {
|
|
write((const uint8_t *)str, strlen(str));
|
|
}
|
|
|
|
~CharBuffer() {
|
|
delete _pool;
|
|
}
|
|
|
|
void clear() {
|
|
memset(_pool, 0, _capacity);
|
|
_write = 0;
|
|
_read = 0;
|
|
}
|
|
|
|
size_t size() const { return _capacity; }
|
|
|
|
size_t free() const { return _capacity - _write - 2; }
|
|
|
|
size_t available() const { return _write; }
|
|
|
|
const char *c_str() {
|
|
if (_pool[_write] != '\x00')
|
|
_pool[_write] = '\x00';
|
|
return _pool;
|
|
}
|
|
|
|
size_t write(char ch) {
|
|
return write((uint8_t)ch);
|
|
};
|
|
|
|
size_t write(const uint8_t ch) {
|
|
size_t n = 0;
|
|
if (_write < (_capacity - 2)) {
|
|
_pool[_write++] = ch;
|
|
n = 1;
|
|
}
|
|
return n;
|
|
}
|
|
|
|
size_t write(const uint8_t *ptr, const size_t size) {
|
|
size_t n = 0;
|
|
while (n < size) {
|
|
uint8_t ch = ptr[n++];
|
|
if (!write(ch))
|
|
break;
|
|
}
|
|
return n;
|
|
}
|
|
|
|
protected:
|
|
char *_pool;
|
|
size_t _capacity;
|
|
size_t _write;
|
|
size_t _read;
|
|
};
|