Code archives/Algorithms/TListExtended
This code has been declared by its author to be Public Domain code.
Download source code
| |||||
I've decided that having an additional module to do extended stuff might not make that much sense after all. So I took my linkedlist module and tried to get it to work as an extended TList. So now here is TListExtended class. It has all features and possibilities of the regular TList but has some nice additions: - Enumerator range (TLink for start and end): This works on eachin list.links() and eachin list.values() regular eachin list works as with normal TList - fully controllable Iterator like PureBasics list structure If there is something missing, please let me know. Currently missing is enumerator support for sort. I'm aware of that. I will at that at some point if it is needed. | |||||
Test App '---------------------------------- Import "tlistextended.bmx" Strict Global list:tlistextended = New tlistextended SeedRnd MilliSecs() For Local i:Int = 1 To 10 list.addlast(String(Rand(0,25))) Next 'list.ResetEnumeratorRange() Print "Listcount: " + list.count() Print "~n~nTestoutput: Nodes" For Local temp:TLink = EachIn list.links() Print temp.toString() + " with value: " + temp.value().toString() Next list.reverse() Print "~n~nTestoutput: Nodes, inverted!" For Local temp:TLink = EachIn list.links() Print temp.toString() + " with value: " + temp.value().toString() Next list.sort(True,compareNumbers) list.ResetEnumeratorRange() ' This is needed as the whole list is sorted Print "~n~nTestoutput: Values, sorted ascending!" For Local value:Object = EachIn list.values() Print value.tostring() Next list.sort(False,compareNumbers) list.ResetEnumeratorRange() ' This is needed as the whole list is sorted Print "~n~nTestoutput: Values, sorted descending!" For Local value:Object = EachIn list.values() Print value.tostring() Next Print "~n~nTestoutput: Enumerator Range from 3rd to 8th element" list.SetEnumeratorRange(list.FirstLink().NextLink().NextLink(),list.lastlink().PrevLink().PrevLink()) For Local value:Object = EachIn list.values() Print value.tostring() Next Print "~n~nTestoutput: Manual pointer movement from start" list.MoveStart() Print "Start: " + list.CurrentLink().tostring() + " with value: " + list.CurrentValue().tostring() list.MoveForward() Print "Step Forward: " + list.CurrentLink().tostring() + " with value: " + list.CurrentValue().tostring() list.MoveForward() Print "Step Forward: " + list.CurrentLink().tostring() + " with value: " + list.CurrentValue().tostring() list.MoveBackward() Print "Step Backward: " + list.CurrentLink().tostring() + " with value: " + list.CurrentValue().tostring() list.MoveBackward() Print "Step Backward: " + list.CurrentLink().tostring() + " with value: " + list.CurrentValue().tostring() Print "~n~nTestoutput: Manual pointer movement from end" list.MoveEnd() Print "Start: " + list.CurrentLink().tostring() + " with value: " + list.CurrentValue().tostring() list.MoveBackward() Print "Step Backward: " + list.CurrentLink().tostring() + " with value: " + list.CurrentValue().tostring() list.MoveBackward() Print "Step Backward: " + list.CurrentLink().tostring() + " with value: " + list.CurrentValue().tostring() list.MoveForward() Print "Step Forward: " + list.CurrentLink().tostring() + " with value: " + list.CurrentValue().tostring() list.MoveForward() Print "Step Forward: " + list.CurrentLink().tostring() + " with value: " + list.CurrentValue().tostring() Local b:Int = GCMemAlloced() list = Null GCCollect() Print "Memory: " + b + " compared to now: " + GCMemAlloced() Function compareNumbers:Int(one:Object, two:Object) Return Int(one.tostring())-Int(two.tostring()) End Function '----------------------------------------------------- TListExtended.bmx '----------------------------------------------------- Strict Import brl.linkedlist rem Created by Marc 'Dreamora' Schärer Moderator at the german blitzbasic community End Rem Rem bbdoc: TListExtended about: Extended version of BRLs TList <br> Eachin still behaves the same as on the original list, this means without support for enumeration ranges.<br> Enumeration ranges only work on eachin with list.values() and list.links() end rem Type TListExtended Extends TList Field _iterator:TLink Field _enumStart:TLink Field _enumStop:TLink Method New() ResetEnumeratorRange() _iterator = _head End Method Rem bbdoc: Clear about: Clears the extended TList and resets the enumeration range End Rem Method Clear() _iterator = Null _enumStart = Null _enumStop = Null Super.clear() End Method Rem bbdoc: Swap about: Swaps the content of 2 lists. if used on extended lists, their enumeration range will be reseted. End Rem Method Swap( list:TList ) Super.Swap(list) If TListExtended(Self) ResetEnumeratorRange() If TListExtended(list) TListExtended(list).ResetEnumeratorRange() End Method Method Reverse() Super.Reverse() Local t:TLink = _enumStart _enumStart = _enumStop _enumStop = t End Method Rem bbdoc: Links about: TLink enumerator End Rem Method Links:TLLEnumer() Local enum:TLLEnumer = New TLLEnumer enum._enum = New TLinkEnumIn If _enumStart = _head Or _enumStop = _head ResetEnumeratorRange() TLinkEnumIn(enum._enum)._link = _enumStart TLinkEnumIn(enum._enum)._stop = _enumStop Return enum End Method Rem bbdoc: Values about: Value enumerator End Rem Method Values:TLLEnumer() Local enum:TLLEnumer = New TLLEnumer enum._enum = New TValueEnumIn If _enumStart = _head Or _enumStop = _head ResetEnumeratorRange() TValueEnumIn(enum._enum)._link = _enumStart TValueEnumIn(enum._enum)._stop = _enumStop Return enum End Method Rem bbdoc: SetEnumeratorRange about: Sets the enumerator for eachin as well as sorting<br> End Rem Method SetEnumeratorRange(start:TLink, stop:TLink) _enumStart = start _enumStop = stop End Method Rem bbdoc: ResetEnumeratorRange() about: Resets the enumeration range to "from start to end of list" <br> This must be called if you call sort on a whole list. End Rem Method ResetEnumeratorRange() _enumStart = _head._succ _enumStop = _head._pred End Method Rem bbdoc: MoveStart about: Moves the iteration reference to the start of the list End Rem Method MoveStart() _iterator = _head._succ End Method Rem bbdoc: MoveEnd about: Moves the iteration reference to the end of the list End Rem Method MoveEnd() _iterator = _head._pred End Method Rem bbdoc: MoveForward about: Moves the iteration reference one position forward in the list returns: true if moving was possible, false otherwise End Rem Method MoveForward:Int() If _iterator._succ <> _head _iterator = _iterator._succ Return True EndIf Return False End Method Rem bbdoc: MoveBackward about: Moves the iteration reference one position backward in the list returns: true if moving was possible, false otherwise End Rem Method MoveBackward:Int() If _iterator._pred <> _head _iterator = _iterator._pred Return True EndIf Return False End Method Rem bbdoc: CurrentValue about: Returns the value of the link the iterator is currently pointing to End Rem Method CurrentValue:Object() Return _iterator.Value() End Method Rem bbdoc: CurrentLink about: Returns the reference to the link the iterator is currently pointing to End Rem Method CurrentLink:TLink() Return _iterator End Method End Type Type TLLEnumer Field _enum:TListEnumIn Method ObjectEnumerator:TListEnumIn() Return _enum End Method End Type Type TListEnumIn Extends TListEnum Field _stop:TLink Method HasNext() Return _link<>_link._succ And _link._pred <> _stop End Method Method NextObject:Object() Local value:Object=_link.value() _link = _link._succ Return value End Method End Type Type TLinkEnumIn Extends TListEnumIn Method NextObject:Object() Local value:Object=_link _link = _link._succ Return value End Method End Type Type TValueEnumIn Extends TListEnumIn Method NextObject:Object() Local value:Object=_link.value() _link = _link._succ Return value End Method End Type |
Comments
None.
Code Archives Forum