diff --git a/ArchiSteamFarm/Collections/ConcurrentEnumerator.cs b/ArchiSteamFarm/Collections/ConcurrentEnumerator.cs new file mode 100644 index 000000000..66bc62e69 --- /dev/null +++ b/ArchiSteamFarm/Collections/ConcurrentEnumerator.cs @@ -0,0 +1,52 @@ +// _ _ _ ____ _ _____ +// / \ _ __ ___ | |__ (_)/ ___| | |_ ___ __ _ _ __ ___ | ___|__ _ _ __ _ __ ___ +// / _ \ | '__|/ __|| '_ \ | |\___ \ | __|/ _ \ / _` || '_ ` _ \ | |_ / _` || '__|| '_ ` _ \ +// / ___ \ | | | (__ | | | || | ___) || |_| __/| (_| || | | | | || _|| (_| || | | | | | | | +// /_/ \_\|_| \___||_| |_||_||____/ \__|\___| \__,_||_| |_| |_||_| \__,_||_| |_| |_| |_| +// | +// Copyright 2015-2019 Ɓukasz "JustArchi" Domeradzki +// Contact: JustArchi@JustArchi.net +// | +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// | +// http://www.apache.org/licenses/LICENSE-2.0 +// | +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +using System; +using System.Collections; +using System.Collections.Generic; +using System.Threading; +using JetBrains.Annotations; + +namespace ArchiSteamFarm.Collections { + internal sealed class ConcurrentEnumerator : IEnumerator { + public T Current => Enumerator.Current; + + private readonly IEnumerator Enumerator; + private readonly SemaphoreSlim Semaphore; + + object IEnumerator.Current => Current; + + internal ConcurrentEnumerator([NotNull] IReadOnlyCollection collection, [NotNull] SemaphoreSlim semaphore) { + if ((collection == null) || (semaphore == null)) { + throw new ArgumentNullException(nameof(collection) + " || " + nameof(semaphore)); + } + + Semaphore = semaphore; + semaphore.Wait(); + + Enumerator = collection.GetEnumerator(); + } + + public void Dispose() => Semaphore.Release(); + public bool MoveNext() => Enumerator.MoveNext(); + public void Reset() => Enumerator.Reset(); + } +} diff --git a/ArchiSteamFarm/Collections/ConcurrentSortedHashSet.cs b/ArchiSteamFarm/Collections/ConcurrentSortedHashSet.cs index 0bc5c0671..6386e1080 100644 --- a/ArchiSteamFarm/Collections/ConcurrentSortedHashSet.cs +++ b/ArchiSteamFarm/Collections/ConcurrentSortedHashSet.cs @@ -97,7 +97,7 @@ namespace ArchiSteamFarm.Collections { } } - public IEnumerator GetEnumerator() => new ConcurrentEnumerator(BackingCollection, CollectionSemaphore); + public IEnumerator GetEnumerator() => new ConcurrentEnumerator(BackingCollection, CollectionSemaphore); public void IntersectWith(IEnumerable other) { CollectionSemaphore.Wait(); @@ -217,29 +217,5 @@ namespace ArchiSteamFarm.Collections { CollectionSemaphore.Release(); } } - - private sealed class ConcurrentEnumerator : IEnumerator { - public T Current => Enumerator.Current; - - private readonly IEnumerator Enumerator; - private readonly SemaphoreSlim Semaphore; - - object IEnumerator.Current => Current; - - internal ConcurrentEnumerator([NotNull] IReadOnlyCollection collection, [NotNull] SemaphoreSlim semaphore) { - if ((collection == null) || (semaphore == null)) { - throw new ArgumentNullException(nameof(collection) + " || " + nameof(semaphore)); - } - - Semaphore = semaphore; - semaphore.Wait(); - - Enumerator = collection.GetEnumerator(); - } - - public void Dispose() => Semaphore.Release(); - public bool MoveNext() => Enumerator.MoveNext(); - public void Reset() => Enumerator.Reset(); - } } }