The rectangle packers now throw a proper exception when there is no more space available; Moved interface implementations of the TransformingReadOnlyCollection into a separate file to keep the main body of the class readable
git-svn-id: file:///srv/devel/repo-conversion/nusu@40 d2e56fa2-650e-0410-a79f-9358c0239efd
This commit is contained in:
parent
acbb07d6b5
commit
fba9d87e65
10 changed files with 538 additions and 424 deletions
|
|
@ -17,11 +17,11 @@ You should have received a copy of the IBM Common Public
|
|||
License along with this library
|
||||
*/
|
||||
#endregion
|
||||
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.ObjectModel;
|
||||
using System.Threading;
|
||||
|
||||
namespace Nuclex.Support.Collections {
|
||||
|
||||
|
|
@ -48,8 +48,9 @@ namespace Nuclex.Support.Collections {
|
|||
/// downcast each time you need to access elements of the non-public type.
|
||||
/// </para>
|
||||
/// </remarks>
|
||||
public abstract class TransformingReadOnlyCollection<ContainedItemType, ExposedItemType> :
|
||||
IList<ExposedItemType>, IList {
|
||||
public abstract partial class TransformingReadOnlyCollection<
|
||||
ContainedItemType, ExposedItemType
|
||||
> : IList<ExposedItemType>, IList {
|
||||
|
||||
#region class TransformingEnumerator
|
||||
|
||||
|
|
@ -276,402 +277,6 @@ namespace Nuclex.Support.Collections {
|
|||
/// </remarks>
|
||||
protected abstract ExposedItemType Transform(ContainedItemType item);
|
||||
|
||||
#region IList<ExposedItemType> Members
|
||||
|
||||
/// <summary>
|
||||
/// Determines the index of a specific item in the TransformingReadOnlyCollection.
|
||||
/// </summary>
|
||||
/// <param name="item">
|
||||
/// The object to locate in the TransformingReadOnlyCollection.
|
||||
/// </param>
|
||||
/// <returns>
|
||||
/// The index of item if found in the list; otherwise, -1.
|
||||
/// </returns>
|
||||
int IList<ExposedItemType>.IndexOf(ExposedItemType item) {
|
||||
return IndexOf(item);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Inserts an item to the TransformingReadOnlyCollection at the specified index.
|
||||
/// </summary>
|
||||
/// <param name="index">
|
||||
/// The zero-based index at which item should be inserted.
|
||||
/// </param>
|
||||
/// <param name="item">
|
||||
/// The object to insert into the TransformingReadOnlyCollection
|
||||
/// </param>
|
||||
/// <exception cref="System.NotSupportedException">
|
||||
/// The TransformingReadOnlyCollection is read-only.
|
||||
/// </exception>
|
||||
/// <exception cref="System.ArgumentOutOfRangeException">
|
||||
/// index is not a valid index in the TransformingReadOnlyCollection.
|
||||
/// </exception>
|
||||
void IList<ExposedItemType>.Insert(int index, ExposedItemType item) {
|
||||
throw new NotSupportedException("The collection is ready-only");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Removes the TransformingReadOnlyCollection item at the specified index.
|
||||
/// </summary>
|
||||
/// <param name="index">The zero-based index of the item to remove.</param>
|
||||
/// <exception cref="System.NotSupportedException">
|
||||
/// The TransformingReadOnlyCollection is read-only.
|
||||
/// </exception>
|
||||
/// <exception cref="System.ArgumentOutOfRangeException">
|
||||
/// Index is not a valid index in the TransformingReadOnlyCollection.
|
||||
/// </exception>
|
||||
void IList<ExposedItemType>.RemoveAt(int index) {
|
||||
throw new NotSupportedException("The collection is ready-only");
|
||||
}
|
||||
|
||||
/// <summary>Gets or sets the element at the specified index.</summary>
|
||||
/// <param name="index">The zero-based index of the element to get or set.</param>
|
||||
/// <returns>The element at the specified index.</returns>
|
||||
/// <exception cref="System.ArgumentOutOfRangeException">
|
||||
/// Index is not a valid index in the TransformingReadOnlyCollection.
|
||||
/// </exception>
|
||||
/// <exception cref="System.NotSupportedException">
|
||||
/// The property is set and the TransformingReadOnlyCollection is read-only
|
||||
/// </exception>
|
||||
ExposedItemType IList<ExposedItemType>.this[int index] {
|
||||
get {
|
||||
return this[index];
|
||||
}
|
||||
set {
|
||||
throw new NotSupportedException("The collection is ready-only");
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region ICollection<ExposedItemType> Members
|
||||
|
||||
/// <summary>Adds an item to the TransformingReadOnlyCollection.</summary>
|
||||
/// <param name="item">The object to add to the TransformingReadOnlyCollection</param>
|
||||
/// <exception cref="System.NotSupportedException">
|
||||
/// The TransformingReadOnlyCollection is read-only.
|
||||
/// </exception>
|
||||
void ICollection<ExposedItemType>.Add(ExposedItemType item) {
|
||||
throw new NotSupportedException("The collection is ready-only");
|
||||
}
|
||||
|
||||
/// <summary>Removes all items from the TransformingReadOnlyCollection</summary>
|
||||
/// <exception cref="System.NotSupportedException">
|
||||
/// The TransformingReadOnlyCollection is read-only.
|
||||
/// </exception>
|
||||
void ICollection<ExposedItemType>.Clear() {
|
||||
throw new NotSupportedException("The collection is ready-only");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Determines whether the TransformingReadOnlyCollection contains a specific value.
|
||||
/// </summary>
|
||||
/// <param name="item">
|
||||
/// The object to locate in the TransformingReadOnlyCollection.
|
||||
/// </param>
|
||||
/// <returns>
|
||||
/// True if item is found in the TransformingReadOnlyCollection; otherwise, false.
|
||||
/// </returns>
|
||||
bool ICollection<ExposedItemType>.Contains(ExposedItemType item) {
|
||||
return Contains(item);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Copies the elements of the TransformingReadOnlyCollection to an System.Array,
|
||||
/// starting at a particular System.Array index.
|
||||
/// </summary>
|
||||
/// <param name="array">
|
||||
/// The one-dimensional System.Array that is the destination of the elements
|
||||
/// copied from TransformingReadOnlyCollection. The System.Array must have
|
||||
/// zero-based indexing.
|
||||
/// </param>
|
||||
/// <param name="arrayIndex">
|
||||
/// The zero-based index in array at which copying begins
|
||||
/// </param>
|
||||
/// <exception cref="System.ArgumentOutOfRangeException">
|
||||
/// ArrayIndex is less than 0.
|
||||
/// </exception>
|
||||
/// <exception cref="System.ArgumentNullException">
|
||||
/// Array is null.
|
||||
/// </exception>
|
||||
/// <exception cref="System.ArgumentException">
|
||||
/// Array is multidimensional or arrayIndex is equal to or greater than the
|
||||
/// length of array or the number of elements in the source
|
||||
/// TransformingReadOnlyCollection is greater than the available
|
||||
/// space from arrayIndex to the end of the destination array or type T cannot
|
||||
/// be cast automatically to the type of the destination array.
|
||||
/// </exception>
|
||||
void ICollection<ExposedItemType>.CopyTo(ExposedItemType[] array, int arrayIndex) {
|
||||
CopyTo(array, arrayIndex);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Removes the first occurrence of a specific object from the
|
||||
/// TransformingReadOnlyCollection.
|
||||
/// </summary>
|
||||
/// <param name="item">
|
||||
/// The object to remove from the TransformingReadOnlyCollection
|
||||
/// </param>
|
||||
/// <returns>
|
||||
/// True if item was successfully removed from the TransformingReadOnlyCollection;
|
||||
/// otherwise, false. This method also returns false if item is not found in the
|
||||
/// original TransformingReadOnlyCollection.
|
||||
/// </returns>
|
||||
/// <exception cref="System.NotSupportedException">
|
||||
/// The TransformingReadOnlyCollection is read-only.
|
||||
/// </exception>
|
||||
bool ICollection<ExposedItemType>.Remove(ExposedItemType item) {
|
||||
throw new NotSupportedException("The collection is ready-only");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// The number of elements contained in the TransformingReadOnlyCollection.
|
||||
/// </summary>
|
||||
int ICollection<ExposedItemType>.Count {
|
||||
get { return Count; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// A value indicating whether the TransformingReadOnlyCollection is read-only.
|
||||
/// </summary>
|
||||
bool ICollection<ExposedItemType>.IsReadOnly {
|
||||
get { return true; }
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region IEnumerable<ExposedItemType> Members
|
||||
|
||||
/// <summary>Returns an enumerator that iterates through the collection.</summary>
|
||||
/// <returns>
|
||||
/// A System.Collections.Generic.IEnumerator<ExposedItemType> that can be used
|
||||
/// to iterate through the collection.
|
||||
/// </returns>
|
||||
IEnumerator<ExposedItemType> IEnumerable<ExposedItemType>.GetEnumerator() {
|
||||
return GetEnumerator();
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region IEnumerable Members
|
||||
|
||||
/// <summary>Returns an enumerator that iterates through a collection.</summary>
|
||||
/// <returns>
|
||||
/// A System.Collections.IEnumerator object that can be used to iterate through
|
||||
/// the collection.
|
||||
/// </returns>
|
||||
IEnumerator IEnumerable.GetEnumerator() {
|
||||
return GetEnumerator();
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region IList Members
|
||||
|
||||
/// <summary>Adds an item to the TransformingReadOnlyCollection.</summary>
|
||||
/// <param name="value">
|
||||
/// The System.Object to add to the TransformingReadOnlyCollection.
|
||||
/// </param>
|
||||
/// <returns>The position into which the new element was inserted.</returns>
|
||||
/// <exception cref="System.NotSupportedException">
|
||||
/// The System.Collections.IList is read-only or the TransformingReadOnlyCollection
|
||||
/// has a fixed size.
|
||||
/// </exception>
|
||||
int IList.Add(object value) {
|
||||
throw new NotSupportedException("The collection is ready-only");
|
||||
}
|
||||
|
||||
/// <summary>Removes all items from the TransformingReadOnlyCollection.</summary>
|
||||
/// <exception cref="System.NotSupportedException">
|
||||
/// The TransformingReadOnlyCollection is read-only.
|
||||
/// </exception>
|
||||
void IList.Clear() {
|
||||
throw new NotSupportedException("The collection is ready-only");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Determines whether the TransformingReadOnlyCollection contains a specific value.
|
||||
/// </summary>
|
||||
/// <param name="value">
|
||||
/// The System.Object to locate in the TransformingReadOnlyCollection.
|
||||
/// </param>
|
||||
/// <returns>
|
||||
/// True if the System.Object is found in the TransformingReadOnlyCollection;
|
||||
/// otherwise, false.
|
||||
/// </returns>
|
||||
bool IList.Contains(object value) {
|
||||
return Contains((ExposedItemType)value);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Determines the index of a specific item in the TransformingReadOnlyCollection.
|
||||
/// </summary>
|
||||
/// <param name="value">
|
||||
/// The System.Object to locate in the TransformingReadOnlyCollection.
|
||||
/// </param>
|
||||
/// <returns>
|
||||
/// The index of value if found in the list; otherwise, -1.
|
||||
/// </returns>
|
||||
int IList.IndexOf(object value) {
|
||||
return IndexOf((ExposedItemType)value);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Inserts an item to the TransformingReadOnlyCollection at the specified index.
|
||||
/// </summary>
|
||||
/// <param name="index">
|
||||
/// The zero-based index at which value should be inserted.
|
||||
/// </param>
|
||||
/// <param name="value">
|
||||
/// The System.Object to insert into the TransformingReadOnlyCollection.
|
||||
/// </param>
|
||||
/// <exception cref="System.ArgumentOutOfRangeException">
|
||||
/// Index is not a valid index in the TransformingReadOnlyCollection.
|
||||
/// </exception>
|
||||
/// <exception cref="System.NotSupportedException">
|
||||
/// The System.Collections.IList is read-only or the TransformingReadOnlyCollection
|
||||
/// has a fixed size.
|
||||
/// </exception>
|
||||
/// <exception cref="System.NullReferenceException">
|
||||
/// Value is null reference in the TransformingReadOnlyCollection.
|
||||
/// </exception>
|
||||
void IList.Insert(int index, object value) {
|
||||
throw new NotSupportedException("The collection is ready-only");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// A value indicating whether the TransformingReadOnlyCollection has a fixed
|
||||
/// size.
|
||||
/// </summary>
|
||||
bool IList.IsFixedSize {
|
||||
get { return true; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// A value indicating whether the index is not a valid index in the is read-only.
|
||||
/// </summary>
|
||||
bool IList.IsReadOnly {
|
||||
get { return true; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Removes the first occurrence of a specific object from the
|
||||
/// TransformingReadOnlyCollection.
|
||||
/// </summary>
|
||||
/// <param name="value">
|
||||
/// The System.Object to remove from the TransformingReadOnlyCollection.
|
||||
/// </param>
|
||||
/// <exception cref="System.NotSupportedException">
|
||||
/// The TransformingReadOnlyCollection is read-only or the
|
||||
/// TransformingReadOnlyCollection has a fixed size.
|
||||
/// </exception>
|
||||
void IList.Remove(object value) {
|
||||
throw new NotSupportedException("The collection is ready-only");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Removes the TransformingReadOnlyCollection item at the specified index.
|
||||
/// </summary>
|
||||
/// <param name="index">The zero-based index of the item to remove.</param>
|
||||
/// <exception cref="System.ArgumentOutOfRangeException">
|
||||
/// Index is not a valid index in the TransformingReadOnlyCollection.
|
||||
/// </exception>
|
||||
/// <exception cref="System.NotSupportedException">
|
||||
/// The TransformingReadOnlyCollection is read-only or the
|
||||
/// TransformingReadOnlyCollection has a fixed size.
|
||||
/// </exception>
|
||||
void IList.RemoveAt(int index) {
|
||||
throw new NotSupportedException("The collection is ready-only");
|
||||
}
|
||||
|
||||
/// <summary>Gets or sets the element at the specified index.</summary>
|
||||
/// <param name="index">The zero-based index of the element to get or set.</param>
|
||||
/// <returns>The element at the specified index</returns>
|
||||
/// <exception cref="System.ArgumentOutOfRangeException">
|
||||
/// Index is not a valid index in the TransformingReadOnlyCollection
|
||||
/// </exception>
|
||||
/// <exception cref="System.NotSupportedException">
|
||||
/// The property is set and the TransformingReadOnlyCollection is read-only.
|
||||
/// </exception>
|
||||
object IList.this[int index] {
|
||||
get {
|
||||
return this[index];
|
||||
}
|
||||
set {
|
||||
throw new NotSupportedException("The collection is ready-only");
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region ICollection Members
|
||||
|
||||
/// <summary>
|
||||
/// Copies the elements of the TransformingReadOnlyCollection to an System.Array,
|
||||
/// starting at a particular System.Array index.
|
||||
/// </summary>
|
||||
/// <param name="array">
|
||||
/// The one-dimensional System.Array that is the destination of the elements
|
||||
/// copied from TransformingReadOnlyCollection. The System.Array must have zero-based
|
||||
/// indexing.
|
||||
/// </param>
|
||||
/// <param name="index">The zero-based index in array at which copying begins.</param>
|
||||
/// <exception cref="System.ArgumentNullException">
|
||||
/// Array is null.
|
||||
/// </exception>
|
||||
/// <exception cref="System.ArgumentOutOfRangeException">
|
||||
/// Index is less than zero.
|
||||
/// </exception>
|
||||
/// <exception cref="System.ArgumentException">
|
||||
/// Array is multidimensional or index is equal to or greater than the length
|
||||
/// of array or the number of elements in the source TransformingReadOnlyCollection
|
||||
/// is greater than the available space from index to the end of the destination
|
||||
/// array.
|
||||
/// </exception>
|
||||
/// <exception cref="System.InvalidCastException">
|
||||
/// The type of the source TransformingReadOnlyCollection cannot be cast
|
||||
/// automatically to the type of the destination array.
|
||||
/// </exception>
|
||||
void ICollection.CopyTo(Array array, int index) {
|
||||
CopyTo((ExposedItemType[])array, index);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// The number of elements contained in the TransformingReadOnlyCollection.
|
||||
/// </summary>
|
||||
int ICollection.Count {
|
||||
get { return Count; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// A value indicating whether access to the TransformingReadOnlyCollection
|
||||
/// is synchronized (thread safe).
|
||||
/// </summary>
|
||||
bool ICollection.IsSynchronized {
|
||||
get { return false; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// An object that can be used to synchronize access to the
|
||||
/// TransformingReadOnlyCollection.
|
||||
/// </summary>
|
||||
object ICollection.SyncRoot {
|
||||
get {
|
||||
if(this.syncRoot == null) {
|
||||
ICollection is2 = this.items as ICollection;
|
||||
if(is2 != null) {
|
||||
this.syncRoot = is2.SyncRoot;
|
||||
} else {
|
||||
Interlocked.CompareExchange(ref this.syncRoot, new object(), null);
|
||||
}
|
||||
}
|
||||
|
||||
return this.syncRoot;
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
/// <summary>Items being transformed upon exposure by this collection</summary>
|
||||
private IList<ContainedItemType> items;
|
||||
/// <summary>Synchronization root for threaded accesses to this collection</summary>
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue