include/utilities/counter.h
 author Dmitriy Morozov Thu, 25 Dec 2008 13:08:41 -0800 branch dev changeset 103 2ac129839e02 parent 37 addeb7563cb2 child 105 051af83fba4c permissions -rw-r--r--
Empty is now a template, replaced RecursiveIterator with boost::counting_iterator
```
/*
* 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		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		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__
```