Files
nage/engine/lib/RingBuffer.ts
T

35 lines
610 B
TypeScript

export type RingBuffer<T> = {
size: number;
mask: number;
cursor: number;
buffer: Array<T>;
};
export function createRingBuffer<T extends object>(
size: number,
create: () => T,
): RingBuffer<T> {
if ((size & (size - 1)) !== 0) {
throw new Error("size must be a power of two");
}
const buffer = new Array<T>(size);
for (let i = 0; i < size; i++) {
buffer[i] = create();
}
return {
size,
mask: size - 1,
cursor: 0,
buffer,
};
}
export function claim<T>(ring: RingBuffer<T>): T {
const slot = ring.buffer[ring.cursor];
ring.cursor = (ring.cursor + 1) & ring.mask;
return slot;
}