Files
nage/engine/lib/RingBuffer.ts
T
2026-08-24 22:26:08 +02:00

35 lines
610 B
TypeScript

export type Pooled<T> = {
size: number;
mask: number;
cursor: number;
buffer: Array<T>;
};
export function createRingBuffer<T extends object>(
size: number,
create: () => T,
): Pooled<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>(pooled: Pooled<T>): T {
const slot = pooled.buffer[pooled.cursor];
pooled.cursor = (pooled.cursor + 1) & pooled.mask;
return slot;
}