mirror of
https://github.com/privacore/open-source-search-engine.git
synced 2025-02-02 03:38:43 -05:00
113 lines
1.9 KiB
C++
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
|