UNPKG

diffusion

Version:

Diffusion JavaScript client

68 lines (58 loc) 1.98 kB
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;