|
@@ -6,62 +6,70 @@
|
|
|
#include <string.h>
|
|
#include <string.h>
|
|
|
#include <mutex>
|
|
#include <mutex>
|
|
|
|
|
|
|
|
-typedef struct hbuf_s{
|
|
|
|
|
|
|
+typedef struct hbuf_s {
|
|
|
uint8* base;
|
|
uint8* base;
|
|
|
size_t len;
|
|
size_t len;
|
|
|
|
|
+ bool cleanup_;
|
|
|
|
|
|
|
|
- hbuf_s(){
|
|
|
|
|
|
|
+ hbuf_s() {
|
|
|
base = NULL;
|
|
base = NULL;
|
|
|
len = 0;
|
|
len = 0;
|
|
|
|
|
+ cleanup_ = false;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- hbuf_s(uint8* base, size_t len){
|
|
|
|
|
|
|
+ hbuf_s(uint8* base, size_t len) {
|
|
|
this->base = base;
|
|
this->base = base;
|
|
|
this->len = len;
|
|
this->len = len;
|
|
|
|
|
+ cleanup_ = false;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ virtual ~hbuf_s() {
|
|
|
|
|
+ cleanup();
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// warn: must call cleanup when no longer in use, otherwise memory leak.
|
|
// warn: must call cleanup when no longer in use, otherwise memory leak.
|
|
|
- void init(size_t cap){
|
|
|
|
|
|
|
+ void init(size_t cap) {
|
|
|
if (cap == len) return;
|
|
if (cap == len) return;
|
|
|
|
|
|
|
|
- if (!base){
|
|
|
|
|
|
|
+ if (!base) {
|
|
|
base = (uint8*)malloc(cap);
|
|
base = (uint8*)malloc(cap);
|
|
|
memset(base, 0, cap);
|
|
memset(base, 0, cap);
|
|
|
- }else{
|
|
|
|
|
|
|
+ } else {
|
|
|
base = (uint8*)realloc(base, cap);
|
|
base = (uint8*)realloc(base, cap);
|
|
|
}
|
|
}
|
|
|
len = cap;
|
|
len = cap;
|
|
|
|
|
+ cleanup_ = true;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- void resize(size_t cap){
|
|
|
|
|
|
|
+ void resize(size_t cap) {
|
|
|
init(cap);
|
|
init(cap);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- void cleanup(){
|
|
|
|
|
- SAFE_FREE(base);
|
|
|
|
|
- len = 0;
|
|
|
|
|
|
|
+ void cleanup() {
|
|
|
|
|
+ if (cleanup_) {
|
|
|
|
|
+ SAFE_FREE(base);
|
|
|
|
|
+ len = 0;
|
|
|
|
|
+ cleanup_ = false;
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- bool isNull(){
|
|
|
|
|
|
|
+ bool isNull() {
|
|
|
return base == NULL || len == 0;
|
|
return base == NULL || len == 0;
|
|
|
}
|
|
}
|
|
|
}hbuf_t;
|
|
}hbuf_t;
|
|
|
|
|
|
|
|
-class HBuf : public hbuf_t{
|
|
|
|
|
|
|
+class HBuf : public hbuf_t {
|
|
|
public:
|
|
public:
|
|
|
- HBuf() : hbuf_t(){}
|
|
|
|
|
|
|
+ HBuf() : hbuf_t() {}
|
|
|
HBuf(size_t cap) {init(cap);}
|
|
HBuf(size_t cap) {init(cap);}
|
|
|
- HBuf(void* data, size_t len){
|
|
|
|
|
|
|
+ HBuf(void* data, size_t len) {
|
|
|
init(len);
|
|
init(len);
|
|
|
memcpy(base, data, len);
|
|
memcpy(base, data, len);
|
|
|
}
|
|
}
|
|
|
- virtual ~HBuf() {cleanup();}
|
|
|
|
|
-
|
|
|
|
|
- std::mutex mutex; // used in multi-thread
|
|
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
// VL: Variable-Length
|
|
// VL: Variable-Length
|
|
|
-class HVLBuf : public HBuf{
|
|
|
|
|
|
|
+class HVLBuf : public HBuf {
|
|
|
public:
|
|
public:
|
|
|
HVLBuf() : HBuf() {_offset = _size = 0;}
|
|
HVLBuf() : HBuf() {_offset = _size = 0;}
|
|
|
HVLBuf(size_t cap) : HBuf(cap) {_offset = _size = 0;}
|
|
HVLBuf(size_t cap) : HBuf(cap) {_offset = _size = 0;}
|
|
@@ -71,13 +79,13 @@ public:
|
|
|
uint8* data() {return base+_offset;}
|
|
uint8* data() {return base+_offset;}
|
|
|
size_t size() {return _size;}
|
|
size_t size() {return _size;}
|
|
|
|
|
|
|
|
- void push_front(void* ptr, size_t len){
|
|
|
|
|
- if (len > this->len - _size){
|
|
|
|
|
|
|
+ void push_front(void* ptr, size_t len) {
|
|
|
|
|
+ if (len > this->len - _size) {
|
|
|
this->len = MAX(this->len, len)*2;
|
|
this->len = MAX(this->len, len)*2;
|
|
|
base = (uint8*)realloc(base, this->len);
|
|
base = (uint8*)realloc(base, this->len);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- if (_offset < len){
|
|
|
|
|
|
|
+ if (_offset < len) {
|
|
|
// move => end
|
|
// move => end
|
|
|
memmove(base+this->len-_size, data(), _size);
|
|
memmove(base+this->len-_size, data(), _size);
|
|
|
_offset = this->len-_size;
|
|
_offset = this->len-_size;
|
|
@@ -88,11 +96,11 @@ public:
|
|
|
_size += len;
|
|
_size += len;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- void push_back(void* ptr, size_t len){
|
|
|
|
|
- if (len > this->len - _size){
|
|
|
|
|
|
|
+ void push_back(void* ptr, size_t len) {
|
|
|
|
|
+ if (len > this->len - _size) {
|
|
|
this->len = MAX(this->len, len)*2;
|
|
this->len = MAX(this->len, len)*2;
|
|
|
base = (uint8*)realloc(base, this->len);
|
|
base = (uint8*)realloc(base, this->len);
|
|
|
- }else if (len > this->len - _offset - _size){
|
|
|
|
|
|
|
+ }else if (len > this->len - _offset - _size) {
|
|
|
// move => start
|
|
// move => start
|
|
|
memmove(base, data(), _size);
|
|
memmove(base, data(), _size);
|
|
|
_offset = 0;
|
|
_offset = 0;
|
|
@@ -101,8 +109,8 @@ public:
|
|
|
_size += len;
|
|
_size += len;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- void pop_front(void* ptr, size_t len){
|
|
|
|
|
- if (len <= _size){
|
|
|
|
|
|
|
+ void pop_front(void* ptr, size_t len) {
|
|
|
|
|
+ if (len <= _size) {
|
|
|
if (ptr){
|
|
if (ptr){
|
|
|
memcpy(ptr, data(), len);
|
|
memcpy(ptr, data(), len);
|
|
|
}
|
|
}
|
|
@@ -112,32 +120,32 @@ public:
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- void pop_back(void* ptr, size_t len){
|
|
|
|
|
- if (len <= _size){
|
|
|
|
|
- if (ptr){
|
|
|
|
|
|
|
+ void pop_back(void* ptr, size_t len) {
|
|
|
|
|
+ if (len <= _size) {
|
|
|
|
|
+ if (ptr) {
|
|
|
memcpy(ptr, data()+_size-len, len);
|
|
memcpy(ptr, data()+_size-len, len);
|
|
|
}
|
|
}
|
|
|
_size -= len;
|
|
_size -= len;
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- void clear(){
|
|
|
|
|
|
|
+ void clear() {
|
|
|
_offset = _size = 0;
|
|
_offset = _size = 0;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- void prepend(void* ptr, size_t len){
|
|
|
|
|
|
|
+ void prepend(void* ptr, size_t len) {
|
|
|
push_front(ptr, len);
|
|
push_front(ptr, len);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- void append(void* ptr, size_t len){
|
|
|
|
|
|
|
+ void append(void* ptr, size_t len) {
|
|
|
push_back(ptr, len);
|
|
push_back(ptr, len);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- void insert(void* ptr, size_t len){
|
|
|
|
|
|
|
+ void insert(void* ptr, size_t len) {
|
|
|
push_back(ptr, len);
|
|
push_back(ptr, len);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- void remove(size_t len){
|
|
|
|
|
|
|
+ void remove(size_t len) {
|
|
|
pop_front(NULL, len);
|
|
pop_front(NULL, len);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -146,26 +154,26 @@ private:
|
|
|
size_t _size;
|
|
size_t _size;
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
-class HRingBuf : public HBuf{
|
|
|
|
|
|
|
+class HRingBuf : public HBuf {
|
|
|
public:
|
|
public:
|
|
|
HRingBuf() : HBuf() {_head = _tail = _size = 0;}
|
|
HRingBuf() : HBuf() {_head = _tail = _size = 0;}
|
|
|
HRingBuf(size_t cap) : HBuf(cap) {_head = _tail = _size = 0;}
|
|
HRingBuf(size_t cap) : HBuf(cap) {_head = _tail = _size = 0;}
|
|
|
|
|
|
|
|
- uint8* alloc(size_t len){
|
|
|
|
|
|
|
+ uint8* alloc(size_t len) {
|
|
|
uint8* ret = NULL;
|
|
uint8* ret = NULL;
|
|
|
- if (_head < _tail || _size == 0){
|
|
|
|
|
|
|
+ if (_head < _tail || _size == 0) {
|
|
|
// [_tail, this->len) && [0, _head)
|
|
// [_tail, this->len) && [0, _head)
|
|
|
- if (this->len - _tail >= len){
|
|
|
|
|
|
|
+ if (this->len - _tail >= len) {
|
|
|
ret = base + _tail;
|
|
ret = base + _tail;
|
|
|
_tail += len;
|
|
_tail += len;
|
|
|
if (_tail == this->len) _tail = 0;
|
|
if (_tail == this->len) _tail = 0;
|
|
|
- }else if(_head >= len){
|
|
|
|
|
|
|
+ } else if(_head >= len) {
|
|
|
ret = base;
|
|
ret = base;
|
|
|
_tail = len;
|
|
_tail = len;
|
|
|
}
|
|
}
|
|
|
}else{
|
|
}else{
|
|
|
// [_tail, _head)
|
|
// [_tail, _head)
|
|
|
- if (_head - _tail >= len){
|
|
|
|
|
|
|
+ if (_head - _tail >= len) {
|
|
|
ret = base + _tail;
|
|
ret = base + _tail;
|
|
|
_tail += len;
|
|
_tail += len;
|
|
|
}
|
|
}
|
|
@@ -174,12 +182,12 @@ public:
|
|
|
return ret;
|
|
return ret;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- void free(size_t len){
|
|
|
|
|
|
|
+ void free(size_t len) {
|
|
|
_size -= len;
|
|
_size -= len;
|
|
|
- if (len <= this->len - _head){
|
|
|
|
|
|
|
+ if (len <= this->len - _head) {
|
|
|
_head += len;
|
|
_head += len;
|
|
|
if (_head == this->len) _head = 0;
|
|
if (_head == this->len) _head = 0;
|
|
|
- }else{
|
|
|
|
|
|
|
+ } else {
|
|
|
_head = len;
|
|
_head = len;
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|