optimize writer.
This commit is contained in:
parent
f0c73f41a6
commit
aa24f6facf
@ -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
|
||||
*/
|
||||
|
||||
Loading…
Reference in New Issue
Block a user