From aa24f6facfcdf8370e13893c0c6e43bdfc6aee42 Mon Sep 17 00:00:00 2001 From: Christopher Jeffrey Date: Mon, 16 May 2016 15:49:56 -0700 Subject: [PATCH] optimize writer. --- lib/bcoin/writer.js | 162 +++++++++++++++++++++++++------------------- 1 file changed, 91 insertions(+), 71 deletions(-) diff --git a/lib/bcoin/writer.js b/lib/bcoin/writer.js index b020f7b2..55260f69 100644 --- a/lib/bcoin/writer.js +++ b/lib/bcoin/writer.js @@ -8,6 +8,35 @@ var utils = require('./utils'); var assert = utils.assert; +/* + * Constants + */ + +var SEEK = 0; +var UI8 = 1; +var UI16 = 2; +var UI16BE = 3; +var UI32 = 4; +var UI32BE = 5; +var UI64 = 6; +var UI64BE = 7; +var I8 = 8; +var I16 = 9; +var I16BE = 10; +var I32 = 11; +var I32BE = 12; +var I64 = 13; +var I64BE = 14; +var FL = 15; +var FLBE = 16; +var DBL = 17; +var DBLBE = 18; +var VARINT = 19; +var BYTES = 20; +var STR = 21; +var CHECKSUM = 22; +var FILL = 23; + /** * An object that allows writing of buffers in a * sane manner. This buffer writer is extremely @@ -48,35 +77,38 @@ BufferWriter.prototype.render = function render(keep) { for (i = 0; i < this.data.length; i++) { item = this.data[i]; switch (item[0]) { - case 'u8': off += utils.writeU8(data, item[1], off); break; - case 'u16': off += utils.writeU16(data, item[1], off); break; - case 'u16be': off += utils.writeU16BE(data, item[1], off); break; - case 'u32': off += utils.writeU32(data, item[1], off); break; - case 'u32be': off += utils.writeU32BE(data, item[1], off); break; - case 'u64': off += utils.writeU64(data, item[1], off); break; - case 'u64be': off += utils.writeU64BE(data, item[1], off); break; - case '8': off += utils.write8(data, item[1], off); break; - case '16': off += utils.write16(data, item[1], off); break; - case '16be': off += utils.write16BE(data, item[1], off); break; - case '32': off += utils.write32(data, item[1], off); break; - case '32be': off += utils.write32BE(data, item[1], off); break; - case '64': off += utils.write64(data, item[1], off); break; - case '64be': off += utils.write64BE(data, item[1], off); break; - case 'f': data.writeFloatLE(item[1], off, true); off += 4; break; - case 'fbe': data.writeFloatBE(item[1], off, true); off += 4; break; - case 'd': data.writeDoubleLE(item[1], off, true); off += 8; break; - case 'dbe': data.writeDoubleBE(item[1], off, true); off += 8; break; - case 'varint': off += utils.writeVarint(data, item[1], off); break; - case 'bytes': off += item[1].copy(data, off); break; - case 'str': off += data.write(item[1], off, item[2]); break; - case 'checksum': + case SEEK: off += item[1]; break; + case UI8: off += utils.writeU8(data, item[1], off); break; + case UI16: off += utils.writeU16(data, item[1], off); break; + case UI16BE: off += utils.writeU16BE(data, item[1], off); break; + case UI32: off += utils.writeU32(data, item[1], off); break; + case UI32BE: off += utils.writeU32BE(data, item[1], off); break; + case UI64: off += utils.writeU64(data, item[1], off); break; + case UI64BE: off += utils.writeU64BE(data, item[1], off); break; + case I8: off += utils.write8(data, item[1], off); break; + case I16: off += utils.write16(data, item[1], off); break; + case I16BE: off += utils.write16BE(data, item[1], off); break; + case I32: off += utils.write32(data, item[1], off); break; + case I32BE: off += utils.write32BE(data, item[1], off); break; + case I64: off += utils.write64(data, item[1], off); break; + case I64BE: off += utils.write64BE(data, item[1], off); break; + case FL: data.writeFloatLE(item[1], off, true); off += 4; break; + case FLBE: data.writeFloatBE(item[1], off, true); off += 4; break; + case DBL: data.writeDoubleLE(item[1], off, true); off += 8; break; + case DBLBE: data.writeDoubleBE(item[1], off, true); off += 8; break; + case VARINT: off += utils.writeVarint(data, item[1], off); break; + case BYTES: off += item[1].copy(data, off); break; + case STR: off += data.write(item[1], off, item[2]); break; + case CHECKSUM: off += utils.checksum(data.slice(0, off)).copy(data, off); break; - // case 'seek': off += item[1]; break; - // case 'fill': - // item[1].fill(item[1], off, off + item[2]); - // off += item[2]; - // break; + case FILL: + item[1].fill(item[1], off, off + item[2]); + off += item[2]; + break; + default: + assert(false, 'Bad type.'); + break; } } @@ -95,14 +127,14 @@ BufferWriter.prototype.getSize = function getSize() { return this.written; }; -/* +/** * Seek to relative offset. * @param {Number} offset */ -// BufferWriter.prototype.seek = function seek(offset) { -// this.data.push(['seek', offset]); -// }; +BufferWriter.prototype.seek = function seek(offset) { + this.data.push([SEEK, offset]); +}; /** * Destroy the buffer writer. Remove references to `data`. @@ -121,7 +153,7 @@ BufferWriter.prototype.destroy = function destroy() { BufferWriter.prototype.writeU8 = function writeU8(value) { this.written += 1; - this.data.push(['u8', value]); + this.data.push([UI8, value]); }; /** @@ -131,7 +163,7 @@ BufferWriter.prototype.writeU8 = function writeU8(value) { BufferWriter.prototype.writeU16 = function writeU16(value) { this.written += 2; - this.data.push(['u16', value]); + this.data.push([UI16, value]); }; /** @@ -141,7 +173,7 @@ BufferWriter.prototype.writeU16 = function writeU16(value) { BufferWriter.prototype.writeU16BE = function writeU16BE(value) { this.written += 2; - this.data.push(['u16be', value]); + this.data.push([UI16BE, value]); }; /** @@ -151,7 +183,7 @@ BufferWriter.prototype.writeU16BE = function writeU16BE(value) { BufferWriter.prototype.writeU32 = function writeU32(value) { this.written += 4; - this.data.push(['u32', value]); + this.data.push([UI32, value]); }; /** @@ -161,7 +193,7 @@ BufferWriter.prototype.writeU32 = function writeU32(value) { BufferWriter.prototype.writeU32BE = function writeU32BE(value) { this.written += 4; - this.data.push(['u32be', value]); + this.data.push([UI32BE, value]); }; /** @@ -171,7 +203,7 @@ BufferWriter.prototype.writeU32BE = function writeU32BE(value) { BufferWriter.prototype.writeU64 = function writeU64(value) { this.written += 8; - this.data.push(['u64', value]); + this.data.push([UI64, value]); }; /** @@ -181,7 +213,7 @@ BufferWriter.prototype.writeU64 = function writeU64(value) { BufferWriter.prototype.writeU64BE = function writeU64BE(value) { this.written += 8; - this.data.push(['u64be', value]); + this.data.push([UI64BE, value]); }; /** @@ -191,7 +223,7 @@ BufferWriter.prototype.writeU64BE = function writeU64BE(value) { BufferWriter.prototype.write8 = function write8(value) { this.written += 1; - this.data.push(['8', value]); + this.data.push([I8, value]); }; /** @@ -201,7 +233,7 @@ BufferWriter.prototype.write8 = function write8(value) { BufferWriter.prototype.write16 = function write16(value) { this.written += 2; - this.data.push(['16', value]); + this.data.push([I16, value]); }; /** @@ -211,7 +243,7 @@ BufferWriter.prototype.write16 = function write16(value) { BufferWriter.prototype.write16BE = function write16BE(value) { this.written += 2; - this.data.push(['16be', value]); + this.data.push([I16BE, value]); }; /** @@ -221,7 +253,7 @@ BufferWriter.prototype.write16BE = function write16BE(value) { BufferWriter.prototype.write32 = function write32(value) { this.written += 4; - this.data.push(['32', value]); + this.data.push([I32, value]); }; /** @@ -231,7 +263,7 @@ BufferWriter.prototype.write32 = function write32(value) { BufferWriter.prototype.write32BE = function write32BE(value) { this.written += 4; - this.data.push(['32be', value]); + this.data.push([I32BE, value]); }; /** @@ -241,7 +273,7 @@ BufferWriter.prototype.write32BE = function write32BE(value) { BufferWriter.prototype.write64 = function write64(value) { this.written += 8; - this.data.push(['64', value]); + this.data.push([I64, value]); }; /** @@ -251,7 +283,7 @@ BufferWriter.prototype.write64 = function write64(value) { BufferWriter.prototype.write64BE = function write64BE(value) { this.written += 8; - this.data.push(['64be', value]); + this.data.push([I64BE, value]); }; /** @@ -262,7 +294,7 @@ BufferWriter.prototype.write64BE = function write64BE(value) { BufferWriter.prototype.writeFloat = function writeFloat(value) { assert(typeof value === 'number'); this.written += 4; - this.data.push(['f', value]); + this.data.push([FL, value]); }; /** @@ -273,7 +305,7 @@ BufferWriter.prototype.writeFloat = function writeFloat(value) { BufferWriter.prototype.writeFloatBE = function writeFloatBE(value) { assert(typeof value === 'number'); this.written += 4; - this.data.push(['fbe', value]); + this.data.push([FLBE, value]); }; /** @@ -284,7 +316,7 @@ BufferWriter.prototype.writeFloatBE = function writeFloatBE(value) { BufferWriter.prototype.writeDouble = function writeDouble(value) { assert(typeof value === 'number'); this.written += 8; - this.data.push(['d', value]); + this.data.push([DBL, value]); }; /** @@ -295,7 +327,7 @@ BufferWriter.prototype.writeDouble = function writeDouble(value) { BufferWriter.prototype.writeDoubleBE = function writeDoubleBE(value) { assert(typeof value === 'number'); this.written += 8; - this.data.push(['dbe', value]); + this.data.push([DBLBE, value]); }; /** @@ -306,7 +338,7 @@ BufferWriter.prototype.writeDoubleBE = function writeDoubleBE(value) { BufferWriter.prototype.writeVarint = function writeVarint(value) { assert(value >= 0); this.written += utils.sizeVarint(value); - this.data.push(['varint', value]); + this.data.push([VARINT, value]); }; /** @@ -316,7 +348,7 @@ BufferWriter.prototype.writeVarint = function writeVarint(value) { BufferWriter.prototype.writeBytes = function writeBytes(value) { this.written += value.length; - this.data.push(['bytes', value]); + this.data.push([BYTES, value]); }; /** @@ -327,8 +359,8 @@ BufferWriter.prototype.writeBytes = function writeBytes(value) { BufferWriter.prototype.writeVarBytes = function writeVarBytes(value) { this.written += utils.sizeVarint(value.length); this.written += value.length; - this.data.push(['varint', value.length]); - this.data.push(['bytes', value]); + this.data.push([VARINT, value.length]); + this.data.push([BYTES, value]); }; /** @@ -341,7 +373,7 @@ BufferWriter.prototype.writeString = function writeString(value, enc) { if (typeof value !== 'string') return this.writeBytes(value); this.written += Buffer.byteLength(value, enc); - this.data.push(['str', value, enc]); + this.data.push([STR, value, enc]); }; /** @@ -370,8 +402,8 @@ BufferWriter.prototype.writeVarString = function writeVarString(value, enc) { this.written += utils.sizeVarint(size); this.written += size; - this.data.push(['varint', size]); - this.data.push(['str', value, enc]); + this.data.push([VARINT, size]); + this.data.push([STR, value, enc]); }; /** @@ -391,7 +423,7 @@ BufferWriter.prototype.writeNullString = function writeNullString(value, enc) { BufferWriter.prototype.writeChecksum = function writeChecksum() { this.written += 4; - this.data.push(['checksum']); + this.data.push([CHECKSUM]); }; /** @@ -401,23 +433,11 @@ BufferWriter.prototype.writeChecksum = function writeChecksum() { */ BufferWriter.prototype.fill = function fill(value, size) { - var buf; - assert(size >= 0); - - buf = new Buffer(size); - buf.fill(value); - - this.written += buf.length; - this.data.push(['bytes', buf]); + this.written += size; + this.data.push([FILL, value, size]); }; -// BufferWriter.prototype.fill = function fill(value, size) { -// assert(size >= 0); -// this.written += size; -// this.data.push(['fill', value, size]); -// }; - /* * Expose */