/*************************************************************************************************** Copyright (C) 2025 The Qt Company Ltd. SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only ***************************************************************************************************/ using System.Collections; using System.Collections.Generic; namespace Qt.DotNet.Utils.Collections.Concurrent { public interface IPrioritizable where TPrio : IComparable, IEquatable { TPrio Priority { get; } } public class ConcurrentPriorityList : IEnumerable where T : IPrioritizable where TPrio : IComparable, IEquatable { private readonly object criticalSection = new(); private ulong timestamp = 0; private class PriorityComparer : IComparer<(TPrio Prio, ulong Timestamp)> { public int Compare((TPrio Prio, ulong Timestamp) x, (TPrio Prio, ulong Timestamp) y) { if (!x.Prio.Equals(y.Prio)) return x.Prio.CompareTo(y.Prio); return x.Timestamp.CompareTo(y.Timestamp); } } private SortedList<(TPrio Prio, ulong Timestamp), T> items = new(new PriorityComparer()); private IEnumerable Items { get { lock (criticalSection) return items.Values.ToList(); } } public IEnumerator GetEnumerator() => Items.GetEnumerator(); IEnumerator IEnumerable.GetEnumerator() => ((IEnumerable)Items).GetEnumerator(); public void Add(T item) { if (item == null) throw new ArgumentNullException(nameof(item)); lock (criticalSection) items.Add((item.Priority, ++timestamp), item); } } }