#region CPL License /* Nuclex Framework Copyright (C) 2002-2013 Nuclex Development Labs This library is free software; you can redistribute it and/or modify it under the terms of the IBM Common Public License as published by the IBM Corporation; either version 1.0 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the IBM Common Public License for more details. You should have received a copy of the IBM Common Public License along with this library */ #endregion using System; using System.Threading; using System.Collections; using System.Collections.Generic; namespace Nuclex.Support.Collections { partial class WeakCollection { #region IEnumerable Members /// Returns an enumerator that iterates through a collection. /// /// A System.Collections.IEnumerator object that can be used to iterate through /// the collection. /// IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } #endregion #region IList Members /// Adds an item to the WeakCollection. /// The System.Object to add to the WeakCollection. /// The position into which the new element was inserted. /// /// The System.Collections.IList is read-only or the WeakCollection has a fixed size. /// int IList.Add(object value) { TItem valueAsItemType = downcastToItemType(value); return (this.items as IList).Add(new WeakReference(valueAsItemType)); } /// /// Determines whether the WeakCollection contains a specific value. /// /// The System.Object to locate in the WeakCollection. /// /// True if the System.Object is found in the WeakCollection; otherwise, false. /// bool IList.Contains(object value) { TItem valueAsItemType = downcastToItemType(value); return Contains(valueAsItemType); } /// Determines the index of a specific item in the WeakCollection. /// The System.Object to locate in the WeakCollection. /// /// The index of value if found in the list; otherwise, -1. /// int IList.IndexOf(object value) { TItem valueAsItemType = downcastToItemType(value); return IndexOf(valueAsItemType); } /// /// Inserts an item to the WeakCollection at the specified index. /// /// /// The zero-based index at which value should be inserted. /// /// The System.Object to insert into the WeakCollection. /// /// Index is not a valid index in the TransformingReadOnlyCollection. /// /// /// The System.Collections.IList is read-only or the WeakCollection has a fixed size. /// /// /// Value is null reference in the WeakCollection. /// void IList.Insert(int index, object value) { TItem valueAsItemType = downcastToItemType(value); Insert(index, valueAsItemType); } /// /// A value indicating whether the WeakCollection has a fixed size. /// bool IList.IsFixedSize { get { return (this.items as IList).IsFixedSize; } } /// /// Removes the first occurrence of a specific object from the WeakCollection. /// /// The System.Object to remove from the WeakCollection. /// /// The WeakCollection is read-only or the WeakCollection has a fixed size. /// void IList.Remove(object value) { TItem valueAsItemType = downcastToItemType(value); Remove(valueAsItemType); } /// Gets or sets the element at the specified index. /// The zero-based index of the element to get or set. /// The element at the specified index /// /// Index is not a valid index in the WeakCollection /// object IList.this[int index] { get { return this[index]; } set { TItem valueAsItemType = downcastToItemType(value); this[index] = valueAsItemType; } } #endregion #region ICollection Members /// /// Copies the elements of the WeakCollection to an System.Array, starting at /// a particular System.Array index. /// /// /// The one-dimensional System.Array that is the destination of the elements /// copied from WeakCollection. The System.Array must have zero-based indexing. /// /// The zero-based index in array at which copying begins. /// /// Array is null. /// /// /// Index is less than zero. /// /// /// Array is multidimensional or index is equal to or greater than the length /// of array or the number of elements in the source WeakCollection is greater than /// the available space from index to the end of the destination array. /// /// /// The type of the source WeakCollection cannot be cast automatically to the type of /// the destination array. /// void ICollection.CopyTo(Array array, int index) { CopyTo((TItem[])array, index); } /// /// A value indicating whether access to the WeakCollection is /// synchronized (thread safe). /// bool ICollection.IsSynchronized { get { return false; } } /// /// An object that can be used to synchronize access to the WeakCollection. /// 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 /// /// Downcasts an object reference to a reference to the collection's item type /// /// Object reference that will be downcast /// /// The specified object referecne as a reference to the collection's item type /// private static TItem downcastToItemType(object value) { TItem valueAsItemType = value as TItem; if(!ReferenceEquals(value, null)) { if(valueAsItemType == null) { throw new ArgumentException("Object is not of a compatible type", "value"); } } return valueAsItemType; } } } // namespace Nuclex.Support.Collections