* Copyright 2008 Stephan Aßmus <superstippi@gmx.de>
* Distributed under the terms of the MIT/X11 license.
*/
#ifndef FUNCTION_TRACER_H
#define FUNCTION_TRACER_H
#include <stdio.h>
#include <String.h>
namespace BPrivate {
class FunctionTracer {
public:
typedef int (*PrintFunction)(const char * fmt, ...);
FunctionTracer(PrintFunction printFunction, const void* pointer, const char* functionName,
int32& depth)
: fFunctionName(functionName),
fPrepend(),
fFunctionDepth(depth),
fPrintFunction(printFunction)
{
fFunctionDepth++;
if (pointer != NULL)
fPrepend.SetToFormat("%p ->", pointer);
fPrepend.Append(' ', fFunctionDepth * 2);
fPrintFunction("%s%s {\n", fPrepend.String(), fFunctionName.String());
}
~FunctionTracer()
{
fPrintFunction("%s}\n", fPrepend.String());
fFunctionDepth--;
}
private:
BString fFunctionName;
BString fPrepend;
int32& fFunctionDepth;
#if __GNUC__ < 3
PrintFunction fPrintFunction;
#else
PrintFunction _PRINTFLIKE(1, 2) fPrintFunction;
#endif
};
}
using BPrivate::FunctionTracer;
#endif