import {AssertUtil} from '../AssertUtil';
import {MemoryUtil} from '../MemoryUtil';
import {Base} from './Base';
//==========================================================
// 内存对象池。
//
// @tool
// @author maocy
// @version 150523
//==========================================================
export class MemoryPool extends Base {
// @attribute
_constructor = null;
_unused = null;
// @attribute
_createCount = 0;
_allocCount = 0;
_freeCount = 0;
//==========================================================
// 收集一个自由对象。
//
// @method
// @return FObject 对象
//==========================================================
public alloc() {
var o = this;
var value = null;
var unused = o._unused;
if (unused) {
value = unused.value;
o._unused = unused.next;
// 释放节点
MemoryUtil.entryFree(unused);
} else {
value = new o._constructor();
value.__pool = o;
o._createCount++;
}
o._allocCount++;
return value;
}
//==========================================================
// 释放 一个自由对象。
//
// @method
// @param FObject 对象
//==========================================================
public free(value) {
var o = this;
AssertUtil.debugNotNull(value);
// 释放资源
if (value.free) {
value.free();
}
// 放回缓冲池
var entry = MemoryUtil.entryAlloc();
entry.value = value;
entry.next = o._unused;
o._unused = entry;
o._freeCount++;
}
//==========================================================
// 释放当前实例。
//
// @method
//==========================================================
public dispose() {
var entry = this._unused;
while (entry) {
var current = entry;
entry = current.next;
current.dispose();
// 释放节点
MemoryUtil.entryFree(current);
}
}
}