|
|
/*! * ws: a node.js websocket client * Copyright(c) 2011 Einar Otto Stangvik <einaros@gmail.com> * MIT Licensed */
var util = require('util');
function BufferPool(initialSize, growStrategy, shrinkStrategy) { if (this instanceof BufferPool === false) { throw new TypeError("Classes can't be function-called"); }
if (typeof initialSize === 'function') { shrinkStrategy = growStrategy; growStrategy = initialSize; initialSize = 0; } else if (typeof initialSize === 'undefined') { initialSize = 0; } this._growStrategy = (growStrategy || function(db, size) { return db.used + size; }).bind(null, this); this._shrinkStrategy = (shrinkStrategy || function(db) { return initialSize; }).bind(null, this); this._buffer = initialSize ? new Buffer(initialSize) : null; this._offset = 0; this._used = 0; this._changeFactor = 0; this.__defineGetter__('size', function(){ return this._buffer == null ? 0 : this._buffer.length; }); this.__defineGetter__('used', function(){ return this._used; }); }
BufferPool.prototype.get = function(length) { if (this._buffer == null || this._offset + length > this._buffer.length) { var newBuf = new Buffer(this._growStrategy(length)); this._buffer = newBuf; this._offset = 0; } this._used += length; var buf = this._buffer.slice(this._offset, this._offset + length); this._offset += length; return buf; }
BufferPool.prototype.reset = function(forceNewBuffer) { var len = this._shrinkStrategy(); if (len < this.size) this._changeFactor -= 1; if (forceNewBuffer || this._changeFactor < -2) { this._changeFactor = 0; this._buffer = len ? new Buffer(len) : null; } this._offset = 0; this._used = 0; }
module.exports = BufferPool;
|