fb:porticula NoPaste
TList.bi - Eine einfache dynamische Zeiger-Liste wie die TList-Klasse von Delphi
Uploader: | Weazle25 |
Datum/Zeit: | 14.03.2009 16:24:56 |
'+--------------------------------------------------------------+
'| +----------------------------------------------------------+ |
'| | Projekt: TList-Class | |
'| | Version: 0.01 | |
'| | Start: 12.03.2009 | |
'| | Autor: Weazle25 | |
'| | Lizenz: Open Source | |
'| | Beschreibung: TList ist eine einfache dynamische Liste | |
'| | die genauso wie die TList-Klasse von | |
'| | Delphi funktioniert. | |
'| | Bei Delphi wurde TList mit Assembler-Code | |
'| | optimiert. Da ich aber keine Ahnung von | |
'| | Assembler habe muss ich mit FB-Bordmitteln| |
'| | improvisieren wodurch dieses TList mit | |
'| | Sicherheit langsamer ist als das TList von| |
'| | Delphi. | |
'| +----------------------------------------------------------+ |
'+--------------------------------------------------------------+
Const CMaxTListItems = 1000000
Type TPointer
Value As Any Ptr
End Type
Type TList
Private:
VCount As UInteger 'die Anzahl der Items die sich in der Liste befinden
VCapacity As UInteger 'die Anzahl der Items die die Liste aufnehmen kann
VStep As UInteger 'die Anzahl der Items um die die Liste bei einem Erweitern vergrössert werden soll
VItems As TPointer Ptr ' die Items (Array!)
Public:
Declare Constructor()
Declare Constructor(VStep As UInteger)
Declare Constructor(VCountItems As UInteger, VStep As UInteger)
Declare Destructor()
Declare Function FAdd(VValue As Any Ptr) As Integer
Declare Function FDelete(Index As UInteger) As Byte
Declare Property PItem(Index As UInteger) As Any Ptr
Declare Property PItem(Index As UInteger, Value As Any Ptr)
Declare Property PCount() As UInteger
End Type
Constructor TList()
'+--------------------------------------------------------------+
'| Standart-Constructor |
'| VStep wird mit 10 initialisiert |
'+--------------------------------------------------------------+
This.VCount = 0
This.VCapacity = 0
This.VStep = 10
This.VItems = 0
End Constructor
Constructor TList(VStep As UInteger)
'+--------------------------------------------------------------+
'| Initialisiert TList.VStep mit einem beliebigen Wert. |
'| Ist VStep = 0 wird TList.VStep mit 10 initialisiert. |
'+--------------------------------------------------------------+
This.VCount = 0
This.VCapacity = 0
If VStep > 0 Then
This.VStep = VStep
Else
This.VStep = 10
EndIf
This.VItems = 0
End Constructor
Constructor TList(CountItems As UInteger, VStep As UInteger)
'+--------------------------------------------------------------+
'| Initialisiert TList.VStep mit einem beliebigen Wert. |
'| Ist VStep = 0 wird TList.VStep mit 10 initialisiert. |
'| CountItems gibt an wie viele Items erzeugt werden sollen. |
'| TList.VCapacity wird dabei auf ein Vielfaches von VStep |
'| aufgerundet. |
'+--------------------------------------------------------------+
Dim Tmp As UInteger
If VStep > 0 Then
This.VStep = VStep
Else
This.VStep = 10
EndIf
This.VCount = 0
If CountItems = 0 Then
This.VCapacity = 0
This.VItems = 0
ElseIf CountItems > CMaxTListItems Then
This.VCapacity = CMaxTListItems
This.VItems = Callocate( CMaxTListItems * Len(TPointer), 1)
This.VCount = CMaxTListItems
Else
Tmp = CountItems / VStep * VStep
While Tmp < CountItems
Tmp += VStep
Wend
This.VCapacity = Tmp
This.VCount = CountItems
This.VItems = Callocate( Tmp * Len(TPointer), 1 )
EndIf
End Constructor
Destructor TList()
'+--------------------------------------------------------------+
'| Gibt das Array TList.VItems frei. Die Daten die an die Items |
'| angehängt wurden werden nicht automatisch frei gegeben und |
'| müssen daher manuell frei gegeben werden. |
'+--------------------------------------------------------------+
If This.VItems <> 0 Then DeAllocate This.VItems
End Destructor
Function TList.FAdd(Value As Any Ptr) As Integer
'+--------------------------------------------------------------+
'| Fügt der Liste ein Item hinzu. |
'| Value ist ein Zeiger der auf beliebige Daten zeigt. |
'| Dieser Zeiger kann mit TList.PItem(Index) gelesen und |
'| geändert werden. |
'+--------------------------------------------------------------+
If This.VCapacity = 0 Then
This.VItems = Callocate(This.VStep * Len(TPointer), 1)
This.VCapacity = This.VStep
This.VItems[0].Value = Value
This.VCount = 1
Return 0
EndIf
If This.VCapacity > 0 And This.VCount < This.VCapacity Then
This.VItems[This.VCount].Value = Value
This.VCount += 1
Return This.VCount -1
EndIf
If This.VCapacity > 0 And This.VCount = This.VCapacity Then
If (This.VCapacity + This.VStep) <= CMaxTListItems Then
This.VItems = ReAllocate( This.VItems, (This.VCapacity + This.VStep) * Len(TPointer))
For i As UInteger = This.VCapacity To This.VCapacity + This.VStep - 1
This.VItems[i].Value = 0
Next
This.VCapacity += This.VStep
This.VItems[This.VCount].Value = Value
This.VCount += 1
Return This.VCount -1
EndIf
EndIf
End Function
Function TList.FDelete(Index As UInteger) As Byte
'+--------------------------------------------------------------+
'| Löscht das mit Index angegebene Item. |
'| Achtung: Die Daten auf die der in Item gespeicherte Zeiger |
'| zeigt werden nicht automatisch frei gegeben und müssen |
'| daher manuell (vor dem Löschen des Items) frei gegeben werden|
'+--------------------------------------------------------------+
If This.VCount = 0 Then Return 0
If Index > This.VCount Then Return 0
This.VItems[Index].Value = 0
If This.VCount > 1 Then
For i As UInteger = Index To This.VCount-2
This.VItems[ i ].Value = This.VItems[ i + 1 ].Value
Next
This.VItems[This.VCount-1].Value = 0
EndIf
This.VCount -= 1
If ( This.VCapacity - This.VCount ) > This.VStep Then
This.VItems = ReAllocate( This.VItems, (This.VCapacity - This.VStep) * Len(TPointer) )
This.VCapacity -= This.VStep
EndIf
End Function
Property TList.PItem(Index As UInteger) As Any Ptr
'+--------------------------------------------------------------+
'| Liefert den Zeiger zurück der in TList.VItem[Index] |
'| gespeichert ist oder 0 wenn kein Item existiert. |
'+--------------------------------------------------------------+
If Index > This.VCount-1 Then Return 0
Return This.VItems[Index].Value
End Property
Property TList.PItem(Index As UInteger, Value As Any Ptr)
'+--------------------------------------------------------------+
'| Überschreibt den Zeiger der in TList.VItem[Index] gespeichert|
'| ist mit dem Wert von Value. |
'+--------------------------------------------------------------+
If Index > This.VCount-1 Then Return
This.VItems[Index].Value = Value
End Property
Property TList.PCount() As UInteger
'+--------------------------------------------------------------+
'| Liefert die Anzahl der Items zurück. |
'+--------------------------------------------------------------+
Return This.VCount
End Property