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)