commit d370fc6201427d77c3e169ca2c3b87e7dc6beb6b
parent 2e2faaeb89023bdfde43ae0104db1b95e2309691
Author: vaplv <vaplv@free.fr>
Date: Wed, 18 Jun 2014 17:41:19 +0200
Improve memory layout
Fix issues with non POD data structures
Diffstat:
1 file changed, 12 insertions(+), 8 deletions(-)
diff --git a/src/dynamic_array.h b/src/dynamic_array.h
@@ -39,7 +39,8 @@
struct DARRAY_TYPE__ {
DARRAY_DATA* data;
- DARRAY_DATA buf[16]; /* Static buffer. Avoid mem alloc on small arrays */
+ /* Avoids alloc on small arrays */
+ char ALIGN(ALIGNOF(DARRAY_DATA)) buf[16*sizeof(DARRAY_DATA)];
size_t size;
size_t capacity;
struct mem_allocator* allocator;
@@ -88,10 +89,13 @@ DARRAY_FUNC__(init)
(struct mem_allocator* allocator, /* May be NULL <=> use default allocator */
struct DARRAY_TYPE__* darray)
{
+ size_t i;
ASSERT(darray);
- darray->data = darray->buf;
+ darray->data = (DARRAY_DATA*)darray->buf;
darray->size = 0;
darray->capacity = sizeof(darray->buf)/sizeof(DARRAY_DATA);
+ FOR_EACH(i, 0, darray->capacity)
+ DARRAY_FUNCTOR_INIT(allocator, darray->data + i);
darray->allocator = allocator ? allocator : &mem_default_allocator;
}
@@ -110,7 +114,7 @@ DARRAY_FUNC__(release)(struct DARRAY_TYPE__* darray)
{
ASSERT(darray);
DARRAY_FUNC__(clear)(darray);
- if( darray->data != darray->buf )
+ if( darray->data != (DARRAY_DATA*)darray->buf )
MEM_FREE(darray->allocator, darray->data);
}
@@ -144,7 +148,7 @@ DARRAY_FUNC__(reserve)(struct DARRAY_TYPE__* darray, const size_t sz)
}
}
}
- if(darray->data != darray->buf)
+ if(darray->data != (DARRAY_DATA*)darray->buf)
MEM_FREE(darray->allocator, darray->data);
darray->data = data;
@@ -248,10 +252,10 @@ DARRAY_FUNC__(copy_and_clear)
return 0;
}
- if(src->data != src->buf && src->allocator == dst->allocator) {
+ if(src->data != (DARRAY_DATA*)src->buf && src->allocator == dst->allocator) {
/* Give the ownership of src->m_Data to dst */
- if(dst->data != dst->buf) {
- DARRAY_FUNC__(clear)(dst);
+ DARRAY_FUNC__(clear)(dst);
+ if(dst->data != (DARRAY_DATA*)dst->buf) {
MEM_FREE(dst->allocator, dst->data);
}
dst->data = src->data;
@@ -274,7 +278,7 @@ DARRAY_FUNC__(copy_and_clear)
res = DARRAY_FUNCTOR_COPY_AND_RELEASE(dst_data+i, src_data+i);
if(res) return res;
}
- DARRAY_FUNC__(clear)(src);
+ src->size = 0;
}
return res;
}