@oaklean/profiler-core
Version:
Part of the @oaklean suite. It provides all basic functions to work with the `.oak` file format. It allows parsing the `.oak` file format as well as tools for analyzing the measurement values. It also provides all necessary capabilities required for prec
194 lines • 15.4 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.ModelMap = void 0;
const BaseModel_1 = require("./BaseModel");
const BufferHelper_1 = require("../helper/BufferHelper");
var ModelMapValueType;
(function (ModelMapValueType) {
ModelMapValueType[ModelMapValueType["string"] = 0] = "string";
ModelMapValueType[ModelMapValueType["number"] = 1] = "number";
ModelMapValueType[ModelMapValueType["object"] = 2] = "object";
})(ModelMapValueType || (ModelMapValueType = {}));
class ModelMap extends BaseModel_1.BaseModel {
constructor(keyType) {
super();
this._map = new Map();
this._keyType = keyType;
}
toJSON() {
if (this._map.size === 0) {
return undefined;
}
const result = {};
for (const [key, value] of this._map) {
if (typeof value === 'string') {
result[key] = value;
}
else if (typeof value === 'number') {
result[key] = value;
}
else if (value instanceof Set) {
result[key] = Array.from(value);
}
else {
result[key] = value.toJSON();
}
}
return result;
}
static fromJSON(json, keyType, fromJSON) {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
let data;
if (typeof json === 'string') {
data = JSON.parse(json);
}
else {
data = json;
}
const result = new ModelMap(keyType);
for (const [key, value] of Object.entries(data)) {
if (typeof value === 'string' || typeof value === 'number') {
result.set(key, value);
}
else {
if (fromJSON !== 'string' && fromJSON !== 'number') {
result.set(key, fromJSON(value));
}
}
}
return result;
}
toBuffer() {
const buffers = [BufferHelper_1.BufferHelper.UIntToBuffer(this._map.size)];
for (const [key, value] of this._map) {
switch (typeof key) {
case 'string':
buffers.push(BufferHelper_1.BufferHelper.String2LToBuffer(key));
break;
case 'number':
buffers.push(BufferHelper_1.BufferHelper.UIntToBuffer(key));
break;
default:
throw new Error('ModelMap.toBuffer: unexpected type of key');
}
switch (typeof value) {
case 'string':
buffers.push(BufferHelper_1.BufferHelper.UInt8ToBuffer(ModelMapValueType.string), BufferHelper_1.BufferHelper.String2LToBuffer(value));
break;
case 'number':
buffers.push(BufferHelper_1.BufferHelper.UInt8ToBuffer(ModelMapValueType.number), BufferHelper_1.BufferHelper.UIntToBuffer(value));
break;
default:
buffers.push(BufferHelper_1.BufferHelper.UInt8ToBuffer(ModelMapValueType.object), value.toBuffer());
}
}
return Buffer.concat(buffers);
}
static consumeFromBuffer(buffer, keyType, consumeFromBuffer) {
let remainingBuffer = buffer;
const { instance: size, remainingBuffer: newRemainingBuffer1 } = BufferHelper_1.BufferHelper.UIntFromBuffer(buffer);
remainingBuffer = newRemainingBuffer1;
const result = new ModelMap(keyType);
for (let i = 0; i < size; i++) {
let key = undefined;
switch (keyType) {
case 'string':
{
const { instance, remainingBuffer: newRemainingBuffer } = BufferHelper_1.BufferHelper.String2LFromBuffer(remainingBuffer);
key = instance;
remainingBuffer = newRemainingBuffer;
}
break;
case 'number': {
const { instance, remainingBuffer: newRemainingBuffer } = BufferHelper_1.BufferHelper.UIntFromBuffer(remainingBuffer);
key = instance;
remainingBuffer = newRemainingBuffer;
}
}
const { instance: valueType, remainingBuffer: newRemainingBuffer } = BufferHelper_1.BufferHelper.UInt8FromBuffer(remainingBuffer);
remainingBuffer = newRemainingBuffer;
switch (valueType) {
case ModelMapValueType.object:
{
if (consumeFromBuffer === 'string' ||
consumeFromBuffer === 'number') {
throw new Error('ModelMap.consumeFromBuffer: expected a consumeFromBuffer to be given');
}
const { instance: value, remainingBuffer: newRemainingBuffer } = consumeFromBuffer(remainingBuffer);
remainingBuffer = newRemainingBuffer;
result.set(key, value);
}
break;
case ModelMapValueType.string:
{
const { instance: value, remainingBuffer: newRemainingBuffer } = BufferHelper_1.BufferHelper.String2LFromBuffer(remainingBuffer);
remainingBuffer = newRemainingBuffer;
result.set(key, value);
}
break;
case ModelMapValueType.number: {
const { instance: value, remainingBuffer: newRemainingBuffer } = BufferHelper_1.BufferHelper.UIntFromBuffer(remainingBuffer);
remainingBuffer = newRemainingBuffer;
result.set(key, value);
}
}
}
return {
instance: result,
remainingBuffer
};
}
get [Symbol.toStringTag]() {
return 'ModelMap';
}
[Symbol.iterator]() {
return this._map.entries();
}
clear() {
this._map.clear();
}
delete(key) {
if (typeof key !== this._keyType) {
throw new Error('ModelMap.delete: Unexpected type for key');
}
return this._map.delete(key);
}
set(key, value) {
if (typeof key !== this._keyType) {
throw new Error('ModelMap.set: Unexpected type for key');
}
this._map.set(key, value);
return this;
}
get(key) {
if (typeof key !== this._keyType) {
throw new Error('ModelMap.get: Unexpected type for key');
}
return this._map.get(key);
}
has(key) {
if (typeof key !== this._keyType) {
throw new Error('ModelMap.has: Unexpected type for key');
}
return this._map.has(key);
}
get size() {
return this._map.size;
}
entries() {
return this._map.entries();
}
keys() {
return this._map.keys();
}
values() {
return this._map.values();
}
forEach(callbackfn,
// eslint-disable-next-line @typescript-eslint/no-explicit-any
thisArg) {
this._map.forEach(callbackfn, thisArg);
}
}
exports.ModelMap = ModelMap;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTW9kZWxNYXAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbW9kZWwvTW9kZWxNYXAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsMkNBQXVDO0FBRXZDLHlEQUFxRDtBQVdyRCxJQUFLLGlCQUlKO0FBSkQsV0FBSyxpQkFBaUI7SUFDckIsNkRBQVUsQ0FBQTtJQUNWLDZEQUFVLENBQUE7SUFDViw2REFBVSxDQUFBO0FBQ1gsQ0FBQyxFQUpJLGlCQUFpQixLQUFqQixpQkFBaUIsUUFJckI7QUFFRCxNQUFhLFFBR1gsU0FBUSxxQkFBUztJQUlsQixZQUFZLE9BQTRCO1FBQ3ZDLEtBQUssRUFBRSxDQUFBO1FBQ1AsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLEdBQUcsRUFBZ0IsQ0FBQTtRQUNuQyxJQUFJLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQTtJQUN4QixDQUFDO0lBRUQsTUFBTTtRQUNMLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDMUIsT0FBTyxTQUFTLENBQUE7UUFDakIsQ0FBQztRQUNELE1BQU0sTUFBTSxHQUErQixFQUFFLENBQUE7UUFDN0MsS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUN0QyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRSxDQUFDO2dCQUMvQixNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBVSxDQUFBO1lBQ3pCLENBQUM7aUJBQU0sSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztnQkFDdEMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQVUsQ0FBQTtZQUN6QixDQUFDO2lCQUFNLElBQUksS0FBSyxZQUFZLEdBQUcsRUFBRSxDQUFDO2dCQUNqQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FB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