Queue :: struct(Value_Type : Type) { count: s64; values: [..] Value_Type; } enqueue :: (queue: *Queue, value: queue.Value_Type) { array_add(*queue.values, value); queue.count = queue.values.count; } dequeue :: (queue: *Queue) -> queue.Value_Type { val : queue.Value_Type; if queue.values.count > 0 { val = queue.values[0]; if queue.values.count > 1 { memcpy(*queue.values.data[0], *queue.values.data[1], (queue.values.count - 1) * size_of(queue.Value_Type)); } queue.values.count -= 1; queue.count = queue.values.count; } return val; } is_queue_empty :: (queue: Queue) -> bool { return queue.count == 0; } for_expansion :: (queue: *Queue, body: Code, flags: For_Flags) #expand { for `it_index: 0..queue.count-1 { #if flags & .POINTER { `it := *queue.values[it_index]; } else { `it := queue.values[it_index]; } #insert body; } }