Code: Select all
CompilerIf #PB_Compiler_Debugger
Import ""
CompilerIf Defined(PB_DEBUGGER_SendWarning, #PB_Procedure)=0
PB_DEBUGGER_SendWarning(Message.p-ascii)
CompilerEndIf
CompilerIf Defined(PB_DEBUGGER_SendError, #PB_Procedure)=0
PB_DEBUGGER_SendError(Message.p-ascii)
CompilerEndIf
EndImport
CompilerElse
Macro PB_DEBUGGER_SendWarning(Message)
EndMacro
Macro PB_DEBUGGER_SendError(Message)
EndMacro
CompilerEndIf
Structure OBJ
ID.i
type.s{256}
*handle
;
; HERE YOUR CUSTOM PARAMETERS...
;
a.i
b.i
c.i
EndStructure
Global NewList OBJ.OBJ()
#OBJ_TYPE$="Custom Object Type"
Procedure.i CreateObjectHandle(a, b, c)
;
; HERE YOUR CUSTOM HANDLE MAKER...
;
*handle=AllocateMemory(1000)
PokeS(*handle, Str(a+b+c))
ProcedureReturn *handle
EndProcedure
Procedure.i CreateObject(ID, a, b, c)
Protected result
If ID>=0 And ID<=100000
AddElement(OBJ())
OBJ()\ID=ID
OBJ()\handle=CreateObjectHandle(a, b, c)
OBJ()\type=#OBJ_TYPE$
result=OBJ()\handle
ElseIf ID=#PB_Any
OBJ()\ID=AddElement(OBJ())
OBJ()\handle=CreateObjectHandle(a, b, c)
OBJ()\type=#OBJ_TYPE$
result=OBJ()\ID
Else
PB_DEBUGGER_SendError("#ID is out of range (0-100000)")
ProcedureReturn #False
EndIf
;
; HERE SAVE YOUR CUSTOM PARAMETERS
;
OBJ()\a=a
OBJ()\b=b
OBJ()\c=c
ProcedureReturn result
EndProcedure
Procedure.i IsObject(ID)
If ListSize(OBJ())
If ID>=FirstElement(OBJ())
;quick search (#PB_ANY)
ChangeCurrentElement(OBJ(), ID)
If OBJ()\type=#OBJ_TYPE$
ProcedureReturn @OBJ()
EndIf
Else
;slow search
If OBJ()\ID=ID And OBJ()\type=#OBJ_TYPE$
ProcedureReturn @OBJ()
Else
ForEach OBJ()
If OBJ()\ID=ID And OBJ()\type=#OBJ_TYPE$
ProcedureReturn @OBJ()
EndIf
Next
EndIf
EndIf
EndIf
ProcedureReturn #False
EndProcedure
Procedure.i ObjectID(ID)
*ThisObj.OBJ=IsObject(ID)
If *ThisObj
ProcedureReturn *ThisObj\handle
Else
ProcedureReturn #False
EndIf
EndProcedure
*ObjectID=CreateObject(10, 1, 2, 3)
Debug *ObjectID
Debug ObjectID(10)
Debug PeekS(*ObjectID) ;<--- 6
Debug PeekS(ObjectID(10)) ;<--- 6
*ThisObj.OBJ=IsObject(10)
Debug *ThisObj\a
Debug *ThisObj\b
Debug *ThisObj\c
Debug ""
ID=CreateObject(#PB_Any, 10, 20, 30)
*ThisObj.OBJ=IsObject(ID)
Debug *ThisObj\a
Debug *ThisObj\b
Debug *ThisObj\c
Debug PeekS(*ThisObj\handle) ;<--- 60
Debug PeekS(ObjectID(ID)) ;<--- 60
Debug ""
;*ObjectID=CreateObject(10000000000, 1, 2, 3) <--- test error message