summaryrefslogtreecommitdiff
path: root/src/core/mem.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/mem.h')
-rw-r--r--src/core/mem.h30
1 files changed, 26 insertions, 4 deletions
diff --git a/src/core/mem.h b/src/core/mem.h
index 1a763f9..e6cc714 100644
--- a/src/core/mem.h
+++ b/src/core/mem.h
@@ -3,10 +3,6 @@
#include <memory.h>
-/*
-** 内存分配相关
-*/
-
void ssrM_freemem();
void ssrM_realloc();
@@ -15,6 +11,32 @@ void ssrM_realloc();
#define ssrM_newvector(T, c) ((T*)calloc(c, sizeof(T)))
#define ssrM_free(obj) free(obj)
+/*vector扩容两倍*/
+#define ssrM_scalevector(T, v, curlen, copy) \
+do{\
+ssr_assert(v);\
+T* t = (T*)calloc(curlen << 1, sizeof(T));\
+if (copy) memcpy(t, v, curlen * sizeof(T));\
+free(v);\
+v = t;\
+}while(0)
+
+/*重设vector容量*/
+#define ssrM_resizevector(T, v, curlen, tarlen, copy) \
+do {\
+T* t = (T*)calloc(tarlen, sizeof(T));\
+if (v && copy) memcpy(t, v, min(curlen, tarlen)* sizeof(T));\
+if (v) free(v);\
+v = t;\
+curlen = tarlen;\
+}while(0)
+
+#define ssrM_rescalevector(T, v, curlen, tarlen, copy)\
+do{\
+if (curlen >= tarlen) {}\
+else { ssrM_resizevector(T, v, curlen, tarlen, copy); }\
+} while (0)
+
#define cast(v, T) (*(T*)(&v))
#endif \ No newline at end of file