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;
 | 
						||
        }
 | 
						||
    }
 | 
						||
} |