You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

96 lines
2.3 KiB

function FlexBuffer(){
this.originalArgs = arguments
if (arguments[0] && typeof arguments[0] === "number")
this.buffer = new Buffer (arguments[0]);
else
this.buffer = Buffer.call(this,arguments);
this.length = this.buffer.length
this.tail = 0
}
FlexBuffer.prototype.rewind = function(){
this.tail = 0
}
FlexBuffer.prototype.reset = function(){
this.buffer = Buffer.call(this,this.originalArgs)
this.length = this.buffer.length
this.tail = 0
}
FlexBuffer.prototype.resizeBuffer = function(minLen){
if(this.length == 0){
this.length = 1
}
this.length = (this.length + minLen) * 2
var oldBuffer = this.buffer
this.buffer = new Buffer(this.length)
oldBuffer.copy(this.buffer,0, 0, this.tail)
}
FlexBuffer.prototype.write = function(arg){
if(!arg)
return;
if(!arg.length){
arg = String(arg)
}
if(typeof arg === "string")
var len = Buffer.byteLength(arg);
else
var len = arg.length;
if(this.tail+len >= this.length)
this.resizeBuffer(len)
if(Buffer.isBuffer(arg)){
arg.copy(this.buffer,this.tail)
}else{
this.buffer.write(arg,this.tail)
}
this.tail+=len
}
FlexBuffer.prototype.getBufferReference = function(){
return this.buffer.slice(0,this.tail)
}
FlexBuffer.prototype.getBuffer = function(){
var buff = this.buffer.slice(0,this.tail)
var b = new Buffer(buff.length)
buff.copy(b)
return b
}
FlexBuffer.prototype.delete = function(start, end) {
checkParams(start, end, this.tail);
var copy = this.buffer.slice(end, this.tail).copy(this.buffer, start)
this.tail = this.tail - end + start
}
var checkParams = function (start, end, size) {
if (end > size || start > size || start < 0 || end < 0 || start > end) {
throw new Error("Start and end not valid. start:["+start+"], end:["+end+"], size:["+size+"]");
}
}
FlexBuffer.prototype.deleteAndGet = function(start, end) {
var b = new Buffer(end - start);
this.buffer.slice(start, end).copy(b);
this.delete(start, end);
return b;
}
FlexBuffer.prototype.getLength = function() {
return this.tail
}
FlexBuffer.prototype.getBufferLength = function() {
return this.buffer.length;
}
module.exports.FlexBuffer = FlexBuffer