diffusion
Version:
Diffusion JavaScript client
68 lines (58 loc) • 1.98 kB
JavaScript
var Codec = require("io/codec");
var BEES = require("serialisers/byte-encoded-enum-serialiser");
var Long = require("long");
var Set = require('core-js/library/fn/set');
/** Encodes a set of enums into a bitset stored in a 64 bit integer
*
* The enum values must all lie bewteen 0 and 63 inclusive.
*/
var serialiser = {
/** Reads an enum set from a buffer input stream
*
* @param {BufferInputStream} bis thhe buffer input stream
* @param {any} enumType the enum type
*
* @returns {Set} a Set contining the enums stored in the input stream
*/
read : function(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;
},
/** Writes an enum set to a buffer output stream
*
* @param {BufferOutputStream} bos thhe buffer output stream
* @param {Array|Set} 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.
*/
write : function(bos, enumSet) {
var bitmap = Long.UZERO;
var enumWriter = {
write: function(val) {
if (val>=64) {
throw new Error("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);
}
};
module.exports = serialiser;