Press n or j to go to the next uncovered block, b, p or k for the previous block.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 | 28x 28x 28x 28x 12032x 14647x 78x 3x 6x 6x 1x 5x 13816x 12136x 3615x 8521x 8521x 8521x 10084x 10084x 10084x 10084x 10084x 10084x 10084x 8521x 93x 30x 63x 63x 63x 81x 81x 81x 81x 81x 81x 81x 81x 81x 63x | import _ from 'lodash'; import {ISiDataType, ISiStorageData, ValueFromStringError} from './interfaces'; import {ModifyUndefinedException, SiDataType} from './SiDataType'; export type SiIntegerPartDefinition = [number, number, number]|[number]; export interface SiIntegerPart { byteOffset: number; startBit: number; endBit: number; } export class SiInt extends SiDataType<number> implements ISiDataType<number> { public parts: SiIntegerPart[]; constructor(parts: SiIntegerPartDefinition[]) { super(); this.parts = parts.map((rawPart) => ({ byteOffset: rawPart[0], startBit: rawPart.length === 3 ? rawPart[1] : 0, endBit: rawPart.length === 3 ? rawPart[2] : 8, })); } typeSpecificIsValueValid(value: number): boolean { return _.isInteger(value) && value >= 0; } typeSpecificValueToString(value: number): string { return value.toString(); } typeSpecificValueFromString(string: string): number|ValueFromStringError { const intValue = parseInt(string, 10); if (!_.isInteger(intValue)) { return new ValueFromStringError( `Value for SiInt must be integer, not "${string}"`, ); } return intValue; } isUndefined(data: ISiStorageData): boolean { return this.parts.some((part) => data.get(part.byteOffset) === undefined); } typeSpecificExtractFromData(data: ISiStorageData): number|undefined { if (this.isUndefined(data)) { return undefined; } let bitOffset = 0; let intValue = 0; this.parts.forEach((part) => { const {byteOffset, startBit, endBit} = part; const bitLength = endBit - startBit; const lengthMask = (0x01 << bitLength) - 1; const existingByte = data.get(byteOffset) as number; const partValue = (existingByte >> startBit) & lengthMask; intValue |= (partValue << bitOffset); bitOffset += bitLength; }); return intValue; } typeSpecificUpdateData(data: ISiStorageData, newValue: number): ISiStorageData { if (this.isUndefined(data)) { throw new ModifyUndefinedException(); } let bitOffset = 0; let tempData = data; this.parts.forEach((part) => { const {byteOffset, startBit, endBit} = part; const bitLength = endBit - startBit; const lengthMask = (0x01 << bitLength) - 1; const newPartValue = (newValue >> bitOffset) & lengthMask; const existingByte = tempData.get(byteOffset) as number; const preservationMask = (lengthMask << startBit) ^ 0xFF; const newByte = (existingByte & preservationMask) | (newPartValue << startBit); tempData = tempData.set(byteOffset, newByte); bitOffset += bitLength; }); return tempData; } } |