annotate 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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1 #pragma once
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3 namespace pfc {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4 //! Manages a malloc()'d memory block. Most methods are self explanatory.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5 class mem_block {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7 mem_block( ) noexcept { _clear(); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8 ~mem_block() noexcept { clear(); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9 void resize(size_t);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10 void clear() noexcept;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11 size_t size() const noexcept { return m_size;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12 void * ptr() noexcept { return m_ptr; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13 const void * ptr() const noexcept { return m_ptr; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14 void move( mem_block & other ) noexcept;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 void copy( mem_block const & other );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16 mem_block(const mem_block & other) { _clear(); copy(other); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17 mem_block(mem_block && other) noexcept { _clear(); move(other); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18 mem_block const & operator=( const mem_block & other ) { copy(other); return *this; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19 mem_block const & operator=( mem_block && other ) noexcept { move(other); return *this; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21 void set(const void* ptr, size_t size) {set_data_fromptr(ptr, size); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22 void set_data_fromptr(const void* p, size_t size) { resize(size); memcpy(ptr(), p, size);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
23 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
24 void append_fromptr(const void* p, size_t size) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25 const size_t base = this->size();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26 resize(base + size);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27 memcpy((uint8_t*)ptr() + base, p, size);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30 void* detach() noexcept {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31 void* ret = m_ptr; _clear(); return ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34 void* get_ptr() noexcept { return m_ptr; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35 const void* get_ptr() const noexcept { return m_ptr; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36 size_t get_size() const noexcept { return m_size; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38 //! Attaches an existing memory block, allocated with malloc(), to this object. After this call, the memory becomes managed by this mem_block instance.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39 void attach(void* ptr, size_t size) noexcept {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40 clear();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41 m_ptr = ptr; m_size = size;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43 //! Turns existing memory block, allocated with malloc(), to a mem_block object. After this call, the memory becomes managed by this mem_block instance.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44 static mem_block takeOwnership(void* ptr, size_t size) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
45 mem_block ret(noinit{});
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46 ret.m_ptr = ptr; ret.m_size = size;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
47 return ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50 struct noinit {}; mem_block(noinit) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51 void _clear() noexcept { m_ptr = nullptr; m_size = 0; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52 void * m_ptr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53 size_t m_size;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
54 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
55 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
56