Mercurial > pub > ImplabNet
comparison Implab/Components/ComponentContainer.cs @ 153:b933ec88446e v2
docs
| author | cin |
|---|---|
| date | Fri, 12 Feb 2016 00:59:29 +0300 |
| parents | 240aa6994018 |
| children | 1e082fb67a46 |
comparison
equal
deleted
inserted
replaced
| 152:240aa6994018 | 153:b933ec88446e |
|---|---|
| 2 using System.Collections.Generic; | 2 using System.Collections.Generic; |
| 3 using System.Linq; | 3 using System.Linq; |
| 4 | 4 |
| 5 namespace Implab.Components { | 5 namespace Implab.Components { |
| 6 /// <summary> | 6 /// <summary> |
| 7 /// Component container. | 7 /// Component container, used to store track components in multi-threaded environmment. |
| 8 /// </summary> | 8 /// </summary> |
| 9 /// <remarks>Instanses of this class are thread safe.</remarks> | 9 /// <remarks>Instanses of this class are thread safe.</remarks> |
| 10 public class ComponentContainer<T> : Disposable, ICollection<T> { | 10 public class ComponentContainer<T> : Disposable, ICollection<T> { |
| 11 readonly HashSet<T> m_components = new HashSet<T>(); | 11 readonly HashSet<T> m_components = new HashSet<T>(); |
| 12 | 12 |
| 13 /// <summary> | |
| 14 /// Removes currently stored compoenents from the container and disposes them if possible. | |
| 15 /// </summary> | |
| 16 /// <remarks> | |
| 17 /// A new components may be added before this method completes. | |
| 18 /// </remarks> | |
| 13 public void Clear() { | 19 public void Clear() { |
| 14 T[] removed; | 20 T[] removed; |
| 15 | 21 |
| 16 lock (m_components) { | 22 lock (m_components) { |
| 17 removed = new T[m_components.Count]; | 23 removed = new T[m_components.Count]; |
| 21 | 27 |
| 22 foreach (var item in removed.OfType<IDisposable>()) | 28 foreach (var item in removed.OfType<IDisposable>()) |
| 23 item.Dispose(); | 29 item.Dispose(); |
| 24 } | 30 } |
| 25 | 31 |
| 32 /// <summary> | |
| 33 /// Checks whether the specified item in the collection. | |
| 34 /// </summary> | |
| 35 /// <param name="item">The item to check.</param> | |
| 26 public bool Contains(T item) { | 36 public bool Contains(T item) { |
| 27 lock (m_components) | 37 lock (m_components) |
| 28 return m_components.Contains(item); | 38 return m_components.Contains(item); |
| 29 } | 39 } |
| 30 | 40 |
| 41 /// <summary> | |
| 42 /// Copies currently stored components to the specified array. | |
| 43 /// </summary> | |
| 44 /// <param name="array">A destination array for components.</param> | |
| 45 /// <param name="arrayIndex">A starting index in the destination array.</param> | |
| 31 public void CopyTo(T[] array, int arrayIndex) { | 46 public void CopyTo(T[] array, int arrayIndex) { |
| 32 lock (m_components) | 47 lock (m_components) |
| 33 m_components.CopyTo(array, arrayIndex); | 48 m_components.CopyTo(array, arrayIndex); |
| 34 } | 49 } |
| 35 | 50 |
| 51 /// <summary> | |
| 52 /// Remove the specified item from the collection. | |
| 53 /// </summary> | |
| 54 /// <param name="item">The item to remove.</param> | |
| 36 public bool Remove(T item) { | 55 public bool Remove(T item) { |
| 37 lock (m_components) | 56 lock (m_components) |
| 38 return m_components.Remove(item); | 57 return m_components.Remove(item); |
| 39 } | 58 } |
| 40 | 59 |
| 60 /// <summary> | |
| 61 /// Gets the count of components in the collection. | |
| 62 /// </summary> | |
| 41 public int Count { | 63 public int Count { |
| 42 get { | 64 get { |
| 43 lock (m_components) | 65 lock (m_components) |
| 44 return m_components.Count; | 66 return m_components.Count; |
| 45 } | 67 } |
| 46 } | 68 } |
| 47 | 69 |
| 70 /// <summary> | |
| 71 /// Gets a value indicating whether this instance is read only. | |
| 72 /// </summary> | |
| 73 /// <remarks> | |
| 74 /// Always false. | |
| 75 /// </remarks> | |
| 48 public bool IsReadOnly { | 76 public bool IsReadOnly { |
| 49 get { | 77 get { |
| 50 return false; | 78 return false; |
| 51 } | 79 } |
| 52 } | 80 } |
| 53 | 81 |
| 82 /// <summary> | |
| 83 /// Gets the enumerator for components in the collection. | |
| 84 /// </summary> | |
| 85 /// <returns>The enumerator.</returns> | |
| 54 public IEnumerator<T> GetEnumerator() { | 86 public IEnumerator<T> GetEnumerator() { |
| 55 T[] items; | 87 T[] items; |
| 56 lock (m_components) { | 88 lock (m_components) { |
| 57 items = new T[m_components.Count]; | 89 items = new T[m_components.Count]; |
| 58 m_components.CopyTo(items); | 90 m_components.CopyTo(items); |
| 62 | 94 |
| 63 System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() { | 95 System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() { |
| 64 return GetEnumerator(); | 96 return GetEnumerator(); |
| 65 } | 97 } |
| 66 | 98 |
| 99 /// <summary> | |
| 100 /// Add the specified item to the collection. | |
| 101 /// </summary> | |
| 102 /// <param name="item">The item to add.</param> | |
| 103 /// <remarks> | |
| 104 /// If the collection is alredy disposed, the item isn't added to the collection and disposed if possible. | |
| 105 /// </remarks> | |
| 67 public void Add(T item) { | 106 public void Add(T item) { |
| 68 Safe.ArgumentNotNull(item, "item"); | 107 Safe.ArgumentNotNull(item, "item"); |
| 69 | 108 |
| 70 lock (m_components) { | 109 lock (m_components) { |
| 71 if (IsDisposed) | 110 if (IsDisposed) |
| 73 else | 112 else |
| 74 m_components.Add(item); | 113 m_components.Add(item); |
| 75 } | 114 } |
| 76 } | 115 } |
| 77 | 116 |
| 117 /// <summary> | |
| 118 /// Disposes the components stored in the collection. | |
| 119 /// </summary> | |
| 120 /// <param name="disposing">If set to <c>true</c> the collection is disposing.</param> | |
| 78 protected override void Dispose(bool disposing) { | 121 protected override void Dispose(bool disposing) { |
| 79 base.Dispose(disposing); | 122 base.Dispose(disposing); |
| 80 Clear(); | 123 Clear(); |
| 81 } | 124 } |
| 82 } | 125 } |
