// ==++==
//
// 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) {
}
}
}