diffusion
Version:
Diffusion JavaScript client
63 lines (62 loc) • 1.9 kB
JavaScript
;
/**
* @module Serialisers
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.write = exports.read = void 0;
var errors_1 = require("./../../errors/errors");
var Codec = require("./../io/codec");
var BEES = require("./../serialisers/byte-encoded-enum-serialiser");
var Long = require("long");
/**
* Read and decodes a set of enums from a bitset stored in a 64 bit integer
*
* The enum values must all lie between 0 and 63 inclusive.
*
* @param bis the buffer input stream
* @param enumType the enum type
* @returns a Set containing the enums stored in the input stream
*/
function read(bis, enumType) {
var enums = new Set();
var bitmap = Codec.readInt64(bis);
var shift = 0;
var enumReader = {
read: function () {
return shift;
}
};
while (!bitmap.isZero()) {
if (!bitmap.and(1).isZero()) {
enums.add(BEES.read(enumReader, enumType));
}
bitmap = bitmap.shiftRight(1);
shift++;
}
return enums;
}
exports.read = read;
/** Writes an enum set to a buffer output stream
*
* @param bos the buffer output stream
* @param enumSet the set of enums stored in an array or set.
* The only requirement is the presence of a forEach method. *
* All enum values stored in the set must lie between 0 and 63
* inclusive.
*/
function write(bos, enumSet) {
var bitmap = Long.UZERO;
var enumWriter = {
write: function (val) {
if (val >= 64) {
throw new errors_1.IOError("Cannot encode enum in long, " + val + " >= 64'");
}
bitmap = bitmap.or(Long.ONE.shiftLeft(val));
}
};
enumSet.forEach(function (e) {
BEES.write(enumWriter, e);
});
Codec.writeInt64(bos, bitmap);
}
exports.write = write;