List functions for storing types

Blitz3D Forums/Blitz3D Programming/List functions for storing types

The forum is locked. These are the original blitzbasic.com forums, kept so they can still be read. No new topics, replies or edits can be made here. To join in, head over to the Blitz3D+ forums.

I've been coding some List functions which might be of use, anyone want to improve/optimize it.
It still needs ListDeleteFirst/Last and ListAddAtIndex but they should be simple to add.

Const TLIST_DATA_SIZE = 4

Type TList
	Field list
End Type

;-----------------------------------------------------------------------------------------
;-----------------------------------------------------------------------------------------
Function CreateList.TList()
	
	;DebugLog "list created"
	ThisList.TList = New TList
	ThisList\list = CreateBank(TLIST_DATA_SIZE)
	Return ThisList.TList

End Function
;-----------------------------------------------------------------------------------------
;-----------------------------------------------------------------------------------------
Function DeleteList(ThisList.TList)

If ThisList.TList = Null DebugLog "No list to delete" : Return -1

	FreeBank ThisList\list
	Delete ThisList

End Function
;-----------------------------------------------------------------------------------------
;-----------------------------------------------------------------------------------------
Function ListAddFirst(ThisList.TList,ObjectHandle%)

If ThisList.TList = Null DebugLog "ListAddLast failed no list" : Return -1
If ObjectHandle%<1 DebugLog "ListAddLast failed no object" : Return -1

count = CountList(ThisList.TList)
If Not count
	ListAddLast(ThisList.TList,ObjectHandle%)
	Return 1
EndIf

	TempBank = CreateBank(BankSize(ThisList\list))
	CopyBank ThisList\list,TLIST_DATA_SIZE,TempBank,TLIST_DATA_SIZE,BankSize(ThisList\list)-TLIST_DATA_SIZE
	
	PokeInt ThisList\list,TLIST_DATA_SIZE,ObjectHandle%
	PokeInt ThisList\list,0,count + 1
	
	ResizeBank ThisList\list,BankSize(ThisList\list)+TLIST_DATA_SIZE
	CopyBank TempBank,TLIST_DATA_SIZE,ThisList\list,TLIST_DATA_SIZE*2,BankSize(TempBank)-TLIST_DATA_SIZE
	
	FreeBank TempBank
	Return 1

End Function
;-----------------------------------------------------------------------------------------
;-----------------------------------------------------------------------------------------
Function ListAddLast(ThisList.TList,ObjectHandle%)

If ThisList.TList = Null DebugLog "ListAddLast failed no list" : Return -1
If ObjectHandle%<1 DebugLog "ListAddLast failed no object" : Return -1

	PokeInt ThisList\list,0,PeekInt(ThisList\list,0)+1
	ResizeBank(ThisList\list,BankSize(ThisList\list)+TLIST_DATA_SIZE)
	PokeInt ThisList\list,BankSize(ThisList\list)-TLIST_DATA_SIZE,ObjectHandle
	Return 1
	
End Function
;-----------------------------------------------------------------------------------------
;-----------------------------------------------------------------------------------------
Function ListAtIndex(ThisList.TList,index%)

If ThisList.TList = Null DebugLog "No list to ListAtIndex" : Return -1

If index<1 Return -1
If ThisList.TList = Null Return -1

Local Offset = index*TLIST_DATA_SIZE

If BankSize(ThisList\list)<(Offset+TLIST_DATA_SIZE) Return -1

Count = PeekInt(ThisList\list,0)
If count<1 Return -1

	Return PeekInt(ThisList\list,Offset)

End Function
;-----------------------------------------------------------------------------------------
;-----------------------------------------------------------------------------------------
Function ListFirst(ThisList.TList)

If ThisList.TList = Null Return -1

Local Offset = TLIST_DATA_SIZE

If BankSize(ThisList\list)<(Offset+TLIST_DATA_SIZE) Return -1

	Return PeekInt(ThisList\list,Offset)

End Function
;-----------------------------------------------------------------------------------------
;-----------------------------------------------------------------------------------------
Function ListLast(ThisList.TList)

If ThisList.TList = Null Return -1

index = PeekInt(ThisList\list,0)

Local Offset = index*TLIST_DATA_SIZE

If BankSize(ThisList\list)<(Offset+TLIST_DATA_SIZE) Return -1

	Return PeekInt(ThisList\list,Offset)

End Function
;-----------------------------------------------------------------------------------------
;-----------------------------------------------------------------------------------------
Function ListDeleteAtIndex(ThisList.TList,index%)

If index<1 Return -1
If ThisList.TList = Null DebugLog "No list to ListDeleteAtIndex" : Return -1

Local Offset = index*TLIST_DATA_SIZE

If BankSize(ThisList\list)<(Offset+TLIST_DATA_SIZE) Return -1

Count = PeekInt(ThisList\list,0)
If count<1 Return -1

Local offset_2

For i = index To Count-1
	Offset_2 = i*TLIST_DATA_SIZE
	PokeInt ThisList\list,Offset_2,PeekInt(ThisList\list,Offset_2+TLIST_DATA_SIZE)
Next

PokeInt ThisList\list,0,count - 1
ResizeBank ThisList\list,BankSize(ThisList\list)-TLIST_DATA_SIZE


End Function
;-----------------------------------------------------------------------------------------
;-----------------------------------------------------------------------------------------
Function CopyList(source.TList,dest.TList)


If source = Null Return -1
If dest = Null Return -1

count = PeekInt(source\list,0)
PokeInt dest\list,0,count

ResizeBank dest\list,(count*TLIST_DATA_SIZE)+TLIST_DATA_SIZE
CopyBank source\list,0,dest\list,0,BankSize(source\list);(count*TLIST_DATA_SIZE)+TLIST_DATA_SIZE

End Function
;-----------------------------------------------------------------------------------------
;-----------------------------------------------------------------------------------------
Function CountList(ThisList.TList)

If ThisList.TList = Null Return -1

	Return PeekInt(ThisList\list,0)

End Function
;-----------------------------------------------------------------------------------------
;-----------------------------------------------------------------------------------------
Function ClearList(ThisList.TList)

If ThisList.TList = Null Return -1

ResizeBank ThisList\list,TLIST_DATA_SIZE
PokeInt ThisList\list,0,0

End Function
;-----------------------------------------------------------------------------------------
;-----------------------------------------------------------------------------------------
Function ListIsEmpty(ThisList.TList)
;returns if a list is empty or not

ListCount = PeekInt(ThisList\list,0)

	If ListCount Return 1 Else Return 0

End Function
;-----------------------------------------------------------------------------------------
;-----------------------------------------------------------------------------------------
Function CheckList(ThisList.TList,ObjectHandle%)
;remove any <1 values from a list, although none
;should get added

If ThisList = Null Return -1
If ObjectHandle<1 Return -1

Count = PeekInt(ThisList\list,0)


Local Offset_2


TempList = CreateBank(TLIST_DATA_SIZE)
PokeInt TempList,0,0
	
	For i = 1 To Count
	
		Offset_2 = i*TLIST_DATA_SIZE

		If PeekInt(ThisList\list,Offset_2)>0
			ResizeBank(TempList,BankSize(TempList)+TLIST_DATA_SIZE);resize list
			PokeInt TempList,0,PeekInt(TempList,0)+1;add to list count
			PokeInt TempList,BankSize(TempList)-TLIST_DATA_SIZE,PeekInt(ThisList\list,Offset_2)
		EndIf
	Next
	
	Count = PeekInt(TempList,0)
	
	ResizeBank ThisList\list,TLIST_DATA_SIZE
	PokeInt ThisList\list,0,0
	
	For i = 1 To Count
	
		Offset_2 = i*TLIST_DATA_SIZE

		If PeekInt(TempList,Offset_2)>0
			ResizeBank(ThisList\list,BankSize(ThisList\list)+TLIST_DATA_SIZE)
			PokeInt ThisList\list,0,PeekInt(ThisList\list,0)+1
			PokeInt ThisList\list,BankSize(ThisList\list)-TLIST_DATA_SIZE,PeekInt(TempList,Offset_2)
		EndIf
	Next

FreeBank TempList


End Function
;-----------------------------------------------------------------------------------------
;-----------------------------------------------------------------------------------------
Function ListRemove(ThisList.TList,ObjectHandle%,all% = 0)
;remove the first object from a list, option to remove all instances, however list should only contain one instance!

If ThisList = Null Return -1
If ObjectHandle<1 Return -1

Count = PeekInt(ThisList\list,0)

Local found

Local Offset_2

For i = 1 To Count

Offset_2 = i*TLIST_DATA_SIZE

	If PeekInt(ThisList\list,Offset_2) = ObjectHandle
		PokeInt ThisList\list,Offset_2,0
		found = True
			If all>0
				Exit
			EndIf
	EndIf
Next

If found = True

TempList = CreateBank(TLIST_DATA_SIZE)
PokeInt TempList,0,0
	
	For i = 1 To Count
	
		Offset_2 = i*TLIST_DATA_SIZE

		If PeekInt(ThisList\list,Offset_2)>0
			ResizeBank(TempList,BankSize(TempList)+TLIST_DATA_SIZE);resize list
			PokeInt TempList,0,PeekInt(TempList,0)+1;add to list count
			PokeInt TempList,BankSize(TempList)-TLIST_DATA_SIZE,PeekInt(ThisList\list,Offset_2)
		EndIf
	Next
	
	Count = PeekInt(TempList,0)
	
	ResizeBank ThisList\list,TLIST_DATA_SIZE
	PokeInt ThisList\list,0,0
	
	For i = 1 To Count
	
		Offset_2 = i*TLIST_DATA_SIZE

		If PeekInt(TempList,Offset_2)>0
			ResizeBank(ThisList\list,BankSize(ThisList\list)+TLIST_DATA_SIZE)
			PokeInt ThisList\list,0,PeekInt(ThisList\list,0)+1
			PokeInt ThisList\list,BankSize(ThisList\list)-TLIST_DATA_SIZE,PeekInt(TempList,Offset_2)
		EndIf
	Next

FreeBank TempList

EndIf

End Function
;-----------------------------------------------------------------------------------------
;-----------------------------------------------------------------------------------------
Function ListContains(ThisList.TList,ObjectHandle%)
;get if an object exists in the list
;use to stop duplicates being added to same list

If ThisList = Null Return -1
If ObjectHandle<1 Return -1

Count = PeekInt(ThisList\list,0)
If count
	For i = 1 To Count
		If PeekInt(ThisList\list,i*TLIST_DATA_SIZE) = ObjectHandle
			Return 1
		EndIf
	Next
EndIf

	Return 0

End Function
;-----------------------------------------------------------------------------------------
;-----------------------------------------------------------------------------------------
Function ReverseList(Thislist.TList)
;swap the order of the list around

If ThisList = Null Return -1

Count = PeekInt(ThisList\list,0)
If count<1 Return -1

TempList = CreateBank(TLIST_DATA_SIZE)
PokeInt TempList,0,0

PokeInt ThisList\list,(index*TLIST_DATA_SIZE),0



For i = count To 1 Step -1
		ResizeBank(TempList,BankSize(TempList)+TLIST_DATA_SIZE)
		PokeInt TempList,0,PeekInt(TempList,0)+1
		PokeInt TempList,BankSize(TempList)-TLIST_DATA_SIZE,PeekInt(ThisList\list,(i*TLIST_DATA_SIZE))
Next

Count = PeekInt(TempList,0)

ResizeBank ThisList\list,TLIST_DATA_SIZE
PokeInt ThisList\list,0,0

For i = 1 To count
		ResizeBank(ThisList\list,BankSize(ThisList\list)+TLIST_DATA_SIZE)
		PokeInt ThisList\list,0,PeekInt(ThisList\list,0)+1
		PokeInt ThisList\list,BankSize(ThisList\list)-TLIST_DATA_SIZE,PeekInt(TempList,(i*TLIST_DATA_SIZE))
Next

FreeBank TempList


End Function
;-----------------------------------------------------------------------------------------
;-----------------------------------------------------------------------------------------
Function SwapLists( ThislistA.TList,ThislistB.TList )
;swap the contents of 2 lists

If ThisListA = Null Return 0
If ThisListB = Null Return 0


TempListB.TList = CreateList()
CopyList(ThislistB.TList,TempListB.TList)

CopyList(ThislistA.TList,ThislistB.TList)
CopyList(TempListB.TList,ThislistA.TList)

DeleteList(TempListB)

	Return 1
	
End Function
;-----------------------------------------------------------------------------------------
;-----------------------------------------------------------------------------------------

;-----------------------------------------------------------------------------------------
;-----------------------------------------------------------------------------------------



Usage:


type TActor
 field name$
end type

Type TMap
 field name$
 field actors.TList
end type

ThisMap.TMap = new TMap
ThisMap\name = "Town"
ThisVillage\actors = CreateList()

for i = 0 to 5
 ThisActor.TActor  = New TActor
 ThisActor\name = "Player_"+i
 ListAddLast(ThisMap\actors,handle(ThisActor))
next

;Then..

count = CountList(ThisMap\actors)
if count
 for i = 1 to count
  ThisActor.TACtor = object.TActor(ListAtIndex(ThisMap\actors,i))
  if not ThisActor = null
   ;code
  endif
 next
endif