| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372 |
- //
- // System.Collections.DictionaryBase.cs
- //
- // Author:
- // Miguel de Icaza ([email protected])
- //
- // (C) Ximian, Inc. http://www.ximian.com
- //
- using System;
- namespace System.Collections {
- /// <summary>
- /// An abstract class that provides a simple way to monitor changes to a
- /// Hashtable. Derived classes overwrite one or more of the `On' methods
- /// to track the changes to the Hashtable.
- /// </summary>
- ///
- /// <remarks>
- /// This class is a base class that can simplify the development of
- /// strongly typed collections. The idea being that the insertion of elements
- /// into the Hashtable can be forced to be of a given type.
- ///
- /// The `On' members are protected and designed to be used only by derived
- /// classes.
- /// </remarks>
- [Serializable]
- public abstract class DictionaryBase : IDictionary, ICollection, IEnumerable {
- Hashtable dictionary;
-
- protected DictionaryBase ()
- {
- dictionary = new Hashtable ();
- }
- /// <summary>
- /// Clears the contents of the dictionary
- /// </summary>
- public void Clear ()
- {
- OnClear ();
- dictionary.Clear ();
- OnClearComplete ();
- }
- /// <summary>
- /// Returns the number of items in the dictionary
- /// </summary>
- public int Count {
- get {
- return dictionary.Count;
- }
- }
- /// <summary>
- /// The collection contained as an IDictionary
- /// </summary>
- protected IDictionary Dictionary {
- get {
- return dictionary;
- }
- }
- /// <summary>
- /// The internal Hashtable representation for this dictionary
- /// </summary>
- protected Hashtable InnerHashtable {
- get {
- return dictionary;
- }
- }
- /// <summary>
- /// Copies the contents of the Dictionary into the target array
- /// </summary>
- /// <param name="array">
- /// The array to copy the contents of the dictionary to. The
- /// array must have a zero-based indexing
- /// </param>
- /// <param name="index">
- /// Starting index within the array where to copy the objects
- /// to.
- /// </param>
- public void CopyTo (Array array, int index)
- {
- if (array == null)
- throw new ArgumentNullException ("array");
- if (index < 0)
- throw new ArgumentOutOfRangeException ("index must be possitive");
- if (array.Rank > 1)
- throw new ArgumentException ("array is multidimensional");
- int size = array.Length;
- if (index > size)
- throw new ArgumentException ("index is larger than array size");
- if (index + Count > size)
- throw new ArgumentException ("Copy will overlflow array");
- DoCopy (array, index);
- }
- /// <summary>
- /// Internal routine called by CopyTo to perform the actual
- /// copying of the data
- /// </summary>
- private void DoCopy (Array array, int index)
- {
- foreach (DictionaryEntry de in dictionary)
- array.SetValue (de, index++);
- }
- /// <summary>
- /// Returns an enumerator for the dictionary
- /// </summary>
- public IDictionaryEnumerator GetEnumerator ()
- {
- return dictionary.GetEnumerator ();
- }
- /// <summary>
- /// Hook invoked before the clear operation
- /// is performed on the DictionaryBase
- /// </summary>
- protected virtual void OnClear ()
- {
- }
- /// <summary>
- /// Hook invoked after the clear operation
- /// is performed on the DictionaryBase
- /// </summary>
- ///
- /// <remarks>
- /// The default implementation does nothing, derived classes
- /// can override this method to be notified of changes
- /// </remarks>
- protected virtual void OnClearComplete ()
- {
- }
- /// <summary>
- /// Hook invoked while fetching data from the DictionaryBase.
- /// </summary>
- ///
- /// <remarks>
- /// This method is provided as a simple way to override the values
- /// returned by the DictionaryBase.
- /// </remarks>
- ///
- /// <param name="key">Key of the object to retrieve</param>
- /// <param name="current_value">Current value of the object associated with
- /// <paramref name="key"/></param>
- protected virtual object OnGet (object key, object current_value)
- {
- return current_value;
- }
- /// <summary>
- /// Hook invoked before inserting data into the DictionaryBase.
- /// </summary>
- ///
- /// <remarks>
- /// Derived classes can override this method and perform some
- /// action before the <paramref name="current_value"/> is inserted
- /// into the dictionary.
- ///
- /// The default implementation does nothing, derived classes
- /// can override this method to be notified of changes
- /// </remarks>
- ///
- /// <param name="key">Key of the object to insert</param>
- /// <param name="current_value">Current value of the object associated with
- /// <paramref name="key"/></param>
- protected virtual void OnInsert (object key, object current_value)
- {
- }
-
- /// <summary>
- /// Hook invoked after inserting the data into the DictionaryBase
- /// </summary>
- ///
- /// <remarks>
- /// The default implementation does nothing, derived classes
- /// can override this method to be notified of changes
- /// </remarks>
- ///
- /// <param name="key">Key of the object to insert</param>
- /// <param name="current_value">Current value of the object associated with
- /// <paramref name="key"/></param>
- protected virtual void OnInsertComplete (object key, object current_value)
- {
- }
- /// <summary>
- /// Hook invoked before changing a value for a key in the DictionaryBase.
- /// </summary>
- ///
- /// <remarks>
- /// Derived classes can override this method and perform some
- /// action before the <paramref name="current_value"/> is changed
- /// in the dictionary.
- /// </remarks>
- ///
- /// <param name="key">Key of the object to change</param>
- /// <param name="current_value">Current value of the object associated with
- /// <paramref name="key"/></param>
- protected virtual void OnSet (object key, object current_value, object new_value)
- {
- }
-
- /// <summary>
- /// Hook invoked after changing a value for a key in the DictionaryBase.
- /// </summary>
- ///
- /// <remarks>
- /// The default implementation does nothing, derived classes
- /// can override this method to be notified of changes
- /// </remarks>
- ///
- /// <param name="key">Key of the object to change</param>
- /// <param name="current_value">Current value of the object associated with
- /// <paramref name="key"/></param>
- protected virtual void OnSetComplete (object key, object current_value, object new_value)
- {
- }
- /// <summary>
- /// Hook invoked before removing a key/value from the DictionaryBase.
- /// </summary>
- ///
- /// <remarks>
- /// Derived classes can override this method and perform some
- /// action before the <paramref name="current_value"/> is removed
- /// from the dictionary.
- /// </remarks>
- ///
- /// <param name="key">Key of the object to remove</param>
- /// <param name="current_value">Current value of the object associated with
- /// <paramref name="key"/></param>
- protected virtual void OnRemove (object key, object current_value)
- {
- }
-
- /// <summary>
- /// Hook invoked after removing a key/value from the DictionaryBase.
- /// </summary>
- ///
- /// <remarks>
- /// The default implementation does nothing, derived classes
- /// can override this method to be notified of changes.
- /// </remarks>
- ///
- /// <param name="key">Key of the object to remove</param>
- /// <param name="current_value">Current value of the object associated with
- /// <paramref name="key"/></param>
- protected virtual void OnRemoveComplete (object key, object current_value)
- {
- }
-
- /// <summary>
- /// Hook invoked after the value has been validated
- /// </summary>
- ///
- /// <remarks>
- /// The default implementation does nothing, derived classes
- /// can override this method to monitor the DictionaryBase.
- /// </remarks>
- ///
- /// <param name="key">Key of the object to retrieve</param>
- /// <param name="current_value">Current value of the object associated with
- /// <paramref name="key"/></param>
- protected virtual void OnValidate (object key, object current_value)
- {
- }
- bool IDictionary.IsFixedSize {
- get {
- return false;
- }
- }
- bool IDictionary.IsReadOnly {
- get {
- return false;
- }
- }
- object IDictionary.this [object key] {
- get {
- object value = dictionary [key];
- OnGet (key, value);
- return value;
- }
- set {
- if (dictionary.ContainsKey (key)){
- object current_value = dictionary [key];
- OnSet (key, current_value, value);
- dictionary [key] = value;
- OnSetComplete (key, current_value, value);
- } else {
- OnInsert (key, value);
- dictionary [key] = value;
- OnInsertComplete (key, value);
- }
- }
- }
- ICollection IDictionary.Keys {
- get {
- return dictionary.Keys;
- }
- }
- ICollection IDictionary.Values {
- get {
- return dictionary.Values;
- }
- }
- /// <summary>
- /// Adds a key/value pair to the dictionary.
- /// </summary>
- void IDictionary.Add (object key, object value)
- {
- OnInsert (key, value);
- dictionary.Add (key, value);
- OnInsertComplete (key, value);
- }
- /// <summary>
- /// Removes a Dictionary Entry based on its key
- /// </summary>
- void IDictionary.Remove (object key)
- {
- if (! dictionary.ContainsKey (key))
- return;
- object value = dictionary [key];
- OnRemove (key, value);
- dictionary.Remove (key);
- OnRemoveComplete (key, value);
- }
- /// <summary>
- /// Tests whether the dictionary contains an entry
- /// </summary>
- bool IDictionary.Contains (object key)
- {
- return dictionary.Contains (key);
- }
- bool ICollection.IsSynchronized {
- get {
- return dictionary.IsSynchronized;
- }
- }
- object ICollection.SyncRoot {
- get {
- return dictionary.SyncRoot;
- }
- }
- IEnumerator IEnumerable.GetEnumerator ()
- {
- return dictionary.GetEnumerator ();
- }
- }
- }
|