I have made a new post at
http://www.artima.com/weblogs/viewpost.jsp?thread=85301 which demonstrates
the technique of template specialization for static event handlers. Here is
the source code for posterity:
#include <stdio.h>
#include <time.h>
const int BIG_NUM = 100000000;
const int EVENT_A = 0;
const int EVENT_B = 1;
int gnCnt = 0;
/////////////////////////////////////////////////
// static dispatch code
template<typena me int>
inline bool StaticHandler(i nt nArg) {
return false;
}
template<typena me Dummy_T>
void StaticDispatch( ) {
while (StaticHandler< EVENT_A>(BIG_NU M)) {
StaticHandler<E VENT_B>(1);
}
}
/////////////////////////////////////////////////
// dynamic dispatch code
typedef bool (*HandlerFxn)(i nt);
bool DefaultDynamicH andler(int nArg) {
return false;
}
HandlerFxn FxnPtrTable[2] = {
&DefaultDynamic Handler,
&DefaultDynamic Handler
};
void RegisterHandler (int EventCode, HandlerFxn pFxn) {
FxnPtrTable[EventCode] = pFxn;
}
void DynamicDispatch () {
while (FxnPtrTable[EVENT_A](BIG_NUM)) {
FxnPtrTable[EVENT_B](1);
}
}
/////////////////////////////////////////////////
// dynamic user-defined event handlers
inline bool DynamicHandlerA (int nArg) {
return gnCnt < nArg;
}
inline bool DynamicHandlerB (int nArg) {
gnCnt += nArg;
return true;
}
/////////////////////////////////////////////////
// static user-defined event handlers
template<>
inline bool StaticHandler<E VENT_A>(int nArg) {
return gnCnt < nArg;
}
template<>
inline bool StaticHandler<E VENT_B>(int nArg) {
gnCnt += nArg;
return true;
}
/////////////////////////////////////////////////
// main entry point
int main()
{
int nStart;
int nEnd;
{
gnCnt = 0;
RegisterHandler (EVENT_A, &DynamicHandler A);
RegisterHandler (EVENT_B, &DynamicHandler B);
nStart = clock();
DynamicDispatch ();
nEnd = clock();
printf("time elapsed for dynamic dispatch %d msec\n", (nEnd - nStart) *
CLOCKS_PER_SEC / 1000);
}
{
gnCnt = 0;
nStart = clock();
StaticDispatch< void>();
nEnd = clock();
printf("time elapsed for static dispatch %d msec\n", (nEnd - nStart) *
CLOCKS_PER_SEC / 1000);
}
getchar();
return 0;
}
--
Christopher Diggins
http://www.cdiggins.com http://www.heron-language.com