UNPKG

binaryarray

Version:
116 lines (115 loc) 4.24 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var assert = require("assert"); var util_1 = require("./util"); var bitsize_util_1 = require("./bitsize_util"); var BinaryArray = /** @class */ (function () { function BinaryArray(maxnum) { this.maxnum = maxnum; this.storage = util_1.createArray(bitsize_util_1.getArraySize(maxnum), 0); } BinaryArray.prototype.findBitPosition = function (no) { assert(this.maxnum > no, 'on:over flagmax'); var idx = bitsize_util_1.getArrayIndex(no); assert(idx >= 0 && idx < this.storage.length, 'on:over idx range'); var pos = bitsize_util_1.getFlagPos(no); var flag = 1 << pos; return [idx, flag]; }; BinaryArray.prototype.bitOn = function (no) { var _a = this.findBitPosition(no), idx = _a[0], flag = _a[1]; this.storage[idx] |= flag; return this; }; BinaryArray.prototype.bitOff = function (no) { var _a = this.findBitPosition(no), idx = _a[0], flag = _a[1]; if (this.storage[idx] & flag) { this.storage[idx] ^= flag; } return this; }; BinaryArray.prototype.at = function (no) { var _a = this.findBitPosition(no), idx = _a[0], flag = _a[1]; return this.storage[idx] & flag ? 1 : 0; }; BinaryArray.prototype.toArray = function () { var _this = this; var results = Array.from(Array(this.maxnum), function (v, idx) { return _this.at(idx); }); return results; }; BinaryArray.prototype.serialize = function (spec) { assert(spec instanceof Object, 'spec is must be Object'); var flaglist = this.toArray(); return Object.keys(spec) .filter(function (k) { return flaglist[spec[k]]; }); }; BinaryArray.prototype.toJSON = function () { return JSON.stringify(this.toArray()); }; BinaryArray.prototype.isRange = function (no) { if (!(this.maxnum > no)) { return false; } var idx = bitsize_util_1.getArrayIndex(no); if (!(idx >= 0 && idx < this.storage.length)) { return false; } return true; }; BinaryArray.prototype.rangeOf = function (no_list) { var _this = this; var xs = (no_list instanceof Array) ? no_list : [no_list]; return xs.reduce(function (r, no) { r[no] = _this.at(no); return r; }, {}); }; BinaryArray.prototype.check = function (on_list, off_list) { if (off_list === void 0) { off_list = []; } var on = this.rangeOf(on_list); var off = this.rangeOf(off_list); var x = Object.keys(on).reduce(function (r, v) { return r & on[v]; }, 1); var y = Object.keys(off).reduce(function (r, v) { return r & ~off[v]; }, 1); return (x & y) ? true : false; }; BinaryArray.prototype.toHexString = function () { var str = ''; var n = this.storage.length; for (var i = n - 1; i >= 0; --i) { str = str + util_1.numberToHexString(this.storage[i], 8); } return str; }; BinaryArray.prototype.clone = function () { return BinaryArray.loadFromArray(this.toArray()); }; BinaryArray.loadFromHexString = function (maxnum, str) { var ba = new BinaryArray(maxnum); var s = 8; var b = str.length - s; var e = str.length - 0; var n = str.length / s; for (var i = 0; i < n; ++i) { ba.storage[i] = parseInt(str.substring(b, e), 16); b -= s; e -= s; } return ba; }; BinaryArray.loadFromArray = function (flaglist) { var ba = new BinaryArray(flaglist.length); flaglist.map(function (v, i) { return [i, v]; }) .filter(function (tuple) { return tuple[1]; }) .forEach(function (tuple) { ba.bitOn(tuple[0]); }); return ba; }; BinaryArray.deserialize = function (list, spec, max) { var ba = new BinaryArray(max); list.forEach(function (v) { ba.bitOn(spec[v]); }); return ba; }; return BinaryArray; }()); exports.BinaryArray = BinaryArray;