77ecdfeae5
* NEW: Heap: Change the way objects are identified in Update. * NEW: gb.data has a part written in Gambas now. * NEW: PrioSet is a weaker (WRT ordering) variant of a PrioQueue which allows operations to be reasonably more efficient. git-svn-id: svn://localhost/gambas/trunk@6472 867c0c6c-44f3-4631-809d-bfa615b0a4ec
63 lines
1.6 KiB
Text
63 lines
1.6 KiB
Text
' Gambas class file
|
|
|
|
'' The PrioSet class is much similar to the PrioQueue, except that
|
|
'' the FIFO principle is missing. While a PrioQueue
|
|
''
|
|
'' 1. divides its elements into priority classes and
|
|
'' 2. within each class enforces the FIFO semantics,
|
|
''
|
|
'' a PrioSet does only the first. In other words: using a PrioSet
|
|
'' will give you high-priority elements first but elements with
|
|
'' equal priority will have no a-priori determined ordering.
|
|
''
|
|
'' To most applications the FIFO semantics are irrelevant and
|
|
'' forgetting about them allows for faster algorithms and less
|
|
'' memory used.
|
|
''
|
|
'' Beware that the term "priority queue" is sometimes used to refer
|
|
'' to what we call "priority set" here.
|
|
|
|
Export
|
|
|
|
Property Read First As Variant
|
|
Property Read Count As Integer
|
|
Property Read IsEmpty As Boolean
|
|
|
|
Private $hHeap As Heap
|
|
|
|
Public Sub _new()
|
|
$hHeap = New Heap(gb.Ascent)
|
|
End
|
|
|
|
Public Sub Insert(Data As Variant, Prio As Integer)
|
|
Dim hEntry As New _PrioSet_Entry(Data, Prio)
|
|
|
|
$hHeap.Insert(hEntry)
|
|
End
|
|
|
|
Public Sub Remove() As Variant
|
|
Dim hEntry As _PrioSet_Entry = $hHeap.Remove()
|
|
|
|
Return hEntry.Data
|
|
End
|
|
|
|
Public Sub Update(Old As Variant, {New} As Variant, Prio As Integer)
|
|
Dim hOld As New _PrioSet_Entry(Old, 0) ' Prio doesn't matter here
|
|
Dim hNew As New _PrioSet_Entry({New}, Prio)
|
|
|
|
$hHeap.Update(hOld, hNew)
|
|
End
|
|
|
|
Private Function First_Read() As Variant
|
|
Dim hEntry As _PrioSet_Entry = $hHeap.First
|
|
|
|
Return hEntry.Data
|
|
End
|
|
|
|
Private Function Count_Read() As Integer
|
|
Return $hHeap.Count
|
|
End
|
|
|
|
Private Function IsEmpty_Read() As Boolean
|
|
Return $hHeap.IsEmpty
|
|
End
|