35 lines
598 B
TypeScript
35 lines
598 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>(ring: Pooled<T>): T {
|
|
const slot = ring.buffer[ring.cursor];
|
|
ring.cursor = (ring.cursor + 1) & ring.mask;
|
|
|
|
return slot;
|
|
}
|