simple class generator

Share your advanced PureBasic knowledge/code with the community.
User avatar
langinagel
Enthusiast
Enthusiast
Posts: 131
Joined: Fri Jan 28, 2005 11:53 pm
Location: Germany
Contact:

simple class generator

Post by langinagel »

Hi there,

I had long term a problem searching for somewhat like classes. The approach by TS-soft in

procedures inside structures

suited me well. So I thought, why not generalise it? Here is some kind of an object-maker:

Code: Select all

; ;baut objectdefinitions dateien auf
; LN 15.02.2013
; 

EnableExplicit

Enumeration 1
        #integer
        #long
        #word
        #quad
        #string
        #float
        #double
        #byte
        #ascii
        #character
        #unicode

EndEnumeration

Enumeration 20
        #usual
        #get
        #set
EndEnumeration

Global Dim typen.s(20)
typen(1)="i"
typen(2)="l"
typen(3)="w"
typen(4)="q"
typen(5)="s"
typen(6)="f"
typen(7)="d"
typen(8)="b"
typen(9)="a"
typen(10)="c"
typen(11)="u"

Structure memb
        name.s
        type.w
        get_soll.w
        set_soll.w
EndStructure

Structure meth
        name.s
        art.w
        type.w
EndStructure

Global NewList methods.meth()

Global NewList members.memb()

Global classname.s
Global objectname.s


Procedure ausgeben(weg.s)
       
        WriteStringN(20,weg.s, #PB_Ascii)
EndProcedure

Procedure  lesbarausgeben()
        ausgeben("")
EndProcedure


Procedure expend_get_methods_from_members()

        Protected nome.s
        ForEach members()
                If members()\get_soll = #True
                        nome = "Get_"+members()\name
                        AddElement(methods())
                        methods()\name = nome
                        methods()\art  = #get
                        methods()\type = members()\type
                EndIf
        Next        
EndProcedure

Procedure expend_set_methods_from_members()
        Protected name.s
        ForEach members()
                If members()\set_soll = #True
                        name = "Set_"+members()\name
                        AddElement(methods())
                        methods()\name = name
                        methods()\art  = #set
                        methods()\type = members()\type
                        
                EndIf
        Next        
EndProcedure

Procedure build_prototypesection()
        Protected ausgabe.s
        ForEach methods()
                ausgabe = "Prototype "+methods()\name+"()"
                ausgeben(ausgabe)
        Next
EndProcedure

Procedure build_structure()
        Protected ausgabe.s
        ausgabe = "Structure "+classname
        ausgeben(ausgabe)
        ausgeben("; -----members--------  ")
        ForEach members()
                
                ausgabe = members()\name+"."+typen(members()\type)
                ausgeben(ausgabe)
        Next         
        ausgeben("; -----  methods----------")
        ForEach methods()
                ausgabe = methods()\name+"."+methods()\name
                ausgeben(ausgabe)
        Next        
        ausgabe = "EndStructure "
        ausgeben(ausgabe)
        
EndProcedure

Procedure build_structure_definition()
        Protected ausgabe.s
        ausgabe = "Global Dim "+objectname+"."+classname+"(1)"
        ausgeben(ausgabe)              
EndProcedure

Procedure build_procedure_stubs()
        Protected ausgabe.s
        ausgeben("; -----Procedures definition--------  ")
        ForEach methods()
                If methods()\art = #set
                        ausgabe = "procedure "+methods()\name+"(value."+typen(methods()\type)+")"
                        
                ElseIf methods()\art = #get And methods()\type = #string
                        ausgabe = "procedure.s "+methods()\name+"()"
                Else
                        ausgabe = "procedure "+methods()\name+"()"
                EndIf
                ausgeben(ausgabe)
                
                If methods()\art = #set
                        
                        ausgabe = objectname+"(0)\"+Right(methods()\name,Len(methods()\name)-4)+" = value"
                        
                ElseIf methods()\art = #get
                        ausgabe = "procedurereturn "+objectname+"(0)\"+Right(methods()\name,Len(methods()\name)-4)
                Else
                        ausgabe=""
                EndIf
                ausgeben(ausgabe)
                ausgabe="Endprocedure"
                ausgeben(ausgabe)        
                lesbarausgeben()        
        Next         
        lesbarausgeben()        
EndProcedure


Procedure build_object_init_procedure()
        Protected ausgabe.s
        ausgeben("; -----InitProcedure--------  ")
        ausgabe = "procedure new_"+objectname+"()"
        ausgeben(ausgabe)
        ForEach methods()
                ausgabe = objectname+"(0)\"+methods()\name+"   =   @"+methods()\name+"()"
                ausgeben(ausgabe)
        Next
        ausgabe="Endprocedure"
        ausgeben(ausgabe)
EndProcedure

Procedure build_object()
        Protected ausgabe.s
        ausgabe = "mod_"+objectname+".pbi"
        If CreateFile(20,ausgabe)
        ausgeben("enableexplicit")
        expend_get_methods_from_members()
        lesbarausgeben()
        expend_set_methods_from_members()
        lesbarausgeben()
        build_prototypesection()
        lesbarausgeben()
        build_structure()
        lesbarausgeben()
        build_structure_definition()
        lesbarausgeben()
        build_procedure_stubs()
        lesbarausgeben()
        build_object_init_procedure()
Else
        MessageRequester("Mist gebaut", "Datei konnte nicht erstellt werden")
        EndIf
EndProcedure
and here is an example or test_program:

Code: Select all

; test_objectmaker_run



IncludeFile"object_maker.pb"

classname  = "balken"
objectname = "einbalken"
;-members definition

AddElement(members())
members()\name    = "hoehe"
members()\type    = #word
members()\get_soll = #False
members()\set_soll = #True

AddElement(members())
members()\name    = "breite"
members()\type    = #word
members()\get_soll = #False
members()\set_soll = #True

AddElement(members())
members()\name    = "beginn"
members()\type    = #word
members()\get_soll = #False
members()\set_soll = #True

AddElement(members())
members()\name    = "ende"
members()\type    = #word
members()\get_soll = #False
members()\set_soll = #True

AddElement(members())
members()\name    = "farbe"
members()\type    = #long
members()\get_soll = #True
members()\set_soll = #True

AddElement(members())
members()\name    = "art"
members()\type    = #word
members()\get_soll = #True
members()\set_soll = #True

AddElement(members())
members()\name    = "beschriftung"
members()\type    = #string
members()\get_soll = #True
members()\set_soll = #True

;--methoden definition-------

AddElement(methods())
methods()\name    = "balken_darstellen"
methods()\type    = 0
methods()\art     = #usual


AddElement(methods())
methods()\name    = "balken_beschriften"
methods()\type    = #word
methods()\art     = #False

;---auf gehts---

build_object()
The generated "mod_einbalken.pbi" survives a compiler run. :D
https://www.doerpsoft.org

Boost. Work. Efficiency.