Metaprocedure example

Post your FreeBASIC source, examples, tips and tricks here. Please don’t post code without including an explanation.
Post Reply
Tourist Trap
Posts: 2958
Joined: Jun 02, 2015 16:24

Metaprocedure example

Post by Tourist Trap »

Hello,

this is the demonstration of how one may define a procedure, here only subroutines, in a way that allow meta-management on it. The way it is defined and stored here in a udt leaves room for injecting some stuff from the outside in a centralized way. Maybe I'm wrong in the implementation style, but it's interesting to illustrate nested macros.

For agent programming it may be relevant, that's why it's called activity.

Tested ok on winxp32, report any failure please.

Code: Select all

 '--------------------------------------
'an activity is a kind of metaprocedure
'--------------------------------------
'features: nested macros


type ACTIVITYREGISTER extends OBJECT
	declare static function PlugActivity(byval ActAnyPtr as any ptr) as integer
	static as integer	activityAnyPtrArrayItemCount
	static as any ptr	activityAnyPtrArray(any)
end type
dim as integer	ACTIVITYREGISTER.activityAnyPtrArrayItemCount
dim as any ptr	ACTIVITYREGISTER.activityAnyPtrArray(any)
function ACTIVITYREGISTER.PlugActivity(byval ActAnyPtr as any ptr) as integer
	redim preserve _ 
	ACTIVITYREGISTER.activityAnyPtrArray( _ 
										uBound(ACTIVITYREGISTER.activityAnyPtrArray) + 1 _ 
										)
	ACTIVITYREGISTER.activityAnyPtrArray(uBound(ACTIVITYREGISTER.activityAnyPtrArray)) => _ 
																				ActAnyPtr
	'
	return (uBound(ACTIVITYREGISTER.activityAnyPtrArray) + 1)
end function

#macro _MAKEACTIVITY(ActivityIndex, SubroutineSignature)
    declare sub ActivityFunction##ActivityIndex SubroutineSignature
    #macro _ACTIVITY##ActivityIndex##CALLTRACK(ActivityFunctionArgument ...)
        cast( sub subroutineSignature , _ 
              ACTIVITYREGISTER.activityAnyPtrArray(ActivityIndex) _
            ) _ 
            (ActivityFunctionArgument)
    #endMacro
    sub ActivityFunction##ActivityIndex SubroutineSignature
#endmacro


'-----------------------------------------------------------------
'-------------------------------------------INIT------------------
'-----------------------------------------------------------------

'we define and register here all our activities 

_MAKEACTIVITY(0, 	(byval i as integer))
       'activity 0 body
	? i
end sub
_MAKEACTIVITY(1,	(byval i as integer, byval j as integer) )
	? i, j
end sub
_MAKEACTIVITY(2,	(byval i as integer, _ 
					 byval j as integer, _ 
					 byval k as integer) )
	? i, j, k
end sub


ACTIVITYREGISTER.PlugActivity(@ActivityFunction0)
ACTIVITYREGISTER.PlugActivity(@ActivityFunction1)
ACTIVITYREGISTER.PlugActivity(@ActivityFunction2)


'-----------------------------------------------------------------
'-------------------------------------------MAIN------------------
'-----------------------------------------------------------------

'we execute our activities from the array of the activity manager udt

_ACTIVITY0CALLTRACK(11111)
_ACTIVITY1CALLTRACK(11111, 22222)
_ACTIVITY2CALLTRACK(11111, 22222, 3333)



'-----------------------------------------------------------------

getKey()
'(eof)
Post Reply