array 5 + tests
This commit is contained in:
parent
311f00b374
commit
bda7315a22
5 changed files with 58 additions and 17 deletions
|
|
@ -5,11 +5,13 @@ set(HEADERS
|
||||||
cutypes.h
|
cutypes.h
|
||||||
cutil.h
|
cutil.h
|
||||||
list.h
|
list.h
|
||||||
|
array.h
|
||||||
)
|
)
|
||||||
|
|
||||||
set(SOURCES
|
set(SOURCES
|
||||||
cutil.c
|
cutil.c
|
||||||
list.c
|
list.c
|
||||||
|
array.c
|
||||||
)
|
)
|
||||||
|
|
||||||
add_library(cutil STATIC ${SOURCES} ${HEADERS})
|
add_library(cutil STATIC ${SOURCES} ${HEADERS})
|
||||||
|
|
|
||||||
35
array.c
35
array.c
|
|
@ -9,14 +9,6 @@ void array_init(array_t* array, uint size, uint align)
|
||||||
array->align = align;
|
array->align = align;
|
||||||
}
|
}
|
||||||
|
|
||||||
void array_alloc(array_t* array, uint newCount)
|
|
||||||
{
|
|
||||||
size_t size = newCount*array->size;
|
|
||||||
if (array->count) array->mem = cu_realloc(array->mem, size);
|
|
||||||
else array->mem = cu_malloc(size);
|
|
||||||
array->count = array->mem ? newCount : 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void array_clear(array_t* array)
|
void array_clear(array_t* array)
|
||||||
{
|
{
|
||||||
if (array->count)
|
if (array->count)
|
||||||
|
|
@ -29,20 +21,37 @@ void array_clear(array_t* array)
|
||||||
array->align = 0;
|
array->align = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint array_align(array_t* array, uint count)
|
uint array_align(array_t* array, uint count)
|
||||||
{
|
{
|
||||||
return (count / array->align + !!(count % array->align)) * array->align;
|
return (count / array->align + !!(count % array->align)) * array->align;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void array_resize(array_t* array, uint newCount)
|
||||||
|
{
|
||||||
|
if (array->count % array->align)
|
||||||
|
{
|
||||||
|
array->count = newCount;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
size_t size = array_align(array, newCount)*array->size;
|
||||||
|
if (array->count) array->mem = cu_realloc(array->mem, size);
|
||||||
|
else array->mem = cu_malloc(size);
|
||||||
|
array->count = array->mem ? newCount : 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void array_push(array_t* array, const void* data)
|
void array_push(array_t* array, const void* data)
|
||||||
{
|
{
|
||||||
if (!(array->count % array->align))
|
array_resize(array, array->count + 1);
|
||||||
array_alloc(array, array->count + 1);
|
|
||||||
else array->count++;
|
|
||||||
cu_memcpy(array_last(array), data, array->size);
|
cu_memcpy(array_last(array), data, array->size);
|
||||||
}
|
}
|
||||||
|
|
||||||
void array_pop(array_t* array, void* src)
|
void array_pop(array_t* array, void* src)
|
||||||
{
|
{
|
||||||
|
if (array->count)
|
||||||
|
{
|
||||||
|
if (src) cu_memcpy(src, array_last(array), array->size);
|
||||||
|
array_resize(array, array->count - 1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
7
array.h
7
array.h
|
|
@ -11,13 +11,18 @@ typedef struct {
|
||||||
} array_t;
|
} array_t;
|
||||||
|
|
||||||
void array_init(array_t* array, uint size, uint align);
|
void array_init(array_t* array, uint size, uint align);
|
||||||
void array_alloc(array_t* array, uint newCount);
|
|
||||||
void array_clear(array_t* array);
|
void array_clear(array_t* array);
|
||||||
|
|
||||||
#define array_at(array, i) ((uint8_t*)(array)->mem + (i)*(array)->size)
|
#define array_at(array, i) ((uint8_t*)(array)->mem + (i)*(array)->size)
|
||||||
#define array_first(array) array_at(array, 0)
|
#define array_first(array) array_at(array, 0)
|
||||||
#define array_last(array) array_at(array, (array)->count - 1)
|
#define array_last(array) array_at(array, (array)->count - 1)
|
||||||
|
|
||||||
|
uint array_align(array_t* array, uint count);
|
||||||
|
void array_resize(array_t* array, uint newCount);
|
||||||
|
|
||||||
|
#define CU_ARRAY_FOREACH(array) \
|
||||||
|
for (uint i = 0; i < (array)->count; i++)
|
||||||
|
|
||||||
void array_push(array_t* array, const void* data);
|
void array_push(array_t* array, const void* data);
|
||||||
void array_pop(array_t* array, void* src);
|
void array_pop(array_t* array, void* src);
|
||||||
|
|
||||||
|
|
|
||||||
2
cutil.c
2
cutil.c
|
|
@ -3,7 +3,7 @@
|
||||||
|
|
||||||
void* (*cu_malloc)(size_t) = CUTIL_MALLOC;
|
void* (*cu_malloc)(size_t) = CUTIL_MALLOC;
|
||||||
void* (*cu_realloc)(void*, size_t) = CUTIL_REALLOC;
|
void* (*cu_realloc)(void*, size_t) = CUTIL_REALLOC;
|
||||||
void* (*cu_free)(void*) = CUTIL_FREE;
|
void (*cu_free)(void*) = CUTIL_FREE;
|
||||||
void* (*cu_memset)(void*,int,size_t) = CUTIL_MEMSET;
|
void* (*cu_memset)(void*,int,size_t) = CUTIL_MEMSET;
|
||||||
void* (*cu_memcpy)(void*,const void*,size_t) = CUTIL_MEMCPY;
|
void* (*cu_memcpy)(void*,const void*,size_t) = CUTIL_MEMCPY;
|
||||||
void* (*cu_memmove)(void*,const void*,size_t) = CUTIL_MEMMOVE;
|
void* (*cu_memmove)(void*,const void*,size_t) = CUTIL_MEMMOVE;
|
||||||
|
|
|
||||||
25
test.c
25
test.c
|
|
@ -2,9 +2,11 @@
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
#include "list.h"
|
#include "list.h"
|
||||||
|
#include "array.h"
|
||||||
|
|
||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
|
printf("[list]\n");
|
||||||
list_t list;
|
list_t list;
|
||||||
list_init(&list);
|
list_init(&list);
|
||||||
|
|
||||||
|
|
@ -23,5 +25,28 @@ int main()
|
||||||
}
|
}
|
||||||
|
|
||||||
list_clear(&list);
|
list_clear(&list);
|
||||||
|
|
||||||
|
printf("[array]\n");
|
||||||
|
array_t array;
|
||||||
|
array_init(&array, sizeof(uint), 2);
|
||||||
|
printf("%p\t%d\t%d\t%d\n", array.mem,
|
||||||
|
array.size, array.count, array.align);
|
||||||
|
|
||||||
|
for (uint i = 0; i < 5; i++)
|
||||||
|
{
|
||||||
|
uint num = i;
|
||||||
|
array_push(&array, &i);
|
||||||
|
}
|
||||||
|
array_pop(&array, NULL);
|
||||||
|
|
||||||
|
CU_ARRAY_FOREACH(&array)
|
||||||
|
{
|
||||||
|
uint8_t* ptr = array_at(&array, i);
|
||||||
|
printf("%p\t%d\n", ptr, *(uint*)ptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("%p\t%d\t%d\t%d\n", array.mem,
|
||||||
|
array.size, array.count, array.align);
|
||||||
|
array_clear(&array);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
Loading…
Add table
Reference in a new issue