137 lines
4 KiB
JavaScript
137 lines
4 KiB
JavaScript
goog.provide("goog.structs.Pool");
|
|
goog.require("goog.Disposable");
|
|
goog.require("goog.structs.Queue");
|
|
goog.require("goog.structs.Set");
|
|
goog.structs.Pool = function(opt_minCount, opt_maxCount) {
|
|
goog.Disposable.call(this);
|
|
this.minCount_ = opt_minCount || 0;
|
|
this.maxCount_ = opt_maxCount || 10;
|
|
if (this.minCount_ > this.maxCount_) {
|
|
throw new Error(goog.structs.Pool.ERROR_MIN_MAX_);
|
|
}
|
|
this.freeQueue_ = new goog.structs.Queue();
|
|
this.inUseSet_ = new goog.structs.Set();
|
|
this.delay = 0;
|
|
this.lastAccess = null;
|
|
this.adjustForMinMax();
|
|
};
|
|
goog.inherits(goog.structs.Pool, goog.Disposable);
|
|
goog.structs.Pool.ERROR_MIN_MAX_ = "[goog.structs.Pool] Min can not be greater than max";
|
|
goog.structs.Pool.ERROR_DISPOSE_UNRELEASED_OBJS_ = "[goog.structs.Pool] Objects not released";
|
|
goog.structs.Pool.prototype.setMinimumCount = function(min) {
|
|
if (min > this.maxCount_) {
|
|
throw new Error(goog.structs.Pool.ERROR_MIN_MAX_);
|
|
}
|
|
this.minCount_ = min;
|
|
this.adjustForMinMax();
|
|
};
|
|
goog.structs.Pool.prototype.setMaximumCount = function(max) {
|
|
if (max < this.minCount_) {
|
|
throw new Error(goog.structs.Pool.ERROR_MIN_MAX_);
|
|
}
|
|
this.maxCount_ = max;
|
|
this.adjustForMinMax();
|
|
};
|
|
goog.structs.Pool.prototype.setDelay = function(delay) {
|
|
this.delay = delay;
|
|
};
|
|
goog.structs.Pool.prototype.getObject = function() {
|
|
var time = Date.now();
|
|
if (this.lastAccess != null && time - this.lastAccess < this.delay) {
|
|
return undefined;
|
|
}
|
|
var obj = this.removeFreeObject_();
|
|
if (obj) {
|
|
this.lastAccess = time;
|
|
this.inUseSet_.add(obj);
|
|
}
|
|
return obj;
|
|
};
|
|
goog.structs.Pool.prototype.releaseObject = function(obj) {
|
|
if (this.inUseSet_.remove(obj)) {
|
|
this.addFreeObject(obj);
|
|
return true;
|
|
}
|
|
return false;
|
|
};
|
|
goog.structs.Pool.prototype.removeFreeObject_ = function() {
|
|
var obj;
|
|
for (; this.getFreeCount() > 0;) {
|
|
obj = this.freeQueue_.dequeue();
|
|
if (!this.objectCanBeReused(obj)) {
|
|
this.adjustForMinMax();
|
|
} else {
|
|
break;
|
|
}
|
|
}
|
|
if (!obj && this.getCount() < this.maxCount_) {
|
|
obj = this.createObject();
|
|
}
|
|
return obj;
|
|
};
|
|
goog.structs.Pool.prototype.addFreeObject = function(obj) {
|
|
this.inUseSet_.remove(obj);
|
|
if (this.objectCanBeReused(obj) && this.getCount() < this.maxCount_) {
|
|
this.freeQueue_.enqueue(obj);
|
|
} else {
|
|
this.disposeObject(obj);
|
|
}
|
|
};
|
|
goog.structs.Pool.prototype.adjustForMinMax = function() {
|
|
var freeQueue = this.freeQueue_;
|
|
for (; this.getCount() < this.minCount_;) {
|
|
freeQueue.enqueue(this.createObject());
|
|
}
|
|
for (; this.getCount() > this.maxCount_ && this.getFreeCount() > 0;) {
|
|
this.disposeObject(freeQueue.dequeue());
|
|
}
|
|
};
|
|
goog.structs.Pool.prototype.createObject = function() {
|
|
return {};
|
|
};
|
|
goog.structs.Pool.prototype.disposeObject = function(obj) {
|
|
if (typeof obj.dispose == "function") {
|
|
obj.dispose();
|
|
} else {
|
|
var i;
|
|
for (i in obj) {
|
|
obj[i] = null;
|
|
}
|
|
}
|
|
};
|
|
goog.structs.Pool.prototype.objectCanBeReused = function(obj) {
|
|
if (typeof obj.canBeReused == "function") {
|
|
return obj.canBeReused();
|
|
}
|
|
return true;
|
|
};
|
|
goog.structs.Pool.prototype.contains = function(obj) {
|
|
return this.freeQueue_.contains(obj) || this.inUseSet_.contains(obj);
|
|
};
|
|
goog.structs.Pool.prototype.getCount = function() {
|
|
return this.freeQueue_.getCount() + this.inUseSet_.getCount();
|
|
};
|
|
goog.structs.Pool.prototype.getInUseCount = function() {
|
|
return this.inUseSet_.getCount();
|
|
};
|
|
goog.structs.Pool.prototype.getFreeCount = function() {
|
|
return this.freeQueue_.getCount();
|
|
};
|
|
goog.structs.Pool.prototype.isEmpty = function() {
|
|
return this.freeQueue_.isEmpty() && this.inUseSet_.isEmpty();
|
|
};
|
|
goog.structs.Pool.prototype.disposeInternal = function() {
|
|
goog.structs.Pool.superClass_.disposeInternal.call(this);
|
|
if (this.getInUseCount() > 0) {
|
|
throw new Error(goog.structs.Pool.ERROR_DISPOSE_UNRELEASED_OBJS_);
|
|
}
|
|
delete this.inUseSet_;
|
|
var freeQueue = this.freeQueue_;
|
|
for (; !freeQueue.isEmpty();) {
|
|
this.disposeObject(freeQueue.dequeue());
|
|
}
|
|
delete this.freeQueue_;
|
|
};
|
|
|
|
//# sourceMappingURL=goog.structs.pool.js.map
|