35 lines
610 B
TypeScript
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;
|
|
}
|