Add lime.utils.ObjectPool (resolve #931)
This commit is contained in:
144
lime/utils/ObjectPool.hx
Normal file
144
lime/utils/ObjectPool.hx
Normal file
@@ -0,0 +1,144 @@
|
|||||||
|
package lime.utils;
|
||||||
|
|
||||||
|
|
||||||
|
@:generic class ObjectPool<T> {
|
||||||
|
|
||||||
|
|
||||||
|
public var allocator:Void->T;
|
||||||
|
public var size (get, set):Int;
|
||||||
|
|
||||||
|
private var __activeObjects:List<T>;
|
||||||
|
private var __inactiveObjects:List<T>;
|
||||||
|
private var __size:Null<Int>;
|
||||||
|
|
||||||
|
|
||||||
|
public function new (allocator:Void->T, size:Null<Int> = null) {
|
||||||
|
|
||||||
|
this.allocator = allocator;
|
||||||
|
|
||||||
|
__activeObjects = new List<T> ();
|
||||||
|
__inactiveObjects = new List<T> ();
|
||||||
|
|
||||||
|
if (size != null) {
|
||||||
|
|
||||||
|
this.size = size;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public function create ():T {
|
||||||
|
|
||||||
|
if (__inactiveObjects.length > 0) {
|
||||||
|
|
||||||
|
var object = __inactiveObjects.first ();
|
||||||
|
__activeObjects.add (object);
|
||||||
|
return object;
|
||||||
|
|
||||||
|
} else {
|
||||||
|
|
||||||
|
var object = Reflect.callMethod (allocator, allocator, []);
|
||||||
|
__activeObjects.add (object);
|
||||||
|
size = __size;
|
||||||
|
return object;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public function get ():Null<T> {
|
||||||
|
|
||||||
|
var object = null;
|
||||||
|
|
||||||
|
if (__inactiveObjects.length > 0) {
|
||||||
|
|
||||||
|
object = __inactiveObjects.first ();
|
||||||
|
__activeObjects.add (object);
|
||||||
|
|
||||||
|
} else if (__size == null) {
|
||||||
|
|
||||||
|
object = Reflect.callMethod (allocator, allocator, []);
|
||||||
|
__activeObjects.add (object);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
return object;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public function release (object:T):Void {
|
||||||
|
|
||||||
|
if (__activeObjects.remove (object)) {
|
||||||
|
|
||||||
|
__inactiveObjects.add (object);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// Get & Set Methods
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
private function get_size ():Int {
|
||||||
|
|
||||||
|
if (__size != null) return null;
|
||||||
|
return __inactiveObjects.length + __activeObjects.length;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private function set_size (value:Int):Int {
|
||||||
|
|
||||||
|
var current = __inactiveObjects.length + __activeObjects.length;
|
||||||
|
|
||||||
|
if (value <= 0) {
|
||||||
|
|
||||||
|
__size = null;
|
||||||
|
|
||||||
|
} else {
|
||||||
|
|
||||||
|
__size = value;
|
||||||
|
|
||||||
|
while (current > value) {
|
||||||
|
|
||||||
|
if (__inactiveObjects.length > 0) {
|
||||||
|
|
||||||
|
__inactiveObjects.first ();
|
||||||
|
current--;
|
||||||
|
|
||||||
|
} else if (__activeObjects.length > 0) {
|
||||||
|
|
||||||
|
__activeObjects.first ();
|
||||||
|
current--;
|
||||||
|
|
||||||
|
} else {
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
while (value > current) {
|
||||||
|
|
||||||
|
__inactiveObjects.add (Reflect.callMethod (allocator, allocator, []));
|
||||||
|
current++;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
return current;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user