template<class T> class SharedBuffer {
public:
typedef T* ObjectPointer;
SharedBuffer(const SharedBuffer& rhs):
buffer_size(rhs.buffer_size), buffer_pointer(nullptr)
{
create_buffer();
memcpy(buffer_pointer, rhs.buffer_pointer, sizeof(T) * buffer_size);
}
SharedBuffer& operator= (const SharedBuffer& rhs) {
if(this == &rhs) {
return *this;
}
buffer_size = rhs.buffer_size;
if(buffer_pointer) {
delete[] buffer_pointer;
buffer_pointer = nullptr;
}
create_buffer();
memcpy(buffer_pointer, rhs.buffer_pointer, sizeof(T) * buffer_size);
}
explicit SharedBuffer(const unsigned short size):
buffer_size(size), buffer_pointer(nullptr)
{
create_buffer();
}
ObjectPointer operator()()const {
return buffer_pointer;
}
~SharedBuffer() {
if(buffer_pointer) {
delete[] buffer_pointer;
buffer_pointer = nullptr;
}
}
const unsigned short size() const {
return buffer_size;
}
protected:
void create_buffer() {
if(nullptr == buffer_pointer) {
buffer_pointer = new T[buffer_size];
}
buffer_zero();
}
void buffer_zero() {
if(nullptr != buffer_pointer) {
memset(buffer_pointer, 0x00, sizeof(T) * buffer_size);
}
}
private:
unsigned short buffer_size;
ObjectPointer buffer_pointer;
};