url-safe-bitpacking 0.3.3 → 0.3.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/dist/factory/enumOptionsFactory.d.ts +2 -2
- package/dist/factory/intFactory.d.ts +7 -0
- package/dist/factory/utils.d.ts +29 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +103 -126
- package/dist/parsers/parsers.d.ts +7 -0
- package/dist/types/enumOptionsData.d.ts +3 -3
- package/dist/types/floatData.d.ts +2 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -29,10 +29,10 @@ From a memory footprint perspective there are two types of attributes in an obje
|
|
|
29
29
|
| Predefined Bitwidth | **✓** | **✓** | **✓** | **✓** | **✓** | ✗ | ✗ | ✗ | ✗ | ✗ |
|
|
30
30
|
| Has State Bit | ✗ | ✗ | ✗ | ✗ | ✗ | **✓** | **✓** | **✓** | **✓** | ✗ |
|
|
31
31
|
| Min Bitwidth | `4` | `1` | `1` | `0` | `0` | `1` | – | – | – | – |
|
|
32
|
-
| Max Bitwidth | `10` | `1` | `
|
|
32
|
+
| Max Bitwidth | `10` | `1` | `8` | `10` | `21` | `8` | – | – | – | – |
|
|
33
33
|
| Min State Bitwidth | – | – | – | – | – | `0` | `1` | `1` | `0` | – |
|
|
34
34
|
| Max State Bitwidth | – | – | – | – | – | `10` | `1` | `10` | `10` | – |
|
|
35
|
-
| Max Available States | `1024` | `2` | `
|
|
35
|
+
| Max Available States | `1024` | `2` | `256` | `1024` | `2097152` | `1024 x 256` | `2` | `256` | `1024` | - |
|
|
36
36
|
| Has Mapping | ✗ | ✗ | **✓** | ✗ | ✗ | **✓** | ✗ | **✓** | ✗ | ✗ |
|
|
37
37
|
| Has Nested Objects | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ | **✓** | **✓** | **✓** | **✓** |
|
|
38
38
|
| **UPDATING** | **VERSION** | **BOOLEAN** | **ENUM** | **INT** | **FLOAT** | **ENUM_ARRAY** | **OPTIONAL** | **ENUM_OPTIONS** | **ARRAY** | **OBJECT** |
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import {
|
|
2
|
-
export type EnumOptionsFactory = (descriptor: (
|
|
1
|
+
import { EnumOptionsDataEntry, EnumOptionsType, ObjectDataEntry } from '../types';
|
|
2
|
+
export type EnumOptionsFactory = (descriptor: (ObjectDataEntry | null)[], defaultState?: number, name?: string, options?: EnumOptionsType) => EnumOptionsDataEntry;
|
|
3
3
|
export declare const create: EnumOptionsFactory;
|
|
@@ -1,3 +1,10 @@
|
|
|
1
1
|
import { IntDataEntry } from '../types';
|
|
2
2
|
export type IntFactory = (value: number, min?: number, max?: number, name?: string) => IntDataEntry;
|
|
3
|
+
/**
|
|
4
|
+
* Method to create an int data entry
|
|
5
|
+
* @param value - `number` default value, should be between `min` and `max`
|
|
6
|
+
* @param min - `number` (default: 0), should be smaller than `max`
|
|
7
|
+
* @param max - `number` (default: 10), should be larger than `min` will be swapped if `min` is larger, the delta between min and max should not be greater than 1023 (max value representable in 10 bits)
|
|
8
|
+
* @param name - `string`
|
|
9
|
+
*/
|
|
3
10
|
export declare const create: IntFactory;
|
package/dist/factory/utils.d.ts
CHANGED
|
@@ -1,4 +1,32 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { DataType } from '@/enums';
|
|
2
|
+
import { EnumMappingType, EnumOptionsType, PrecisionRangeType } from '../types';
|
|
3
|
+
/**
|
|
4
|
+
* Method to validate the state of an unsigned int
|
|
5
|
+
*/
|
|
6
|
+
export declare const validateUnsignedInt: (min: number | undefined, max: number, defaultValue: number, name: string, type: DataType, maxBits: number) => {
|
|
7
|
+
min: number;
|
|
8
|
+
value: number;
|
|
9
|
+
max: number;
|
|
10
|
+
bitwidth: number;
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* Method to validate the state of a signed int
|
|
14
|
+
*/
|
|
15
|
+
export declare const validateSignedInt: (min: number, max: number, defaultValue: number, name: string, type: DataType, maxBits: number) => {
|
|
16
|
+
min: number;
|
|
17
|
+
value: number;
|
|
18
|
+
max: number;
|
|
19
|
+
bitwidth: number;
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* Method to validate FLOAT
|
|
23
|
+
*/
|
|
24
|
+
export declare const validateFloat: (min: number, max: number, defaultValue: number, precision: PrecisionRangeType, name: string, type: DataType, maxBits: number) => {
|
|
25
|
+
min: number;
|
|
26
|
+
value: number;
|
|
27
|
+
max: number;
|
|
28
|
+
bitwidth: number;
|
|
29
|
+
};
|
|
2
30
|
/**
|
|
3
31
|
* Method to get the max and mapping from the options
|
|
4
32
|
* @param options - `any[] | string | number` the options to get the max and mapping from
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export { DataType, HasMappingDataTypes, HasStateBitsDataTypes, HasChildDataTypes, HasChildrenDataTypes, HasNestedDataTypes, ValueUpdateDataTypes, StateUpdateDataTypes } from './enums';
|
|
2
|
-
export { VersionDataEntry, BooleanDataEntry, EnumDataEntry, IntDataEntry, FloatDataEntry, EnumArrayDataEntry, ObjectDataEntry, OptionalDataEntry, EnumOptionsDataEntry, ArrayDataEntry, PrecisionRangeType, SignificandMaxBits, IntegerMaxBits, VersionRangeType, DataEntry, ProtectedAttributeNames, EnumOptionsType, EnumMappingType, PROTECTED_ATTRIBUTE_NAMES, StateDataObject, StateDataObjectValue } from './types';
|
|
2
|
+
export { VersionDataEntry, BooleanDataEntry, EnumDataEntry, IntDataEntry, FloatDataEntry, EnumArrayDataEntry, ObjectDataEntry, OptionalDataEntry, EnumOptionsDataEntry, ArrayDataEntry, PrecisionRange, PrecisionRangeType, SignificandMaxBits, IntegerMaxBits, VersionRangeType, DataEntry, ProtectedAttributeNames, EnumOptionsType, EnumMappingType, PROTECTED_ATTRIBUTE_NAMES, StateDataObject, StateDataObjectValue } from './types';
|
|
3
3
|
export { getBitsCount, dataEntryBitstringParser, dataEntryCorrecting, dataEntryBitsStringifier, parseBase64ToBits } from './parsers';
|
|
4
4
|
export { SpecificTypeNode, NodeFactory, GetStateNodeTree, FromState, VersionNode, ArrayNode, BooleanNode, EnumNode, IntNode, FloatNode, EnumArrayNode, OptionalNode, EnumOptionsNode, ObjectNode, StateNode, getStateData } from './stateHandling';
|
|
5
5
|
export { interpolateEntryAt, getRelativeValue } from './utils';
|
package/dist/index.js
CHANGED
|
@@ -9,6 +9,7 @@ var StateUpdateDataTypes = ["OPTIONAL", "ENUM_OPTIONS", "ARRAY"];
|
|
|
9
9
|
// src/types/enumData.ts
|
|
10
10
|
var EnumMaxBits = 8;
|
|
11
11
|
// src/types/floatData.ts
|
|
12
|
+
var PrecisionRange = [-3, -2, -1, 0, 1, 2, 3, 4];
|
|
12
13
|
var SignificandMaxBits = 20;
|
|
13
14
|
// src/types/intData.ts
|
|
14
15
|
var IntegerMaxBits = 12;
|
|
@@ -271,10 +272,6 @@ var simpleFromValueParser = (bitString, entry) => {
|
|
|
271
272
|
}
|
|
272
273
|
};
|
|
273
274
|
var dataEntryBitstringParser = (entry, bitString) => {
|
|
274
|
-
const result = _dataEntryBitstringParser(entry, bitString);
|
|
275
|
-
return result;
|
|
276
|
-
};
|
|
277
|
-
var _dataEntryBitstringParser = (entry, bitString) => {
|
|
278
275
|
switch (entry.type) {
|
|
279
276
|
case "BOOLEAN":
|
|
280
277
|
case "INT":
|
|
@@ -459,43 +456,74 @@ var updateStateEntry = (original, update) => {
|
|
|
459
456
|
return updateState3(original, update);
|
|
460
457
|
}
|
|
461
458
|
};
|
|
462
|
-
// src/factory/
|
|
463
|
-
var
|
|
464
|
-
const
|
|
465
|
-
if (
|
|
466
|
-
throw new Error(`Cannot
|
|
467
|
-
return
|
|
459
|
+
// src/factory/utils.ts
|
|
460
|
+
var validateBitsCount = (stateCount, maxBitWidth, name, type) => {
|
|
461
|
+
const bitCountForStateCount = Math.ceil(Math.log2(stateCount));
|
|
462
|
+
if (bitCountForStateCount > maxBitWidth)
|
|
463
|
+
throw new Error(`Cannot store ${stateCount} state in ${maxBitWidth} bits for ${name} ${type} you would need ${bitCountForStateCount} bits`);
|
|
464
|
+
return bitCountForStateCount;
|
|
465
|
+
};
|
|
466
|
+
var validateUnsignedInt = (min, max, defaultValue, name, type, maxBits) => {
|
|
467
|
+
if (min === undefined || min < 0)
|
|
468
|
+
min = 0;
|
|
469
|
+
if (!Number.isInteger(min))
|
|
470
|
+
min = Math.floor(min);
|
|
471
|
+
if (!Number.isInteger(max))
|
|
472
|
+
max = Math.floor(max);
|
|
473
|
+
[min, max] = [min, max].sort((a, b) => a - b);
|
|
474
|
+
const bitwidth = validateBitsCount(max - min + 1, maxBits, name, type);
|
|
475
|
+
if (!Number.isInteger(defaultValue))
|
|
476
|
+
defaultValue = Math.floor(defaultValue);
|
|
477
|
+
return { min, value: Math.max(min, Math.min(defaultValue, max)), max, bitwidth };
|
|
478
|
+
};
|
|
479
|
+
var validateSignedInt = (min, max, defaultValue, name, type, maxBits) => {
|
|
480
|
+
if (!Number.isInteger(min))
|
|
481
|
+
min = Math.floor(min);
|
|
482
|
+
if (!Number.isInteger(max))
|
|
483
|
+
max = Math.floor(max);
|
|
484
|
+
if (!Number.isInteger(defaultValue))
|
|
485
|
+
defaultValue = Math.floor(defaultValue);
|
|
486
|
+
[min, max] = [min, max].sort((a, b) => a - b);
|
|
487
|
+
const bitwidth = validateBitsCount(max - min + 1, maxBits, name, type);
|
|
488
|
+
return { min, value: Math.max(min, Math.min(Math.round(defaultValue), max)), max, bitwidth };
|
|
489
|
+
};
|
|
490
|
+
var validateFloat = (min, max, defaultValue, precision, name, type, maxBits) => {
|
|
491
|
+
if (!PrecisionRange.includes(precision))
|
|
492
|
+
throw new Error(`Precision ${precision} is not valid for ${name} ${type}`);
|
|
493
|
+
const precisionMultiplier = 10 ** precision;
|
|
494
|
+
min = Math.floor(min * precisionMultiplier);
|
|
495
|
+
max = Math.floor(max * precisionMultiplier);
|
|
496
|
+
[min, max] = [min, max].sort((a, b) => a - b);
|
|
497
|
+
const bitwidth = validateBitsCount(max - min + 1, maxBits, name, type);
|
|
498
|
+
[min, max] = [min, max].map((v) => v / precisionMultiplier);
|
|
499
|
+
const value = Math.max(min, Math.min(Math.round(defaultValue * precisionMultiplier) / precisionMultiplier, max));
|
|
500
|
+
return { min, value, max, bitwidth };
|
|
501
|
+
};
|
|
502
|
+
var getEnumMaxAndMappingFromOptions = (options) => {
|
|
503
|
+
if (typeof options === "string")
|
|
504
|
+
return { max: options.length - 1, mapping: options.split("") };
|
|
505
|
+
if (typeof options === "number")
|
|
506
|
+
return { max: options, mapping: Array.from({ length: options + 1 }, (_, i) => i) };
|
|
507
|
+
return { max: options.length - 1, mapping: options };
|
|
508
|
+
};
|
|
509
|
+
var getOptionsFromMaxAndMapping = (v) => {
|
|
510
|
+
if (v.mapping.every((option) => typeof option === "string" && option.length === 1))
|
|
511
|
+
return v.mapping.join("");
|
|
512
|
+
if (Array.from({ length: v.max + 1 }, (_, i) => i).every((option, i) => option === v.mapping[i]))
|
|
513
|
+
return v.max;
|
|
514
|
+
return v.mapping;
|
|
468
515
|
};
|
|
469
|
-
var getMinimumBitsForInteger = (v) => Math.ceil(Math.log2(v + 1));
|
|
470
516
|
|
|
471
517
|
// src/factory/floatFactory.ts
|
|
472
518
|
var create = (value, min = 0, max = 1, precision = 2, name = "a float") => {
|
|
473
|
-
const
|
|
474
|
-
|
|
475
|
-
const roundedMax = Math.ceil(max * precisionMultiplier);
|
|
476
|
-
const delta = roundedMax - roundedMin;
|
|
477
|
-
const significand = Math.max(1, getBitsForIntegerNumber(delta, SignificandMaxBits));
|
|
478
|
-
return {
|
|
479
|
-
value,
|
|
480
|
-
type: "FLOAT",
|
|
481
|
-
min: roundedMin / precisionMultiplier,
|
|
482
|
-
max: roundedMax / precisionMultiplier,
|
|
483
|
-
precision,
|
|
484
|
-
significand,
|
|
485
|
-
name
|
|
486
|
-
};
|
|
519
|
+
const r = validateFloat(min, max, value, precision, name, "FLOAT", SignificandMaxBits);
|
|
520
|
+
return { value: r.value, type: "FLOAT", min: r.min, max: r.max, precision, significand: r.bitwidth, name };
|
|
487
521
|
};
|
|
488
522
|
|
|
489
523
|
// src/factory/intFactory.ts
|
|
490
524
|
var create2 = (value, min = 0, max = 10, name = "an int") => {
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
if (max - min < 1)
|
|
494
|
-
throw new Error("max must be at least one");
|
|
495
|
-
if (Math.abs(max - min) > 2 ** IntegerMaxBits - 1)
|
|
496
|
-
throw new Error("max - min must be less than 1024");
|
|
497
|
-
const bits = getBitsForIntegerNumber(max - min + 1, IntegerMaxBits);
|
|
498
|
-
return { value, type: "INT", min, max, bits, name };
|
|
525
|
+
const r = validateSignedInt(min, max, value, name, "INT", IntegerMaxBits);
|
|
526
|
+
return { value, type: "INT", min: r.min, max: r.max, bits: r.bitwidth, name };
|
|
499
527
|
};
|
|
500
528
|
|
|
501
529
|
// src/factory/booleanFactory.ts
|
|
@@ -506,82 +534,31 @@ var create3 = (value, name = "a boolean") => ({
|
|
|
506
534
|
});
|
|
507
535
|
|
|
508
536
|
// src/factory/versionFactory.ts
|
|
509
|
-
var create4 = (value, bits = 8, name = "a version") =>
|
|
510
|
-
value
|
|
511
|
-
|
|
512
|
-
bits,
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
return { max: options.length - 1, mapping: options.split("") };
|
|
520
|
-
if (typeof options === "number")
|
|
521
|
-
return { max: options, mapping: Array.from({ length: options + 1 }, (_, i) => i) };
|
|
522
|
-
return { max: options.length - 1, mapping: options };
|
|
523
|
-
};
|
|
524
|
-
var getOptionsFromMaxAndMapping = (v) => {
|
|
525
|
-
if (v.mapping.every((option) => typeof option === "string" && option.length === 1))
|
|
526
|
-
return v.mapping.join("");
|
|
527
|
-
if (Array.from({ length: v.max + 1 }, (_, i) => i).every((option, i) => option === v.mapping[i]))
|
|
528
|
-
return v.max;
|
|
529
|
-
return v.mapping;
|
|
537
|
+
var create4 = (value, bits = 8, name = "a version") => {
|
|
538
|
+
if (!Number.isInteger(value))
|
|
539
|
+
value = Math.floor(value);
|
|
540
|
+
value = Math.max(0, Math.min(2 ** bits - 1, value));
|
|
541
|
+
return {
|
|
542
|
+
value,
|
|
543
|
+
type: "VERSION",
|
|
544
|
+
bits,
|
|
545
|
+
name
|
|
546
|
+
};
|
|
530
547
|
};
|
|
531
548
|
|
|
532
549
|
// src/factory/enumFactory.ts
|
|
533
550
|
var create5 = (value, options, name = "an enum") => {
|
|
534
551
|
const { max, mapping } = getEnumMaxAndMappingFromOptions(options);
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
if (max < 1)
|
|
538
|
-
throw new Error("max must be at least one");
|
|
539
|
-
if (max > 2 ** EnumMaxBits - 1)
|
|
540
|
-
throw new Error("max - min must be less than 256");
|
|
541
|
-
const bits = getBitsForIntegerNumber(max + 1, EnumMaxBits);
|
|
542
|
-
return { value, type: "ENUM", max, bits, name, mapping };
|
|
552
|
+
const r = validateUnsignedInt(0, max, value, name, "ENUM", EnumMaxBits);
|
|
553
|
+
return { value: r.value, type: "ENUM", max: r.max, bits: r.bitwidth, name, mapping };
|
|
543
554
|
};
|
|
544
555
|
|
|
545
556
|
// src/factory/enumArrayFactory.ts
|
|
546
|
-
var
|
|
547
|
-
var maxOptionsCount = 1024;
|
|
548
|
-
var create6 = (value, options, minCount = minEnumArrayCount, maxCount = 10, name = "enum array") => {
|
|
557
|
+
var create6 = (value, options, minCount = 0, maxCount = 10, name = "enum array") => {
|
|
549
558
|
const { max, mapping } = getEnumMaxAndMappingFromOptions(options);
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
throw new Error("minCount and maxCount must be integers");
|
|
554
|
-
if (max < 1)
|
|
555
|
-
throw new Error("must have at least one option");
|
|
556
|
-
if (max > maxOptionsCount)
|
|
557
|
-
throw new Error(`maximum allowed options is 1024, you have given ${max + 1} options`);
|
|
558
|
-
minCount = Math.min(minCount, maxCount);
|
|
559
|
-
maxCount = Math.max(minCount, maxCount);
|
|
560
|
-
if (minCount < 0)
|
|
561
|
-
throw new Error("minCount can't be negative");
|
|
562
|
-
if (maxCount - minCount < 0)
|
|
563
|
-
throw new Error(`count range length must be positive, given count range length is ${Math.abs(maxCount - minCount)}`);
|
|
564
|
-
if (Math.abs(maxCount - minCount) > 2 ** IntegerMaxBits - 1)
|
|
565
|
-
throw new Error(`count range length must be less than 1024, given count range length is ${Math.abs(maxCount - minCount)}`);
|
|
566
|
-
value.forEach((v, i) => {
|
|
567
|
-
if (!Number.isInteger(v))
|
|
568
|
-
throw new Error(`all entries must be integers, index ${i} (${v}) is not`);
|
|
569
|
-
if (v > max)
|
|
570
|
-
throw new Error(`all entries must be within the range ${0} - ${max}, index ${i} (${v}) is not`);
|
|
571
|
-
});
|
|
572
|
-
if (value.length < minCount || value.length > maxCount)
|
|
573
|
-
throw new Error(`value length must be between minCount and maxCount, ${value.length} is not between ${minCount} and ${maxCount}`);
|
|
574
|
-
const stateBits = getBitsForIntegerNumber(maxCount - minCount + 1, IntegerMaxBits);
|
|
575
|
-
return {
|
|
576
|
-
type: "ENUM_ARRAY",
|
|
577
|
-
minCount,
|
|
578
|
-
maxCount,
|
|
579
|
-
value: JSON.parse(JSON.stringify(value)),
|
|
580
|
-
max,
|
|
581
|
-
name,
|
|
582
|
-
mapping,
|
|
583
|
-
stateBits
|
|
584
|
-
};
|
|
559
|
+
const r = validateUnsignedInt(minCount, maxCount, value.length, name, "ENUM_ARRAY", IntegerMaxBits);
|
|
560
|
+
value = Array.from({ length: r.value }, (_, i) => validateUnsignedInt(0, max, value[i] ?? 0, `${name}[${i}]`, "ENUM_ARRAY", EnumMaxBits).value);
|
|
561
|
+
return { type: "ENUM_ARRAY", minCount: r.min, maxCount: r.max, value, max, name, mapping, stateBits: r.bitwidth };
|
|
585
562
|
};
|
|
586
563
|
|
|
587
564
|
// src/factory/optionalFactory.ts
|
|
@@ -600,6 +577,15 @@ var create7 = (descriptor, defaultState = false, name = "an optional") => {
|
|
|
600
577
|
};
|
|
601
578
|
};
|
|
602
579
|
|
|
580
|
+
// src/factory/helperMethod.ts
|
|
581
|
+
var getBitsForIntegerNumber = (number, maxBits) => {
|
|
582
|
+
const bitCount = Math.ceil(Math.log2(number));
|
|
583
|
+
if (bitCount > maxBits)
|
|
584
|
+
throw new Error(`Cannot get ${maxBits} bits for a number with ${bitCount} bits`);
|
|
585
|
+
return bitCount;
|
|
586
|
+
};
|
|
587
|
+
var getMinimumBitsForInteger = (v) => Math.ceil(Math.log2(v + 1));
|
|
588
|
+
|
|
603
589
|
// src/factory/enumOptionsFactory.ts
|
|
604
590
|
var maxEnumOptions = 64;
|
|
605
591
|
var maxEnumOptionsBits = getMinimumBitsForInteger(maxEnumOptions);
|
|
@@ -628,29 +614,16 @@ var create8 = (descriptor, defaultState = 0, name = "enum options", options) =>
|
|
|
628
614
|
};
|
|
629
615
|
|
|
630
616
|
// src/factory/arrayFactory.ts
|
|
631
|
-
var maxArrayCount = 1024;
|
|
632
617
|
var create9 = (descriptor, defaultState = 0, minCount = 0, maxCount = 10, name = "an array") => {
|
|
633
|
-
|
|
634
|
-
throw new Error("minCount and maxCount must be integers");
|
|
635
|
-
if (minCount < 0)
|
|
636
|
-
throw new Error("minCount must be at least 0");
|
|
637
|
-
if (maxCount < 0)
|
|
638
|
-
throw new Error("maxCount must be at least 0");
|
|
639
|
-
if (maxCount - minCount < 0)
|
|
640
|
-
throw new Error("maxCount must be greater than or equal to minCount");
|
|
641
|
-
if (maxCount - minCount > maxArrayCount)
|
|
642
|
-
throw new Error(`maxCount (${maxCount}) - minCount (${minCount}) = ${maxCount - minCount} must be less than or equal to maxArrayCount (${maxArrayCount})`);
|
|
643
|
-
if (defaultState < minCount || defaultState > maxCount)
|
|
644
|
-
throw new Error(`defaultState must be between minCount (${minCount}) and maxCount (${maxCount}), given defaultState is ${defaultState}`);
|
|
645
|
-
const stateBits = getMinimumBitsForInteger(maxCount - minCount);
|
|
618
|
+
const r = validateUnsignedInt(minCount, maxCount, defaultState, name, "ARRAY", IntegerMaxBits);
|
|
646
619
|
return {
|
|
647
|
-
value: [...Array(
|
|
620
|
+
value: [...Array(r.value)].map(() => JSON.parse(JSON.stringify(descriptor))),
|
|
648
621
|
descriptor,
|
|
649
622
|
type: "ARRAY",
|
|
650
|
-
minCount,
|
|
651
|
-
maxCount,
|
|
652
|
-
stateBits,
|
|
653
|
-
state:
|
|
623
|
+
minCount: r.min,
|
|
624
|
+
maxCount: r.max,
|
|
625
|
+
stateBits: r.bitwidth,
|
|
626
|
+
state: r.value,
|
|
654
627
|
name
|
|
655
628
|
};
|
|
656
629
|
};
|
|
@@ -661,8 +634,7 @@ var create10 = (descriptor, name = "an object") => {
|
|
|
661
634
|
type: "OBJECT",
|
|
662
635
|
descriptor,
|
|
663
636
|
value: descriptor,
|
|
664
|
-
name
|
|
665
|
-
stateBits: 0
|
|
637
|
+
name
|
|
666
638
|
};
|
|
667
639
|
};
|
|
668
640
|
|
|
@@ -841,7 +813,10 @@ class EnumOptionsNode extends ComplexStateNodes {
|
|
|
841
813
|
getChildren = () => [this.child];
|
|
842
814
|
getStateBits = () => rawStateStringifier4(this.state, this.descriptor.stateBits);
|
|
843
815
|
getValueBits = () => this.child ? this.child.bitstring : "";
|
|
844
|
-
initializedChild = () =>
|
|
816
|
+
initializedChild = () => {
|
|
817
|
+
const validatedEntry = validateDataEntry(this.descriptor.descriptor[this.state], this.descriptor.value);
|
|
818
|
+
return validatedEntry ? NodeFactory(validatedEntry, this) : null;
|
|
819
|
+
};
|
|
845
820
|
updateState = (newState) => {
|
|
846
821
|
const constrainedNewState = constrainState2(this.descriptor.descriptor.length, newState);
|
|
847
822
|
if (constrainedNewState === this.state)
|
|
@@ -872,7 +847,7 @@ class ArrayNode extends ComplexStateNodes {
|
|
|
872
847
|
this.children = this.initializedChildren();
|
|
873
848
|
this.bitstring = this.getBitString();
|
|
874
849
|
}
|
|
875
|
-
initializedChildren = () => this.descriptor.value.map((
|
|
850
|
+
initializedChildren = () => this.descriptor.value.map((entry) => NodeFactory(validateDataEntry(this.descriptor.descriptor, entry), this));
|
|
876
851
|
getChildren = () => this.children;
|
|
877
852
|
getStateBits = () => rawStateStringifier2(this.state, this.descriptor.minCount, this.descriptor.stateBits);
|
|
878
853
|
getValueBits = () => this.children.map((child) => child.bitstring).join("");
|
|
@@ -954,6 +929,7 @@ var getObjectForDataEntries = (entries) => {
|
|
|
954
929
|
});
|
|
955
930
|
return object;
|
|
956
931
|
};
|
|
932
|
+
var getStringForDataEntries = (values) => Array.isArray(values) && values.every((v) => typeof v === "string" && v.length === 1) ? values.join("") : values;
|
|
957
933
|
var getStateData = (entry) => {
|
|
958
934
|
switch (entry.type) {
|
|
959
935
|
case "BOOLEAN":
|
|
@@ -964,7 +940,7 @@ var getStateData = (entry) => {
|
|
|
964
940
|
case "ENUM":
|
|
965
941
|
return entry.mapping[entry.value];
|
|
966
942
|
case "ENUM_ARRAY":
|
|
967
|
-
return entry.value.map((v) => entry.mapping[v]);
|
|
943
|
+
return getStringForDataEntries(entry.value.map((v) => entry.mapping[v]));
|
|
968
944
|
case "OPTIONAL":
|
|
969
945
|
return entry.value === null ? null : getStateData(entry.value);
|
|
970
946
|
case "ENUM_OPTIONS":
|
|
@@ -973,7 +949,7 @@ var getStateData = (entry) => {
|
|
|
973
949
|
switch (entry.value.type) {
|
|
974
950
|
case "OBJECT":
|
|
975
951
|
return {
|
|
976
|
-
...
|
|
952
|
+
...getObjectForDataEntries(entry.value.value),
|
|
977
953
|
state
|
|
978
954
|
};
|
|
979
955
|
default:
|
|
@@ -984,7 +960,7 @@ var getStateData = (entry) => {
|
|
|
984
960
|
case "OBJECT":
|
|
985
961
|
return getObjectForDataEntries(entry.value);
|
|
986
962
|
case "ARRAY":
|
|
987
|
-
return entry.value.map(
|
|
963
|
+
return getStringForDataEntries(entry.value.map(getStateData));
|
|
988
964
|
}
|
|
989
965
|
};
|
|
990
966
|
// src/utils/interpolateData.ts
|
|
@@ -1035,6 +1011,7 @@ export {
|
|
|
1035
1011
|
StateUpdateDataTypes,
|
|
1036
1012
|
StateNode,
|
|
1037
1013
|
SignificandMaxBits,
|
|
1014
|
+
PrecisionRange,
|
|
1038
1015
|
PROTECTED_ATTRIBUTE_NAMES,
|
|
1039
1016
|
OptionalNode,
|
|
1040
1017
|
ObjectNode,
|
|
@@ -9,6 +9,13 @@ export declare const getStateBitsForDataEntry: (entry: DataEntry & {
|
|
|
9
9
|
* @param entry - `DataEntry`
|
|
10
10
|
*/
|
|
11
11
|
export declare const getContentBitsCountForDataEntry: (entry: DataEntry) => number;
|
|
12
|
+
/**
|
|
13
|
+
* Method that parses a bitstring into a value
|
|
14
|
+
*
|
|
15
|
+
* @param bitString - `string` of 0 | 1
|
|
16
|
+
* @param entry - `DataEntry` that represents the data entry to parse
|
|
17
|
+
* @returns `number` | `boolean` that represents the parsed value
|
|
18
|
+
*/
|
|
12
19
|
export declare const dataEntryBitstringParser: <T extends DataEntry>(entry: T, bitString: string) => [T, string];
|
|
13
20
|
/**
|
|
14
21
|
* Method that returns the amount of bits required for a given data entry
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { ObjectDataEntry } from './dataEntry';
|
|
2
2
|
import { EnumMappingType } from './enumData';
|
|
3
3
|
export type EnumOptionsData = {
|
|
4
4
|
type: 'ENUM_OPTIONS';
|
|
5
5
|
stateBits: number;
|
|
6
6
|
state: number;
|
|
7
|
-
descriptor: (
|
|
7
|
+
descriptor: (ObjectDataEntry | null)[];
|
|
8
8
|
mapping: EnumMappingType;
|
|
9
|
-
value:
|
|
9
|
+
value: ObjectDataEntry | null;
|
|
10
10
|
};
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
export
|
|
1
|
+
export declare const PrecisionRange: readonly [-3, -2, -1, 0, 1, 2, 3, 4];
|
|
2
|
+
export type PrecisionRangeType = (typeof PrecisionRange)[number];
|
|
2
3
|
export declare const SignificandMaxBits = 20;
|
|
3
4
|
/**
|
|
4
5
|
* Float object
|