array 5 + tests

This commit is contained in:
mykola2312 2022-04-17 21:31:08 +03:00
parent 311f00b374
commit bda7315a22
5 changed files with 58 additions and 17 deletions

View file

@ -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
View file

@ -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);
}
} }

View file

@ -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);

View file

@ -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
View file

@ -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;
} }