From 75d5790ee125e42cb6b9824b833b08765a01f5fe Mon Sep 17 00:00:00 2001 From: _ov4 Date: Fri, 18 Sep 2026 13:30:25 +0000 Subject: add T_raw_mem for RAII raw memory --- include/memory.h | 67 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 include/memory.h diff --git a/include/memory.h b/include/memory.h new file mode 100644 index 0000000..6cf4536 --- /dev/null +++ b/include/memory.h @@ -0,0 +1,67 @@ +#pragma once + +#include + +namespace ov4 +{ + +template +class T_raw_mem +{ + +public: + + void *_p; + std::size_t _len; + + explicit T_raw_mem(std::size_t size) + { + _p = operator new(size); + _len = size; + } + + ~T_raw_mem() + { + operator delete(_p); + } + + T *get() const noexcept + { + return static_cast(_p); + } + + std::size_t get_size() const noexcept + { + return len; + } + + // COPY is not allowed + T_raw_mem(const T_raw_mem&) = delete; + T_raw_mem& operator=(const T_raw_mem&) = delete; + + // MOVE constructor + T_raw_mem(T_raw_mem &&x) noexcept + : p(std::exchange(x._p, nullptr)), slen(std::exchange(x._len, 0)) + { /* empty */ } + + T_raw_mem& operator=(T_raw_mem &&x) noexcept + { + // if they are same + // release itself, which is not expected + if (this != &x) + { + // consider statement: y = x; + // release memory of y (if exist) + operator delete(_p); + + // and then move + _p = std::exchange(x._p, nullptr); + _len = std::exchange(x._len, 0); + } + + return *this; + } + +}; + +} -- cgit v1.3.1-4-g156e