Mercurial > pub > ImplabNet
comparison Implab/Components/ComponentContainer.cs @ 152:240aa6994018 v2
component model refactoring
author | cin |
---|---|
date | Thu, 11 Feb 2016 01:56:27 +0300 |
parents | |
children | b933ec88446e |
comparison
equal
deleted
inserted
replaced
151:ec91a6dfa5b3 | 152:240aa6994018 |
---|---|
1 using System; | |
2 using System.Collections.Generic; | |
3 using System.Linq; | |
4 | |
5 namespace Implab.Components { | |
6 /// <summary> | |
7 /// Component container. | |
8 /// </summary> | |
9 /// <remarks>Instanses of this class are thread safe.</remarks> | |
10 public class ComponentContainer<T> : Disposable, ICollection<T> { | |
11 readonly HashSet<T> m_components = new HashSet<T>(); | |
12 | |
13 public void Clear() { | |
14 T[] removed; | |
15 | |
16 lock (m_components) { | |
17 removed = new T[m_components.Count]; | |
18 m_components.CopyTo(removed); | |
19 m_components.Clear(); | |
20 } | |
21 | |
22 foreach (var item in removed.OfType<IDisposable>()) | |
23 item.Dispose(); | |
24 } | |
25 | |
26 public bool Contains(T item) { | |
27 lock (m_components) | |
28 return m_components.Contains(item); | |
29 } | |
30 | |
31 public void CopyTo(T[] array, int arrayIndex) { | |
32 lock (m_components) | |
33 m_components.CopyTo(array, arrayIndex); | |
34 } | |
35 | |
36 public bool Remove(T item) { | |
37 lock (m_components) | |
38 return m_components.Remove(item); | |
39 } | |
40 | |
41 public int Count { | |
42 get { | |
43 lock (m_components) | |
44 return m_components.Count; | |
45 } | |
46 } | |
47 | |
48 public bool IsReadOnly { | |
49 get { | |
50 return false; | |
51 } | |
52 } | |
53 | |
54 public IEnumerator<T> GetEnumerator() { | |
55 T[] items; | |
56 lock (m_components) { | |
57 items = new T[m_components.Count]; | |
58 m_components.CopyTo(items); | |
59 return (IEnumerator<T>)items.GetEnumerator(); | |
60 } | |
61 } | |
62 | |
63 System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() { | |
64 return GetEnumerator(); | |
65 } | |
66 | |
67 public void Add(T item) { | |
68 Safe.ArgumentNotNull(item, "item"); | |
69 | |
70 lock (m_components) { | |
71 if (IsDisposed) | |
72 Safe.Dispose(item); | |
73 else | |
74 m_components.Add(item); | |
75 } | |
76 } | |
77 | |
78 protected override void Dispose(bool disposing) { | |
79 base.Dispose(disposing); | |
80 Clear(); | |
81 } | |
82 } | |
83 } | |
84 |