// ==++== // // Copyright (c) Microsoft Corporation. All rights reserved. // // ==--== //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ namespace System.Collections { using System; // Useful base class for typed read/write collections where items derive from object //| public abstract class CollectionBase : IList { ArrayList list; //| protected ArrayList InnerList { get { if (list == null) list = new ArrayList(); return list; } } //| protected IList List { get { return (IList)this; } } //| public int Count { get { return list == null ? 0 : list.Count; } } //| public void Clear() { OnClear(); InnerList.Clear(); OnClearComplete(); } //| public void RemoveAt(int index) { if (index < 0 || index >= InnerList.Count) throw new ArgumentOutOfRangeException("ArgumentOutOfRange_Index"); Object temp = InnerList[index]; OnValidate(temp); OnRemove(index, temp); InnerList.RemoveAt(index); OnRemoveComplete(index, temp); } //| bool IList.IsReadOnly { get { return InnerList.IsReadOnly; } } //| bool IList.IsFixedSize { get { return InnerList.IsFixedSize; } } //| bool ICollection.IsSynchronized { get { return InnerList.IsSynchronized; } } //| Object ICollection.SyncRoot { get { return InnerList.SyncRoot; } } //| void ICollection.CopyTo(Array array, int index) { InnerList.CopyTo(array, index); } //| Object IList.this[int index] { get { if (index < 0 || index >= InnerList.Count) throw new ArgumentOutOfRangeException("ArgumentOutOfRange_Index"); return InnerList[index]; } set { if (index < 0 || index >= InnerList.Count) throw new ArgumentOutOfRangeException("ArgumentOutOfRange_Index"); OnValidate(value); Object temp = InnerList[index]; OnSet(index, temp, value); InnerList[index] = value; try { OnSetComplete(index, temp, value); } catch (Exception) { InnerList[index] = temp; throw; } } } //| bool IList.Contains(Object value) { return InnerList.Contains(value); } //| int IList.Add(Object value) { OnValidate(value); OnInsert(InnerList.Count, value); int index = InnerList.Add(value); try { OnInsertComplete(index, value); } catch (Exception) { InnerList.RemoveAt(index); throw; } return index; } //| void IList.Remove(Object value) { OnValidate(value); int index = InnerList.IndexOf(value); if (index < 0) throw new ArgumentException("Arg_RemoveArgNotFound"); OnRemove(index, value); InnerList.RemoveAt(index); OnRemoveComplete(index, value); } //| int IList.IndexOf(Object value) { return InnerList.IndexOf(value); } //| void IList.Insert(int index, Object value) { if (index < 0 || index > InnerList.Count) throw new ArgumentOutOfRangeException("ArgumentOutOfRange_Index"); OnValidate(value); OnInsert(index, value); InnerList.Insert(index, value); try { OnInsertComplete(index, value); } catch (Exception) { InnerList.RemoveAt(index); throw; } } //| public IEnumerator GetEnumerator() { return InnerList.GetEnumerator(); } //| protected virtual void OnSet(int index, Object oldValue, Object newValue) { } //| protected virtual void OnInsert(int index, Object value) { } //| protected virtual void OnClear() { } //| protected virtual void OnRemove(int index, Object value) { } //| protected virtual void OnValidate(Object value) { if (value == null) throw new ArgumentNullException("value"); } //| protected virtual void OnSetComplete(int index, Object oldValue, Object newValue) { } //| protected virtual void OnInsertComplete(int index, Object value) { } //| protected virtual void OnClearComplete() { } //| protected virtual void OnRemoveComplete(int index, Object value) { } } }