2#include "nuklear_internal.h"
9#ifdef NK_INCLUDE_DEFAULT_ALLOCATOR
11nk_malloc(
nk_handle unused,
void *old,nk_size size)
24nk_buffer_init_default(
struct nk_buffer *buffer)
27 alloc.userdata.ptr = 0;
28 alloc.alloc = nk_malloc;
29 alloc.free = nk_mfree;
30 nk_buffer_init(buffer, &alloc, NK_BUFFER_DEFAULT_INITIAL_SIZE);
40 NK_ASSERT(initial_size);
41 if (!b || !a || !initial_size)
return;
43 nk_zero(b,
sizeof(*b));
44 b->
type = NK_BUFFER_DYNAMIC;
45 b->
memory.ptr = a->alloc(a->userdata,0, initial_size);
46 b->
memory.size = initial_size;
47 b->
size = initial_size;
52nk_buffer_init_fixed(
struct nk_buffer *b,
void *m, nk_size size)
57 if (!b || !m || !size)
return;
59 nk_zero(b,
sizeof(*b));
60 b->
type = NK_BUFFER_FIXED;
66nk_buffer_align(
void *unaligned,
67 nk_size align, nk_size *alignment,
68 enum nk_buffer_allocation_type type)
76 memory = NK_ALIGN_PTR(unaligned, align);
77 *alignment = (nk_size)((nk_byte*)memory - (nk_byte*)unaligned);
85 memory = NK_ALIGN_PTR_BACK(unaligned, align);
86 *alignment = (nk_size)((nk_byte*)unaligned - (nk_byte*)memory);
96nk_buffer_realloc(
struct nk_buffer *b, nk_size capacity, nk_size *size)
103 if (!b || !size || !b->
pool.alloc || !b->
pool.free)
106 buffer_size = b->
memory.size;
112 if (temp != b->
memory.ptr) {
113 NK_MEMCPY(temp, b->
memory.ptr, buffer_size);
117 if (b->
size == buffer_size) {
125 back_size = buffer_size - b->
size;
126 dst = nk_ptr_add(
void, temp, capacity - back_size);
127 src = nk_ptr_add(
void, temp, b->
size);
128 NK_MEMCPY(dst, src, back_size);
129 b->
size = capacity - back_size;
134nk_buffer_alloc(
struct nk_buffer *b,
enum nk_buffer_allocation_type type,
135 nk_size size, nk_size align)
144 if (!b || !size)
return 0;
148 if (type == NK_BUFFER_FRONT)
150 else unaligned = nk_ptr_add(
void, b->
memory.ptr, b->
size - size);
151 memory = nk_buffer_align(unaligned, align, &alignment, type);
154 if (type == NK_BUFFER_FRONT)
160 if (b->
type != NK_BUFFER_DYNAMIC)
162 NK_ASSERT(b->
pool.alloc && b->
pool.free);
163 if (b->
type != NK_BUFFER_DYNAMIC || !b->
pool.alloc || !b->
pool.free)
168 capacity = NK_MAX(capacity, nk_round_up_pow2((nk_uint)(b->
allocated + size)));
169 b->
memory.ptr = nk_buffer_realloc(b, capacity, &b->
memory.size);
170 if (!b->
memory.ptr)
return 0;
173 if (type == NK_BUFFER_FRONT)
175 else unaligned = nk_ptr_add(
void, b->
memory.ptr, b->
size - size);
176 memory = nk_buffer_align(unaligned, align, &alignment, type);
178 if (type == NK_BUFFER_FRONT)
180 else b->
size -= (size + alignment);
186nk_buffer_push(
struct nk_buffer *b,
enum nk_buffer_allocation_type type,
187 const void *memory, nk_size size, nk_size align)
189 void *mem = nk_buffer_alloc(b, type, size, align);
191 NK_MEMCPY(mem, memory, size);
194nk_buffer_mark(
struct nk_buffer *buffer,
enum nk_buffer_allocation_type type)
198 buffer->marker[type].active = nk_true;
199 if (type == NK_BUFFER_BACK)
200 buffer->marker[type].offset = buffer->
size;
201 else buffer->marker[type].offset = buffer->
allocated;
204nk_buffer_reset(
struct nk_buffer *buffer,
enum nk_buffer_allocation_type type)
208 if (type == NK_BUFFER_BACK) {
210 buffer->
needed -= (buffer->
memory.size - buffer->marker[type].offset);
211 if (buffer->marker[type].active)
212 buffer->
size = buffer->marker[type].offset;
214 buffer->marker[type].active = nk_false;
218 if (buffer->marker[type].active)
219 buffer->
allocated = buffer->marker[type].offset;
221 buffer->marker[type].active = nk_false;
238 if (!b || !b->
memory.ptr)
return;
239 if (b->
type == NK_BUFFER_FIXED)
return;
240 if (!b->
pool.free)
return;
241 NK_ASSERT(b->
pool.free);
249 if (!s || !b)
return;
253 s->memory = b->
memory.ptr;
257nk_buffer_memory(
struct nk_buffer *buffer)
260 if (!buffer)
return 0;
261 return buffer->
memory.ptr;
264nk_buffer_memory_const(
const struct nk_buffer *buffer)
267 if (!buffer)
return 0;
268 return buffer->
memory.ptr;
271nk_buffer_total(
const struct nk_buffer *buffer)
274 if (!buffer)
return 0;
275 return buffer->
memory.size;
main API and documentation file
struct nk_allocator pool
!< buffer marker to free a buffer to a certain offset
struct nk_memory memory
!< memory management type
enum nk_allocation_type type
!< allocator callback for dynamic buffers
nk_size needed
!< total amount of memory allocated
nk_size size
!< number of allocation calls
nk_size allocated
!< growing factor for dynamic memory management
float grow_factor
!< memory and size of the current memory block
nk_size calls
!< totally consumed memory given that enough memory is present