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 | 27x 27x 27x 55x 55x 55x 46x 2x 3x 3x 1x 2x 60x 60x 10x 50x 40x 40x 40x 40x 10x 30x 30x | import _ from 'lodash'; import {ISiDataType, ISiStorageData, ValueFromStringError} from './interfaces'; import {ModifyUndefinedException, SiDataType} from './SiDataType'; export class SiBool extends SiDataType<boolean> implements ISiDataType<boolean> { constructor( private byteOffset: number, private bitOffset: number = 0, ) { super(); } typeSpecificIsValueValid(_value: boolean): boolean { return true; } typeSpecificValueToString(value: boolean): string { return value ? 'true' : 'false'; } typeSpecificValueFromString(string: string): boolean|ValueFromStringError { const valueByString: {[key: string]: boolean} = { 'true': true, 'false': false, }; if (valueByString[string] === undefined) { return new ValueFromStringError( `Value for ${this.constructor.name} must be "true" or "false", not "${string}"`, ); } return valueByString[string]; } typeSpecificExtractFromData(data: ISiStorageData): boolean|undefined { const existingByte = data.get(this.byteOffset); if (existingByte === undefined) { return undefined; } return ((existingByte >> this.bitOffset) & 0x01) === 0x01; } typeSpecificUpdateData(data: ISiStorageData, newValue: boolean): ISiStorageData { const boolAsInt = newValue ? 0x01 : 0x00; const preservationMask = (0x01 << this.bitOffset) ^ 0xFF; const existingByte = data.get(this.byteOffset); if (existingByte === undefined) { throw new ModifyUndefinedException(); } const newByte = (existingByte & preservationMask) | (boolAsInt << this.bitOffset); return data.set(this.byteOffset, newByte); } } |