1 #Region "Microsoft.VisualBasic::322ede92a24597e1cb6ce8135f668c82, Microsoft.VisualBasic.Core\ComponentModel\System.Collections.Generic\PriorityQueue\PriorityQueue.vb"
2
3     ' Author:
4     
5     '       asuka (amethyst.asuka@gcmodeller.org)
6     '       xie (genetics@smrucc.org)
7     '       xieguigang (xie.guigang@live.com)
8     
9     ' Copyright (c) 2018 GPL3 Licensed
10     
11     
12     ' GNU GENERAL PUBLIC LICENSE (GPL3)
13     
14     
15     ' This program is free software: you can redistribute it and/or modify
16     ' it under the terms of the GNU General Public License as published by
17     ' the Free Software Foundation, either version 3 of the License, or
18     ' (at your option) any later version.
19     
20     ' This program is distributed in the hope that it will be useful,
21     ' but WITHOUT ANY WARRANTY; without even the implied warranty of
22     ' MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
23     ' GNU General Public License for more details.
24     
25     ' You should have received a copy of the GNU General Public License
26     ' along with this program. If not, see <http://www.gnu.org/licenses/>.
27
28
29
30     ' /********************************************************************************/
31
32     ' Summaries:
33
34     '     Class PriorityQueue
35     
36     '         Properties: Count
37     
38     '         Constructor: (+2 OverloadsSub New
39     
40     '         Function: Contains, Dequeue, GetEnumerator, IEnumerable_GetEnumerator, Peek
41     '                   ToString
42     
43     '         Sub: Add, Clear, Enqueue, Remove, Sort
44     
45     
46     ' /********************************************************************************/
47
48 #End Region
49
50 '! 
51 '@file PriorityQueue.cs
52 '@author Woong Gyu La a.k.a Chris. <juhgiyo@gmail.com>
53 ' <http://github.com/juhgiyo/epForceDirectedGraph.cs>
54 '@date September 27, 2013
55 '@brief PriorityQueue Interface
56 '@version 2.0
57 '
58 '@section LICENSE
59 '
60 'The MIT License (MIT)
61 '
62 'Copyright (c) 2013 Woong Gyu La <juhgiyo@gmail.com>
63 '
64 'Permission is hereby granted, free of charge, to any person obtaining a copy
65 'of this software and associated documentation files (the "Software"), to deal
66 'in the Software without restriction, including without limitation the rights
67 'to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
68 'copies of the Software, and to permit persons to whom the Software is
69 'furnished to do so, subject to the following conditions:
70 '
71 'The above copyright notice and this permission notice shall be included in
72 'all copies or substantial portions of the Software.
73 '
74 'THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
75 'IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
76 'FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
77 'AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
78 'LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
79 'OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
80 'THE SOFTWARE.
81 '
82 '@section DESCRIPTION
83 '
84 'An Interface for the PriorityQueue Class.
85 '
86 '
87
88 Imports System.Runtime.CompilerServices
89 Imports Microsoft.VisualBasic.Serialization.JSON
90
91 Namespace ComponentModel.Collection
92
93     ''' <summary>
94     ''' An Interface for the PriorityQueue Class.
95     ''' </summary>
96     ''' <typeparam name="T"></typeparam>
97     Public Class PriorityQueue(Of T As IComparable)
98         Implements IEnumerable(Of T)
99
100         Protected list As New List(Of T)
101
102         Public Overridable ReadOnly Property Count() As Integer
103             Get
104                 Return list.Count
105             End Get
106         End Property
107
108         Sub New()
109         End Sub
110
111         Sub New(source As IEnumerable(Of T))
112             list = source.ToList
113             list.Sort()
114         End Sub
115
116         <MethodImpl(MethodImplOptions.AggressiveInlining)>
117         Public Overridable Sub Enqueue(queueItem As T)
118             Call list.Add(queueItem)
119             Call list.Sort()
120         End Sub
121
122         ''' <summary>
123         ''' Add without sort
124         ''' </summary>
125         ''' <param name="x"></param>
126         <MethodImpl(MethodImplOptions.AggressiveInlining)>
127         Public Sub Add(x As T)
128             Call list.Add(x)
129         End Sub
130
131         <MethodImpl(MethodImplOptions.AggressiveInlining)>
132         Public Sub Sort()
133             Call list.Sort()
134         End Sub
135
136         <MethodImpl(MethodImplOptions.AggressiveInlining)>
137         Public Overridable Sub Clear()
138             Call list.Clear()
139         End Sub
140
141         <MethodImpl(MethodImplOptions.AggressiveInlining)>
142         Public Overridable Sub Remove(o As T)
143             Call list.Remove(o)
144         End Sub
145
146         ''' <summary>
147         ''' Poll
148         ''' </summary>
149         ''' <returns></returns>
150         Public Overridable Function Dequeue() As T
151             Dim frontItem As T = list(0)
152             list.RemoveAt(0)
153             Return frontItem
154         End Function
155
156         Public Overridable Function Peek() As T
157             Dim frontItem As T = list(0)
158             Return frontItem
159         End Function
160
161         Public Overrides Function ToString() As String
162             Return $"Queue {list.Count} items, 1st_item:={Peek.GetJson}"
163         End Function
164
165         <MethodImpl(MethodImplOptions.AggressiveInlining)>
166         Public Overridable Function Contains(queueItem As T) As Boolean
167             Return list.Contains(queueItem)
168         End Function
169
170         Public Overridable Iterator Function GetEnumerator() As IEnumerator(Of T) Implements IEnumerable(Of T).GetEnumerator
171             For Each x As T In list
172                 Yield x
173             Next
174         End Function
175
176         Private Iterator Function IEnumerable_GetEnumerator() As IEnumerator Implements IEnumerable.GetEnumerator
177             Yield GetEnumerator()
178         End Function
179     End Class
180 End Namespace