00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef _cvc3__statistics_h
00023 #define _cvc3__statistics_h
00024
00025 #include <string>
00026 #include <iostream>
00027 #include <sstream>
00028 #include <map>
00029
00030 namespace CVC3 {
00031
00032 class Statistics;
00033
00034
00035
00036
00037
00038 class StatFlag {
00039 private:
00040 bool* d_flag;
00041 public:
00042
00043
00044 StatFlag(bool& flag) : d_flag(&flag) { }
00045
00046 ~StatFlag() { }
00047
00048 operator bool() { return *d_flag; }
00049
00050
00051
00052 bool operator--() { *d_flag = false; return false; }
00053 bool operator++() { *d_flag = true; return true; }
00054
00055 bool operator--(int) { bool x=*d_flag; *d_flag=false; return x; }
00056 bool operator++(int) { bool x=*d_flag; *d_flag=true; return x; }
00057
00058 StatFlag& operator=(bool x) { *d_flag=(x!=false); return *this; }
00059
00060 friend bool operator==(const StatFlag& f1, const StatFlag& f2);
00061 friend bool operator!=(const StatFlag& f1, const StatFlag& f2);
00062
00063 friend std::ostream& operator<<(std::ostream& os, const StatFlag& f);
00064 };
00065
00066 inline bool operator==(const StatFlag& f1, const StatFlag& f2) {
00067 return (*f1.d_flag) == (*f2.d_flag);
00068 }
00069 inline bool operator!=(const StatFlag& f1, const StatFlag& f2) {
00070 return (*f1.d_flag) != (*f2.d_flag);
00071 }
00072 inline std::ostream& operator<<(std::ostream& os, const StatFlag& f) {
00073 if(*f.d_flag) return(os << "true");
00074 else return(os << "false");
00075 }
00076
00077
00078
00079
00080 class StatCounter {
00081 private:
00082 int* d_counter;
00083 public:
00084
00085
00086 StatCounter(int& c) : d_counter(&c) { }
00087
00088 ~StatCounter() { }
00089
00090
00091
00092 operator int() { return *d_counter; }
00093
00094
00095
00096 int operator--() { return --(*d_counter); }
00097 int operator++() { return ++(*d_counter); }
00098
00099 int operator--(int) { return (*d_counter)--; }
00100 int operator++(int) { return (*d_counter)++; }
00101
00102 StatCounter& operator=(int x) { *d_counter=x; return *this; }
00103 StatCounter& operator+=(int x) { *d_counter+=x; return *this; }
00104 StatCounter& operator-=(int x) { *d_counter-=x; return *this; }
00105 StatCounter& operator=(const StatCounter& x)
00106 { *d_counter=*x.d_counter; return *this; }
00107 StatCounter& operator-=(const StatCounter& x)
00108 { *d_counter-=*x.d_counter; return *this; }
00109 StatCounter& operator+=(const StatCounter& x)
00110 { *d_counter+=*x.d_counter; return *this; }
00111
00112 friend bool operator==(const StatCounter& c1, const StatCounter& c2);
00113 friend bool operator!=(const StatCounter& c1, const StatCounter& c2);
00114 friend bool operator==(int c1, const StatCounter& c2);
00115 friend bool operator!=(int c1, const StatCounter& c2);
00116 friend bool operator==(const StatCounter& c1, int c2);
00117 friend bool operator!=(const StatCounter& c1, int c2);
00118
00119 friend std::ostream& operator<<(std::ostream& os, const StatCounter& f);
00120 };
00121
00122 inline bool operator==(const StatCounter& c1, const StatCounter& c2) {
00123 return (*c1.d_counter) == (*c2.d_counter);
00124 }
00125 inline bool operator!=(const StatCounter& c1, const StatCounter& c2) {
00126 return (*c1.d_counter) != (*c2.d_counter);
00127 }
00128 inline bool operator==(int c1, const StatCounter& c2) {
00129 return c1 == (*c2.d_counter);
00130 }
00131 inline bool operator!=(int c1, const StatCounter& c2) {
00132 return c1 != (*c2.d_counter);
00133 }
00134 inline bool operator==(const StatCounter& c1, int c2) {
00135 return (*c1.d_counter) == c2;
00136 }
00137 inline bool operator!=(const StatCounter& c1, int c2) {
00138 return (*c1.d_counter) != c2;
00139 }
00140 inline std::ostream& operator<<(std::ostream& os, const StatCounter& c) {
00141 return (os << *c.d_counter);
00142 }
00143
00144
00145
00146 class Statistics {
00147 private:
00148
00149 std::ostream* d_os;
00150 typedef std::map<std::string, bool> StatFlagMap;
00151 typedef std::map<std::string, int> StatCounterMap;
00152 StatFlagMap d_flags;
00153 StatCounterMap d_counters;
00154 public:
00155
00156 Statistics() { }
00157
00158 ~Statistics() { }
00159
00160
00161 StatFlag flag(const std::string& name)
00162 { return StatFlag(d_flags[name]); }
00163 StatCounter counter(const std::string& name)
00164 { return StatCounter(d_counters[name]); }
00165
00166
00167 std::ostream& printAll(std::ostream& os) const;
00168 friend std::ostream& operator<<(std::ostream& os,
00169 const Statistics& stats) {
00170 return stats.printAll(os);
00171 }
00172 };
00173
00174 }
00175
00176 #endif