X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=src%2Ffixed-priority-queue.ts;h=a3de02095fb4fcd34874cea8efbf67c703d01e5c;hb=refs%2Fheads%2Fmaster;hp=3b767eb8b93971b77663f22bf495f353eb830c5a;hpb=1d98bad2cdcfd3c3d6ceb2707faffa98391237c6;p=poolifier.git diff --git a/src/fixed-priority-queue.ts b/src/fixed-priority-queue.ts index 3b767eb8..1cc1480a 100644 --- a/src/fixed-priority-queue.ts +++ b/src/fixed-priority-queue.ts @@ -5,7 +5,6 @@ export const defaultQueueSize = 2048 /** * Fixed priority queue node. - * * @typeParam T - Type of priority queue node data. * @internal */ @@ -16,33 +15,35 @@ export interface FixedPriorityQueueNode { /** * Fixed priority queue. - * * @typeParam T - Type of fixed priority queue data. * @internal */ export class FixedPriorityQueue { private start!: number - private readonly nodeArray: Array> + private readonly nodeArray: FixedPriorityQueueNode[] + /** The fixed priority queue capacity. */ public readonly capacity: number + /** The fixed priority queue size. */ public size!: number - public maxSize!: number + /** Whether to enable priority. */ + public enablePriority: boolean /** * Constructs a fixed priority queue. - * * @param size - Fixed priority queue size. @defaultValue defaultQueueSize + * @param enablePriority - Whether to enable priority. @defaultValue false * @returns FixedPriorityQueue. */ - constructor (size: number = defaultQueueSize) { + constructor (size: number = defaultQueueSize, enablePriority = false) { this.checkSize(size) this.capacity = size + this.enablePriority = enablePriority this.nodeArray = new Array>(this.capacity) this.clear() } /** * Checks if the fixed priority queue is empty. - * * @returns `true` if the fixed priority queue is empty, `false` otherwise. */ public empty (): boolean { @@ -51,7 +52,6 @@ export class FixedPriorityQueue { /** * Checks if the fixed priority queue is full. - * * @returns `true` if the fixed priority queue is full, `false` otherwise. */ public full (): boolean { @@ -60,31 +60,32 @@ export class FixedPriorityQueue { /** * Enqueue data into the fixed priority queue. - * * @param data - Data to enqueue. * @param priority - Priority of the data. Lower values have higher priority. * @returns The new size of the priority queue. + * @throws If the fixed priority queue is full. */ public enqueue (data: T, priority?: number): number { if (this.full()) { throw new Error('Priority queue is full') } priority = priority ?? 0 - let index = this.start let inserted = false - for (let i = 0; i < this.size; i++) { - if (this.nodeArray[index]?.priority > priority) { - this.nodeArray.splice(index, 0, { data, priority }) - inserted = true - break - } - ++index - if (index === this.capacity) { - index = 0 + if (this.enablePriority) { + let index = this.start + for (let i = 0; i < this.size; i++) { + if (this.nodeArray[index].priority > priority) { + this.nodeArray.splice(index, 0, { data, priority }) + this.nodeArray.length = this.capacity + inserted = true + break + } + ++index + if (index === this.capacity) { + index = 0 + } } } - this.nodeArray.length !== this.capacity && - (this.nodeArray.length = this.capacity) if (!inserted) { let index = this.start + this.size if (index >= this.capacity) { @@ -92,12 +93,11 @@ export class FixedPriorityQueue { } this.nodeArray[index] = { data, priority } } - return this.incrementSize() + return ++this.size } /** * Gets data from the fixed priority queue. - * * @param index - The index of the data to get. * @returns The data at the index or `undefined` if the fixed priority queue is empty or the index is out of bounds. */ @@ -114,7 +114,6 @@ export class FixedPriorityQueue { /** * Dequeue data from the fixed priority queue. - * * @returns The dequeued data or `undefined` if the priority queue is empty. */ public dequeue (): T | undefined { @@ -136,12 +135,10 @@ export class FixedPriorityQueue { public clear (): void { this.start = 0 this.size = 0 - this.maxSize = 0 } /** * Returns an iterator for the fixed priority queue. - * * @returns An iterator for the fixed priority queue. * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Iteration_protocols */ @@ -153,7 +150,7 @@ export class FixedPriorityQueue { if (i >= this.size) { return { value: undefined, - done: true + done: true, } } const value = this.nodeArray[index].data @@ -164,38 +161,26 @@ export class FixedPriorityQueue { } return { value, - done: false + done: false, } - } + }, } } /** - * Increments the size of the fixed priority queue. - * - * @returns The new size of the fixed priority queue. - */ - private incrementSize (): number { - ++this.size - if (this.size > this.maxSize) { - this.maxSize = this.size - } - return this.size - } - - /** - * Checks the size. - * - * @param size - The size to check. + * Checks the queue size. + * @param size - Queue size. */ private checkSize (size: number): void { if (!Number.isSafeInteger(size)) { throw new TypeError( - `Invalid fixed priority queue size: '${size}' is not an integer` + `Invalid fixed priority queue size: '${size.toString()}' is not an integer` ) } if (size < 0) { - throw new RangeError(`Invalid fixed priority queue size: ${size} < 0`) + throw new RangeError( + `Invalid fixed priority queue size: ${size.toString()} < 0` + ) } } }