arraylist :: import "@std/arraylist" mem :: import "@std/mem" _fail_alloc func(_ ?*mut anyopaque, _ usize, _ usize) ?*mut u8 { return none } _fail_realloc func(_ ?*mut anyopaque, _ ?*mut u8, _ usize, _ usize, _ usize) ?*mut u8 { return none } _fail_free func(_ ?*mut anyopaque, _ ?*mut u8, _ usize, _ usize) void {} _fail_vtable mem.AllocatorVTable :: mem.AllocatorVTable { alloc = _fail_alloc, realloc = _fail_realloc, free = _fail_free, } _fail_allocator mem.Allocator :: mem.Allocator { context = none, vtable = &_fail_vtable, } _noop func() void {} run func() i32 ! mem.AllocError { values arraylist.ArrayList(i32) = arraylist.init(i32, mem.c_allocator) defer arraylist.deinit(i32, &values) if (values.items.len != 0 or values.capacity != 0) return 1 i usize = 0 while i < 20 : i += 1 { arraylist.append(i32, &values, i32(i)) catch |_| { return .out_of_memory } } if (values.items.len != 20 or values.capacity < 20) return 2 if (values.items[0] != 0 or values.items[19] != 19) return 3 values.items[3] = 33 if (values.items[3] != 33) return 4 arraylist.reserve(i32, &values, 50) catch |_| { return .out_of_memory } if (values.capacity < 50 or values.items.len != 20 or values.items[19] != 19) return 5 capacity usize :: values.capacity arraylist.clear(i32, &values) if (values.items.len != 0 or values.capacity != capacity) return 6 arraylist.append(i32, &values, 7) catch |_| { return .out_of_memory } if (values.items.len != 1 or values.items[0] != 7 or values.capacity != capacity) return 7 empty_values arraylist.ArrayList([0]u8) = arraylist.init([0]u8, mem.c_allocator) defer arraylist.deinit([0]u8, &empty_values) zero [0]u8 :: [] arraylist.append([0]u8, &empty_values, zero) catch |_| { return .out_of_memory } if (empty_values.items.len != 1) return 8 failed arraylist.ArrayList(i32) = arraylist.init(i32, _fail_allocator) failed_as_expected bool = false arraylist.append(i32, &failed, 1) catch |_| { failed_as_expected = true yield _noop() } if (failed_as_expected == false or failed.items.len != 0 or failed.capacity != 0) return 9 arraylist.deinit(i32, &failed) return 0 } main func() i32 { return run() catch 100 }