Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches

◆ Enumerate()

static IEnumerator< T > System.Collections.Concurrent.ConcurrentQueue< T >.Enumerate ( ConcurrentQueueSegment< T > head,
int headHead,
ConcurrentQueueSegment< T > tail,
int tailTail )
inlinestaticprivateinherited

Definition at line 269 of file ConcurrentQueue.cs.

270 {
271 int headTail = ((head == tail) ? tailTail : Volatile.Read(ref head._headAndTail.Tail)) - head.FreezeOffset;
272 if (headHead < headTail)
273 {
274 headHead &= head._slotsMask;
275 headTail &= head._slotsMask;
276 if (headHead < headTail)
277 {
278 for (int l = headHead; l < headTail; l++)
279 {
280 yield return GetItemWhenAvailable(head, l);
281 }
282 }
283 else
284 {
285 for (int l = headHead; l < head._slots.Length; l++)
286 {
287 yield return GetItemWhenAvailable(head, l);
288 }
289 for (int l = 0; l < headTail; l++)
290 {
291 yield return GetItemWhenAvailable(head, l);
292 }
293 }
294 }
295 if (head == tail)
296 {
297 yield break;
298 }
299 for (ConcurrentQueueSegment<T> s = head._nextSegment; s != tail; s = s._nextSegment)
300 {
301 int l = s._headAndTail.Tail - s.FreezeOffset;
302 for (int j = 0; j < l; j++)
303 {
304 yield return GetItemWhenAvailable(s, j);
305 }
306 }
307 tailTail -= tail.FreezeOffset;
308 for (int l = 0; l < tailTail; l++)
309 {
310 yield return GetItemWhenAvailable(tail, l);
311 }
312 }
static T GetItemWhenAvailable(ConcurrentQueueSegment< T > segment, int i)

References System.Collections.Concurrent.ConcurrentQueue< T >.GetItemWhenAvailable(), System.Threading.Volatile.Read(), and System.s.

Referenced by System.Collections.Concurrent.ConcurrentQueue< T >.CopyTo(), System.Collections.Concurrent.ConcurrentQueue< T >.GetEnumerator(), and System.Collections.Concurrent.ConcurrentQueue< T >.ToArray().