Very very simple class creation tool

Applications, Games, Tools, User libs and useful stuff coded in PureBasic
SofT MANiAC
Enthusiast
Enthusiast
Posts: 142
Joined: Mon Sep 17, 2007 10:28 am
Location: P.O.P
Contact:

Very very simple class creation tool

Post by SofT MANiAC »

classmaker.pb

Code: Select all

sPrefix.s = "CLASS_"
sClassName.s = InputRequester("Class name", "Class name:", sPrefix) 
sClassFile.s = SaveFileRequester("Save .class.pbi file", LCase(Mid(sClassName, Len(sPrefix) + 1, Len(sClassName) - Len(sPrefix)) + ".class.pbi"), "pbi|*.pbi", 0)

If sClassFile = "" : End : EndIf

sTemplateText.s = PeekS(?template)
sTemplateText = ReplaceString(sTemplateText, "<#classname#>", sClassName) 

If CreateFile(1, sClassFile)
  WriteString(1, sTemplateText)
  CloseFile(1)
  MessageRequester("Complete!", "File:" + Chr(10) + sClassFile, #MB_OK | #MB_ICONINFORMATION)
Else 
  MessageRequester("Fatal error!", "File" + Chr(10) + sClassFile + Chr(10) + "not created!", #MB_OK | #MB_ICONERROR)
EndIf

DataSection
  template:
  IncludeBinary "templatebase.pb"
EndDataSection
templatebase.pb

Code: Select all

; Class <#classname#>
; Generated by SofT MANiAC's ClassMaker

;- structures
Structure <#classname#>_PROPS
  dummyProp.l
EndStructure

Interface <#classname#>
  ; constructor
  <#classname#>(dummyConstructorParam.l)
  
  ; destructor
  Release() 
  
  ; methods
  DummyMethod(dummyMethodParam.l)
EndInterface

Structure s<#classname#>
  ; virt table
  *vt.l
  
  ; attributes
  props.<#classname#>_PROPS
EndStructure

Declare.l Construct<#classname#>(dummyConstructorParam.l)
Declare.l <#classname#>_Release(*this)
Global _VT_<#classname#>

;- constructor
Procedure <#classname#>_<#classname#>(*this.s<#classname#>, dummyConstructorParam.l)
  Protected *thisM.<#classname#> = *this 
  ; *this\props\dummyProp = dummyConstructorParam
  ; MessageRequester("Input param is:", Str(dummyConstructorParam), #MB_OK)
  ; MessageRequester("Construction...", "...complete!", #MB_OK)
  ; ProcedureReturn #True
EndProcedure

;- destructor
Procedure <#classname#>_Release(*this.s<#classname#>) 
  Protected *thisM.<#classname#> = *this 
  ; MessageRequester("Destruction...", "...complete!", #MB_OK)
  ; ProcedureReturn #True
EndProcedure

;- DummyMethod
Procedure <#classname#>_DummyMethod(*this.s<#classname#>, dummyMethodParam.l)
  Protected *thisM.<#classname#> = *this
  MessageRequester("Input param is:", Str(dummyMethodParam), #MB_OK)
  Protected ouput.l = *this\props\dummyProp
  MessageRequester("Output param is:", Str(ouput), #MB_OK)
  ProcedureReturn ouput  
EndProcedure

Procedure Construct<#classname#>(dummyConstructorParam.l)
  Protected *this.s<#classname#> = AllocateMemory(SizeOf(s<#classname#>))
  Protected *thisM.<#classname#> = *this
  If Not *this : ProcedureReturn #False : EndIf
  If Not _VT_<#classname#> And SizeOf(<#classname#>)
    _VT_<#classname#> = AllocateMemory(SizeOf(<#classname#>)) ; Global virtual table
    
    ; constructor
    CompilerIf Defined(<#classname#>_<#classname#>, #PB_Procedure)
      PokeL(_VT_<#classname#> + OffsetOf(<#classname#>\<#classname#>()), @<#classname#>_<#classname#>())
    CompilerEndIf
    
    ; destructor
    CompilerIf Defined(<#classname#>_Release, #PB_Procedure)
      PokeL(_VT_<#classname#> + OffsetOf(<#classname#>\Release()), @<#classname#>_Release())
    CompilerEndIf
    
    ; other methods here
    CompilerIf Defined(<#classname#>_DummyMethod, #PB_Procedure)
      PokeL(_VT_<#classname#> + OffsetOf(<#classname#>\DummyMethod()), @<#classname#>_DummyMethod())
    CompilerEndIf
    
  EndIf
  *this\vt = _VT_<#classname#>
  CompilerIf Defined(<#classname#>_<#classname#>, #PB_Procedure) = #True
    <#classname#>_<#classname#>(*this, dummyConstructorParam)
  CompilerEndIf
  ProcedureReturn *this
EndProcedure

; declaration
; dummyConstructorParam.l = 23
; Global *IS_Dummy.<#classname#> = construct<#classname#>(dummyConstructorParam)
; accessing methods
; dummyMethodParam.l = 87
; debug *IS_Dummy\DummyMethod(dummyMethodParam)
; deleting
; *IS_Dummy\Release() : FreeMemory(*IS_Dummy) : *IS_Dummy = 0
Based on inc.'s PureObject.
I use it, because Dreamotion3D conflicts with PureObject :(
Preprocessor tools (eg PureObject) are really cool, but not always comfortable.
Native OOP support would be great :cry:
POiNT.OF.PRESENCE group