Seite 1 von 1

Osterei: Auf PB Objekt Management (100% PureBasic Code)

Verfasst: 15.04.2017 11:45
von Benubi
Hi Leute und danke an ts-soft und Sicro,

mit diesem alten Osterei kann man auf das PB Objekt-Management direkt zugreifen ohne Assembler benutzen zu müssen.
Dies ist das Ticket Beispiel aus dem SDK Verzeichnis (\SDK\VisualC\ObjectManagement), zu 100% in PB umgeschrieben und mit Test-Code.

Es läuft auch prima mit TailBite zusammen :)

Code: Alles auswählen

; German forum:
; Author: benubi + perfected by ts-soft & Sicro
; Date: 15. April 2017
; OS: all
; Demo: unknown
; -------------------
; /\/\/\/
; -------------------
; Name: TicketEasterEgg.pb
; Version: v1.1
; PB-Version: All versions since "Import" command was included
; -------------------
; /\/\/\/
; -------------------
; Description :
;
;   Ticket example - originaly written in c/c++ - from the PB SDK Folder.
;
;   100% PureBasic
;
;   The (original) Ticket example is useful to learn basic/fundamental
;   PB-object managment.
;

; 
; -------------------
; /\/\/\/ Ticket Library 
; -------------------
; 
; PureBasic/SDK/Objects.h
; PB Internal Object Management

CompilerIf #PB_Compiler_OS & #PB_OS_Windows = #PB_OS_Windows
Import "" ; <- Oster Ei, easter egg, oeuf de Pâques
CompilerElse
ImportC "" ; <- Oster Ei, easter egg, oeuf de Pâques à la c/c++
CompilerEndIf 
  ; *Object = PB object area  
                   ; ID      = PB ID  (e.g. #Image, #Mesh, #Ticket, #PB_Any ...)  

  PB_Object_GetOrAllocateID( *Object,  ID);
  PB_Object_GetObject      ( *Object,  DynamicOrArrayID);
  PB_Object_IsObject       ( *Object,  DynamicOrArrayID);
  PB_Object_EnumerateAll   ( *Object, ObjectEnumerateAllCallback ,  *Data);
  PB_Object_EnumerateStart ( *Object);
  PB_Object_EnumerateStartRecursive( *Object);
  PB_Object_EnumerateNext  ( *Object,  *ID);
  PB_Object_EnumerateNextRecursive( *Object,  *ID);
  PB_Object_EnumerateAbort ( *Object);
  PB_Object_FreeID         ( *Object,  DynamicOrArrayID);
  PB_Object_CleanAll       ( *Object);
  PB_Object_Init      ( StructureSize,  IncrementStep, ObjectFreeFunction ); Create new PB object area
  PB_Object_Count         ( *Object)                                       ;
  ; etc.
EndImport
; -------------------
; /\/\/\/ Ticket Structures
; -------------------
Structure Ticket ; Ticket structure
  RESERVED_OR_OS_HANDLE.i     ; MUST be non-zero on successful object-initialisation
                              ; or PB will discard the new object!
  Number.i ; Ticket number value
EndStructure
; -------------------
; /\/\/\/
; -------------------
Define.i obj_tickets ; Tickets' object area

; -------------------
; /\/\/\/
; -------------------
;
Declare CreateTicket(ID,Number) ; Create Ticket
Declare FreeTicket(ID) ; Free Ticket
Declare IsTicket(ID) ; Check Ticket
Declare GetTicket(ID) ; Get Ticket value
Declare SetTicket(ID,Number) ; Set Ticket value
Declare Ticket_Init() ; Ticket-Library initialization procedure ( init the ticket object area )
; -------------------
; /\/\/\/
; -------------------

Procedure Ticket_Init() ; You need to init your PureBasic "Objects-Area" first!
  Shared obj_tickets
  If Not obj_tickets
    obj_tickets = PB_Object_Init(SizeOf(Ticket),16,@FreeTicket())
  EndIf 
  ProcedureReturn obj_tickets
EndProcedure
Procedure CreateTicket(ID,Number) ; Create/Replace Ticket 
  Shared obj_tickets
  Protected *OBJ.Ticket
  *OBJ = PB_Object_GetOrAllocateID(obj_tickets,ID)
  If *OBJ
    *OBJ\RESERVED_OR_OS_HANDLE='Dx' ; Init the OS handle / reserved init-value
    *OBJ\number=Number
  EndIf 
  ProcedureReturn *OBJ
EndProcedure
Procedure SetTicket(ID,Number) ; Set Ticket value
  Shared obj_tickets
  Protected *OBJ.Ticket
  *OBJ=PB_Object_GetObject(obj_tickets,ID)
  If *OBJ
    *OBJ\number=number
  EndIf 
  ProcedureReturn *OBJ
EndProcedure
Procedure IsTicket(ID) ; Check if ID is a valid ticket
  Shared obj_tickets
  ProcedureReturn PB_Object_IsObject(obj_tickets,ID)
EndProcedure
Procedure GetTicket(ID) ; Get Ticket
  Shared obj_tickets
  Protected *OBJ.Ticket
  *OBJ=PB_Object_GetObject(obj_tickets,ID)
  If *obj
    ProcedureReturn *OBJ\number
  EndIf 
  ProcedureReturn 0
EndProcedure
Procedure FreeTicket(ID) ; Free Ticket
  Shared obj_tickets
  ProcedureReturn PB_Object_FreeID(obj_tickets,ID)
EndProcedure
; ----
Procedure TicketCount() ; Count all tickets
  Shared obj_tickets
  ProcedureReturn PB_Object_Count(obj_tickets)
EndProcedure
; -------------------
; -------------------
; ##################################################################################
; -------------------
; /\/\/\/
; -------------------
; TEST: "Internal library" test
; -------------------
; -------------------
; -------------------
Macro _yes_no_(_a_,_b_)
  If _b_
    Debug "(0x"+RSet(Hex(_a_),SizeOf(Integer)*2,"0")+"): yes"
  Else 
    Debug "(0x"+RSet(Hex(_a_),SizeOf(Integer)*2,"0")+"): no"
  EndIf
EndMacro  


Ticket_Init()
;
CreateTicket(1,101)
CreateTicket(2,202)
CreateTicket(3,333333)
;
dynamic.i = CreateTicket(-1,404)
;
Debug "Ticket-Count:" 
Debug TicketCount()
Debug "Ticket-Values:"
For i.i =1 To 3
Debug "#"+Str(i) + ": " +GetTicket(i)
Next 
;
Debug "Dynamic Ticket Value:(0x"+RSet(Hex(dynamic),SizeOf(Integer)*2,"0")+"):"
Debug GetTicket(dynamic)
Debug "****"
Debug "Is Ticket:"
For i.i=0 To 10
  _yes_no_(i,IsTicket(i))
Next 
_yes_no_(dynamic,IsTicket(dynamic))
Debug "free tickets 0..10"
For i.i = 0 To 10:FreeTicket(i):Next
Debug "****"
Debug "Is Ticket:"
For i.i=0 To 10
  _yes_no_(i,IsTicket(i))
Next 
_yes_no_(dynamic,IsTicket(dynamic))
Debug "Ticket Count:"
Debug TicketCount()
; -------------------
; -------------------
; ##################################################################################
; -------------------
; -------------------
; TEST 2
;
;
;
;

Mfg,

Benubi

Re: Osterei: Auf PB Objekt Management (100% PureBasic Code)

Verfasst: 15.04.2017 12:53
von ts-soft
Kleiner Schönheitsfehler :wink:
Abgesehen von 32-Bit Windows ist alles ImportC, wobei es bei 64-Bit keine Rolle spielen sollte (Fastcall).
Mit anderen Worten, mit 32-Bit Linux oder MacOS wird es an allen Ecken knallen <)

Gruß
Thomas

Re: Osterei: Auf PB Objekt Management (100% PureBasic Code)

Verfasst: 15.04.2017 21:02
von Benubi
Hi ts-soft!

WOW! Danke für Deine Antwort :)

Ich werde dem ImportC/Import switch dieses oder spätestens nächstes Wochenede das korrigieren ... früher!
So schnell geht das?

Oder funktioniert das jetzt (ca. Zeile 33)?

Code: Alles auswählen

CompilerIf #PB_Compiler_OS & #PB_OS_Windows = #PB_OS_Windows
Import "PureBasic" ; <- Oster Ei, easter egg, oeuf de Pâques
CompilerElse
ImportC "PureBasic" ; <- Oster Ei, easter egg, oeuf de Pâques à la c/c++
CompilerEndIf 
Mfg,

Benubi

Re: Osterei: Auf PB Objekt Management (100% PureBasic Code)

Verfasst: 15.04.2017 21:30
von ts-soft
Noch ein Schönheitsfehler: "" statt "PureBasic", funktioniert dann immer und nicht nur unter Windows :wink:

Ansonsten ist es so in Ordnung, denke ich mal :D

Re: Osterei: Auf PB Objekt Management (100% PureBasic Code)

Verfasst: 16.04.2017 12:20
von Sicro
Ein lehrreicher Code. Danke fürs Teilen :allright:
Denn könnte man noch mit weiteren Beispielen zu den PB-internen Funktionen bereichern.

Wie ts-soft schon geschrieben hat den Code wie folgt abändern:

Code: Alles auswählen

CompilerIf #PB_Compiler_OS = #PB_OS_Windows
  Import "" ; <- Oster Ei, easter egg, oeuf de Pâques
CompilerElse
  ImportC "" ; <- Oster Ei, easter egg, oeuf de Pâques à la c/c++
CompilerEndIf
Getestet: Linux 32/64-Bit und Windows XP 32-Bit

Zudem könntest du die Variable "obj_tickets" global definieren, um dir das "Shared" zu sparen.

Auf PB-interne Funktionen verzichte ich jedoch im produktivem Einsatz, weil sie nicht offiziell sind und bei internen Änderungen zu fehleranfälligem Code führen könnten.