File: System\Activities\Runtime\Pool.cs
Project: ndp\cdf\src\NetFx40\System.Activities\System.Activities.csproj (System.Activities)
//-----------------------------------------------------------------------------
// Copyright (c) Microsoft Corporation.  All rights reserved.
//-----------------------------------------------------------------------------
 
namespace System.Activities.Runtime
{
    using System;
    using System.Runtime;
 
    // Pool<T> defined below is a LIFO pool of Pool.IClearable objects.
    // It is strongly typed to make the Acquire/Release methods more user
    // friendly.  To use this pool, subclass it with a concrete type and
    // override the CreateNew method.  Typically, the type of T will
    // have a default ctor and will use an Initialize(...) method in order
    // to configure it for use.
    // NOTE: CreateNew is required because T : new() requires that the default
    // ctor is public.  We did not want to put public ctors on some of our
    // pooled resources (like NativeActivityContext).
 
 
    abstract class Pool<T>
    {
        const int DefaultPoolSize = 10;
 
        T[] items;
        int count;
        int poolSize;
 
        public Pool()
            : this(DefaultPoolSize)
        {
        }
 
        public Pool(int poolSize)
        {
            this.items = new T[poolSize];
            this.poolSize = poolSize;
        }
 
        public T Acquire()
        {
            if (this.count > 0)
            {
                this.count--;
                T item = this.items[this.count];
 
                return item;
            }
            else
            {
                return CreateNew();
            }
        }
 
        protected abstract T CreateNew();
 
        public void Release(T item)
        {
            if (this.count < this.poolSize)
            {
                this.items[this.count] = item;
                this.count++;
            }
        }
    }
}