
#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<int> 
inline bool StaticHandler(int nArg) {
  return false;
}

template<typename Dummy_T>
void StaticDispatch() {
  while (StaticHandler<EVENT_A>(BIG_NUM)) {
    StaticHandler<EVENT_B>(1);
  }
}

/////////////////////////////////////////////////
// dynamic dispatch code

typedef bool (*HandlerFxn)(int);

bool DefaultDynamicHandler(int nArg) {
  return false;
}

HandlerFxn FxnPtrTable[2] = { 
  &DefaultDynamicHandler, 
  &DefaultDynamicHandler 
}; 

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<EVENT_A>(int nArg) {
  return gnCnt < nArg;
}

template<>
inline bool StaticHandler<EVENT_B>(int nArg) {
  gnCnt += nArg;
  return true;
}

/////////////////////////////////////////////////
// main entry point

int main()
{
  int nStart;
  int nEnd;
  
  {
    gnCnt = 0;
    RegisterHandler(EVENT_A, &DynamicHandlerA);
    RegisterHandler(EVENT_B, &DynamicHandlerB);
    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;
}



