privacore-open-source-searc.../IOBuffer.h
2017-05-01 15:58:37 +02:00

113 lines
1.9 KiB
C++

#ifndef IOBUFFER_H_
#define IOBUFFER_H_
#include <string.h>
#include <algorithm>
class IOBuffer {
char *buf;
size_t bufused;
size_t bufsize;
public:
IOBuffer()
: buf(0), bufused(0), bufsize(0)
{ }
IOBuffer(IOBuffer &&b)
: buf(b.buf), bufused(b.bufused), bufsize(b.bufsize)
{
b.buf = 0;
b.bufused = 0;
b.bufsize = 0;
}
~IOBuffer() {
delete[] buf;
}
IOBuffer(const IOBuffer &b)
: buf(0), bufused(0), bufsize(0)
{
*this = b;
}
IOBuffer& operator=(const IOBuffer &b) {
if(this!=&b) {
if(b.bufused>bufsize)
reserve_extra(b.bufused-bufsize);
memcpy(buf,b.buf,b.bufused);
bufused = b.bufused;
}
return *this;
}
IOBuffer& operator=(IOBuffer &&b) {
if(this!=&b) {
delete[] buf;
buf = b.buf;
bufused = b.bufused;
bufsize = b.bufsize;
b.buf = 0;
b.bufused = 0;
b.bufsize = 0;
}
return *this;
}
void clear() {
delete[] buf;
buf = 0;
bufsize = 0;
bufused = 0;
}
char *begin() { return buf; }
const char *begin() const { return buf; }
char *end() { return buf+bufused; }
const char *end() const { return buf+bufused; }
size_t used() const { return bufused; }
bool empty() const { return bufused==0; }
size_t spare() const { return bufsize-bufused; }
void pop_front(size_t bytes) {
if(bytes==bufused)
clear();
else {
memmove(buf, buf+bytes, bufused-bytes);
bufused -= bytes;
}
}
void push_back(size_t bytes) {
bufused += bytes;
}
void reserve_extra(size_t extra) {
if(bufused+extra > bufsize) {
size_t new_bufsize = (bufused+extra+4095) & ~4095;
char *new_buf = new char[new_bufsize];
memcpy(new_buf, buf, bufused);
delete[] buf;
buf = new_buf;
bufsize = new_bufsize;
}
}
void swap(IOBuffer &b) {
std::swap(buf,b.buf);
std::swap(bufused,b.bufused);
std::swap(bufsize,b.bufsize);
}
};
inline void swap(IOBuffer &a, IOBuffer &b) {
a.swap(b);
}
#endif