wasSharp – Blame information for rev 40

Subversion Repositories:
Rev:
Rev Author Line No. Line
40 office 1 ///////////////////////////////////////////////////////////////////////////
2 // Copyright (C) Wizardry and Steamworks 2017 - License: GNU GPLv3 //
3 // Please see: http://www.gnu.org/licenses/gpl.html for legal details, //
4 // rights of fair usage, the disclaimer and warranty conditions. //
5 ///////////////////////////////////////////////////////////////////////////
6  
7 using System.Collections;
8 using System.Collections.Generic;
9 using System.Threading;
10  
11 namespace wasSharp.Collections.Specialized
12 {
13 public static class ConcurrentListExtensions
14 {
15 public static ConcurrentList<T> ToConcurrentList<T>(this IEnumerable<T> enumerable)
16 {
17 return new ConcurrentList<T>(enumerable);
18 }
19 }
20  
21 public class ConcurrentList<T> : IList<T>
22 {
23 private readonly ReaderWriterLockSlim _lock = new ReaderWriterLockSlim(LockRecursionPolicy.SupportsRecursion);
24 private readonly List<T> _list = null;
25  
26 public ConcurrentList(IEnumerable<T> v)
27 {
28 try
29 {
30 _lock.EnterWriteLock();
31 _list = new List<T>();
32 foreach (var i in v)
33 {
34 _list.Add(i);
35 }
36 }
37 finally
38 {
39 if (_lock.IsWriteLockHeld) _lock.ExitWriteLock();
40 }
41 }
42  
43 public ConcurrentList()
44 {
45 try
46 {
47 _lock.EnterWriteLock();
48 _list = new List<T>();
49 }
50 finally
51 {
52 if (_lock.IsWriteLockHeld) _lock.ExitWriteLock();
53 }
54 }
55  
56 public int Count
57 {
58 get
59 {
60 _lock.EnterReadLock();
61 var c = _list.Count;
62 _lock.ExitReadLock();
63 return c;
64 }
65 }
66  
67 public bool IsReadOnly
68 {
69 get
70 {
71 try
72 {
73 _lock.EnterReadLock();
74 return ((IList<T>)_list).IsReadOnly;
75 }
76 finally
77 {
78 if (_lock.IsReadLockHeld) _lock.ExitReadLock();
79 }
80 }
81 }
82  
83 public T this[int index]
84 {
85 get
86 {
87 try
88 {
89 _lock.EnterReadLock();
90 return _list[index];
91 }
92 finally
93 {
94 if (_lock.IsReadLockHeld) _lock.ExitReadLock();
95 }
96 }
97  
98 set
99 {
100 try
101 {
102 _lock.EnterWriteLock();
103 _list[index] = value;
104 }
105 finally
106 {
107 if (_lock.IsWriteLockHeld) _lock.ExitWriteLock();
108 }
109 }
110 }
111  
112 public int IndexOf(T item)
113 {
114 try
115 {
116 _lock.EnterReadLock();
117 return _list.IndexOf(item);
118 }
119 finally
120 {
121 if (_lock.IsReadLockHeld) _lock.ExitReadLock();
122 }
123 }
124  
125 public void Insert(int index, T item)
126 {
127 try
128 {
129 _lock.EnterWriteLock();
130 _list.Insert(index, item);
131 }
132 finally
133 {
134 if (_lock.IsWriteLockHeld) _lock.ExitWriteLock();
135 }
136 }
137  
138 public void RemoveAt(int index)
139 {
140 try
141 {
142 _lock.EnterWriteLock();
143 _list.RemoveAt(index);
144 }
145 finally
146 {
147 if (_lock.IsWriteLockHeld) _lock.ExitWriteLock();
148 }
149 }
150  
151 public void Add(T item)
152 {
153 try
154 {
155 _lock.EnterWriteLock();
156 _list.Add(item);
157 }
158 finally
159 {
160 if (_lock.IsWriteLockHeld) _lock.ExitWriteLock();
161 }
162 }
163  
164 public void Clear()
165 {
166 try
167 {
168 _lock.EnterWriteLock();
169 _list.Clear();
170 }
171 finally
172 {
173 if (_lock.IsWriteLockHeld) _lock.ExitWriteLock();
174 }
175 }
176  
177 public bool Contains(T item)
178 {
179 try
180 {
181 _lock.EnterReadLock();
182 return _list.Contains(item);
183 }
184 finally
185 {
186 if (_lock.IsReadLockHeld) _lock.ExitReadLock();
187 }
188 }
189  
190 public void CopyTo(T[] array, int arrayIndex)
191 {
192 try
193 {
194 _lock.EnterReadLock();
195 _list.CopyTo(array, arrayIndex);
196 }
197 finally
198 {
199 if (_lock.IsReadLockHeld) _lock.ExitReadLock();
200 }
201 }
202  
203 public bool Remove(T item)
204 {
205 try
206 {
207 _lock.EnterWriteLock();
208 return _list.Remove(item);
209 }
210 finally
211 {
212 if (_lock.IsWriteLockHeld) _lock.ExitWriteLock();
213 }
214 }
215  
216 public IEnumerator<T> GetEnumerator()
217 {
218 try
219 {
220 _lock.EnterReadLock();
221 return ((IList<T>)_list).GetEnumerator();
222 }
223 finally
224 {
225 if (_lock.IsReadLockHeld) _lock.ExitReadLock();
226 }
227 }
228  
229 IEnumerator IEnumerable.GetEnumerator()
230 {
231 try
232 {
233 _lock.EnterReadLock();
234 return ((IList<T>)_list).GetEnumerator();
235 }
236 finally
237 {
238 if (_lock.IsReadLockHeld) _lock.ExitReadLock();
239 }
240 }
241 }
242 }