2005-09-29 Miguel de Icaza <miguel@novell.com>
[mono.git] / mcs / class / corlib / System.Collections / CollectionBase.cs
index 9a436415c9e8128a79c53df3cf5e6aaad5053a40..4a1d730f313db5932b80c8e1bbb2904b10eae609 100644 (file)
@@ -1,11 +1,11 @@
-//\r
-// System.Collections.CollectionBase.cs\r
-//\r
-// Author:\r
-//   Nick Drochak II (ndrochak@gol.com)\r
-//\r
-// (C) 2001 Nick Drochak II\r
-//\r
+//
+// System.Collections.CollectionBase.cs
+//
+// Author:
+//   Nick Drochak II (ndrochak@gol.com)
+//
+// (C) 2001 Nick Drochak II
+//
 
 //
 // Copyright (C) 2004 Novell, Inc (http://www.novell.com)
 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 //
-\r
-using System;\r
-\r
-namespace System.Collections {\r
-\r
-       [Serializable]\r
-       public abstract class CollectionBase : IList, ICollection, IEnumerable {\r
-\r
-               // private instance properties\r
-               private ArrayList list;\r
-               \r
-               // public instance properties\r
-               public int Count { get { return InnerList.Count; } }\r
-               \r
-               // Public Instance Methods\r
-               public IEnumerator GetEnumerator() { return InnerList.GetEnumerator(); }\r
-               public void Clear() { \r
-                       OnClear();\r
-                       InnerList.Clear(); \r
-                       OnClearComplete();\r
-               }\r
-               public void RemoveAt (int index) {\r
-                       object objectToRemove;\r
-                       objectToRemove = InnerList[index];\r
-                       OnValidate(objectToRemove);\r
-                       OnRemove(index, objectToRemove);\r
-                       InnerList.RemoveAt(index);\r
-                       OnRemoveComplete(index, objectToRemove);\r
-               }\r
-               \r
-               // Protected Instance Constructors\r
-               protected CollectionBase() { \r
-                       this.list = new ArrayList();\r
-               }\r
-               \r
-               // Protected Instance Properties\r
-               protected ArrayList InnerList {get { return this.list; } }\r
-               protected IList List {get { return this; } }\r
-               \r
-               // Protected Instance Methods\r
-               protected virtual void OnClear() { }\r
-               protected virtual void OnClearComplete() { }\r
-               \r
-               protected virtual void OnInsert(int index, object value) { }\r
-               protected virtual void OnInsertComplete(int index, object value) { }\r
-\r
-               protected virtual void OnRemove(int index, object value) { }\r
-               protected virtual void OnRemoveComplete(int index, object value) { }\r
-\r
-               protected virtual void OnSet(int index, object oldValue, object newValue) { }\r
-               protected virtual void OnSetComplete(int index, object oldValue, object newValue) { }\r
-\r
-               protected virtual void OnValidate(object value) {\r
-                       if (null == value) {\r
-                               throw new System.ArgumentNullException("CollectionBase.OnValidate: Invalid parameter value passed to method: null");\r
-                       }\r
-               }\r
-               \r
-               // ICollection methods\r
-               void ICollection.CopyTo(Array array, int index) {\r
-                       InnerList.CopyTo(array, index);\r
-               }\r
-               object ICollection.SyncRoot {\r
-                       get { return InnerList.SyncRoot; }\r
-               }\r
-               bool ICollection.IsSynchronized {\r
-                       get { return InnerList.IsSynchronized; }\r
-               }\r
-\r
-               // IList methods\r
-               int IList.Add (object value) {\r
-                       int newPosition;\r
-                       OnValidate(value);\r
-                       newPosition = InnerList.Count;\r
-                       OnInsert(newPosition, value);\r
-                       InnerList.Add(value);\r
-                       try {\r
-                               OnInsertComplete(newPosition, value);\r
-                       } catch {\r
-                               InnerList.RemoveAt (newPosition);\r
-                               throw;\r
-                       }\r
-                       \r
-                       return newPosition;\r
-               }\r
-               \r
-               bool IList.Contains (object value) {\r
-                       return InnerList.Contains(value);\r
-               }\r
-\r
-               int IList.IndexOf (object value) {\r
-                       return InnerList.IndexOf(value);\r
-               }\r
-\r
-               void IList.Insert (int index, object value) {\r
-                       OnValidate(value);\r
-                       OnInsert(index, value);\r
-                       InnerList.Insert(index, value);\r
-                       try {\r
-                               OnInsertComplete(index, value);\r
-                       } catch {\r
-                               InnerList.RemoveAt (index);\r
-                               throw;\r
-                       }\r
-               }\r
-\r
-               void IList.Remove (object value) {\r
-                       int removeIndex;\r
-                       OnValidate(value);\r
-                       removeIndex = InnerList.IndexOf(value);\r
-                       if (removeIndex == -1)\r
-                               throw new ArgumentException ("The element cannot be found.", "value");\r
-                       OnRemove(removeIndex, value);\r
-                       InnerList.Remove(value);\r
-                       OnRemoveComplete(removeIndex, value);\r
-               }\r
-\r
-               // IList properties\r
-               bool IList.IsFixedSize { \r
-                       get { return InnerList.IsFixedSize; }\r
-               }\r
-\r
-               bool IList.IsReadOnly { \r
-                       get { return InnerList.IsReadOnly; }\r
-               }\r
-\r
-               object IList.this[int index] { \r
-                       get { return InnerList[index]; }\r
-                       set { \r
-                               if (index < 0 || index >= InnerList.Count)\r
-                                       throw new ArgumentOutOfRangeException ("index");\r
-\r
-                               object oldValue;\r
-                               // make sure we have been given a valid value\r
-                               OnValidate(value);\r
-                               // save a reference to the object that is in the list now\r
-                               oldValue = InnerList[index];\r
-                               \r
-                               OnSet(index, oldValue, value);\r
-                               InnerList[index] = value;\r
-                               try {\r
-                                       OnSetComplete(index, oldValue, value);\r
-                               } catch {\r
-                                       InnerList[index] = oldValue;\r
-                                       throw;\r
-                               }\r
-                       }\r
-               }\r
-       }\r
-}\r
+
+using System;
+using System.Runtime.InteropServices;
+
+namespace System.Collections {
+
+#if NET_2_0
+       [ComVisible(true)]
+#endif
+       [Serializable]
+       public abstract class CollectionBase : IList, ICollection, IEnumerable {
+
+               // private instance properties
+               private ArrayList list;
+               
+               // public instance properties
+               public int Count { get { return InnerList.Count; } }
+               
+               // Public Instance Methods
+               public IEnumerator GetEnumerator() { return InnerList.GetEnumerator(); }
+               public void Clear() { 
+                       OnClear();
+                       InnerList.Clear(); 
+                       OnClearComplete();
+               }
+               public void RemoveAt (int index) {
+                       object objectToRemove;
+                       objectToRemove = InnerList[index];
+                       OnValidate(objectToRemove);
+                       OnRemove(index, objectToRemove);
+                       InnerList.RemoveAt(index);
+                       OnRemoveComplete(index, objectToRemove);
+               }
+               
+               // Protected Instance Constructors
+               protected CollectionBase()
+               { 
+               }
+
+#if NET_2_0
+               protected CollectionBase (int capacity)
+               {
+                       list = new ArrayList (capacity);
+               }
+
+               public int Capacity {
+                       get {
+                               if (list == null)
+                                       list = new ArrayList ();
+                               
+                               return list.Capacity;
+                       }
+
+                       set {
+                               if (list == null)
+                                       list = new ArrayList ();
+                                                             
+                               list.Capacity = value;
+                       }
+               }
+                       
+#endif
+               
+               // Protected Instance Properties
+               protected ArrayList InnerList {
+                       get {
+                               if (list == null)
+                                       list = new ArrayList ();
+                               return list;
+                       } 
+               }
+               
+               protected IList List {get { return this; } }
+               
+               // Protected Instance Methods
+               protected virtual void OnClear() { }
+               protected virtual void OnClearComplete() { }
+               
+               protected virtual void OnInsert(int index, object value) { }
+               protected virtual void OnInsertComplete(int index, object value) { }
+
+               protected virtual void OnRemove(int index, object value) { }
+               protected virtual void OnRemoveComplete(int index, object value) { }
+
+               protected virtual void OnSet(int index, object oldValue, object newValue) { }
+               protected virtual void OnSetComplete(int index, object oldValue, object newValue) { }
+
+               protected virtual void OnValidate(object value) {
+                       if (null == value) {
+                               throw new System.ArgumentNullException("CollectionBase.OnValidate: Invalid parameter value passed to method: null");
+                       }
+               }
+               
+               // ICollection methods
+               void ICollection.CopyTo(Array array, int index) {
+                       InnerList.CopyTo(array, index);
+               }
+               object ICollection.SyncRoot {
+                       get { return InnerList.SyncRoot; }
+               }
+               bool ICollection.IsSynchronized {
+                       get { return InnerList.IsSynchronized; }
+               }
+
+               // IList methods
+               int IList.Add (object value) {
+                       int newPosition;
+                       OnValidate(value);
+                       newPosition = InnerList.Count;
+                       OnInsert(newPosition, value);
+                       InnerList.Add(value);
+                       try {
+                               OnInsertComplete(newPosition, value);
+                       } catch {
+                               InnerList.RemoveAt (newPosition);
+                               throw;
+                       }
+                       
+                       return newPosition;
+               }
+               
+               bool IList.Contains (object value) {
+                       return InnerList.Contains(value);
+               }
+
+               int IList.IndexOf (object value) {
+                       return InnerList.IndexOf(value);
+               }
+
+               void IList.Insert (int index, object value) {
+                       OnValidate(value);
+                       OnInsert(index, value);
+                       InnerList.Insert(index, value);
+                       try {
+                               OnInsertComplete(index, value);
+                       } catch {
+                               InnerList.RemoveAt (index);
+                               throw;
+                       }
+               }
+
+               void IList.Remove (object value) {
+                       int removeIndex;
+                       OnValidate(value);
+                       removeIndex = InnerList.IndexOf(value);
+                       if (removeIndex == -1)
+                               throw new ArgumentException ("The element cannot be found.", "value");
+                       OnRemove(removeIndex, value);
+                       InnerList.Remove(value);
+                       OnRemoveComplete(removeIndex, value);
+               }
+
+               // IList properties
+               bool IList.IsFixedSize { 
+                       get { return InnerList.IsFixedSize; }
+               }
+
+               bool IList.IsReadOnly { 
+                       get { return InnerList.IsReadOnly; }
+               }
+
+               object IList.this[int index] { 
+                       get { return InnerList[index]; }
+                       set { 
+                               if (index < 0 || index >= InnerList.Count)
+                                       throw new ArgumentOutOfRangeException ("index");
+
+                               object oldValue;
+                               // make sure we have been given a valid value
+                               OnValidate(value);
+                               // save a reference to the object that is in the list now
+                               oldValue = InnerList[index];
+                               
+                               OnSet(index, oldValue, value);
+                               InnerList[index] = value;
+                               try {
+                                       OnSetComplete(index, oldValue, value);
+                               } catch {
+                                       InnerList[index] = oldValue;
+                                       throw;
+                               }
+                       }
+               }
+       }
+}