Files
nage/engine/lib/RingBuffer.ts
T
2026-08-28 13:33:23 +02:00

35 lines
652 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>, reset: (instance: T) => T): T {
const instance = ring.buffer[ring.cursor];
ring.cursor = (ring.cursor + 1) & ring.mask;
return reset(instance);
}