add ArrayList alias to std

This commit is contained in:
2026-07-13 13:46:45 +02:00
parent 288df082e2
commit 6455df52b4
14 changed files with 600 additions and 13 deletions
+7 -6
View File
@@ -1,6 +1,7 @@
arraylist :: import "@std/arraylist"
mem :: import "@std/mem"
c :: import "@ffi/c"
import "@ffi/c"
import "@std"
import "@std/mem"
import "@std/arraylist"
Kind :: enum(u8) {
invalid
@@ -37,7 +38,7 @@ _word_kind func(word []u8) Kind {
return .identifier
}
_append func(tokens @mut arraylist.ArrayList(Token), kind Kind, start, end usize) void ! mem.AllocError {
_append func(tokens @mut std.ArrayList(Token), kind Kind, start, end usize) void ! mem.AllocError {
try arraylist.append(tokens, Token {
start = start,
length = end - start,
@@ -46,7 +47,7 @@ _append func(tokens @mut arraylist.ArrayList(Token), kind Kind, start, end usize
return _
}
lex func(source []u8, tokens @mut arraylist.ArrayList(Token)) void ! mem.AllocError {
lex func(source []u8, tokens @mut std.ArrayList(Token)) void ! mem.AllocError {
cursor usize = 0
while cursor < source.len {
value u8 :: source[cursor]
@@ -131,7 +132,7 @@ main func() i32 {
` hello()
`}
tokens arraylist.ArrayList(Token) = arraylist.init(mem.c_allocator)
tokens std.ArrayList(Token) = arraylist.init(mem.c_allocator)
defer arraylist.deinit(&tokens)
lex(source, &tokens) catch |_| {
+1 -1
View File
@@ -30,7 +30,7 @@ reserve func($T type, list @mut ArrayList(T), minimum_capacity usize) void ! mem
new_capacity usize = 8
if list.capacity >= 8 {
half usize :: list.capacity / 2
half usize :: div_trunc(list.capacity, 2)
if list.capacity > max_value(usize) - half {
new_capacity = minimum_capacity
} else {
+122
View File
@@ -0,0 +1,122 @@
c :: import "@ffi/c"
ReadError :: enum {
read_failed
}
WriteError :: enum {
write_failed
no_progress
}
Io :: struct {
context ?*mut anyopaque
vtable @IoVTable
}
IoVTable :: struct {
read @func(context ?*mut anyopaque, stream ReadStream, buffer []mut u8) usize ! ReadError
write @func(context ?*mut anyopaque, stream WriteStream, bytes []u8) usize ! WriteError
}
ReadStream :: enum(c_int) {
stdin = 0
}
WriteStream :: enum(c_int) {
stdout = 1
stderr = 2
}
Reader :: struct {
impl Io
stream ReadStream
}
Writer :: struct {
impl Io
stream WriteStream
}
read func(reader Reader, buffer []mut u8) usize ! ReadError {
if buffer.len == 0 {
return 0
}
count usize :: try reader.impl.vtable.read(reader.impl.context, reader.stream, buffer)
if count > buffer.len {
return .read_failed
}
return count
}
write func(writer Writer, bytes []u8) usize ! WriteError {
if bytes.len == 0 {
return 0
}
count usize :: try writer.impl.vtable.write(writer.impl.context, writer.stream, bytes)
if count > bytes.len {
return .write_failed
}
return count
}
write_all func(writer Writer, bytes []u8) void ! WriteError {
offset usize = 0
while offset < bytes.len {
count usize :: write(writer, bytes[offset..]) catch |err| {
return err
}
if count == 0 {
return .no_progress
}
offset += count
}
return _
}
_system_read func(_ ?*mut anyopaque, stream ReadStream, buffer []mut u8) usize ! ReadError {
request usize = buffer.len
maximum usize :: usize(max_value(c_long))
if request > maximum {
request = maximum
}
while true {
count c_long :: c.read(c_int(stream), buffer.ptr, c_ulong(request))
if count >= 0 {
return usize(count)
}
if c.__error()^ != 4 {
return .read_failed
}
}
}
_system_write func(_ ?*mut anyopaque, stream WriteStream, bytes []u8) usize ! WriteError {
fd c_int :: c_int(stream)
request usize = bytes.len
maximum usize :: usize(max_value(c_long))
if request > maximum {
request = maximum
}
while true {
count c_long :: c.write(fd, bytes.ptr, c_ulong(request))
if count >= 0 {
return usize(count)
}
if c.__error()^ != 4 {
return .write_failed
}
}
}
_system_vtable IoVTable :: IoVTable {
read = _system_read,
write = _system_write,
}
_system func() Io {
return Io {
context = none,
vtable = &_system_vtable,
}
}
+3 -3
View File
@@ -61,7 +61,7 @@ alloc func($T type, allocator Allocator, count usize) []mut T ! AllocError {
if element_size == 0 {
return _empty_slice(T, count)
}
if count > max_value(usize) / element_size {
if count > div_trunc(max_value(usize), element_size) {
return .out_of_memory
}
@@ -86,7 +86,7 @@ realloc func($T type, allocator Allocator, memory []mut T, new_count usize) []mu
if element_size == 0 {
return _empty_slice(T, new_count)
}
if new_count > max_value(usize) / element_size {
if new_count > div_trunc(max_value(usize), element_size) {
return .out_of_memory
}
@@ -125,7 +125,7 @@ _power_of_two func(value usize) bool {
current usize = value
while current > 1 {
half usize = current / 2
half usize = div_trunc(current, 2)
if half * 2 != current {
return false
}
+3
View File
@@ -0,0 +1,3 @@
import "arraylist"
ArrayList :: alias arraylist.ArrayList