List functions for storing types

Blitz3D Forums/Blitz3D Programming/List functions for storing types

(tu) sinu(Posted 2006) [#1]
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






Chroma(Posted 2006) [#2]
Looks like it's for BMax...if it is you got the wrong forum! :p


(tu) sinu(Posted 2006) [#3]
Nope, it's for Blitz3D :)


Jams(Posted 2006) [#4]
Nice functions, i'm using these atm http://www.blitzbasic.com/codearcs/codearcs.php?code=1438