wasSharp – Diff between revs 39 and 44

Subversion Repositories:
Rev:
Show entire fileIgnore whitespace
Rev 39 Rev 44
Line 20... Line 20...
20 /// An implementation of an observable HashSet. 20 /// An implementation of an observable HashSet.
21 /// </summary> 21 /// </summary>
22 /// <typeparam name="T">the object type</typeparam> 22 /// <typeparam name="T">the object type</typeparam>
23 public class ObservableHashSet<T> : ICollection<T>, INotifyCollectionChanged, IEnumerable<T> 23 public class ObservableHashSet<T> : ICollection<T>, INotifyCollectionChanged, IEnumerable<T>
24 { 24 {
25 private readonly ReaderWriterLockSlim SyncRoot = new ReaderWriterLockSlim(LockRecursionPolicy.SupportsRecursion); 25 private readonly ReaderWriterLockSlim _lock = new ReaderWriterLockSlim(LockRecursionPolicy.SupportsRecursion);
26 private readonly HashSet<T> store = new HashSet<T>(); 26 private readonly HashSet<T> store = new HashSet<T>();
Line 27... Line 27...
27   27  
28 public ObservableHashSet(HashSet<T> set) 28 public ObservableHashSet(HashSet<T> set)
29 { 29 {
-   30 _lock.EnterWriteLock();
-   31 try
30 SyncRoot.EnterWriteLock(); 32 {
-   33 UnionWith(set);
-   34 }
-   35 finally
31 UnionWith(set); 36 {
-   37 if (_lock.IsWriteLockHeld) _lock.ExitWriteLock();
32 SyncRoot.ExitWriteLock(); 38 }
Line 33... Line 39...
33 } 39 }
34   40  
35 public ObservableHashSet() 41 public ObservableHashSet()
Line 36... Line 42...
36 { 42 {
37 } 43 }
38   44  
-   45 public ObservableHashSet(T item)
-   46 {
39 public ObservableHashSet(T item) 47 _lock.EnterWriteLock();
-   48 try
-   49 {
-   50 Add(item);
40 { 51 }
-   52 finally
41 SyncRoot.EnterWriteLock(); 53 {
Line 42... Line 54...
42 Add(item); 54 if (_lock.IsWriteLockHeld) _lock.ExitWriteLock();
43 SyncRoot.ExitWriteLock(); 55 }
44 } 56 }
-   57  
-   58 public ObservableHashSet(ObservableHashSet<T> other)
45   59 {
-   60 _lock.EnterWriteLock();
-   61 try
-   62 {
46 public ObservableHashSet(ObservableHashSet<T> other) 63 UnionWith(other);
-   64 }
47 { 65 finally
Line 48... Line 66...
48 SyncRoot.EnterWriteLock(); 66 {
49 UnionWith(other); 67 if (_lock.IsWriteLockHeld) _lock.ExitWriteLock();
50 SyncRoot.ExitWriteLock(); 68 }
-   69 }
-   70  
51 } 71 public ObservableHashSet(IEnumerable<T> list)
-   72 {
-   73 _lock.EnterWriteLock();
-   74 try
52   75 {
-   76 UnionWith(list);
53 public ObservableHashSet(IEnumerable<T> list) 77 }
Line 54... Line 78...
54 { 78 finally
Line 55... Line 79...
55 SyncRoot.EnterWriteLock(); 79 {
56 UnionWith(list); 80 if (_lock.IsWriteLockHeld) _lock.ExitWriteLock();
57 SyncRoot.ExitWriteLock(); 81 }
-   82 }
-   83  
58 } 84 public bool IsVirgin { get; private set; } = true;
-   85  
59   86 public IEnumerator<T> GetEnumerator()
60 public bool IsVirgin { get; private set; } = true; 87 {
-   88 _lock.EnterReadLock();
-   89 try
-   90 {
-   91 using (var enumerator = store.GetEnumerator())
-   92 {
-   93 while (enumerator.MoveNext())
61   94 yield return enumerator.Current;
Line 62... Line 95...
62 public IEnumerator<T> GetEnumerator() 95 }
63 { 96 }
64 SyncRoot.EnterReadLock(); 97 finally
-   98 {
-   99 if (_lock.IsReadLockHeld) _lock.ExitReadLock();
65 var enumerator = store.GetEnumerator(); 100 }
-   101 }
66 SyncRoot.ExitReadLock(); 102  
67 return enumerator; 103 IEnumerator IEnumerable.GetEnumerator()
-   104 {
-   105 _lock.EnterReadLock();
-   106 try
-   107 {
-   108 using (var enumerator = store.GetEnumerator())
-   109 {
68 } 110 while (enumerator.MoveNext())
Line 69... Line 111...
69   111 yield return enumerator.Current;
70 IEnumerator IEnumerable.GetEnumerator() 112 }
71 { 113 }
-   114 finally
-   115 {
72 SyncRoot.EnterReadLock(); 116 if (_lock.IsReadLockHeld) _lock.ExitReadLock();
-   117 }
-   118 }
-   119  
73 var enumerator = GetEnumerator(); 120 public void Add(T item)
-   121 {
74 SyncRoot.ExitReadLock(); 122 _lock.EnterWriteLock();
75 return enumerator; 123 try
76 } 124 {
Line 77... Line 125...
77   125 store.Add(item);
78 public void Add(T item) 126 }
79 { 127 finally
-   128 {
-   129 if (_lock.IsWriteLockHeld) _lock.ExitWriteLock();
80 SyncRoot.EnterWriteLock(); 130 }
-   131 IsVirgin = false;
-   132 OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, item));
-   133 }
81 store.Add(item); 134  
-   135 public void Clear()
82 SyncRoot.ExitWriteLock(); 136 {
83 IsVirgin = false; 137 _lock.EnterWriteLock();
84 OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, item)); 138 try
85 } 139 {
Line 86... Line 140...
86   140 store.Clear();
87 public void Clear() 141 }
88 { 142 finally
-   143 {
-   144 if (_lock.IsWriteLockHeld) _lock.ExitWriteLock();
89 SyncRoot.EnterWriteLock(); 145 }
-   146 if (!IsVirgin)
-   147 OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));
-   148 IsVirgin = false;
90 store.Clear(); 149 }
91 SyncRoot.ExitWriteLock(); 150  
92 if (!IsVirgin) 151 public bool Contains(T item)
Line 93... Line 152...
93 OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset)); 152 {
94 IsVirgin = false; 153 _lock.EnterReadLock();
95 } 154 try
-   155 {
-   156 return store.Contains(item);
96   157 }
-   158 finally
-   159 {
-   160 if (_lock.IsReadLockHeld) _lock.ExitReadLock();
97 public bool Contains(T item) 161 }
-   162 }
98 { 163  
Line 99... Line 164...
99 SyncRoot.EnterReadLock(); 164 public void CopyTo(T[] array, int arrayIndex)
100 var contains = store.Contains(item); 165 {
101 SyncRoot.ExitReadLock(); 166 _lock.EnterReadLock();
-   167 try
-   168 {
-   169 store.CopyTo(array, arrayIndex);
102 return contains; 170 }
-   171 finally
-   172 {
-   173 if (_lock.IsReadLockHeld) _lock.ExitReadLock();
103 } 174 }
-   175 }
104   176  
105 public void CopyTo(T[] array, int arrayIndex) 177 public bool Remove(T item)
106 { 178 {
107 SyncRoot.EnterReadLock(); 179 _lock.EnterWriteLock();
108 store.CopyTo(array, arrayIndex); 180 bool removed;
Line 127... Line 199...
127 public event NotifyCollectionChangedEventHandler CollectionChanged; 199 public event NotifyCollectionChangedEventHandler CollectionChanged;
Line 128... Line 200...
128   200  
129 public void UnionWith(IEnumerable<T> list) 201 public void UnionWith(IEnumerable<T> list)
130 { 202 {
131 var added = new List<T>(list.Except(store)); 203 var added = new List<T>(list.Except(store));
-   204 _lock.EnterWriteLock();
-   205 try
132 SyncRoot.EnterWriteLock(); 206 {
-   207 store.UnionWith(added);
-   208 }
-   209 finally
133 store.UnionWith(added); 210 {
-   211 if (_lock.IsWriteLockHeld) _lock.ExitWriteLock();
134 SyncRoot.ExitWriteLock(); 212 }
135 if (!IsVirgin && added.Any()) 213 if (!IsVirgin && added.Any())
136 OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, added)); 214 OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, added));
137 IsVirgin = false; 215 IsVirgin = false;
Line 143... Line 221...
143 } 221 }
Line 144... Line 222...
144   222  
145 public void ExceptWith(IEnumerable<T> list) 223 public void ExceptWith(IEnumerable<T> list)
146 { 224 {
147 var removed = new List<T>(list.Intersect(store)); 225 var removed = new List<T>(list.Intersect(store));
-   226 _lock.EnterWriteLock();
-   227 try
148 SyncRoot.EnterWriteLock(); 228 {
-   229 store.ExceptWith(removed);
-   230 }
-   231 finally
149 store.ExceptWith(removed); 232 {
-   233 if (_lock.IsWriteLockHeld) _lock.ExitWriteLock();
150 SyncRoot.ExitWriteLock(); 234 }
151 if (!IsVirgin && removed.Any()) 235 if (!IsVirgin && removed.Any())
152 OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Remove, 236 OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Remove,
153 removed)); 237 removed));
154 IsVirgin = false; 238 IsVirgin = false;
Line 155... Line 239...
155 } 239 }
156   240  
157 public void RemoveWhere(Func<T, bool> func) 241 public void RemoveWhere(Func<T, bool> func)
158 { 242 {
-   243 var removed = new List<T>(store.Where(func));
-   244 _lock.EnterWriteLock();
159 var removed = new List<T>(store.Where(func)); 245 try
-   246 {
-   247 store.ExceptWith(removed);
-   248 }
160 SyncRoot.EnterWriteLock(); 249 finally
-   250 {
161 store.ExceptWith(removed); 251 if (_lock.IsWriteLockHeld) _lock.ExitWriteLock();
162 SyncRoot.ExitWriteLock(); 252 }
163 if (!IsVirgin && removed.Any()) 253 if (!IsVirgin && removed.Any())
164 OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Remove, 254 OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Remove,
165 removed)); 255 removed));
Line 166... Line 256...
166 IsVirgin = false; 256 IsVirgin = false;
167 } 257 }
168   258  
-   259 public IEnumerable<T> AsEnumerable()
-   260 {
169 public IEnumerable<T> AsEnumerable() 261 _lock.EnterWriteLock();
-   262 try
-   263 {
-   264 return store.AsEnumerable();
170 { 265 }
171 SyncRoot.EnterWriteLock(); 266 finally
172 var enumerable = store.AsEnumerable(); 267 {
173 SyncRoot.ExitWriteLock(); 268 if (_lock.IsWriteLockHeld) _lock.ExitWriteLock();
174 return enumerable; 269 }