atoms.js (215 lines of code) (raw):

// Copyright (c) 2015 Uber Technologies, Inc. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. var inherits = require('util').inherits; var WriteResult = require('./base').WriteResult; var ReadResult = require('./base').ReadResult; var BufferRW = require('./base').BufferRW; var errors = require('./errors'); function AtomRW(width, readAtomFrom, writeAtomInto) { if (!(this instanceof AtomRW)) { return new AtomRW(width, readAtomFrom, writeAtomInto); } this.width = width; this.readAtomFrom = readAtomFrom; this.writeAtomInto = writeAtomInto; BufferRW.call(this); } inherits(AtomRW, BufferRW); AtomRW.prototype.poolByteLength = function byteLength(destResult) { return destResult.reset(null, this.width); }; AtomRW.prototype.poolReadFrom = function readFrom(destResult, buffer, offset) { var remain = buffer.length - offset; if (remain < this.width) { return ReadResult.poolShortError(destResult, this.width, remain, offset); } return this.readAtomFrom(destResult, buffer, offset); }; AtomRW.prototype.poolWriteInto = function writeInto(destResult, value, buffer, offset) { var remain = buffer.length - offset; // istanbul ignore next if (remain < this.width) { WriteResult.poolShortError(destResult, this.width, remain, offset); } return this.writeAtomInto(destResult, value, buffer, offset); }; // jshint maxparams:5 function IntegerRW(width, min, max, readAtomFrom, writeAtomInto) { if (!(this instanceof IntegerRW)) { return new IntegerRW(width, min, max, readAtomFrom, writeAtomInto); } AtomRW.call(this, width, readAtomFrom, writeAtomInto); this.min = min; this.max = max; } inherits(IntegerRW, AtomRW); IntegerRW.prototype.poolWriteInto = function poolWriteInto(destResult, value, buffer, offset) { if (typeof value !== 'number') { return destResult.reset(errors.expected(value, 'a number')); } if (value < this.min || value > this.max) { return destResult.reset(errors.RangeError({ value: value, min: this.min, max: this.max }), offset); } var remain = buffer.length - offset; if (remain < this.width) { return WriteResult.poolShortError(destResult, this.width, remain, offset); } return this.writeAtomInto(destResult, value, buffer, offset); }; var Int8 = IntegerRW(1, -0x80, 0x7f, function readInt8From(destResult, buffer, offset) { var value = buffer.readInt8(offset, true); return destResult.reset(null, offset + 1, value); }, function writeInt8Into(destResult, value, buffer, offset) { buffer.writeInt8(value, offset, true); return destResult.reset(null, offset + 1); }); var Int16BE = IntegerRW(2, -0x8000, 0x7fff, function readInt16BEFrom(destResult, buffer, offset) { var value = buffer.readInt16BE(offset, true); return destResult.reset(null, offset + 2, value); }, function writeInt16BEInto(destResult, value, buffer, offset) { buffer.writeInt16BE(value, offset, true); return destResult.reset(null, offset + 2); }); var Int32BE = IntegerRW(4, -0x80000000, 0x7fffffff, function readInt32BEFrom(destResult, buffer, offset) { var value = buffer.readInt32BE(offset, true); return destResult.reset(null, offset + 4, value); }, function writeInt32BEInto(destResult, value, buffer, offset) { buffer.writeInt32BE(value, offset, true); return destResult.reset(null, offset + 4); }); var Int16LE = IntegerRW(2, -0x8000, 0x7fff, function readInt16LEFrom(destResult, buffer, offset) { var value = buffer.readInt16LE(offset, true); return destResult.reset(null, offset + 2, value); }, function writeInt16LEInto(destResult, value, buffer, offset) { buffer.writeInt16LE(value, offset, true); return destResult.reset(null, offset + 2); }); var Int32LE = IntegerRW(4, -0x80000000, 0x7fffffff, function readInt32LEFrom(destResult, buffer, offset) { var value = buffer.readInt32LE(offset, true); return destResult.reset(null, offset + 4, value); }, function writeInt32LEInto(destResult, value, buffer, offset) { buffer.writeInt32LE(value, offset, true); return destResult.reset(null, offset + 4); }); var UInt8 = IntegerRW(1, 0, 0xff, function readUInt8From(destResult, buffer, offset) { var value = buffer.readUInt8(offset, true); return destResult.reset(null, offset + 1, value); }, function writeUInt8Into(destResult, value, buffer, offset) { buffer.writeUInt8(value, offset, true); return destResult.reset(null, offset + 1); }); var UInt16BE = IntegerRW(2, 0, 0xffff, function readUInt16BEFrom(destResult, buffer, offset) { var value = buffer.readUInt16BE(offset, true); return destResult.reset(null, offset + 2, value); }, function writeUInt16BEInto(destResult, value, buffer, offset) { buffer.writeUInt16BE(value, offset, true); return destResult.reset(null, offset + 2); }); var UInt32BE = IntegerRW(4, 0, 0xffffffff, function readUInt32BEFrom(destResult, buffer, offset) { var value = buffer.readUInt32BE(offset, true); return destResult.reset(null, offset + 4, value); }, function writeUInt32BEInto(destResult, value, buffer, offset) { buffer.writeUInt32BE(value, offset, true); return destResult.reset(null, offset + 4); }); var UInt16LE = IntegerRW(2, 0, 0xffff, function readUInt16LEFrom(destResult, buffer, offset) { var value = buffer.readUInt16LE(offset, true); return destResult.reset(null, offset + 2, value); }, function writeUInt16LEInto(destResult, value, buffer, offset) { buffer.writeUInt16LE(value, offset, true); return destResult.reset(null, offset + 2); }); var UInt32LE = IntegerRW(4, 0, 0xffffffff, function readUInt32LEFrom(destResult, buffer, offset) { var value = buffer.readUInt32LE(offset, true); return destResult.reset(null, offset + 4, value); }, function writeUInt32LEInto(destResult, value, buffer, offset) { buffer.writeUInt32LE(value, offset, true); return destResult.reset(null, offset + 4); }); var FloatLE = AtomRW(4, function readFloatLEFrom(destResult, buffer, offset) { var value = buffer.readFloatLE(offset, true); return destResult.reset(null, offset + 4, value); }, function writeFloatLEInto(destResult, value, buffer, offset) { // istanbul ignore if if (typeof value !== 'number') { return destResult.reset(errors.expected(value, 'a number'), null); } else { buffer.writeFloatLE(value, offset); return destResult.reset(null, offset + 4); } }); var FloatBE = AtomRW(4, function readFloatBEFrom(destResult, buffer, offset) { var value = buffer.readFloatBE(offset, true); return destResult.reset(null, offset + 4, value); }, function writeFloatBEInto(destResult, value, buffer, offset) { // istanbul ignore if if (typeof value !== 'number') { return destResult.reset(errors.expected(value, 'a number'), null); } else { buffer.writeFloatBE(value, offset); return destResult.reset(null, offset + 4); } }); var DoubleLE = AtomRW(8, function readDoubleLEFrom(destResult, buffer, offset) { var value = buffer.readDoubleLE(offset, true); return destResult.reset(null, offset + 8, value); }, function writeDoubleLEInto(destResult, value, buffer, offset) { // istanbul ignore if if (typeof value !== 'number') { return destResult.reset(errors.expected(value, 'a number'), null); } else { buffer.writeDoubleLE(value, offset); return destResult.reset(null, offset + 8); } }); var DoubleBE = AtomRW(8, function readDoubleBEFrom(destResult, buffer, offset) { var value = buffer.readDoubleBE(offset, true); return destResult.reset(null, offset + 8, value); }, function writeDoubleBEInto(destResult, value, buffer, offset) { // istanbul ignore if if (typeof value !== 'number') { return destResult.reset(errors.expected(value, 'a number'), null); } else { buffer.writeDoubleBE(value, offset); return destResult.reset(null, offset + 8); } }); module.exports.AtomRW = AtomRW; module.exports.Int8 = Int8; module.exports.Int16BE = Int16BE; module.exports.Int32BE = Int32BE; module.exports.Int16LE = Int16LE; module.exports.Int32LE = Int32LE; module.exports.UInt8 = UInt8; module.exports.UInt16BE = UInt16BE; module.exports.UInt32BE = UInt32BE; module.exports.UInt16LE = UInt16LE; module.exports.UInt32LE = UInt32LE; module.exports.FloatLE = FloatLE; module.exports.FloatBE = FloatBE; module.exports.DoubleLE = DoubleLE; module.exports.DoubleBE = DoubleBE;