X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=src%2Fpriority-queue.ts;h=ee3310c3d8f2cb8cf6e4d6287d0a668eb20f4a9c;hb=b7ea53bbd96886c5bc95c13943e5c92a3206f8a5;hp=0f75e52b2e7368ca1d7932283972f70f8537a62f;hpb=13ed544a17e9b0e3a8447cfea17964709cdaffa1;p=poolifier.git diff --git a/src/priority-queue.ts b/src/priority-queue.ts index 0f75e52b..ee3310c3 100644 --- a/src/priority-queue.ts +++ b/src/priority-queue.ts @@ -34,9 +34,13 @@ export class PriorityQueue { * Constructs a priority queue. * * @param bucketSize - Prioritized bucket size. @defaultValue defaultBucketSize + * @param enablePriority - Whether to enable priority. @defaultValue false * @returns PriorityQueue. */ - public constructor (bucketSize: number = defaultBucketSize) { + public constructor ( + bucketSize: number = defaultBucketSize, + enablePriority = false + ) { if (!Number.isSafeInteger(bucketSize)) { throw new TypeError( `Invalid bucket size: '${bucketSize}' is not an integer` @@ -46,7 +50,11 @@ export class PriorityQueue { throw new RangeError(`Invalid bucket size: ${bucketSize} < 0`) } this.bucketSize = bucketSize - this.clear() + this.head = this.tail = new FixedPriorityQueue( + this.bucketSize, + enablePriority + ) + this.maxSize = 0 } /** @@ -62,6 +70,21 @@ export class PriorityQueue { return size } + public get enablePriority (): boolean { + return this.head.enablePriority + } + + public set enablePriority (enablePriority: boolean) { + if (this.head.enablePriority === enablePriority) { + return + } + let node: PriorityQueueNode | undefined = this.tail + while (node != null) { + node.enablePriority = enablePriority + node = node.next + } + } + /** * The number of filled prioritized buckets. */ @@ -78,7 +101,10 @@ export class PriorityQueue { */ public enqueue (data: T, priority?: number): number { if (this.head.full()) { - this.head = this.head.next = new FixedPriorityQueue(this.bucketSize) + this.head = this.head.next = new FixedPriorityQueue( + this.bucketSize, + this.enablePriority + ) } this.head.enqueue(data, priority) const size = this.size @@ -136,7 +162,10 @@ export class PriorityQueue { * Clears the priority queue. */ public clear (): void { - this.head = this.tail = new FixedPriorityQueue(this.bucketSize) + this.head = this.tail = new FixedPriorityQueue( + this.bucketSize, + this.enablePriority + ) this.maxSize = 0 }