arena & vec work

This commit is contained in:
koniifer 2025-03-11 01:11:48 +00:00
parent 2a39dee295
commit bcc06bb133
4 changed files with 51 additions and 14 deletions

View file

@ -19,8 +19,8 @@ Allocator := struct {
/// same behaviour as alloc, except:
/// must move data to new allocation,
/// must ensure the old allocation is freed at some point.
realloc := fn(self: ^Self, $T: type, ptr: ^T, new_count: uint): ?[]T
realloc := fn(self: ^Self, $T: type, prev: []T, new_count: uint): ?[]T
/// must dealloc or schedule the freeing of the given allocation
dealloc := fn(self: ^Self, $T: type, ptr: ^T): void
dealloc := fn(self: ^Self, $T: type, prev: []T): void
}
```

21
main.hb
View file

@ -1,6 +1,6 @@
lily.{fmt, log, mem, alloc, target} := @use("lily")
b: []u8 = idk
// b: []u8 = idk
main := fn(): void {
arena := alloc.Arena.new()
@ -13,11 +13,18 @@ main := fn(): void {
// i += 1
// }
b = arena.alloc_zeroed(u8, 1000).?
// b = arena.alloc_zeroed(u8, 1000).?
mem.bytes(mem.reverse("Hello, World!")[1..]).take(5).for_each(fn(x: u8): void {
len := fmt.fmt_int(b, x, 16)
log.info(b[0..len])
mem.set(b.ptr, 0, len)
})
// mem.bytes(mem.reverse("Hello, World!")[1..]).take(5).for_each(fn(x: u8): void {
// len := fmt.fmt_int(b, x, 16)
// log.info(b[0..len])
// mem.set(b.ptr, 0, len)
// })
c := alloc.Vec(uint, alloc.Arena).new(&arena)
defer c.deinit()
loop if c.len() == 100000 break else {
c.push(1)
}
}

View file

@ -61,11 +61,13 @@ Arena := struct {
mem.set(slice.?.ptr, 0, slice.?.len)
return slice
}
$realloc := fn(self: ^Self, $T: type, ptr_old: ^T, count_new: uint): ?[]T {
@error("todo: ", Self.realloc)
return null
$realloc := fn(self: ^Self, $T: type, prev: []T, count_new: uint): ?[]T {
slice := self.alloc(T, mem.size(T, count_new))
if slice == null return null
mem.copy(@bit_cast(slice.?.ptr), @bit_cast(prev.ptr), mem.size(T, prev.len))
return slice
}
$dealloc := fn(self: ^Self, $T: type, ptr: ^T): void {
$dealloc := fn(self: ^Self, $T: type, prev: []T): void {
}
deinit := fn(self: ^Self): void {
if self.allocation == null {

View file

@ -1,4 +1,3 @@
// ! stub
Vec := fn(T: type, A: type): type return struct {
.slice: []T;
.cap: uint;
@ -9,7 +8,36 @@ Vec := fn(T: type, A: type): type return struct {
$new := fn(allocator: ^A): Self {
return .(idk, 0, allocator)
}
push := fn(self: ^Self, elem: T): void {
if self.slice.len == self.cap {
if self.cap == 0 {
new_slice := self.allocator.alloc(T, 1)
if new_slice == null {
// todo: handle
die
}
self.slice = new_slice.?[0..self.slice.len]
self.cap = new_slice.?.len
} else {
new_slice := self.allocator.realloc(T, self.slice[0..self.cap], self.cap * 2)
if new_slice == null {
// todo: handle
die
}
self.slice = new_slice.?[0..self.slice.len]
self.cap = new_slice.?.len
}
}
self.slice[self.slice.len] = elem
self.slice = self.slice[0..self.slice.len + 1]
}
$len := fn(self: ^Self): uint {
return self.slice.len
}
deinit := fn(self: ^Self): void {
self.allocator.dealloc(T, self.slice[0..self.cap])
self.* = idk
}
}