Files
wagic/projects/mtg/include/ObjectAnalytics.h
wrenczes@gmail.com bd56723bc0 Checkpoint on a utility helper class. Basically, if you have a class that you want to count the numbers of instances, you do this:
class Foo
#ifdef TRACK_OBJECT_USAGE
      : public InstanceCounter<Foo>
#endif

Then, use this macro somewhere in the class body:
SUPPORT_OBJECT_ANALYTICS(Foo)

Lastly, add whatever information you want to trace out to the function ObjectAnalytics::DumpStatistics().

Here's a sample of the output of what I've instrumented so far:

-----------------------------------------------------------
Object Usage Stats

CardPrimitive current count: 7899
CardPrimitive current byte usage: 2053740
CardPrimitive max count: 7908
CardPrimitive max byte usage: 2056080

MTGCard current count: 13973
MTGCard current byte usage: 670704
MTGCard max count: 13982
MTGCard max byte usage: 671136

MTGCardInstance current count: 180
MTGCardInstance current byte usage: 172080
MTGCardInstance max count: 189
MTGCardInstance max byte usage: 180684

-----------------------------------------------------------
2011-04-23 05:16:53 +00:00

88 lines
1.8 KiB
C++

#ifndef OBJECTANALYTICS_H
#define OBJECTANALYTICS_H
#ifdef DEBUG
#define TRACK_OBJECT_USAGE
#endif
#ifdef TRACK_OBJECT_USAGE
namespace ObjectAnalytics
{
/*
** See ObjectAnalytics.cpp for how to add additional objects to this function's dump
*/
void DumpStatistics();
}
#define SUPPORT_OBJECT_ANALYTICS(classname) \
template <> unsigned int InstanceCounter<classname>::sHighWaterMark = 0; \
template <> unsigned int InstanceCounter<classname>::sInstanceCount = 0; \
/**
** Helper class for tracking object instances.
** Usage:
** class Foo
** #ifdef TRACK_OBJECT_USAGE
** : public InstanceCounter<Foo>
** #endif
**
** Additionally, since the implementation uses static counters,
** somewhere in your class body, you need to put in the following macro:
** SUPPORT_OBJECT_ANALYTICS(Foo);
*/
template <typename T>
class InstanceCounter
{
public:
InstanceCounter()
{
if (sHighWaterMark < ++sInstanceCount)
sHighWaterMark = sInstanceCount;
}
InstanceCounter(const InstanceCounter&)
{
if (sHighWaterMark < ++sInstanceCount)
sHighWaterMark = sInstanceCount;
}
InstanceCounter& operator =(const InstanceCounter&)
{
}
~InstanceCounter()
{
--sInstanceCount;
}
static unsigned int GetCurrentObjectCount()
{
return sInstanceCount;
}
static unsigned int GetMaximumObjectCount()
{
return sHighWaterMark;
}
static unsigned int GetCurrentByteCount()
{
return sizeof(T) * sInstanceCount;
}
static unsigned int GetMaximumByteCount()
{
return sizeof(T) * sHighWaterMark;
}
static unsigned int sInstanceCount;
static unsigned int sHighWaterMark;
};
#else
#define SUPPORT_OBJECT_ANALYTICS(classname)
#endif //TRACK_OBJECT_USAGE
#endif //OBJECTANALYTICS_H