X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=src%2Futils%2FCircularArray.ts;h=4fafe5280a78cd849667f94e12e7e198e16f2dc7;hb=d116b9b5f418a020bc6f971580a23a04cdf8497a;hp=08a37220c1469e255873ab06482a3193b4c25d87;hpb=f59858d8518c5217a8444e44a7f091f49d928e53;p=e-mobility-charging-stations-simulator.git diff --git a/src/utils/CircularArray.ts b/src/utils/CircularArray.ts index 08a37220..4fafe528 100644 --- a/src/utils/CircularArray.ts +++ b/src/utils/CircularArray.ts @@ -1,9 +1,9 @@ -// Copyright Jerome Benoit. 2021. All Rights Reserved. +// Copyright Jerome Benoit. 2021-2023. All Rights Reserved. -export const DEFAULT_CIRCULAR_ARRAY_SIZE = Number.MAX_SAFE_INTEGER; +export const DEFAULT_CIRCULAR_ARRAY_SIZE = 1024; /** - * Array with a maximum length shifting items when full. + * Array with a maximum length and shifting items when full. */ export class CircularArray extends Array { public size: number; @@ -39,24 +39,30 @@ export class CircularArray extends Array { if (concatenatedCircularArray.length > concatenatedCircularArray.size) { concatenatedCircularArray.splice( 0, - concatenatedCircularArray.length - concatenatedCircularArray.size + concatenatedCircularArray.length - concatenatedCircularArray.size, ); } return concatenatedCircularArray; } - public splice(start: number, deleteCount?: number, ...items: T[]): T[] { - let itemsRemoved: T[]; - if (arguments.length >= 3 && typeof deleteCount !== 'undefined') { - itemsRemoved = super.splice(start, deleteCount); - // FIXME: that makes the items insert not in place - this.push(...items); + public splice(start: number, deleteCount?: number, ...items: T[]): CircularArray { + let itemsRemoved: T[] = []; + if (arguments.length >= 3 && deleteCount !== undefined) { + itemsRemoved = super.splice(start, deleteCount, ...items); + if (this.length > this.size) { + const itemsOverflowing = super.splice(0, this.length - this.size); + itemsRemoved = new CircularArray( + itemsRemoved.length + itemsOverflowing.length, + ...itemsRemoved, + ...itemsOverflowing, + ); + } } else if (arguments.length === 2) { itemsRemoved = super.splice(start, deleteCount); } else { itemsRemoved = super.splice(start); } - return itemsRemoved; + return itemsRemoved as CircularArray; } public resize(size: number): void { @@ -79,9 +85,12 @@ export class CircularArray extends Array { return this.length === this.size; } - private checkSize(size: number) { + private checkSize(size: number): void { + if (!Number.isSafeInteger(size)) { + throw new TypeError(`Invalid circular array size: ${size} is not a safe integer`); + } if (size < 0) { - throw new RangeError('Invalid circular array size'); + throw new RangeError(`Invalid circular array size: ${size} < 0`); } } }