Another OOP PreCompiler

Applications, Games, Tools, User libs and useful stuff coded in PureBasic
User avatar
mk-soft
Always Here
Always Here
Posts: 5313
Joined: Fri May 12, 2006 6:51 pm
Location: Germany

Another OOP PreCompiler

Post by mk-soft »

Hi,

here now my oop-precompiler.

Update v0.44
New:
- Parameters for NewClassName(...) --> Call InitObject(...)

Update v0.45
Bugfix:
- Memory Manager

Download OOP-PreCompiler (Window x86 and x64)
Download OOP-PreCompiler (Linux)


IDE-Properties
Image
Image
Image

Examples Code Update v0.43

Code: Select all

; Example Part 1

; Defined first class

Class(MasterClass)
  ; This methods are generate the oop precomiler 
  ;    - QueryInterface(*UIID.iid, *ppv.long)
  ;    - AddRef()
  ;    - Release()
  ; All others methods automatically included
    
  ; Attributes
  LastName.s
  FirstName.s
  Datum.l
EndClass

; Syntax for Method:
; Method [Overwrite] ClassName_Function(*this.ClassName, ...)
;   ...
; EndMethod

; Method for Class MasterClass
Method MasterClass_SetLastName(*this.MasterClass, Name.s)
  *this\LastName = Name
EndMethod

Method MasterClass_SetFirstName(*this.MasterClass, Name.s)
  *this\FirstName = Name
EndMethod

Method MasterClass_SetDatum(*this.MasterClass, Datum.l)
  *this\Datum = Datum
EndMethod

Method.s MasterClass_GetDaten(*this.MasterClass, Separator.s)
  Protected Result.s
  Result = *this\LastName + Separator + *this\FirstName + Separator + FormatDate("%dd.%mm.%yyyy", *this\Datum)
  ProcedureReturn Result
EndMethod

; Test Part 1

Debug "Test Part 1"
Define.IMasterClass *User1 ; <- Object declare - Syntax: I + ClassName
; Create Object
*User1 = NewObject(MasterClass)
; Call Methods any Properties
*User1\SetLastName("Meyer")
*User1\SetFirstName("Hans")
*User1\SetDatum(Date())
Debug "User1: " + *User1\GetDaten(";")
; Release Object
DeleteObject(*User1)
; or *User1\Release()

Debug ""
; ***************************************************************************************

; Example Part 2 - inheritance and overwrite inherited method

; Defined second Class
Class(SubClass, MasterClass) ; <- inheritance method and attributes from MasterClass
  ; Attributes
  Street.s
  Sity.s
EndClass

; Method for Class SubClass
Method SubClass_SetStreet(*this.SubClass, Street.s)
  *this\Street = Street
EndMethod

Method SubClass_SetSity(*this.SubClass, Sity.s)
  *this\Sity = Sity
EndMethod

Method.s SubClass_GetAdresse(*this.SubClass, Separator.s)
  Protected Result.s
  Result = *this\Street + Separator + *this\Sity
  ProcedureReturn Result
EndMethod

Method.s Overwrite SubClass_GetDaten(*this.SubClass, Separator.s) ; <- Overwrite inherited method GetDaten(...)
  Protected *self.ISubClass = *this ; <- declare self methods
  Protected Result.s
  Result = *this\LastName + Separator + *this\FirstName + Separator + FormatDate("%dd.%mm.%yyyy", *this\Datum)
  Result + Separator + *self\GetAdresse(Separator)
  ProcedureReturn Result
EndMethod

; Test Part 2

Debug "Test Part 2"
Define.ISubClass *User2, *User3
; Create Object
*User2 = NewObject(SubClass)
*User2\SetLastName("Smith")
*User2\SetFirstName("Jon")
*User2\SetDatum(Date())
*User2\SetStreet("Linenstr. 44")
*User2\SetSity("Irgendwo")
Debug "User2: " + *User2\GetDaten(";")
; Release Object
*User2\Release()
; or DeleteObject(*User2)
Debug ""

; ***************************************************************************************

; Example Part 3 - avoidance of memory leak with method InitObject and DestroyObject

Class(MemClass)
  *mem1
  *mem2
EndClass

; Init memory
Method MemClass_InitObject(*this.MemClass) ; <- NewObject calling InitObject
  With *this
    Debug "InitObject: AllocateMemory."
    \mem1 = AllocateMemory(10*1024)
    \mem2 = AllocateMemory(20*1024)
  EndWith
EndMethod

Method MemClass_GetMemPointer(*this.MemClass, number.l)
  Select number
    Case 1 : ProcedureReturn *this\mem1
    Case 2 : ProcedureReturn *this\mem2
    Default : ProcedureReturn 0
  EndSelect
EndMethod

Method MemClass_DestroyObject(*this.MemClass) ; <- DeleteObject or Release calling DestroyObject
  
  Debug "DestroyObject: Free Memory."
  FreeMemory(*this\mem1)
  FreeMemory(*this\mem2)
  
EndMethod

; Test Part 3
Debug "Test Part 3"
Debug ""
Debug "Mem Test 1"
*mem.IMemClass = NewObject(MemClass)
Debug "Address of Obj : " + Str(*mem)
Debug "Address of mem1: " + Str(*mem\GetMemPointer(1))
Debug "Address of mem2: " + Str(*mem\GetMemPointer(2))
*mem\Release()
Debug ""

Debug "Mem Test 2"
*mem.IMemClass = NewObject(MemClass)
Debug "Address of Obj : " + Str(*mem)
Debug "Address of mem1: " + Str(*mem\GetMemPointer(1))
Debug "Address of mem2: " + Str(*mem\GetMemPointer(2))
DeleteObject(*mem)
Debug ""

Debug "Mem Test 3"
*mem.IMemClass = NewObject(MemClass)
Debug "Address of Obj : " + Str(*mem)
Debug "Address of mem1: " + Str(*mem\GetMemPointer(1))
Debug "Address of mem2: " + Str(*mem\GetMemPointer(2))
*mem\Release()
Debug ""
Please testing for bugs. Thanks

GT :wink:
Last edited by mk-soft on Wed Jun 24, 2009 11:16 pm, edited 10 times in total.
My Projects ThreadToGUI / OOP-BaseClass / EventDesigner V3
PB v3.30 / v5.75 - OS Mac Mini OSX 10.xx - VM Window Pro / Linux Ubuntu
Downloads on my Webspace / OneDrive
User avatar
yoxola
Enthusiast
Enthusiast
Posts: 383
Joined: Sat Feb 25, 2006 4:23 pm

Post by yoxola »

Sounds pretty fun, I'll have a try.

Thank for contribution :D
This field was left intentionally as signature.
SFSxOI
Addict
Addict
Posts: 2970
Joined: Sat Dec 31, 2005 5:24 pm
Location: Where ya would never look.....

Post by SFSxOI »

makes me want to convert my curent project....Thank You :)
User avatar
mk-soft
Always Here
Always Here
Posts: 5313
Joined: Fri May 12, 2006 6:51 pm
Location: Germany

Post by mk-soft »

Bugfix v0.34

Lower and upper case searching was errors in the translation.

Sorry :oops:
My Projects ThreadToGUI / OOP-BaseClass / EventDesigner V3
PB v3.30 / v5.75 - OS Mac Mini OSX 10.xx - VM Window Pro / Linux Ubuntu
Downloads on my Webspace / OneDrive
superadnim
Enthusiast
Enthusiast
Posts: 480
Joined: Thu Jul 27, 2006 4:06 am

Post by superadnim »

could you go a little more OOP for the parser? for instance I know why you are using the underscores, but... using a \ or a dot would make much more sense, really.

Even if you use :: as C++, it'll be much more solid.

May I ask, can you call encapsulated classes from public? or only privately?.

Just a few ideas: you could call "this" for yourself, ie as a reserved variable label and thus prevent from using the pointer all together, you can parse this one easily.

this->var = 10 ; var being a variable in the class

etc..

Another idea: don't pass *this by yourself, use the parser to add this pointer... thats the whole principle and idea of an oop parser, to do this stuff so you don't have to...

If you take my ideas it'll become a cleaner and more solid tool to work with :)

PS: as parser I mean preprocessor, etc...
PS2: baseclass? wtf?
User avatar
mk-soft
Always Here
Always Here
Posts: 5313
Joined: Fri May 12, 2006 6:51 pm
Location: Germany

Post by mk-soft »

the precomiler read only the code and bind a topfile and a bottomfile to the mainfile as includefile.
The syntax with *this as Pointer to encapsulated data and "\" as bind to structures and Interfaces come from PB
I won´t to translate all code, because it´s a big problem with includefiles und debuging code.
May I ask, can you call encapsulated classes from public? or only privately?
All Attributes with Class allways privatly but you can definded all attributes as Public with a new pointer to object . That´s not right method.

Code: Select all

*publicMaster.MasterClass = *User1
Debug "Public: " + *publicMaster\LastName
Sorry for my english.
:wink:
My Projects ThreadToGUI / OOP-BaseClass / EventDesigner V3
PB v3.30 / v5.75 - OS Mac Mini OSX 10.xx - VM Window Pro / Linux Ubuntu
Downloads on my Webspace / OneDrive
superadnim
Enthusiast
Enthusiast
Posts: 480
Joined: Thu Jul 27, 2006 4:06 am

Post by superadnim »

I mean, what if I want to do this:

myfile\read\string()


Too bad about the "can't be arsed to make a proper preprocessor" part :? I guess I'll have to continue mine after all... Both existent OOP tools are flawed in many points and the authors don't seem to care :cry: - I appreciate the effort but it's not good enough IMO as to start porting code and use it on a regular basis... Since it's not full OOP by any means.
User avatar
mk-soft
Always Here
Always Here
Posts: 5313
Joined: Fri May 12, 2006 6:51 pm
Location: Germany

Post by mk-soft »

superadnim wrote:I mean, what if I want to do this:
myfile\read\string()
Sorry, this not supported PB directly, but I have a germany sample.

Please wait to translate to englisch sample

Code: Select all


; *****************************************************************************

Class SubClass Extends BaseClass
  ; Private
  num.l
  text.s
EndClass

Class MasterClass Extends BaseClass
  ; Private
  Value.l
  *subclass.ISubClass[100]
EndClass

; *****************************************************************************

Method SubClass_SetText(*this.SubClass, text.s)
  *this\text = text
EndMethod

Method.s SubClass_GetText(*this.SubClass)
  ProcedureReturn *this\Text
EndMethod

Method SubClass_SetNum(*this.SubClass, Num.l)
  *this\num = num
EndMethod

Method SubClass_GetNum(*this.SubClass)
  ProcedureReturn *this\num
EndMethod

Method MasterClass_NewSubClass(*this.MasterClass)
  
  Protected count.l
  
  For i = 0 To 99
    If *this\subclass[i] = 0
      *this\subclass[i] = NewObject(SubClass)
      ProcedureReturn *this\subclass[i]
    EndIf
  Next
  ProcedureReturn 0
  
EndMethod

Method MasterClass_FreeSubClass(*this.MasterClass, *subclass)
  
  Protected count.l
  
  For i = 0 To 99
    If *this\subclass[i] = *subclass
      *this\subclass[i]\Release()
      *this\subclass[i] = 0
      ProcedureReturn 0
    EndIf
  Next
  ProcedureReturn *subclass
  
EndMethod

Method MasterClass_FreeAllSubClass(*this.MasterClass)
  
  For i = 0 To 99
    If *this\subclass[i] <> 0
      *this\subclass[i]\Release()
      *this\subclass[i] = 0
    EndIf
  Next
  
EndMethod

Method Overwrite MasterClass_Release(*this.MasterClass)
  
  If *this\__Ref > 1
    *this\__Ref - 1
    ProcedureReturn *this\__Ref
  Else
    For i = 0 To 99
      If *this\subclass[i] <> 0
        While *this\subclass[i]\Release() : Wend
        *this\subclass[i] = 0
      EndIf
    Next
    ProcedureReturn DeleteObject(*this)
  EndIf
  
EndMethod

; *****************************************************************************

*master.IMasterClass = NewObject(MasterClass)
*subclass1.ISubClass = *master\NewSubClass()
If *subclass1
  *subclass1\SetText("Hallo World")
EndIf

*subclass2.ISubClass = *master\NewSubClass()
If *subclass2
  *subclass2\SetText("OOP with PureBasic")
EndIf
*subclass3.ISubClass = *master\NewSubClass()
If *subclass3
  *subclass3\SetText(";)")
EndIf

Debug *subclass1\Gettext()
Debug *subclass2\Gettext()
Debug *subclass3\Gettext()

*master\FreeSubClass(*subclass1)

While *master\Release() : Wend
It´s the same method when you using DCOM-Object in PB

GT :roll:
My Projects ThreadToGUI / OOP-BaseClass / EventDesigner V3
PB v3.30 / v5.75 - OS Mac Mini OSX 10.xx - VM Window Pro / Linux Ubuntu
Downloads on my Webspace / OneDrive
superadnim
Enthusiast
Enthusiast
Posts: 480
Joined: Thu Jul 27, 2006 4:06 am

Post by superadnim »

I know, I know... but again, the purpose of a preprocessor is to enable this sort of things :P

Thanks.
LuCiFeR[SD]
666
666
Posts: 1033
Joined: Mon Sep 01, 2003 2:33 pm

Post by LuCiFeR[SD] »

superadnim wrote:Too bad about the "can't be arsed to make a proper preprocessor" part :? I guess I'll have to continue mine after all...
Is there REALLY any need for that? This isn't the first occasion you have gone out of your way to be as insultive as you possibly can towards somebody who is doing code in their spare time for free. Perhaps you SHOULD put your money where your big mouth is and bloody well write some code and realease it in the same manner so WE can all sit back and tear you to shreds for a change eh?
superadnim
Enthusiast
Enthusiast
Posts: 480
Joined: Thu Jul 27, 2006 4:06 am

Post by superadnim »

Or perhaps you could get laid and we could all sit back and laugh at you.
I said thanks, I said it was a good tool, I did add my constructive criticism if you don't like it, there you are. I also mentioned I'm working on my own preprocessor, but for people like you I would rather not share a bit. :wink:
LuCiFeR[SD]
666
666
Posts: 1033
Joined: Mon Sep 01, 2003 2:33 pm

Post by LuCiFeR[SD] »

Ahhhh, I really love cheap shots... especially as you keep turning me down for sex.. I guess you'll be waiting a while for the laughter to errupt ;)
User avatar
mk-soft
Always Here
Always Here
Posts: 5313
Joined: Fri May 12, 2006 6:51 pm
Location: Germany

Post by mk-soft »

Information:

The PreCompiler produces additional program code and macros.
This is merged at the beginning and at the end of the Main file.
The syntax of purebasic uses all techniques for the programming of objects.
No source codes are changed or replaced. I do not have also before this
differently to reallisieren around the full to purebasic to keep kompalitaet.

To produce all objects in LinkedList over put on after the release by objects no memory leakages.
This is unfortunately often not considered with the use AllocateMemory and FreeMemory.

Purebasic is a procedurale programming language however object orientation supported.
I use this support for the PreCompiler.

For complete object-oriented programming there are Visual studio or C++.

/* Translate by Yahoo! Babel Fish */
My Projects ThreadToGUI / OOP-BaseClass / EventDesigner V3
PB v3.30 / v5.75 - OS Mac Mini OSX 10.xx - VM Window Pro / Linux Ubuntu
Downloads on my Webspace / OneDrive
Dare
Addict
Addict
Posts: 1965
Joined: Mon May 29, 2006 1:01 am
Location: Outback

Post by Dare »

Thanks, mk-soft


@superadnim

I agree with LuCiFeR[SD], mate. You can make the odd good point but you almost always deliver these things in an obnoxious way. Yours is destructive, not constructive criticism.

LuCiFeR[SD] makes an excellent point about the generous contributions to these forums.

Posts like yours make some people think twice about releasing things and so you spite yourself and the rest of us when you belittle other people's efforts.

You imply you have all this (usually unfinished) but awesome code lying around. In different areas of expertise. Mate, I think you're skiting. It is put up or shut up time - so let's see this OOP masterpiece of yours.
Dare2 cut down to size
inc.
Enthusiast
Enthusiast
Posts: 406
Joined: Thu May 06, 2004 4:28 pm
Location: Cologne/GER

Post by inc. »

MK-Soft ... just don't care ...

If you dont agree with his " xyz must be available in an OOP paradigm" he just presumes that you got less skills and no idea how an oop language has to be. So be prepared ;-)
http://www.phpbbserver.com/pboop/viewto ... m=pboop#31
http://www.purebasic.fr/english/viewtop ... 823#227823
http://www.phpbbserver.com/pboop/viewto ... orum=pboop
Both existent OOP tools are flawed in many points and the authors don't seem to care Crying or Very sad ... Since it's not full OOP by any means.
Its not the way of the C# approach you "would like to have" but IT IS OOP.
The authors maybe just don't want to follow your order giving style, your teasings and presumtions regarding skills.

And btw: You know, not everything is "flawed" or as you say monkey-style builded just cause you are the one who can't handle it.
Check out OOP support for PB here!
Post Reply