#pragma once #include #include template class typed_buffer_ptr { std::unique_ptr buffer_; size_t size_; public: typed_buffer_ptr() { } explicit typed_buffer_ptr(size_t size) { reset(size); } void reset(size_t size) { buffer_.reset(new char[size]); memset(buffer_.get(), 0, size); size_ = size; } void resize(size_t size) { std::unique_ptr tmp(new char[size]); memcpy(tmp.get(), buffer_.get(), min(size, size_)); buffer_ = std::move(tmp); size_ = size; } operator T*() { return reinterpret_cast(buffer_.get()); } operator const T*() const { return cget(); } T* operator->() const { return reinterpret_cast(buffer_.get()); } const T* cget() const { return reinterpret_cast(buffer_.get()); } typed_buffer_ptr(const typed_buffer_ptr& other) = delete; typed_buffer_ptr& typed_buffer_ptr::operator=(const typed_buffer_ptr& other) = delete; typed_buffer_ptr(typed_buffer_ptr&& other) { buffer_ = std::move(other.buffer_); size_ = other.size_; other.size_ = 0; } typed_buffer_ptr& operator=(typed_buffer_ptr&& other) { if (this != &other) { buffer_ = std::move(other.buffer_); size_ = other.size_; other.size_ = 0; } } size_t size() const { return size_; } };