/* Web Polygraph http://www.web-polygraph.org/
* (C) 2003-2006 The Measurement Factory
* Licensed under the Apache License, Version 2.0 */
#ifndef POLYGRAPH__BASE_OIDGENSTAT_H
#define POLYGRAPH__BASE_OIDGENSTAT_H
#include "xstd/h/iosfwd.h"
class OLog;
class ILog;
// oid generation statistics
class OidGenStat {
public:
enum Interest { intNone = 0, intPrivate, intPublic, intForeign };
protected:
typedef int Table[8];
public:
OidGenStat();
void reset();
// these two must be called in the listed order
void recordNeed(bool rep, int world);
void recordGen(bool rep, int world);
void store(OLog &log) const;
void load(ILog &log);
OidGenStat &operator +=(const OidGenStat &s);
ostream &print(ostream &os, const String &pfx) const;
protected:
inline int toIdx(bool rep, int world) const;
void mergeTable(Table &a, const Table &b) const;
void writeTable(OLog &log, const Table &t) const;
void readTable(ILog &log, Table &t);
void printTable(ostream &os, const String &pfx, const Table &t) const;
protected:
Table theNeed;
Table theLack;
Table theGen;
private: /* cached need info */
int needWorld;
bool needRep;
bool waitForGen;
};
inline
int OidGenStat::toIdx(bool rep, int world) const {
return world | (rep ? 4 : 0);
}
inline
ostream &operator <<(ostream &os, const OidGenStat &s) { return s.print(os, ""); }
inline
OLog &operator <<(OLog &log, const OidGenStat &s) { s.store(log); return log; }
inline
ILog &operator >>(ILog &log, OidGenStat &s) { s.load(log); return log; }
#endif
syntax highlighted by Code2HTML, v. 0.9.1