172 lines
4.5 KiB
C#
172 lines
4.5 KiB
C#
|
|
/*
|
|||
|
|
Copyright (c) 2015-2017 topameng(topameng@qq.com)
|
|||
|
|
|
|||
|
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|||
|
|
of this software and associated documentation files (the "Software"), to deal
|
|||
|
|
in the Software without restriction, including without limitation the rights
|
|||
|
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|||
|
|
copies of the Software, and to permit persons to whom the Software is
|
|||
|
|
furnished to do so, subject to the following conditions:
|
|||
|
|
|
|||
|
|
The above copyright notice and this permission notice shall be included in all
|
|||
|
|
copies or substantial portions of the Software.
|
|||
|
|
|
|||
|
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|||
|
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|||
|
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|||
|
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|||
|
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|||
|
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|||
|
|
SOFTWARE.
|
|||
|
|
*/
|
|||
|
|
|
|||
|
|
using System;
|
|||
|
|
using System.Collections.Generic;
|
|||
|
|
|
|||
|
|
namespace LuaInterface
|
|||
|
|
{
|
|||
|
|
public class LuaObjectPool
|
|||
|
|
{
|
|||
|
|
class PoolNode
|
|||
|
|
{
|
|||
|
|
public int index;
|
|||
|
|
public object obj;
|
|||
|
|
|
|||
|
|
public PoolNode(int index, object obj)
|
|||
|
|
{
|
|||
|
|
this.index = index;
|
|||
|
|
this.obj = obj;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private List<PoolNode> list;
|
|||
|
|
//同lua_ref策略,0作为一个回收链表头,不使用这个位置
|
|||
|
|
private PoolNode head = null;
|
|||
|
|
private int count = 0;
|
|||
|
|
private int collectStep = 2;
|
|||
|
|
private int collectedIndex = -1;
|
|||
|
|
|
|||
|
|
public LuaObjectPool()
|
|||
|
|
{
|
|||
|
|
list = new List<PoolNode>(1024);
|
|||
|
|
head = new PoolNode(0, null);
|
|||
|
|
list.Add(head);
|
|||
|
|
list.Add(new PoolNode(1, null));
|
|||
|
|
count = list.Count;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public object this[int i]
|
|||
|
|
{
|
|||
|
|
get
|
|||
|
|
{
|
|||
|
|
if (i > 0 && i < count)
|
|||
|
|
{
|
|||
|
|
return list[i].obj;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return null;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public void Clear()
|
|||
|
|
{
|
|||
|
|
list.Clear();
|
|||
|
|
head = null;
|
|||
|
|
count = 0;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public int Add(object obj)
|
|||
|
|
{
|
|||
|
|
int pos = -1;
|
|||
|
|
|
|||
|
|
if (head.index != 0)
|
|||
|
|
{
|
|||
|
|
pos = head.index;
|
|||
|
|
list[pos].obj = obj;
|
|||
|
|
head.index = list[pos].index;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
pos = list.Count;
|
|||
|
|
list.Add(new PoolNode(pos, obj));
|
|||
|
|
count = pos + 1;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return pos;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public object TryGetValue(int index)
|
|||
|
|
{
|
|||
|
|
if (index > 0 && index < count)
|
|||
|
|
{
|
|||
|
|
return list[index].obj;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return null;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public object Remove(int pos)
|
|||
|
|
{
|
|||
|
|
if (pos > 0 && pos < count)
|
|||
|
|
{
|
|||
|
|
object o = list[pos].obj;
|
|||
|
|
list[pos].obj = null;
|
|||
|
|
list[pos].index = head.index;
|
|||
|
|
head.index = pos;
|
|||
|
|
|
|||
|
|
return o;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return null;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public object Destroy(int pos)
|
|||
|
|
{
|
|||
|
|
if (pos > 0 && pos < count)
|
|||
|
|
{
|
|||
|
|
object o = list[pos].obj;
|
|||
|
|
list[pos].obj = null;
|
|||
|
|
return o;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return null;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public void StepCollect(Action<object, int> collectListener)
|
|||
|
|
{
|
|||
|
|
++collectedIndex;
|
|||
|
|
for (int i = 0; i < collectStep; ++i)
|
|||
|
|
{
|
|||
|
|
collectedIndex += i;
|
|||
|
|
if (collectedIndex >= count)
|
|||
|
|
{
|
|||
|
|
collectedIndex = -1;
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
var node = list[collectedIndex];
|
|||
|
|
object o = node.obj;
|
|||
|
|
if (o != null && o.Equals(null))
|
|||
|
|
{
|
|||
|
|
node.obj = null;
|
|||
|
|
if (collectListener != null)
|
|||
|
|
{
|
|||
|
|
collectListener(o, collectedIndex);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public object Replace(int pos, object o)
|
|||
|
|
{
|
|||
|
|
if (pos > 0 && pos < count)
|
|||
|
|
{
|
|||
|
|
object obj = list[pos].obj;
|
|||
|
|
list[pos].obj = o;
|
|||
|
|
return obj;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return null;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|