aboutsummaryrefslogtreecommitdiff
path: root/core/container/array.odin
diff options
context:
space:
mode:
Diffstat (limited to 'core/container/array.odin')
-rw-r--r--core/container/array.odin52
1 files changed, 47 insertions, 5 deletions
diff --git a/core/container/array.odin b/core/container/array.odin
index 945d2a5c2..1a9e8ac28 100644
--- a/core/container/array.odin
+++ b/core/container/array.odin
@@ -9,6 +9,38 @@ Array :: struct(T: typeid) {
allocator: mem.Allocator,
}
+/*
+array_init :: proc {
+ array_init_none,
+ array_init_len,
+ array_init_len_cap,
+}
+array_init
+array_delete
+array_len
+array_cap
+array_space
+array_slice
+array_get
+array_get_ptr
+array_set
+array_reserve
+array_resize
+array_push = array_append :: proc{
+ array_push_back,
+ array_push_back_elems,
+}
+array_push_front
+array_pop_back
+array_pop_font
+array_consume
+array_trim
+array_clear
+array_clone
+array_set_capacity
+array_grow
+*/
+
array_init_none :: proc(a: ^$A/Array, allocator := context.allocator) {
array_init_len(a, 0, allocator);
}
@@ -16,10 +48,10 @@ array_init_len :: proc(a: ^$A/Array, len: int, allocator := context.allocator) {
array_init_len_cap(a, 0, 16, allocator);
}
array_init_len_cap :: proc(a: ^$A/Array($T), len: int, cap: int, allocator := context.allocator) {
- a.data = (^T)(mem.alloc(size_of(T)*cap, align_of(T), allocator));
+ a.allocator = allocator;
+ a.data = (^T)(mem.alloc(size_of(T)*cap, align_of(T), a.allocator));
a.len = len;
a.cap = cap;
- a.allocator = allocator;
}
array_init :: proc{array_init_none, array_init_len, array_init_len_cap};
@@ -123,8 +155,15 @@ array_trim :: proc(a: ^$A/Array($T)) {
array_set_capacity(a, a.len);
}
-array_clear :: proc(q: ^$Q/Queue($T)) {
- array_resize(q, 0);
+array_clear :: proc(a: ^$A/Array($T)) {
+ array_resize(a, 0);
+}
+
+array_clone :: proc(a: $A/Array($T), allocator := context.allocator) -> A {
+ res: A;
+ array_init(&res, array_len(a), array_len(a), allocator);
+ copy(array_slice(res), array_slice(a));
+ return res;
}
@@ -153,12 +192,15 @@ array_set_capacity :: proc(a: ^$A/Array($T), new_capacity: int) {
new_data: ^T;
if new_capacity > 0 {
+ if a.allocator.procedure == nil {
+ a.allocator = context.allocator;
+ }
new_data = (^T)(mem.alloc(size_of(T)*new_capacity, align_of(T), a.allocator));
if new_data != nil {
mem.copy(new_data, a.data, size_of(T)*a.len);
}
}
- mem.free(a.data);
+ mem.free(a.data, a.allocator);
a.data = new_data;
a.cap = new_capacity;
}