From 250a4048cda2fdee5893a1e5595636b55296b512 Mon Sep 17 00:00:00 2001 From: SoundOfScooting Date: Sat, 13 Jun 2026 00:12:08 -0400 Subject: [PATCH] Add Queue.TryPeek, Queue.TryDequeue --- apiCount.include.md | 18 ++++++------ api_list.include.md | 2 ++ src/Consume/Consume.cs | 2 ++ src/Polyfill/Polyfill_Queue.cs | 37 ++++++++++++++++++++++++ src/Tests/PolyfillTests_Queue.cs | 49 ++++++++++++++++++++++++++++++++ 5 files changed, 99 insertions(+), 9 deletions(-) diff --git a/apiCount.include.md b/apiCount.include.md index 3045d82e..f4671527 100644 --- a/apiCount.include.md +++ b/apiCount.include.md @@ -1,17 +1,17 @@ -**API count: 986** +**API count: 988** ### Per Target Framework | Target | APIs | | -- | -- | -| `net461` | 951 | -| `net462` | 951 | -| `net47` | 950 | -| `net471` | 949 | -| `net472` | 945 | -| `net48` | 945 | -| `net481` | 945 | -| `netstandard2.0` | 947 | +| `net461` | 953 | +| `net462` | 953 | +| `net47` | 952 | +| `net471` | 951 | +| `net472` | 947 | +| `net48` | 947 | +| `net481` | 947 | +| `netstandard2.0` | 949 | | `netstandard2.1` | 778 | | `netcoreapp2.0` | 870 | | `netcoreapp2.1` | 789 | diff --git a/api_list.include.md b/api_list.include.md index 2cf78fb6..75f75244 100644 --- a/api_list.include.md +++ b/api_list.include.md @@ -806,6 +806,8 @@ * Note: No-op on older targets; the BCL grows the backing storage. * `void TrimExcess(int)` [reference](https://learn.microsoft.com/en-us/dotnet/api/system.collections.generic.queue-1.trimexcess?view=net-11.0#system-collections-generic-queue-1-trimexcess(system-int32)) * Note: No-op on older targets; the BCL shrinks the backing storage. + * `bool TryPeek(T)` [reference](https://learn.microsoft.com/en-us/dotnet/api/system.collections.generic.queue-1.trypeek?view=net-11.0) + * `bool TryDequeue(T)` [reference](https://learn.microsoft.com/en-us/dotnet/api/system.collections.generic.queue-1.trydequeue?view=net-11.0) #### Random diff --git a/src/Consume/Consume.cs b/src/Consume/Consume.cs index 7fa0b4fb..ba6ab4a7 100644 --- a/src/Consume/Consume.cs +++ b/src/Consume/Consume.cs @@ -1141,6 +1141,8 @@ void List_Methods() void Queue_Methods() { var queue = new Queue(); + queue.TryPeek(out var ch1); + queue.TryDequeue(out var ch2); queue.EnsureCapacity(1); queue.TrimExcess(1); queue.TrimExcess(); diff --git a/src/Polyfill/Polyfill_Queue.cs b/src/Polyfill/Polyfill_Queue.cs index c288a1df..19e97d0b 100644 --- a/src/Polyfill/Polyfill_Queue.cs +++ b/src/Polyfill/Polyfill_Queue.cs @@ -1,6 +1,7 @@ namespace Polyfills; using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; static partial class Polyfill { @@ -28,5 +29,41 @@ public static void TrimExcess(this Queue target, int capacity) { } +#endif + +#if NETSTANDARD2_0 || NETFRAMEWORK + + /// + /// Returns a value that indicates whether there is an object at the beginning of the , and if one is present, copies it to the result parameter. The object is not removed from the . + /// + //Link: https://learn.microsoft.com/en-us/dotnet/api/system.collections.generic.queue-1.trypeek?view=net-11.0 + public static bool TryPeek(this Queue target, [MaybeNullWhen(false)] out T result) + { + if (target.Count > 0) + { + result = target.Peek(); + return true; + } + + result = default; + return false; + } + + /// + /// Removes the object at the beginning of the , and copies it to the result parameter. + /// + //Link: https://learn.microsoft.com/en-us/dotnet/api/system.collections.generic.queue-1.trydequeue?view=net-11.0 + public static bool TryDequeue(this Queue target, [MaybeNullWhen(false)] out T result) + { + if (target.Count > 0) + { + result = target.Dequeue(); + return true; + } + + result = default; + return false; + } + #endif } diff --git a/src/Tests/PolyfillTests_Queue.cs b/src/Tests/PolyfillTests_Queue.cs index 47d9b09f..fb8ab855 100644 --- a/src/Tests/PolyfillTests_Queue.cs +++ b/src/Tests/PolyfillTests_Queue.cs @@ -22,4 +22,53 @@ public async Task Queue_TrimExcess() // Should not throw await Assert.That(queue.Count).IsEqualTo(10); } + + [Test] + public async Task Queue_TryPeek() + { + var queue = new Queue(); + + // Test when queue is empty + var result = queue.TryPeek(out var value); + await Assert.That(result).IsFalse(); + await Assert.That(value).IsEqualTo(0); + + // Test when queue has elements + queue.Enqueue(1); + queue.Enqueue(2); + queue.Enqueue(3); + + result = queue.TryPeek(out value); + await Assert.That(result).IsTrue(); + // The top element should be 1 + await Assert.That(value).IsEqualTo(1); + + // Ensure the queue is not modified + await Assert.That(queue.Count).IsEqualTo(3); + } + + [Test] + public async Task Queue_TryDequeue() + { + var queue = new Queue(); + + // Test when queue is empty + var result = queue.TryDequeue(out var value); + await Assert.That(result).IsFalse(); + await Assert.That(value).IsEqualTo(0); + + // Test when queue has elements + queue.Enqueue(1); + queue.Enqueue(2); + queue.Enqueue(3); + + result = queue.TryDequeue(out value); + await Assert.That(result).IsTrue(); + // The top element should be 1 + await Assert.That(value).IsEqualTo(1); + + // Ensure the queue is modified + await Assert.That(queue.Count).IsEqualTo(2); + await Assert.That(queue.Peek()).IsEqualTo(2); + } }