diff options
| author | _ov4 <ov4@ov4.org> | 2026-09-18 13:30:25 +0000 |
|---|---|---|
| committer | _ov4 <ov4@ov4.org> | 2026-09-18 13:30:25 +0000 |
| commit | 75d5790ee125e42cb6b9824b833b08765a01f5fe (patch) | |
| tree | 028f19594bed2fd591f8650ab0ef00b9f8a7aa85 /include | |
| parent | 464d090c9d42a02697548fd1f471f8b6450ebaf2 (diff) | |
add T_raw_mem for RAII raw memory
Diffstat (limited to 'include')
| -rw-r--r-- | include/memory.h | 67 |
1 files changed, 67 insertions, 0 deletions
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 <string> + +namespace ov4 +{ + +template <typename T> +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<T*>(_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; + } + +}; + +} |
