add ArrayList alias to std
This commit is contained in:
@@ -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 |_| {
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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,
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -0,0 +1,3 @@
|
||||
import "arraylist"
|
||||
|
||||
ArrayList :: alias arraylist.ArrayList
|
||||
Reference in New Issue
Block a user