diff options
author | cathook <cat.hook31894@gmail.com> | 2013-11-23 03:20:09 +0800 |
---|---|---|
committer | cathook <cat.hook31894@gmail.com> | 2013-11-23 03:20:09 +0800 |
commit | c56c03da816ef7b09fd14e00e0cc4ee1a347bafd (patch) | |
tree | 5bee723bc12834a2efedabbeb1e3e3d5e63d15c6 | |
parent | 1ab1516ebc0730a0bc63fa6d98dbfdc23840bd7b (diff) | |
download | ctl-c56c03da816ef7b09fd14e00e0cc4ee1a347bafd.tar.gz ctl-c56c03da816ef7b09fd14e00e0cc4ee1a347bafd.tar.zst ctl-c56c03da816ef7b09fd14e00e0cc4ee1a347bafd.zip |
第一版
-rw-r--r-- | include/vector.h | 32 | ||||
-rw-r--r-- | lib/vector.a | bin | 0 -> 3374 bytes | |||
-rwxr-xr-x | lib/vector.so | bin | 0 -> 8422 bytes | |||
-rw-r--r-- | obj/vector.o | bin | 0 -> 3024 bytes | |||
-rw-r--r-- | src/vector.c | 95 |
5 files changed, 127 insertions, 0 deletions
diff --git a/include/vector.h b/include/vector.h new file mode 100644 index 0000000..b665df0 --- /dev/null +++ b/include/vector.h @@ -0,0 +1,32 @@ +#ifndef __vector_h__ +#define __vector_h__ + +#include "utility.h" + +void* ctl_vector_initX(void** ptr, size_t size, uint init_count); +void* ctl_vector_freeX(void** ptr); + +int ctl_vector_addBackX(void** ptr, void* entry); +int ctl_vector_delBackX(void** ptr); + +int ctl_vector_setSizeX (void** ptr, uint count); +void* ctl_vector_setEntryX(void** ptr, uint index, void* data); + +int ctl_vector_getSizeX (void** ptr); +void* ctl_vector_getEntryX (void** ptr, uint index); +int ctl_vector_getEntrySizeX(void** ptr); + +#define ctl_vector_init(X,Y,Z) ctl_vector_initX(ppVOID(X),Y,Z) +#define ctl_vector_free(X) ctl_vector_freeX(ppVOID(X)) + +#define ctl_vector_addBack(X,Y) ctl_vector_addBackX(ppVOID(X),pVOID(Y)) +#define ctl_vector_delBack(X) ctl_vector_delBackX(ppVOID(X)) + +#define ctl_vector_setSize(X,Y) ctl_vector_setSizeX (ppVOID(X),Y) +#define ctl_vector_setEntry(X,Y,Z) ctl_vector_setEntryX(ppVOID(X),Y,pVOID(Z)) + +#define ctl_vector_getSize(X) ctl_vector_getSizeX (ppVOID(X)) +#define ctl_vector_getEntry(X,Y) ctl_vector_getEntryX (ppVOID(X),Y) +#define ctl_vector_getEntrySize(X) ctl_vector_getEntrySizeX(ppVOID(X)) + +#endif /* __vector_h__ */ diff --git a/lib/vector.a b/lib/vector.a Binary files differnew file mode 100644 index 0000000..9b082d0 --- /dev/null +++ b/lib/vector.a diff --git a/lib/vector.so b/lib/vector.so Binary files differnew file mode 100755 index 0000000..e9c7cde --- /dev/null +++ b/lib/vector.so diff --git a/obj/vector.o b/obj/vector.o Binary files differnew file mode 100644 index 0000000..73e9a8a --- /dev/null +++ b/obj/vector.o diff --git a/src/vector.c b/src/vector.c new file mode 100644 index 0000000..babcd74 --- /dev/null +++ b/src/vector.c @@ -0,0 +1,95 @@ +#include "utility.h" +#include "vector.h" + +#include <stdlib.h> +#include <stddef.h> +#include <string.h> + +typedef struct{ + size_t size; + uint use_count; + uint mem_count; + + char buf[]; +} VectorHeader; + +#define getHeader(X) ((VectorHeader*)(pCHAR(X)-offsetof(VectorHeader,buf))) +#define getTotal(X) ((X)->size*(X)->mem_count+sizeof(VectorHeader)) + +void* ctl_vector_initX(void** ptr, size_t size, uint init_count){ + VectorHeader *tmp; + + int mem = 0; + if(init_count >= 1) + for(mem = 1; mem < init_count; mem *= 2); + + tmp = ctl_malloc(sizeof(VectorHeader) + (mem * size)); + + tmp->size = size; + tmp->use_count = init_count; + tmp->mem_count = mem; + if(ptr != NULL){ + *ptr = pVOID(tmp->buf); + } + return pVOID(tmp->buf); +} + +void* ctl_vector_freeX(void **ptr){ + free(pVOID(getHeader(*ptr))); + return (*ptr = NULL); +} + +int ctl_vector_addBackX(void** ptr, void* entry){ + VectorHeader *tmp = getHeader(*ptr); + + if(tmp->use_count + 1 > tmp->mem_count){ + if(tmp->mem_count == 0) tmp->mem_count = 1; + else tmp->mem_count *= 2; + tmp = (VectorHeader*)realloc(pVOID(tmp), getTotal(tmp)); + *ptr = pVOID(tmp->buf); + } + memcpy(tmp->buf + tmp->size * tmp->use_count, entry, tmp->size); + return ++tmp->use_count; +} +int ctl_vector_delBackX(void** ptr){ + VectorHeader *tmp = getHeader(*ptr); + + if((tmp->use_count - 1) * 2 < tmp->mem_count){ + tmp->mem_count /= 2; + tmp = (VectorHeader*)realloc(pVOID(tmp), getTotal(tmp)); + *ptr = pVOID(tmp->buf); + } + + return (--tmp->use_count); +} +int ctl_vector_setSizeX(void** ptr, uint count){ + VectorHeader *tmp = getHeader(*ptr); + + int mem = 0; + if(count >= 1) + for(mem = 1; mem < count; mem *= 2); + tmp->mem_count = mem; + + tmp = (VectorHeader*)realloc(pVOID(tmp), getTotal(tmp)); + *ptr = pVOID(tmp->buf); + return (tmp->use_count = count); +} +void* ctl_vector_setEntryX(void** ptr, uint index, void* data){ + VectorHeader *tmp = getHeader(*ptr); + void* dst = pVOID(tmp->buf + tmp->size * index); + memcpy(dst, data, tmp->size); + return dst; +} + +int ctl_vector_getSizeX (void** ptr){ + return getHeader(*ptr)->use_count; +} + +void* ctl_vector_getEntryX (void** ptr, uint index){ + VectorHeader *tmp = getHeader(*ptr); + return pVOID(tmp->buf + tmp->size * index); +} + +int ctl_vector_getEntrySizeX(void** ptr){ + return getHeader(*ptr)->mem_count; +} |