Buchempfehlung
Mikrocomputertechnik mit Controllern der Atmel AVR-RISC-Familie
Mikrocomputertechnik mit Controllern der Atmel AVR-RISC-Familie
Umfassend, aber leicht verständlich führt dieses Buch in die Programmierung von ATMEL AVR Mikrocontrollern ein. [Mehr Infos...]
FreeBASIC-Chat
Es sind Benutzer im FreeBASIC-Chat online.
(Stand:  )
FreeBASIC bei Twitter
Twitter FreeBASIC-Nachrichten jetzt auch über Twitter erhalten. Follow us!

fb:porticula NoPaste

Info
Info / Hilfe
Liste
Übersicht / Liste
Neu
Datei hochladen
Suche
Quellcode suchen
Download
Dateidownload

TList.bi - Eine einfache dynamische Zeiger-Liste wie die TList-Klasse von Delphi

Uploader:MitgliedWeazle25
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