mirror of
https://github.com/EQEmu/Server.git
synced 2025-12-16 17:41:29 +00:00
213 lines
4.1 KiB
C++
213 lines
4.1 KiB
C++
#include "memory_buffer.h"
|
|
|
|
EQEmu::MemoryBuffer::MemoryBuffer() {
|
|
buffer_ = nullptr;
|
|
size_ = 0;
|
|
capacity_ = 0;
|
|
read_pos_ = 0;
|
|
write_pos_ = 0;
|
|
}
|
|
|
|
EQEmu::MemoryBuffer::MemoryBuffer(size_t sz) {
|
|
buffer_ = nullptr;
|
|
size_ = 0;
|
|
capacity_ = 0;
|
|
read_pos_ = 0;
|
|
write_pos_ = 0;
|
|
Resize(sz);
|
|
}
|
|
|
|
EQEmu::MemoryBuffer::MemoryBuffer(const MemoryBuffer &other) {
|
|
if(other.capacity_) {
|
|
buffer_ = new uchar[other.capacity_];
|
|
memcpy(buffer_, other.buffer_, other.capacity_);
|
|
} else {
|
|
buffer_ = nullptr;
|
|
}
|
|
|
|
size_ = other.size_;
|
|
capacity_ = other.capacity_;
|
|
write_pos_ = other.write_pos_;
|
|
read_pos_ = other.read_pos_;
|
|
}
|
|
|
|
EQEmu::MemoryBuffer::MemoryBuffer(MemoryBuffer &&other) {
|
|
uchar *tbuf = other.buffer_;
|
|
size_t tsz = other.size_;
|
|
size_t tcapacity = other.capacity_;
|
|
size_t twrite_pos = other.write_pos_;
|
|
size_t tread_pos = other.read_pos_;
|
|
|
|
other.buffer_ = nullptr;
|
|
other.size_ = 0;
|
|
other.capacity_ = 0;
|
|
other.read_pos_ = 0;
|
|
other.write_pos_ = 0;
|
|
|
|
buffer_ = tbuf;
|
|
size_ = tsz;
|
|
capacity_ = tcapacity;
|
|
write_pos_ = twrite_pos;
|
|
read_pos_ = tread_pos;
|
|
}
|
|
|
|
EQEmu::MemoryBuffer& EQEmu::MemoryBuffer::operator=(const MemoryBuffer &other) {
|
|
if(this == &other) {
|
|
return *this;
|
|
}
|
|
|
|
if(buffer_) {
|
|
delete[] buffer_;
|
|
}
|
|
|
|
if(other.capacity_) {
|
|
buffer_ = new uchar[other.capacity_];
|
|
memcpy(buffer_, other.buffer_, other.capacity_);
|
|
}
|
|
else {
|
|
buffer_ = nullptr;
|
|
}
|
|
|
|
size_ = other.size_;
|
|
capacity_ = other.capacity_;
|
|
write_pos_ = other.write_pos_;
|
|
read_pos_ = other.read_pos_;
|
|
return *this;
|
|
}
|
|
|
|
EQEmu::MemoryBuffer& EQEmu::MemoryBuffer::operator=(MemoryBuffer &&other) {
|
|
uchar *tbuf = other.buffer_;
|
|
size_t tsz = other.size_;
|
|
size_t tcapacity = other.capacity_;
|
|
size_t twrite_pos = other.write_pos_;
|
|
size_t tread_pos = other.read_pos_;
|
|
|
|
other.buffer_ = nullptr;
|
|
other.size_ = 0;
|
|
other.capacity_ = 0;
|
|
other.read_pos_ = 0;
|
|
other.write_pos_ = 0;
|
|
|
|
buffer_ = tbuf;
|
|
size_ = tsz;
|
|
capacity_ = tcapacity;
|
|
write_pos_ = twrite_pos;
|
|
read_pos_ = tread_pos;
|
|
return *this;
|
|
}
|
|
|
|
EQEmu::MemoryBuffer& EQEmu::MemoryBuffer::operator+=(const MemoryBuffer &rhs) {
|
|
if(!rhs.buffer_) {
|
|
return *this;
|
|
}
|
|
|
|
if(buffer_) {
|
|
size_t old_size = size_;
|
|
Resize(size_ + rhs.size_);
|
|
memcpy(&buffer_[old_size], rhs.buffer_, rhs.size_);
|
|
} else {
|
|
buffer_ = new uchar[rhs.capacity_];
|
|
memcpy(buffer_, rhs.buffer_, rhs.capacity_);
|
|
size_ = rhs.size_;
|
|
capacity_ = rhs.capacity_;
|
|
}
|
|
|
|
return *this;
|
|
}
|
|
|
|
EQEmu::MemoryBuffer::~MemoryBuffer() { Clear(); }
|
|
|
|
uchar& EQEmu::MemoryBuffer::operator[](size_t pos) {
|
|
return buffer_[pos];
|
|
}
|
|
|
|
const uchar& EQEmu::MemoryBuffer::operator[](size_t pos) const {
|
|
return buffer_[pos];
|
|
}
|
|
|
|
bool EQEmu::MemoryBuffer::Empty() {
|
|
return size_ == 0;
|
|
}
|
|
|
|
bool EQEmu::MemoryBuffer::Empty() const {
|
|
return size_ == 0;
|
|
}
|
|
|
|
size_t EQEmu::MemoryBuffer::Size() {
|
|
return size_;
|
|
}
|
|
|
|
size_t EQEmu::MemoryBuffer::Size() const {
|
|
return size_;
|
|
}
|
|
|
|
size_t EQEmu::MemoryBuffer::Capacity() {
|
|
return capacity_;
|
|
}
|
|
|
|
size_t EQEmu::MemoryBuffer::Capacity() const {
|
|
return capacity_;
|
|
}
|
|
|
|
void EQEmu::MemoryBuffer::Resize(size_t sz) {
|
|
if(!buffer_) {
|
|
size_t new_size = sz + 64;
|
|
buffer_ = new uchar[new_size];
|
|
capacity_ = new_size;
|
|
size_ = sz;
|
|
memset(buffer_, 0, capacity_);
|
|
return;
|
|
}
|
|
|
|
if(sz > capacity_) {
|
|
size_t new_size = sz + 32;
|
|
uchar *temp = new uchar[new_size];
|
|
memcpy(temp, buffer_, capacity_);
|
|
delete[] buffer_;
|
|
buffer_ = temp;
|
|
|
|
capacity_ = new_size;
|
|
size_ = sz;
|
|
}
|
|
else {
|
|
size_ = sz;
|
|
}
|
|
}
|
|
|
|
void EQEmu::MemoryBuffer::Clear() {
|
|
if(buffer_) {
|
|
delete[] buffer_;
|
|
buffer_ = nullptr;
|
|
}
|
|
|
|
size_ = 0;
|
|
capacity_ = 0;
|
|
write_pos_ = 0;
|
|
read_pos_ = 0;
|
|
}
|
|
|
|
void EQEmu::MemoryBuffer::Zero() {
|
|
if(buffer_) {
|
|
memset(buffer_, 0, capacity_);
|
|
}
|
|
}
|
|
|
|
void EQEmu::MemoryBuffer::Write(const char *val, size_t len) {
|
|
size_t size_needed = write_pos_ + len;
|
|
Resize(size_needed);
|
|
|
|
memcpy(&buffer_[write_pos_], val, len);
|
|
write_pos_ += len;
|
|
}
|
|
|
|
void EQEmu::MemoryBuffer::Read(uchar *buf, size_t len) {
|
|
memcpy(buf, &buffer_[read_pos_], len);
|
|
read_pos_ += len;
|
|
}
|
|
|
|
void EQEmu::MemoryBuffer::Read(char *str) {
|
|
size_t len = strlen((const char*)&buffer_[read_pos_]);
|
|
memcpy(str, &buffer_[read_pos_], len);
|
|
read_pos_ += len;
|
|
}
|