Skip to content

std.vec

growable arrays that bump-allocate from an arena; no per-element frees resetting the arena frees every Vec in it; don’t touch one after

pub Vec :: struct($T: type) {
region: *Arena,
data: []T,
count: usize,
}
  • region: grows into this; borrowed, not owned
  • data: backing storage; capacity == data.len
  • count: elements in use
pub len :: fn(self: *Self) -> usize
pub cap :: fn(self: *Self) -> usize
pub is_empty :: fn(self: *Self) -> bool
pub get :: fn(self: *Self, i: usize) -> T
pub set :: fn(self: *Self, i: usize, v: T)
pub at :: fn(self: *Self, i: usize) -> *T

pointer to element i, for in-place mutation

pub last :: fn(self: *Self) -> T

assumes non-empty

pub items :: fn(self: *Self) -> []T

valid until the next growth

pub reserve :: fn(self: *Self, want: usize)

capacity for at least want; doubles, never shrinks

pub push :: fn(self: *Self, item: T)
pub extend :: fn(self: *Self, src: []const T)

append all of src

pub pop :: fn(self: *Self) -> T

assumes non-empty

pub insert :: fn(self: *Self, i: usize, item: T)

shifts the tail right; O(n)

pub remove :: fn(self: *Self, i: usize) -> T

shifts the tail left, keeps order; O(n)

pub remove_swap :: fn(self: *Self, i: usize) -> T

O(1): last element moves into i; order NOT kept

pub clear :: fn(self: *Self)

keeps capacity

pub clone_into :: fn(self: *Self, into: *Arena) -> Vec(T)

deep copy into into; lets data escape a scratch arena

pub make :: fn($T: type, a: *Arena) -> Vec(T)

empty, bound to a

pub with_cap :: fn($T: type, a: *Arena, cap: usize) -> Vec(T)

empty with cap reserved

pub from :: fn($T: type, a: *Arena, src: []const T) -> Vec(T)

copies src into a

pub VecUnmanaged :: struct($T: type) {
data: []T,
count: usize,
}

VecUnmanaged(T): no region of its own; growing calls take the *Arena

pub len :: fn(self: *Self) -> usize
pub cap :: fn(self: *Self) -> usize
pub is_empty :: fn(self: *Self) -> bool
pub get :: fn(self: *Self, i: usize) -> T
pub set :: fn(self: *Self, i: usize, v: T)
pub last :: fn(self: *Self) -> T
pub items :: fn(self: *Self) -> []T
pub clear :: fn(self: *Self)
pub reserve :: fn(self: *Self, a: *Arena, want: usize)
pub push :: fn(self: *Self, a: *Arena, item: T)
pub pop :: fn(self: *Self) -> T
pub empty :: fn($T: type) -> VecUnmanaged(T)

no storage yet; first push allocates