From 5b5556e908c88e1bc963a7ae6fc7e5a5a0dc800b Mon Sep 17 00:00:00 2001 From: kzrnm Date: Wed, 29 Nov 2023 00:20:08 +0900 Subject: [PATCH 1/3] Add PriorityQueue.DequeueEnqueue(T) --- .../STL/PriorityQueue/PriorityQueueOp.cs | 11 ++++ .../STL/PriorityQueue/PriorityQueueOp`2.cs | 16 ++++- .../STL/PriorityQueueTest.cs | 64 +++++++++++++++++-- 3 files changed, 84 insertions(+), 7 deletions(-) diff --git a/Source/ac-library-csharp/STL/PriorityQueue/PriorityQueueOp.cs b/Source/ac-library-csharp/STL/PriorityQueue/PriorityQueueOp.cs index 953b425..0131ae1 100644 --- a/Source/ac-library-csharp/STL/PriorityQueue/PriorityQueueOp.cs +++ b/Source/ac-library-csharp/STL/PriorityQueue/PriorityQueueOp.cs @@ -78,6 +78,17 @@ public T EnqueueDequeue(T value) return res; } /// + /// Dequeue してから を Enqueue(T) します。 + /// + [MethodImpl(256)] + public T DequeueEnqueue(T value) + { + var res = data[0]; + data[0] = value; + UpdateDown(0); + return res; + } + /// /// Dequeue した値に を適用して Enqueue(T) します。 /// [MethodImpl(256)] diff --git a/Source/ac-library-csharp/STL/PriorityQueue/PriorityQueueOp`2.cs b/Source/ac-library-csharp/STL/PriorityQueue/PriorityQueueOp`2.cs index 8153f5b..67788e2 100644 --- a/Source/ac-library-csharp/STL/PriorityQueue/PriorityQueueOp`2.cs +++ b/Source/ac-library-csharp/STL/PriorityQueue/PriorityQueueOp`2.cs @@ -57,8 +57,8 @@ public bool TryDequeue(out TKey key, out TValue value) { if (Count == 0) { - key = default(TKey); - value = default(TValue); + key = default; + value = default; return false; } (key, value) = Dequeue(); @@ -101,6 +101,18 @@ public KeyValuePair EnqueueDequeue(TKey key, TValue value) return res; } /// + /// Dequeue してから を Enqueue(T) します。 + /// + [MethodImpl(256)] + public KeyValuePair DequeueEnqueue(TKey key, TValue value) + { + var res = KeyValuePair.Create(keys[0], values[0]); + keys[0] = key; + values[0] = value; + UpdateDown(0); + return res; + } + /// /// Dequeue した値に を適用して Enqueue(T) します。 /// [MethodImpl(256)] diff --git a/Test/ac-library-csharp.Test/STL/PriorityQueueTest.cs b/Test/ac-library-csharp.Test/STL/PriorityQueueTest.cs index 98ca2a5..9810b2e 100644 --- a/Test/ac-library-csharp.Test/STL/PriorityQueueTest.cs +++ b/Test/ac-library-csharp.Test/STL/PriorityQueueTest.cs @@ -270,8 +270,62 @@ void EnqueueDequeue(int value) } } + [Fact] public void DequeueEnqueue() + { + var pq1 = new PriorityQueue(); + var pq2 = new PriorityQueue(); + for (int i = 10; i > 0; i--) + { + pq1.Enqueue(i); + pq2.Enqueue(i); + } + var mt = MTRandom.Create(); + + for (int i = -1; i < 20; i++) + { + DequeueEnqueue(); + } + + void DequeueEnqueue() + { + var value = mt.Next(); + pq1.DequeueEnqueue(value).Should().Be(pq2.Dequeue()); + pq2.Enqueue(value); + pq1.Unorderd().ToArray().Should().BeEquivalentTo(pq2.Unorderd().ToArray()); + } + } + + [Fact] + public void DequeueEnqueueKV() + { + var pq1 = new PriorityQueueDictionary(); + var pq2 = new PriorityQueueDictionary(); + for (int i = 10; i > 0; i--) + { + pq1.Enqueue(i, i.ToString()); + pq2.Enqueue(i, i.ToString()); + } + var mt = MTRandom.Create(); + + for (int i = -1; i < 20; i++) + { + DequeueEnqueue(); + } + + void DequeueEnqueue() + { + var key = mt.Next(); + var value = mt.Next().ToString(); + pq1.DequeueEnqueue(key, value).Should().Be(pq2.Dequeue()); + pq2.Enqueue(key, value); + pq1.UnorderdKeys().ToArray().Should().BeEquivalentTo(pq2.UnorderdKeys().ToArray()); + pq1.UnorderdValues().ToArray().Should().BeEquivalentTo(pq2.UnorderdValues().ToArray()); + } + } + [Fact] + public void DequeueEnqueueFunc() { var pq1 = new PriorityQueue(); var pq2 = new PriorityQueue(); @@ -285,10 +339,10 @@ public void DequeueEnqueue() for (int i = -1; i < 20; i++) { - EnqueueDequeue(); + DequeueEnqueue(); } - void EnqueueDequeue() + void DequeueEnqueue() { pq2.Enqueue(func(pq2.Dequeue())); pq1.DequeueEnqueue(func); @@ -297,7 +351,7 @@ void EnqueueDequeue() } [Fact] - public void DequeueEnqueueKV() + public void DequeueEnqueueFuncKV() { var pq1 = new PriorityQueueDictionary(); var pq2 = new PriorityQueueDictionary(); @@ -311,10 +365,10 @@ public void DequeueEnqueueKV() for (int i = -1; i < 20; i++) { - EnqueueDequeue(); + DequeueEnqueue(); } - void EnqueueDequeue() + void DequeueEnqueue() { var (k, v) = pq2.Dequeue(); var (ek, ev) = func(k, v); From 95ff028f2e3d073fc392f6f58d0f5e0fc8b68eb8 Mon Sep 17 00:00:00 2001 From: kzrnm Date: Wed, 29 Nov 2023 00:24:49 +0900 Subject: [PATCH 2/3] Add PriorityQueue.TryPeek(out T) --- .../STL/PriorityQueue/PriorityQueueOp.cs | 13 +++++++++- .../STL/PriorityQueue/PriorityQueueOp`2.cs | 25 ++++++++++++++++++- .../STL/PriorityQueueTest.cs | 13 +++++++--- 3 files changed, 46 insertions(+), 5 deletions(-) diff --git a/Source/ac-library-csharp/STL/PriorityQueue/PriorityQueueOp.cs b/Source/ac-library-csharp/STL/PriorityQueue/PriorityQueueOp.cs index 0131ae1..d3b4686 100644 --- a/Source/ac-library-csharp/STL/PriorityQueue/PriorityQueueOp.cs +++ b/Source/ac-library-csharp/STL/PriorityQueue/PriorityQueueOp.cs @@ -44,11 +44,22 @@ public void Enqueue(T value) UpdateUp(Count - 1); } [MethodImpl(256)] + public bool TryPeek(out T result) + { + if (Count == 0) + { + result = default; + return false; + } + result = data[0]; + return true; + } + [MethodImpl(256)] public bool TryDequeue(out T result) { if (Count == 0) { - result = default(T); + result = default; return false; } result = Dequeue(); diff --git a/Source/ac-library-csharp/STL/PriorityQueue/PriorityQueueOp`2.cs b/Source/ac-library-csharp/STL/PriorityQueue/PriorityQueueOp`2.cs index 67788e2..e281a5b 100644 --- a/Source/ac-library-csharp/STL/PriorityQueue/PriorityQueueOp`2.cs +++ b/Source/ac-library-csharp/STL/PriorityQueue/PriorityQueueOp`2.cs @@ -53,6 +53,29 @@ public void Enqueue(TKey key, TValue value) UpdateUp(Count - 1); } [MethodImpl(256)] + public bool TryPeek(out TKey key, out TValue value) + { + if (Count == 0) + { + key = default; + value = default; + return false; + } + (key, value) = (keys[0], values[0]); + return true; + } + [MethodImpl(256)] + public bool TryPeek(out KeyValuePair result) + { + if (Count == 0) + { + result = default; + return false; + } + result = Peek; + return true; + } + [MethodImpl(256)] public bool TryDequeue(out TKey key, out TValue value) { if (Count == 0) @@ -69,7 +92,7 @@ public bool TryDequeue(out KeyValuePair result) { if (Count == 0) { - result = default(KeyValuePair); + result = default; return false; } result = Dequeue(); diff --git a/Test/ac-library-csharp.Test/STL/PriorityQueueTest.cs b/Test/ac-library-csharp.Test/STL/PriorityQueueTest.cs index 9810b2e..9ae87ed 100644 --- a/Test/ac-library-csharp.Test/STL/PriorityQueueTest.cs +++ b/Test/ac-library-csharp.Test/STL/PriorityQueueTest.cs @@ -71,9 +71,11 @@ public void Simple() pq.Enqueue(-lx); foreach (var lx in list) { - pq.TryDequeue(out var res).Should().BeTrue(); + pq.TryPeek(out var res).Should().BeTrue(); + pq.TryDequeue(out res).Should().BeTrue(); res.Should().Be(-lx); } + pq.TryPeek(out _).Should().BeFalse(); pq.TryDequeue(out _).Should().BeFalse(); pq.Count.Should().Be(0); } @@ -110,7 +112,8 @@ public void SimpleKV() pq.Enqueue(-lx, lx); foreach (var lx in list) { - pq.TryDequeue(out var res).Should().BeTrue(); + pq.TryPeek(out var res).Should().BeTrue(); + pq.TryDequeue(out res).Should().BeTrue(); res.Should().Be(KeyValuePair.Create(-(long)lx, lx)); } pq.TryDequeue(out _).Should().BeFalse(); @@ -120,10 +123,14 @@ public void SimpleKV() pq.Enqueue(-lx, lx); foreach (var lx in list) { - pq.TryDequeue(out var key, out var val).Should().BeTrue(); + pq.TryPeek(out var key, out var val).Should().BeTrue(); + key.Should().Be(-lx); + val.Should().Be(lx); + pq.TryDequeue(out key, out val).Should().BeTrue(); key.Should().Be(-lx); val.Should().Be(lx); } + pq.TryPeek(out _, out _).Should().BeFalse(); pq.TryDequeue(out _, out _).Should().BeFalse(); pq.Count.Should().Be(0); } From 14106317c5d26fb9e07be4e7685f39176f552711 Mon Sep 17 00:00:00 2001 From: kzrnm Date: Wed, 29 Nov 2023 00:25:26 +0900 Subject: [PATCH 3/3] v3.7.0 --- CHANGELOG.md | 5 +++++ Directory.Build.props | 4 ++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7ad1556..f3caaa3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,11 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [3.7.0] - 2023-11-29 +### Added +- Add PriorityQueue.TryPeek(out T) +- Add PriorityQueue.DequeueEnqueue(T) + ## [3.6.2] - 2023-11-26 ### Changed - Fix EnqueueDequeue diff --git a/Directory.Build.props b/Directory.Build.props index 55d954a..478e189 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -7,8 +7,8 @@ https://github.com/kzrnm/ac-library-csharp https://github.com/kzrnm/ac-library-csharp/blob/main/CHANGELOG.md - 3.6.2 - 3.6.2.101 + 3.7.0 + 3.7.0.101 $(GIT_COMMIT) True