#ifndef UTIL_TRACER_H
#define UTIL_TRACER_H

#include <string>

using namespace std;

#define TRACER(CLASSNAME) \
struct CLASSNAME ## _TRACER_STRUCT { \
\
   CLASSNAME ## _TRACER_STRUCT() { tracer_ctor( #CLASSNAME, TRACER_ID ); }; \
   CLASSNAME ## _TRACER_STRUCT( const CLASSNAME ## _TRACER_STRUCT& TRACER ) { tracer_ctor( #CLASSNAME, TRACER_ID ); }; \
   virtual ~ CLASSNAME ## _TRACER_STRUCT() { tracer_dtor( #CLASSNAME, TRACER_ID ); }; \
   private: \
   int TRACER_ID; \
} CLASSNAME ## _TRACER;

void tracer_enable( const string& ClassName );
void tracer_dump();
int tracer_count( const string& ClassName );
void tracer_ctor( const string& ClassName, int& TracerID );
void tracer_dtor( const string& ClassName, int& TracerID );

#endif

