include/utilities/counter.h
 author Dmitriy Morozov Fri, 01 May 2009 15:36:25 -0700 branch dev changeset 124 af54138b98fd parent 109 75eb7a4628f2 child 174 3f1034dca432 permissions -rw-r--r--
```
/*
* Author: Dmitriy Morozov
* Department of Computer Science, Duke University, 2005 -- 2007
*/

#ifndef __COUNTER_H__
#define __COUNTER_H__

#ifndef COUNTERS
#define     GetCounter(path)        0
#define     Count(x)
#define     CountNum(x,y)
#define     CountBy(x,y)
#define     CountNumBy(x,y,z)
#define     SetFrequency(x, freq)
#define     SetTrigger(x, y)
#else // COUNTERS
#define     GetCounter(path)            get_counter(path)
#define     Count(x)                    do { x->count++; if ((x->count % x->frequency == 0)) x->trigger->print(); } while (0)
#define     CountNum(x,y)               do { x->subcount[y]++; } while (0)
#define     CountBy(x,y)                do { x->count += y; } while (0)
#define     CountNumBy(x,y,z)           do { x->subcount[y] += z; } while (0)
#define     SetFrequency(x, freq)       do { x->frequency = freq; } while (0)
#define     SetTrigger(x, y)            do { x->trigger = y; } while(0)

#include <map>
#include <string>
#include <iostream>
#include <limits>
#include <unistd.h>

class Counter
{
public:
typedef                 unsigned long                           CounterType;
typedef                 std::map<std::string, Counter*>         SubCounterMap;
typedef                 std::map<int, CounterType>              SubCountMap;

public:
CounterType             count;
CounterType             frequency;
SubCountMap             subcount;
Counter*                trigger;

public:
Counter(const std::string& full_name = "",
CounterType freq = std::numeric_limits<CounterType>::max());
~Counter();

Counter*                get_child(const std::string& path, std::string::size_type pos);
void                    print();

private:
SubCounterMap           subcounters_;
std::string             full_name_;

static const char*      start_color;
static const char*      finish_color;
static const char       green_color[];
static const char       normal_color[];
static const char       empty_string[];
};
const char Counter::green_color[]       = "\033[32m";
const char Counter::normal_color[]      = "\033[0m";
const char Counter::empty_string[]      = "";
const char* Counter::start_color        = 0;
const char* Counter::finish_color       = 0;

static      Counter             rootCounter;

Counter*    get_counter(const char* path)
{
return rootCounter.get_child(path, 0);
}

#include "counter.hpp"

#endif // COUNTERS

#endif // __COUNTER_H__
```