Another OOP PreCompiler

Applications, Games, Tools, User libs and useful stuff coded in PureBasic
Post Reply
mk-soft
Always Here
Always Here
Posts: 6309
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
yoxola
Enthusiast
Enthusiast
Posts: 386
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 :)
mk-soft
Always Here
Always Here
Posts: 6309
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?
mk-soft
Always Here
Always Here
Posts: 6309
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.
mk-soft
Always Here
Always Here
Posts: 6309
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 ;)
mk-soft
Always Here
Always Here
Posts: 6309
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

Return to "Applications - Feedback and Discussion"