// ==++==
//
// 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 DictionaryBase : IDictionary {
Hashtable hashtable;
//|
protected Hashtable InnerHashtable {
get {
if (hashtable == null)
hashtable = new Hashtable();
return hashtable;
}
}
//|
protected IDictionary Dictionary {
get { return (IDictionary) this; }
}
//|
public int Count {
// to avoid newing inner list if no items are ever added
get { return hashtable == null ? 0 : hashtable.Count; }
}
//|
bool IDictionary.IsReadOnly {
get { return InnerHashtable.IsReadOnly; }
}
//|
bool IDictionary.IsFixedSize {
get { return InnerHashtable.IsFixedSize; }
}
//|
bool ICollection.IsSynchronized {
get { return InnerHashtable.IsSynchronized; }
}
//|
ICollection IDictionary.Keys {
get {
return InnerHashtable.Keys;
}
}
//|
Object ICollection.SyncRoot {
get { return InnerHashtable.SyncRoot; }
}
//|
ICollection IDictionary.Values {
get {
return InnerHashtable.Values;
}
}
//|
public void CopyTo(Array array, int index) {
InnerHashtable.CopyTo(array, index);
}
//|
object IDictionary.this[object key] {
get {
OnGet(key, InnerHashtable[key]);
return InnerHashtable[key];
}
set {
OnValidate(key, value);
Object temp = InnerHashtable[key];
OnSet(key, temp, value);
InnerHashtable[key] = value;
try {
OnSetComplete(key, temp, value);
}
catch (Exception) {
InnerHashtable[key] = temp;
throw;
}
}
}
//|
bool IDictionary.Contains(object key) {
return InnerHashtable.Contains(key);
}
//|
void IDictionary.Add(object key, object value) {
OnValidate(key, value);
OnInsert(key, value);
InnerHashtable.Add(key, value);
try {
OnInsertComplete(key, value);
}
catch (Exception) {
InnerHashtable.Remove(key);
throw;
}
}
//|
public void Clear() {
OnClear();
InnerHashtable.Clear();
OnClearComplete();
}
//|
void IDictionary.Remove(object key) {
Object temp = InnerHashtable[key];
OnValidate(key, temp);
OnRemove(key, temp);
InnerHashtable.Remove(key);
OnRemoveComplete(key, temp);
}
//|
public IDictionaryEnumerator GetEnumerator() {
return InnerHashtable.GetEnumerator();
}
//|
IEnumerator IEnumerable.GetEnumerator() {
return InnerHashtable.GetEnumerator();
}
//|
protected virtual object OnGet(object key, object currentValue) {
return currentValue;
}
//|
protected virtual void OnSet(object key, object oldValue, object newValue) {
}
//|
protected virtual void OnInsert(object key, object value) {
}
//|
protected virtual void OnClear() {
}
//|
protected virtual void OnRemove(object key, object value) {
}
//|
protected virtual void OnValidate(object key, object value) {
}
//|
protected virtual void OnSetComplete(object key, object oldValue, object newValue) {
}
//|
protected virtual void OnInsertComplete(object key, object value) {
}
//|
protected virtual void OnClearComplete() {
}
//|
protected virtual void OnRemoveComplete(object key, object value) {
}
}
}