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

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benubi
Beiträge: 186
Registriert: 22.10.2004 17:51
Wohnort: Berlin, Wedding

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

Beitrag 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
Zuletzt geändert von Benubi am 22.04.2017 18:18, insgesamt 3-mal geändert.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

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

Beitrag 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
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benubi
Beiträge: 186
Registriert: 22.10.2004 17:51
Wohnort: Berlin, Wedding

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

Beitrag 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
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

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

Beitrag 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
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Sicro
Beiträge: 955
Registriert: 11.08.2005 19:08
Kontaktdaten:

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

Beitrag 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.
Bild
Warum OpenSource eine Lizenz haben sollte :: PB-CodeArchiv-Rebirth :: Pleasant-Dark (Syntax-Farbschema) :: RegEx-Engine (kompiliert RegExes zu NFA/DFA)
Manjaro Xfce x64 (Hauptsystem) :: Windows 10 Home (VirtualBox) :: Neueste PureBasic-Version
Antworten