UNPKG

fastds

Version:

Fast, Zero-Dependency, TypeScript-based data structures for high-performance applications.

1 lines 31.1 kB
{"version":3,"sources":["../src/ring-buffer.ts"],"sourcesContent":["const DEFAULT_CAPACITY = 8;\n\nexport interface FilterFunction<T> {\n (value: T, index: number): boolean;\n}\n\nexport class RingBuffer<T> {\n #buffer: Array<T | undefined>;\n #head = 0;\n #tail = 0;\n #mask: number;\n #length = 0;\n\n static from<T>(values: T[]): RingBuffer<T> {\n const n = values.length;\n const ring = new RingBuffer<T>(n + 1);\n for (let i = 0; i < n; i++) {\n ring.#buffer[i] = values[i];\n }\n ring.#head = 0;\n ring.#tail = n;\n ring.#length = n;\n\n return ring;\n }\n\n readonly [Symbol.toStringTag] = 'RingBuffer';\n\n constructor(capacity: number = DEFAULT_CAPACITY) {\n const size = Math.max(1 << (32 - Math.clz32(capacity - 1)), DEFAULT_CAPACITY);\n this.#buffer = new Array<T>(size);\n this.#mask = size - 1;\n }\n\n get capacity() {\n return this.#mask + 1;\n }\n\n get length() {\n return this.#length;\n }\n\n isEmpty(): boolean {\n return this.#tail === this.#head;\n }\n\n isWrapped(): boolean {\n return this.#head > this.#tail;\n }\n\n getHeadOffset(index: number): number {\n return (this.#head + index) & this.#mask;\n }\n\n getTailOffset(index: number): number {\n return (this.#tail + index) & this.#mask;\n }\n\n resize(capacity: number): boolean {\n const buffer = this.#buffer;\n const bufferLength = buffer.length;\n if (bufferLength > capacity && bufferLength >> 1 < capacity) {\n return false;\n }\n const size = Math.max(1 << (32 - Math.clz32(capacity - 1)), DEFAULT_CAPACITY);\n const length = this.#length;\n if (size < length) {\n return false;\n }\n const head = this.#head;\n const prevMask = this.#mask;\n const prevTail = this.#tail;\n\n const nextMask = size - 1;\n const nextTail = (head + length) & nextMask;\n\n const wrapIndex = size > bufferLength ? (prevTail < head ? bufferLength - head : length) : nextTail < head ? size - head : length;\n\n for (let i = length - 1; i >= wrapIndex; i--) {\n const read = (head + i) & prevMask;\n const write = (head + i) & nextMask;\n buffer[write] = buffer[read];\n if (read !== write) {\n buffer[read] = undefined;\n }\n }\n\n this.#buffer.length = size;\n this.#tail = nextTail;\n this.#mask = nextMask;\n return true;\n }\n\n grow(capacity: number = this.#mask + 1): void {\n const buffer = this.#buffer;\n const bufferLength = buffer.length;\n if (bufferLength >= capacity + 1) {\n return;\n }\n const size = 1 << (32 - Math.clz32(capacity));\n this.#buffer.length = size;\n\n const oldTail = this.#tail;\n if (oldTail < this.#head) {\n for (let i = 0; i < oldTail; i++) {\n buffer[bufferLength + i] = buffer[i];\n }\n this.#tail = bufferLength + oldTail;\n }\n\n this.#mask = size - 1;\n }\n\n allocate(index: number, count: number): boolean {\n const prevLength = this.#length;\n if (index < 0 || count <= 0) {\n return false;\n }\n\n index = Math.min(index, prevLength);\n\n const buffer = this.#buffer;\n const head = this.#head;\n const tail = this.#tail;\n const prevMask = this.#mask;\n\n const nextLength = count + prevLength;\n const wrapIndex = buffer.length - head;\n const isWrapped = head > tail;\n\n if (nextLength >= buffer.length) {\n const size = 1 << (32 - Math.clz32(nextLength));\n buffer.length = size;\n this.#mask = size - 1;\n }\n\n const mask = this.#mask;\n const isResized = prevMask !== mask;\n\n const leftMoveCount = index;\n const rightMoveCount = prevLength - index;\n\n if (leftMoveCount < rightMoveCount) {\n if (isResized && isWrapped) {\n for (let i = 0; i < tail; i++) {\n const read = i;\n const write = (head + wrapIndex + i) & mask;\n buffer[write] = buffer[read];\n buffer[read] = undefined;\n }\n }\n const writeBase = (head - count) & mask;\n for (let i = 0; i < leftMoveCount; i++) {\n const read = (head + i) & mask;\n const write = (writeBase + i) & mask;\n buffer[write] = buffer[read];\n buffer[read] = undefined;\n }\n this.#head = writeBase;\n } else {\n if (isResized && isWrapped) {\n for (let i = 0; i < tail; i++) {\n const read = i;\n const write = (head + wrapIndex + i) & mask;\n buffer[write] = buffer[read];\n buffer[read] = undefined;\n }\n }\n\n for (let i = rightMoveCount - 1; i >= 0; i--) {\n const read = (head + index + i) & mask;\n const write = (head + index + count + i) & mask;\n\n buffer[write] = buffer[read];\n buffer[read] = undefined;\n }\n\n this.#tail = (head + nextLength) & mask;\n }\n\n this.#length = nextLength;\n return true;\n }\n\n deallocate(index: number, count: number): boolean {\n const prevLength = this.#length;\n if (index < 0 || index >= prevLength || count <= 0) {\n return false;\n }\n\n const actualCount = Math.min(count, prevLength - index);\n const nextLength = prevLength - actualCount;\n\n const buffer = this.#buffer;\n const head = this.#head;\n const tail = this.#tail;\n const mask = this.#mask;\n\n if (index === 0) {\n for (let i = 0; i < actualCount; i++) {\n buffer[(head + i) & mask] = undefined;\n }\n this.#head = (head + actualCount) & mask;\n this.#length = nextLength;\n return true;\n }\n\n if (index + actualCount === prevLength) {\n for (let i = 0; i < actualCount; i++) {\n buffer[(tail - i - 1) & mask] = undefined;\n }\n this.#tail = (tail - actualCount) & mask;\n this.#length = nextLength;\n return true;\n }\n\n const leftMoveCount = index;\n const rightMoveCount = prevLength - index - actualCount;\n\n if (leftMoveCount < rightMoveCount) {\n for (let i = leftMoveCount - 1; i >= 0; i--) {\n const read = (head + i) & mask;\n const write = (head + i + actualCount) & mask;\n buffer[write] = buffer[read];\n }\n for (let i = 0; i < actualCount; i++) {\n buffer[(head + i) & mask] = undefined;\n }\n this.#head = (head + actualCount) & mask;\n } else {\n for (let i = 0; i < rightMoveCount; i++) {\n const read = (head + index + actualCount + i) & mask;\n const write = (head + index + i) & mask;\n buffer[write] = buffer[read];\n }\n this.#tail = (tail - actualCount) & mask;\n for (let i = 0; i < actualCount; i++) {\n buffer[(tail + i) & mask] = undefined;\n }\n }\n\n this.#length = nextLength;\n return true;\n }\n\n indexOf(value: T, index: number = 0): number {\n const length = this.#length;\n const buffer = this.#buffer;\n const head = this.#head;\n const tail = this.#tail;\n\n if (head < tail) {\n const offset = head + index;\n const result = buffer.indexOf(value, offset);\n if (result !== -1 && result < tail) {\n return result - head;\n }\n return -1;\n }\n \n const capacity = buffer.length;\n const firstSegmentLength = capacity - head;\n\n if (index < firstSegmentLength) {\n const result = buffer.indexOf(value, head + index);\n if (result !== -1) {\n return result - head;\n }\n index = firstSegmentLength;\n }\n\n if (index < length) {\n const result = buffer.indexOf(value, 0);\n if (result !== -1 && result < tail) {\n return firstSegmentLength + result;\n }\n }\n \n return -1;\n }\n\n unwrap(): boolean {\n if (this.isEmpty()) {\n return false;\n }\n const length = this.#length;\n const buffer = this.#buffer;\n const prevHead = this.#head;\n const prevTail = this.#tail;\n\n if (prevHead > prevTail) {\n const bufferLength = buffer.length;\n buffer.length = bufferLength + prevTail;\n for (let i = 0; i < prevTail; i++) {\n buffer[bufferLength + i] = buffer[i];\n buffer[i] = undefined;\n }\n }\n for (let i = 0; i < length; i++) {\n buffer[i] = buffer[prevHead + i];\n }\n\n buffer.length = this.#mask + 1;\n this.#head = 0;\n this.#tail = length;\n this.#length = length;\n\n return true;\n }\n\n compact(filter: FilterFunction<T>): boolean {\n if (this.isEmpty()) {\n return false;\n }\n const length = this.#length;\n const buffer = this.#buffer;\n const head = this.#head;\n const mask = this.#mask;\n\n let bufferLength = buffer.length;\n let write = 0;\n for (let read = 0; read < length; read++) {\n const readOffset = (head + read) & mask;\n const value = buffer[readOffset]!;\n if (filter(value, read)) {\n if (read !== write) {\n const writeOffset = (head + write) & mask;\n buffer[writeOffset] = value;\n }\n write++;\n }\n }\n if (write === length) {\n return false;\n }\n if (write < bufferLength / 2) {\n const size = 1 << (32 - Math.clz32(write - 1));\n buffer.length = size;\n bufferLength = size;\n }\n\n for (let i = write; i < bufferLength; i++) {\n buffer[i] = undefined;\n }\n\n this.#head = 0;\n this.#tail = write;\n this.#length = write;\n return true;\n }\n\n set(index: number, values: T[], insert = false) {\n const length = this.#length;\n if (index < 0 || index > length) {\n return false;\n }\n const count = values.length;\n if (insert) {\n this.allocate(index, count);\n } else {\n const extra = Math.max(index + values.length - length, 0);\n if (extra > 0) {\n this.allocate(length, extra);\n }\n }\n const buffer = this.#buffer;\n const mask = this.#mask;\n const baseWrite = this.#head + index;\n for (let i = 0; i < count; i++) {\n buffer[(baseWrite + i) & mask] = values[i];\n }\n return true;\n }\n\n setOne(index: number, value: T, insert = false) {\n const length = this.#length;\n if (index < 0 || index > length) {\n return false;\n }\n if (insert) {\n this.allocate(index, 1);\n } else {\n const extra = Math.max(index + 1 - length, 0);\n if (extra > 0) {\n this.allocate(length, extra);\n }\n }\n const buffer = this.#buffer;\n const mask = this.#mask;\n buffer[(this.#head + index) & mask] = value;\n\n return true;\n }\n\n slice(start: number = 0, end: number = this.#length): T[] {\n const length = this.#length;\n const buffer = this.#buffer;\n const head = this.#head;\n const tail = this.#tail;\n const mask = this.#mask;\n\n const actualStart = start < 0 ? Math.max(length + start, 0) : Math.min(start, length);\n const actualEnd = end < 0 ? Math.max(length + end, 0) : Math.min(end, length);\n\n if (head <= tail) {\n return this.#buffer.slice((head + actualStart) & mask, (head + actualEnd) & mask) as T[];\n }\n\n const size = Math.max(actualEnd - actualStart, 0);\n const result = new Array<T>(size);\n for (let i = 0; i < size; i++) {\n result[i] = buffer[(head + actualStart + i) & mask]!;\n }\n return result;\n }\n\n removeOne(index: number): number {\n const length = this.#length;\n if (index < 0 || index >= length) {\n return -1;\n }\n const buffer = this.#buffer;\n const mask = this.#mask;\n const head = this.#head;\n\n const leftMoveCount = index;\n const rightMoveCount = length - index;\n\n if (leftMoveCount < rightMoveCount) {\n for (let i = index; i > 0; i--) {\n buffer[(head + i) & mask] = buffer[(head + i - 1) & mask];\n }\n buffer[head] = undefined;\n this.#head = (head + 1) & mask;\n } else {\n for (let i = index; i < length - 1; i++) {\n buffer[(head + i) & mask] = buffer[(head + i + 1) & mask];\n }\n const tail = (head + length - 1) & mask;\n buffer[tail] = undefined;\n this.#tail = tail;\n }\n this.#length = length - 1;\n\n return index;\n }\n\n removeFirst(value: T, index: number = 0): number {\n const foundIndex = this.indexOf(value, index);\n if (foundIndex === -1) {\n return -1;\n }\n return this.removeOne(foundIndex);\n }\n\n remove(index: number, count: number): T[] {\n const result = this.slice(index, index + count);\n this.deallocate(index, count);\n return result;\n }\n\n push(value: T) {\n const nextTail = (this.#tail + 1) & this.#mask;\n if (nextTail === this.#head) {\n this.grow(this.#mask + 2);\n this.#buffer[this.#tail] = value;\n this.#tail = (this.#tail + 1) & this.#mask;\n } else {\n this.#buffer[this.#tail] = value;\n this.#tail = nextTail;\n }\n this.#length++;\n return this;\n }\n\n unshift(value: T): this {\n const newHead = (this.#head - 1) & this.#mask;\n if (newHead === this.#tail) {\n this.grow(this.#mask + 2);\n this.#head = (this.#head - 1) & this.#mask;\n } else {\n this.#head = newHead;\n }\n this.#buffer[this.#head] = value;\n this.#length++;\n return this;\n }\n\n shift(): T | undefined {\n if (this.#head === this.#tail) {\n return undefined;\n }\n const value = this.#buffer[this.#head];\n this.#buffer[this.#head] = undefined;\n this.#head = (this.#head + 1) & this.#mask;\n this.#length--;\n return value;\n }\n\n pop(): T | undefined {\n if (this.#head === this.#tail) {\n return undefined;\n }\n this.#tail = (this.#tail - 1) & this.#mask;\n const value = this.#buffer[this.#tail];\n this.#buffer[this.#tail] = undefined;\n this.#length--;\n return value;\n }\n\n peekAt(index: number): T | undefined {\n if (index < 0 || index >= this.#length) {\n return undefined;\n }\n const offset = this.getHeadOffset(index);\n return this.#buffer[offset];\n }\n\n peekFirst(): T | undefined {\n return this.#buffer[this.#head];\n }\n\n peekLast(): T | undefined {\n const offset = this.getTailOffset(-1);\n return this.#buffer[offset];\n }\n\n has(value: T): boolean {\n return this.indexOf(value) !== -1;\n }\n\n clear(): this {\n this.#buffer.length = 0;\n this.#buffer.length = DEFAULT_CAPACITY;\n this.#head = 0;\n this.#tail = 0;\n this.#length = 0;\n this.#mask = DEFAULT_CAPACITY - 1;\n return this;\n }\n\n toArray(): T[] {\n return this.slice();\n }\n\n drain(): IteratorObject<T, void, unknown> {\n return Iterator.from({\n [Symbol.iterator]: () => {\n return {\n next: (): IteratorResult<T> => {\n if (this.#length === 0) {\n return { done: true, value: undefined };\n }\n const value = this.shift()!;\n return { done: false, value };\n },\n };\n },\n });\n }\n\n iter(): IteratorObject<T, void, unknown> {\n return Iterator.from(this[Symbol.iterator]());\n }\n\n [Symbol.iterator](): Iterator<T, void, unknown> {\n const buffer = this.#buffer;\n const mask = this.#mask;\n const length = this.#length;\n let count = 0;\n let idx = this.#head;\n return {\n next: (): IteratorResult<T> => {\n if (count >= length) {\n return { done: true, value: undefined };\n }\n const value = buffer[idx]!;\n idx = (idx + 1) & mask;\n count++;\n return { done: false, value };\n },\n };\n }\n}\n"],"names":["RingBuffer","DEFAULT_CAPACITY","from","values","n","length","ring","i","Symbol","toStringTag","capacity","size","Math","max","clz32","Array","isEmpty","isWrapped","getHeadOffset","index","getTailOffset","resize","buffer","bufferLength","head","prevMask","prevTail","nextMask","nextTail","wrapIndex","read","write","undefined","grow","oldTail","allocate","count","prevLength","min","tail","nextLength","mask","isResized","leftMoveCount","rightMoveCount","writeBase","deallocate","actualCount","indexOf","value","offset","result","firstSegmentLength","unwrap","prevHead","compact","filter","readOffset","writeOffset","set","insert","extra","baseWrite","setOne","slice","start","end","actualStart","actualEnd","removeOne","removeFirst","foundIndex","remove","push","unshift","newHead","shift","pop","peekAt","peekFirst","peekLast","has","clear","toArray","drain","Iterator","iterator","next","done","iter","idx"],"mappings":"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"}