bluzelle-binary-codec
Version:
bluzelle binary codec
60 lines (55 loc) • 1.87 kB
JavaScript
var assert = require('assert');
var BN = require('bn.js');
var makeClass = require('../utils/make-class');var _require =
require('./serialized-type'),Comparable = _require.Comparable,SerializedType = _require.SerializedType;var _require2 =
require('../utils/bytes-utils'),serializeUIntN = _require2.serializeUIntN;
var MAX_VALUES = [0, 255, 65535, 16777215, 4294967295];
function signum(a, b) {
return a < b ? -1 : a === b ? 0 : 1;
}
var UInt = makeClass({
mixins: [Comparable, SerializedType],
UInt: function UInt() {var val = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
var max = MAX_VALUES[this.constructor.width];
if (val < 0 || !(val <= max)) {
throw new Error(val + ' not in range 0 <= $val <= ' + max);
}
this.val = val;
},
statics: {
width: 0,
fromParser: function fromParser(parser) {
var val = this.width > 4 ? parser.read(this.width) :
parser.readUIntN(this.width);
return new this(val);
},
from: function from(val) {
return val instanceof this ? val : new this(val);
} },
toJSON: function toJSON() {
return this.val;
},
valueOf: function valueOf() {
return this.val;
},
compareTo: function compareTo(other) {
var thisValue = this.valueOf();
var otherValue = other.valueOf();
if (thisValue instanceof BN) {
return otherValue instanceof BN ?
thisValue.cmp(otherValue) :
thisValue.cmpn(otherValue);
} else if (otherValue instanceof BN) {
return -other.compareTo(this);
}
assert(typeof otherValue === 'number');
return signum(thisValue, otherValue);
},
toBytesSink: function toBytesSink(sink) {
sink.put(this.toBytes());
},
toBytes: function toBytes() {
return serializeUIntN(this.val, this.constructor.width);
} });
module.exports = {
UInt: UInt };
;