60 lines
1.9 KiB
JavaScript
60 lines
1.9 KiB
JavaScript
|
"use strict";
|
||
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||
|
exports.CachedUtf8Decoder = void 0;
|
||
|
const tslib_1 = require("tslib");
|
||
|
const v10_1 = tslib_1.__importDefault(require("./decodeUtf8/v10"));
|
||
|
let x = 1 + Math.round(Math.random() * ((-1 >>> 0) - 1));
|
||
|
function randomU32(min, max) {
|
||
|
x ^= x << 13;
|
||
|
x ^= x >>> 17;
|
||
|
x ^= x << 5;
|
||
|
return ((x >>> 0) % (max - min + 1)) + min;
|
||
|
}
|
||
|
class CacheItem {
|
||
|
constructor(bytes, value) {
|
||
|
this.bytes = bytes;
|
||
|
this.value = value;
|
||
|
}
|
||
|
}
|
||
|
class CachedUtf8Decoder {
|
||
|
constructor() {
|
||
|
this.caches = [];
|
||
|
for (let i = 0; i < 31; i++)
|
||
|
this.caches.push([]);
|
||
|
}
|
||
|
get(bytes, offset, size) {
|
||
|
const records = this.caches[size - 1];
|
||
|
const len = records.length;
|
||
|
FIND_CHUNK: for (let i = 0; i < len; i++) {
|
||
|
const record = records[i];
|
||
|
const recordBytes = record.bytes;
|
||
|
for (let j = 0; j < size; j++)
|
||
|
if (recordBytes[j] !== bytes[offset + j])
|
||
|
continue FIND_CHUNK;
|
||
|
return record.value;
|
||
|
}
|
||
|
return null;
|
||
|
}
|
||
|
store(bytes, value) {
|
||
|
const records = this.caches[bytes.length - 1];
|
||
|
const record = new CacheItem(bytes, value);
|
||
|
const length = records.length;
|
||
|
if (length >= 16)
|
||
|
records[randomU32(0, 16 - 1)] = record;
|
||
|
else
|
||
|
records.push(record);
|
||
|
}
|
||
|
decode(bytes, offset, size) {
|
||
|
if (!size)
|
||
|
return '';
|
||
|
const cachedValue = this.get(bytes, offset, size);
|
||
|
if (cachedValue !== null)
|
||
|
return cachedValue;
|
||
|
const value = (0, v10_1.default)(bytes, offset, size);
|
||
|
const copy = Uint8Array.prototype.slice.call(bytes, offset, offset + size);
|
||
|
this.store(copy, value);
|
||
|
return value;
|
||
|
}
|
||
|
}
|
||
|
exports.CachedUtf8Decoder = CachedUtf8Decoder;
|
||
|
//# sourceMappingURL=CachedUtf8Decoder.js.map
|