Mercurial > foo_out_sdl
diff foosdk/sdk/pfc/mem_block.h @ 1:20d02a178406 default tip
*: check in everything else
yay
| author | Paper <paper@tflc.us> |
|---|---|
| date | Mon, 05 Jan 2026 02:15:46 -0500 |
| parents | |
| children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/foosdk/sdk/pfc/mem_block.h Mon Jan 05 02:15:46 2026 -0500 @@ -0,0 +1,56 @@ +#pragma once + +namespace pfc { + //! Manages a malloc()'d memory block. Most methods are self explanatory. + class mem_block { + public: + mem_block( ) noexcept { _clear(); } + ~mem_block() noexcept { clear(); } + void resize(size_t); + void clear() noexcept; + size_t size() const noexcept { return m_size;} + void * ptr() noexcept { return m_ptr; } + const void * ptr() const noexcept { return m_ptr; } + void move( mem_block & other ) noexcept; + void copy( mem_block const & other ); + mem_block(const mem_block & other) { _clear(); copy(other); } + mem_block(mem_block && other) noexcept { _clear(); move(other); } + mem_block const & operator=( const mem_block & other ) { copy(other); return *this; } + mem_block const & operator=( mem_block && other ) noexcept { move(other); return *this; } + + void set(const void* ptr, size_t size) {set_data_fromptr(ptr, size); } + void set_data_fromptr(const void* p, size_t size) { resize(size); memcpy(ptr(), p, size); + } + void append_fromptr(const void* p, size_t size) { + const size_t base = this->size(); + resize(base + size); + memcpy((uint8_t*)ptr() + base, p, size); + } + + void* detach() noexcept { + void* ret = m_ptr; _clear(); return ret; + } + + void* get_ptr() noexcept { return m_ptr; } + const void* get_ptr() const noexcept { return m_ptr; } + size_t get_size() const noexcept { return m_size; } + + //! Attaches an existing memory block, allocated with malloc(), to this object. After this call, the memory becomes managed by this mem_block instance. + void attach(void* ptr, size_t size) noexcept { + clear(); + m_ptr = ptr; m_size = size; + } + //! Turns existing memory block, allocated with malloc(), to a mem_block object. After this call, the memory becomes managed by this mem_block instance. + static mem_block takeOwnership(void* ptr, size_t size) { + mem_block ret(noinit{}); + ret.m_ptr = ptr; ret.m_size = size; + return ret; + } + private: + struct noinit {}; mem_block(noinit) {} + void _clear() noexcept { m_ptr = nullptr; m_size = 0; } + void * m_ptr; + size_t m_size; + }; +} +
