aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorcathook <cat.hook31894@gmail.com>2013-11-23 03:20:09 +0800
committercathook <cat.hook31894@gmail.com>2013-11-23 03:20:09 +0800
commitc56c03da816ef7b09fd14e00e0cc4ee1a347bafd (patch)
tree5bee723bc12834a2efedabbeb1e3e3d5e63d15c6
parent1ab1516ebc0730a0bc63fa6d98dbfdc23840bd7b (diff)
downloadctl-c56c03da816ef7b09fd14e00e0cc4ee1a347bafd.tar.gz
ctl-c56c03da816ef7b09fd14e00e0cc4ee1a347bafd.tar.zst
ctl-c56c03da816ef7b09fd14e00e0cc4ee1a347bafd.zip
第一版
-rw-r--r--include/vector.h32
-rw-r--r--lib/vector.abin0 -> 3374 bytes
-rwxr-xr-xlib/vector.sobin0 -> 8422 bytes
-rw-r--r--obj/vector.obin0 -> 3024 bytes
-rw-r--r--src/vector.c95
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
new file mode 100644
index 0000000..9b082d0
--- /dev/null
+++ b/lib/vector.a
Binary files differ
diff --git a/lib/vector.so b/lib/vector.so
new file mode 100755
index 0000000..e9c7cde
--- /dev/null
+++ b/lib/vector.so
Binary files differ
diff --git a/obj/vector.o b/obj/vector.o
new file mode 100644
index 0000000..73e9a8a
--- /dev/null
+++ b/obj/vector.o
Binary files differ
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;
+}