aboutsummaryrefslogtreecommitdiff
path: root/Vector.c
diff options
context:
space:
mode:
Diffstat (limited to 'Vector.c')
-rw-r--r--Vector.c70
1 files changed, 40 insertions, 30 deletions
diff --git a/Vector.c b/Vector.c
index 2236c64..d2906d8 100644
--- a/Vector.c
+++ b/Vector.c
@@ -2,6 +2,8 @@
#include "Types.h"
#include <string.h>
+/** Metadata **/
+
struct VectorMeta {
MemoryManager *mm;
usize element_size;
@@ -14,6 +16,8 @@ V_metadata(void *arr) {
return arr - sizeof(struct VectorMeta);
}
+/* Create */
+
Vector
V_new(MemoryManager *mm, usize element_size, usize length) {
if (NULL == mm)
@@ -37,33 +41,20 @@ V_new(MemoryManager *mm, usize element_size, usize length) {
return start + sizeof(vm);
}
-usize
-V_length(Vector arr) {
- if (NULL == arr)
- return 0;
- return V_metadata(arr)->length;
-}
+/* Free */
-usize
-V_count(Vector arr) {
- if (NULL == arr)
- return 0;
- return V_metadata(arr)->count;
-}
-
-void*
-V_top(Vector arr) {
- if (NULL == arr)
- return NULL;
-
- struct VectorMeta *vm = V_metadata(arr);
-
- if (0 == vm->count)
- return NULL;
+Result
+V_free(Vector *arr) {
+ if (NULL == arr || NULL == *arr)
+ return R_NullArgument;
- return arr + (vm->count - 1) * vm->element_size;
+ struct VectorMeta *vm = V_metadata(*arr);
+ *arr = vm;
+ return vm->mm->free(*vm->mm, arr);
}
+/* Modify */
+
Result
V_push(Vector *arr, void *pvalue) {
if (NULL == arr || NULL == *arr)
@@ -106,12 +97,31 @@ V_pop(Vector *arr) {
return R_Ok;
}
-Result
-V_free(Vector *arr) {
- if (NULL == arr || NULL == *arr)
- return R_NullArgument;
+/* Get */
- struct VectorMeta *vm = V_metadata(*arr);
- *arr = vm;
- return vm->mm->free(*vm->mm, arr);
+usize
+V_length(Vector arr) {
+ if (NULL == arr)
+ return 0;
+ return V_metadata(arr)->length;
+}
+
+usize
+V_count(Vector arr) {
+ if (NULL == arr)
+ return 0;
+ return V_metadata(arr)->count;
+}
+
+void*
+V_top(Vector arr) {
+ if (NULL == arr)
+ return NULL;
+
+ struct VectorMeta *vm = V_metadata(arr);
+
+ if (0 == vm->count)
+ return NULL;
+
+ return arr + (vm->count - 1) * vm->element_size;
}