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.
97 lines
2.3 KiB
97 lines
2.3 KiB
5 years ago
|
|
||
|
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
|
||
|
|