Added six separate constructors to avoid default parameters (which aren't supported on Windows Phone 7 or the Xbox 360)
git-svn-id: file:///srv/devel/repo-conversion/nusu@269 d2e56fa2-650e-0410-a79f-9358c0239efd
This commit is contained in:
parent
c91a082e84
commit
58a1652749
|
@ -48,32 +48,43 @@ namespace Nuclex.Support.Collections {
|
||||||
|
|
||||||
#endregion // class TestClass
|
#endregion // class TestClass
|
||||||
|
|
||||||
|
#region class NoDefaultConstructor
|
||||||
|
|
||||||
|
/// <summary>Used to test the pool</summary>
|
||||||
|
private class NoDefaultConstructor {
|
||||||
|
|
||||||
|
/// <summary>Private constructor so no instances can be created</summary>
|
||||||
|
private NoDefaultConstructor() { }
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion // class NoDefaultConstructor
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Verifies that the pool can return newly constructed objects
|
/// Verifies that the pool can return newly constructed objects
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[Test]
|
[Test]
|
||||||
public void TestGet() {
|
public void NewInstancesCanBeObtained() {
|
||||||
Pool<TestClass> pool = new Pool<TestClass>();
|
Pool<TestClass> pool = new Pool<TestClass>();
|
||||||
Assert.IsNotNull(pool.Get());
|
Assert.IsNotNull(pool.Get());
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Verifies that the pool will return a recycled object if one is available
|
/// Verifies that an exception is thrown if the pool's default instance creator is used
|
||||||
|
/// on a type that doesn't have a default constructor
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[Test]
|
[Test]
|
||||||
public void TestGetRecycled() {
|
public void UsingDefaultInstanceCreatorRequiresDefaultConstructor() {
|
||||||
Pool<TestClass> pool = new Pool<TestClass>();
|
Assert.Throws<ArgumentException>(
|
||||||
pool.Redeem(new TestClass());
|
delegate() { new Pool<NoDefaultConstructor>(); }
|
||||||
|
);
|
||||||
TestClass test = pool.Get();
|
|
||||||
Assert.IsTrue(test.Recycled);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Tests whether the pool can redeem objects that are no longer used
|
/// Tests whether the pool can redeem objects that are no longer used
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[Test]
|
[Test]
|
||||||
public void TestRedeem() {
|
public void InstancesCanBeRedeemed() {
|
||||||
Pool<TestClass> pool = new Pool<TestClass>();
|
Pool<TestClass> pool = new Pool<TestClass>();
|
||||||
pool.Redeem(new TestClass());
|
pool.Redeem(new TestClass());
|
||||||
}
|
}
|
||||||
|
@ -82,7 +93,7 @@ namespace Nuclex.Support.Collections {
|
||||||
/// Tests whether the Recycle() method is called at the appropriate time
|
/// Tests whether the Recycle() method is called at the appropriate time
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[Test]
|
[Test]
|
||||||
public void TestRecycle() {
|
public void RedeemedItemsWillBeRecycled() {
|
||||||
Pool<TestClass> pool = new Pool<TestClass>();
|
Pool<TestClass> pool = new Pool<TestClass>();
|
||||||
TestClass x = new TestClass();
|
TestClass x = new TestClass();
|
||||||
|
|
||||||
|
@ -93,7 +104,7 @@ namespace Nuclex.Support.Collections {
|
||||||
|
|
||||||
/// <summary>Verifies that the pool's Capacity is applied correctly</summary>
|
/// <summary>Verifies that the pool's Capacity is applied correctly</summary>
|
||||||
[Test]
|
[Test]
|
||||||
public void TestPoolSize() {
|
public void PoolCapacityCanBeAdjusted() {
|
||||||
Pool<TestClass> pool = new Pool<TestClass>(123);
|
Pool<TestClass> pool = new Pool<TestClass>(123);
|
||||||
Assert.AreEqual(123, pool.Capacity);
|
Assert.AreEqual(123, pool.Capacity);
|
||||||
pool.Capacity = 321;
|
pool.Capacity = 321;
|
||||||
|
|
|
@ -50,22 +50,45 @@ namespace Nuclex.Support.Collections {
|
||||||
/// <summary>Default number of recyclable objects the pool will store</summary>
|
/// <summary>Default number of recyclable objects the pool will store</summary>
|
||||||
public const int DefaultPoolSize = 64;
|
public const int DefaultPoolSize = 64;
|
||||||
|
|
||||||
|
/// <summary>Initializes a new pool using the default capacity</summary>
|
||||||
|
public Pool() : this(DefaultPoolSize, null, null) { }
|
||||||
|
|
||||||
|
/// <summary>Initializes a new pool using the default capacity</summary>
|
||||||
|
/// <param name="createNewDelegate">Delegate that will be used to create new items</param>
|
||||||
|
public Pool(Func<TItem> createNewDelegate) :
|
||||||
|
this(DefaultPoolSize, createNewDelegate, null) { }
|
||||||
|
|
||||||
/// <summary>Initializes a new pool using the default capacity</summary>
|
/// <summary>Initializes a new pool using the default capacity</summary>
|
||||||
/// <param name="createNewDelegate">Delegate that will be used to create new items</param>
|
/// <param name="createNewDelegate">Delegate that will be used to create new items</param>
|
||||||
/// <param name="recycleDelegate">Delegate that will be used to recycle items</param>
|
/// <param name="recycleDelegate">Delegate that will be used to recycle items</param>
|
||||||
public Pool(Func<TItem> createNewDelegate = null, Action<TItem> recycleDelegate = null) :
|
public Pool(Func<TItem> createNewDelegate, Action<TItem> recycleDelegate) :
|
||||||
this(DefaultPoolSize, createNewDelegate, recycleDelegate) { }
|
this(DefaultPoolSize, createNewDelegate, recycleDelegate) { }
|
||||||
|
|
||||||
|
/// <summary>Initializes a new pool using a user-specified capacity</summary>
|
||||||
|
/// <param name="capacity">Capacity of the pool</param>
|
||||||
|
public Pool(int capacity) :
|
||||||
|
this(capacity, null, null) { }
|
||||||
|
|
||||||
|
/// <summary>Initializes a new pool using a user-specified capacity</summary>
|
||||||
|
/// <param name="capacity">Capacity of the pool</param>
|
||||||
|
/// <param name="createNewDelegate">Delegate that will be used to create new items</param>
|
||||||
|
public Pool(int capacity, Func<TItem> createNewDelegate) :
|
||||||
|
this(capacity, createNewDelegate, null) { }
|
||||||
|
|
||||||
/// <summary>Initializes a new pool using a user-specified capacity</summary>
|
/// <summary>Initializes a new pool using a user-specified capacity</summary>
|
||||||
/// <param name="capacity">Capacity of the pool</param>
|
/// <param name="capacity">Capacity of the pool</param>
|
||||||
/// <param name="createNewDelegate">Delegate that will be used to create new items</param>
|
/// <param name="createNewDelegate">Delegate that will be used to create new items</param>
|
||||||
/// <param name="recycleDelegate">Delegate that will be used to recycle items</param>
|
/// <param name="recycleDelegate">Delegate that will be used to recycle items</param>
|
||||||
public Pool(
|
public Pool(int capacity, Func<TItem> createNewDelegate, Action<TItem> recycleDelegate) {
|
||||||
int capacity, Func<TItem> createNewDelegate = null, Action<TItem> recycleDelegate = null
|
|
||||||
) {
|
|
||||||
Capacity = capacity;
|
Capacity = capacity;
|
||||||
|
|
||||||
if(createNewDelegate == null) {
|
if(createNewDelegate == null) {
|
||||||
|
if(!typeof(TItem).HasDefaultConstructor()) {
|
||||||
|
throw new ArgumentException(
|
||||||
|
"Type " + typeof(TItem).Name + " has no default constructor and " +
|
||||||
|
"requires a custom 'create instance' delegate"
|
||||||
|
);
|
||||||
|
}
|
||||||
createNewDelegate = new Func<TItem>(Activator.CreateInstance<TItem>);
|
createNewDelegate = new Func<TItem>(Activator.CreateInstance<TItem>);
|
||||||
}
|
}
|
||||||
if(recycleDelegate == null) {
|
if(recycleDelegate == null) {
|
||||||
|
|
Loading…
Reference in New Issue
Block a user