| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316 |
- //-----------------------------------------------------------------------------
- // Copyright (c) Microsoft Corporation. All rights reserved.
- //-----------------------------------------------------------------------------
- namespace System.Collections.Generic
- {
- using System;
- using System.Collections;
- using System.Diagnostics;
- using System.ServiceModel;
- [System.Runtime.InteropServices.ComVisible(false)]
- public class SynchronizedCollection<T> : IList<T>, IList
- {
- List<T> items;
- object sync;
- public SynchronizedCollection()
- {
- this.items = new List<T>();
- this.sync = new Object();
- }
- public SynchronizedCollection(object syncRoot)
- {
- if (syncRoot == null)
- throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentNullException("syncRoot"));
- this.items = new List<T>();
- this.sync = syncRoot;
- }
- public SynchronizedCollection(object syncRoot, IEnumerable<T> list)
- {
- if (syncRoot == null)
- throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentNullException("syncRoot"));
- if (list == null)
- throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentNullException("list"));
- this.items = new List<T>(list);
- this.sync = syncRoot;
- }
- public SynchronizedCollection(object syncRoot, params T[] list)
- {
- if (syncRoot == null)
- throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentNullException("syncRoot"));
- if (list == null)
- throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentNullException("list"));
- this.items = new List<T>(list.Length);
- for (int i = 0; i < list.Length; i++)
- this.items.Add(list[i]);
- this.sync = syncRoot;
- }
- public int Count
- {
- get { lock (this.sync) { return this.items.Count; } }
- }
- protected List<T> Items
- {
- get { return this.items; }
- }
- public object SyncRoot
- {
- get { return this.sync; }
- }
- public T this[int index]
- {
- get
- {
- lock (this.sync)
- {
- return this.items[index];
- }
- }
- set
- {
- lock (this.sync)
- {
- if (index < 0 || index >= this.items.Count)
- throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentOutOfRangeException("index", index,
- SR.GetString(SR.ValueMustBeInRange, 0, this.items.Count - 1)));
- this.SetItem(index, value);
- }
- }
- }
- public void Add(T item)
- {
- lock (this.sync)
- {
- int index = this.items.Count;
- this.InsertItem(index, item);
- }
- }
- public void Clear()
- {
- lock (this.sync)
- {
- this.ClearItems();
- }
- }
- public void CopyTo(T[] array, int index)
- {
- lock (this.sync)
- {
- this.items.CopyTo(array, index);
- }
- }
- public bool Contains(T item)
- {
- lock (this.sync)
- {
- return this.items.Contains(item);
- }
- }
- public IEnumerator<T> GetEnumerator()
- {
- lock (this.sync)
- {
- return this.items.GetEnumerator();
- }
- }
- public int IndexOf(T item)
- {
- lock (this.sync)
- {
- return this.InternalIndexOf(item);
- }
- }
- public void Insert(int index, T item)
- {
- lock (this.sync)
- {
- if (index < 0 || index > this.items.Count)
- throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentOutOfRangeException("index", index,
- SR.GetString(SR.ValueMustBeInRange, 0, this.items.Count)));
- this.InsertItem(index, item);
- }
- }
- int InternalIndexOf(T item)
- {
- int count = items.Count;
- for (int i = 0; i < count; i++)
- {
- if (object.Equals(items[i], item))
- {
- return i;
- }
- }
- return -1;
- }
- public bool Remove(T item)
- {
- lock (this.sync)
- {
- int index = this.InternalIndexOf(item);
- if (index < 0)
- return false;
- this.RemoveItem(index);
- return true;
- }
- }
- public void RemoveAt(int index)
- {
- lock (this.sync)
- {
- if (index < 0 || index >= this.items.Count)
- throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentOutOfRangeException("index", index,
- SR.GetString(SR.ValueMustBeInRange, 0, this.items.Count - 1)));
- this.RemoveItem(index);
- }
- }
- protected virtual void ClearItems()
- {
- this.items.Clear();
- }
- protected virtual void InsertItem(int index, T item)
- {
- this.items.Insert(index, item);
- }
- protected virtual void RemoveItem(int index)
- {
- this.items.RemoveAt(index);
- }
- protected virtual void SetItem(int index, T item)
- {
- this.items[index] = item;
- }
- bool ICollection<T>.IsReadOnly
- {
- get { return false; }
- }
- IEnumerator IEnumerable.GetEnumerator()
- {
- return ((IList)this.items).GetEnumerator();
- }
- bool ICollection.IsSynchronized
- {
- get { return true; }
- }
- object ICollection.SyncRoot
- {
- get { return this.sync; }
- }
- void ICollection.CopyTo(Array array, int index)
- {
- lock (this.sync)
- {
- ((IList)this.items).CopyTo(array, index);
- }
- }
- object IList.this[int index]
- {
- get
- {
- return this[index];
- }
- set
- {
- VerifyValueType(value);
- this[index] = (T)value;
- }
- }
- bool IList.IsReadOnly
- {
- get { return false; }
- }
- bool IList.IsFixedSize
- {
- get { return false; }
- }
- int IList.Add(object value)
- {
- VerifyValueType(value);
- lock (this.sync)
- {
- this.Add((T)value);
- return this.Count - 1;
- }
- }
- bool IList.Contains(object value)
- {
- VerifyValueType(value);
- return this.Contains((T)value);
- }
- int IList.IndexOf(object value)
- {
- VerifyValueType(value);
- return this.IndexOf((T)value);
- }
- void IList.Insert(int index, object value)
- {
- VerifyValueType(value);
- this.Insert(index, (T)value);
- }
- void IList.Remove(object value)
- {
- VerifyValueType(value);
- this.Remove((T)value);
- }
- static void VerifyValueType(object value)
- {
- if (value == null)
- {
- if (typeof(T).IsValueType)
- {
- throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentException(SR.GetString(SR.SynchronizedCollectionWrongTypeNull)));
- }
- }
- else if (!(value is T))
- {
- throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentException(SR.GetString(SR.SynchronizedCollectionWrongType1, value.GetType().FullName)));
- }
- }
- }
- }
|