90 lines
1.9 KiB
Plaintext
90 lines
1.9 KiB
Plaintext
' FB 1.05.0 Win64
|
|
|
|
' queue_rosetta.bi
|
|
' simple generic Queue type
|
|
|
|
#Define Queue(T) Queue_##T
|
|
|
|
#Macro Declare_Queue(T)
|
|
Type Queue(T)
|
|
Public:
|
|
Declare Constructor()
|
|
Declare Destructor()
|
|
Declare Property capacity As Integer
|
|
Declare Property count As Integer
|
|
Declare Property empty As Boolean
|
|
Declare Property front As T
|
|
Declare Function pop() As T
|
|
Declare Sub push(item As T)
|
|
Private:
|
|
a(any) As T
|
|
count_ As Integer = 0
|
|
Declare Function resize(size As Integer) As Integer
|
|
End Type
|
|
|
|
Constructor Queue(T)()
|
|
Redim a(0 To 0) '' create a default T instance for various purposes
|
|
End Constructor
|
|
|
|
Destructor Queue(T)()
|
|
Erase a
|
|
End Destructor
|
|
|
|
Property Queue(T).capacity As Integer
|
|
Return UBound(a)
|
|
End Property
|
|
|
|
Property Queue(T).count As Integer
|
|
Return count_
|
|
End Property
|
|
|
|
Property Queue(T).empty As Boolean
|
|
Return count_ = 0
|
|
End Property
|
|
|
|
Property Queue(T).front As T
|
|
If count_ > 0 Then
|
|
Return a(1)
|
|
End If
|
|
Print "Error: Attempted to access 'front' element of an empty queue"
|
|
Return a(0) '' return default element
|
|
End Property
|
|
|
|
Function Queue(T).pop() As T
|
|
If count_ > 0 Then
|
|
Dim value As T = a(1)
|
|
If count_ > 1 Then '' move remaining elements to fill space vacated
|
|
For i As Integer = 2 To count_
|
|
a(i - 1) = a(i)
|
|
Next
|
|
End If
|
|
a(count_) = a(0) '' zero last element
|
|
count_ -= 1
|
|
Return value
|
|
End If
|
|
Print "Error: Attempted to remove 'front' element of an empty queue"
|
|
Return a(0) '' return default element
|
|
End Function
|
|
|
|
Sub Queue(T).push(item As T)
|
|
Dim size As Integer = UBound(a)
|
|
count_ += 1
|
|
If count_ > size Then
|
|
size = resize(size)
|
|
Redim Preserve a(0 to size)
|
|
End If
|
|
a(count_) = item
|
|
End Sub
|
|
|
|
Function Queue(T).resize(size As Integer) As Integer
|
|
If size = 0 Then
|
|
size = 4
|
|
ElseIf size <= 32 Then
|
|
size = 2 * size
|
|
Else
|
|
size += 32
|
|
End If
|
|
Return size
|
|
End Function
|
|
#EndMacro
|