japji/resources/public/js/cljs-runtime/goog.structs.pool.js
2025-09-01 12:49:14 +01:00

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