snakealpha
5/17/2014 - 11:28 AM

A multi-types Object Pool implement with C#. Type as key value. NOT thread-safty.

A multi-types Object Pool implement with C#. Type as key value. NOT thread-safty.

using System;
using System.Collections.Generic;

namespace Elecelf.Utils
{
    class ObjectPool
    {
        protected Dictionary<Type, Object> queues = new Dictionary<Type, Object>();

        public int DefaultMaxCount = 10;

        public bool Get<T>(out T value)
        {
            Object queue;
            if (queues.TryGetValue(typeof(T), out queue))
            {
                return (queue as ObjectPoolQueue<T>).Get(out value);
            }
            else
            {
                value = default(T);
                return false;
            }
        }

        public bool Put<T>(T value)
        {
            Object queue;
            if(queues.TryGetValue(typeof(T), out queue))
            {
                return (queue as ObjectPoolQueue<T>).Put(value);
            }
            else
            {
                ObjectPoolQueue<T> newQueue = new ObjectPoolQueue<T>();
                queues.Add(typeof(T), newQueue);
                return newQueue.Put(value);
            }
        }
    }

    class ObjectPoolQueue<T>
    {
        public int MaxCount = 10;

        protected Queue<T> items = new Queue<T>();

        public bool Get(out T item)
        {
            if(items.Count > 0)
            {
                item = items.Dequeue();
                return true;
            }
            else
            {
                item = default(T);
                return false;
            }
        }

        public bool Put(T item)
        {
            if (items.Count >= MaxCount)
            {
                items.Enqueue(item);
                return true;
            }
            else
            {
                return false;
            }
        }
    }
}