00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00018
00019 #ifndef NET_INSTAWEB_UTIL_PUBLIC_STATISTICS_TEMPLATE_H_
00020 #define NET_INSTAWEB_UTIL_PUBLIC_STATISTICS_TEMPLATE_H_
00021
00022 #include <cstddef>
00023 #include <map>
00024 #include <vector>
00025 #include <utility>
00026
00027 #include "net/instaweb/util/public/basictypes.h"
00028 #include "net/instaweb/util/public/statistics.h"
00029 #include "net/instaweb/util/public/stl_util.h"
00030 #include "net/instaweb/util/public/string.h"
00031 #include "net/instaweb/util/public/string_util.h"
00032 #include "net/instaweb/util/public/writer.h"
00033
00034 namespace net_instaweb {
00035 class MessageHandler;
00036
00040 template<class Var, class Hist, class TimedVar> class StatisticsTemplate
00041 : public Statistics {
00042 public:
00043 StatisticsTemplate() {}
00044 virtual ~StatisticsTemplate() {
00045 STLDeleteContainerPointers(variables_.begin(), variables_.end());
00046 STLDeleteContainerPointers(histograms_.begin(), histograms_.end());
00047 STLDeleteContainerPointers(timed_vars_.begin(), timed_vars_.end());
00048 }
00049
00052 virtual Var* AddVariable(const StringPiece& name) {
00053 Var* var = FindVariable(name);
00054 if (var == NULL) {
00055 var = NewVariable(name, variables_.size());
00056 variables_.push_back(var);
00057 variable_names_.push_back(name.as_string());
00058 variable_map_[name.as_string()] = var;
00059 }
00060 return var;
00061 }
00062
00063 virtual Var* FindVariable(const StringPiece& name) const {
00064 typename VarMap::const_iterator p = variable_map_.find(name.as_string());
00065 Var* var = NULL;
00066 if (p != variable_map_.end()) {
00067 var = p->second;
00068 }
00069 return var;
00070 }
00071
00072 virtual Hist* AddHistogram(const StringPiece& name) {
00073 Hist* hist = FindHistogram(name);
00074 if (hist == NULL) {
00075 hist = NewHistogram(name);
00076 histograms_.push_back(hist);
00077 histogram_names_.push_back(name.as_string());
00078 histogram_map_[name.as_string()] = hist;
00079 }
00080 return hist;
00081 }
00082
00083 virtual Hist* FindHistogram(const StringPiece& name) const {
00084 typename HistMap::const_iterator p = histogram_map_.find(name.as_string());
00085 Hist* hist = NULL;
00086 if (p != histogram_map_.end()) {
00087 hist = p->second;
00088 }
00089 return hist;
00090 }
00091
00092 virtual TimedVar* AddTimedVariable(const StringPiece& name,
00093 const StringPiece& group) {
00094 TimedVar* timedvar = FindTimedVariable(name);
00095 if (timedvar == NULL) {
00096 timedvar = NewTimedVariable(name, timed_vars_.size());
00097 timed_vars_.push_back(timedvar);
00098 timed_var_map_[name.as_string()] = timedvar;
00099 timed_var_group_map_[group.as_string()].push_back(name.as_string());
00100 }
00101 return timedvar;
00102 }
00103
00104 virtual TimedVar* FindTimedVariable(const StringPiece& name) const {
00105 typename TimedVarMap::const_iterator p =
00106 timed_var_map_.find(name.as_string());
00107 TimedVar* timedvar = NULL;
00108 if (p != timed_var_map_.end()) {
00109 timedvar = p->second;
00110 }
00111 return timedvar;
00112 }
00113
00114 virtual const StringVector& HistogramNames() {
00115 return histogram_names_;
00116 }
00117
00118 virtual const std::map<GoogleString, StringVector>& TimedVariableMap() {
00119 return timed_var_group_map_;
00120 }
00121
00122 virtual void Dump(Writer* writer, MessageHandler* message_handler) {
00123 for (int i = 0, n = variables_.size(); i < n; ++i) {
00124 Variable* var = variables_[i];
00125 writer->Write(variable_names_[i], message_handler);
00126 writer->Write(": ", message_handler);
00127 writer->Write(Integer64ToString(var->Get64()), message_handler);
00128 writer->Write("\n", message_handler);
00129 }
00130 }
00131
00132 virtual void Clear() {
00133 for (int i = 0, n = variables_.size(); i < n; ++i) {
00134 Variable* var = variables_[i];
00135 var->Clear();
00136 }
00137 for (int i = 0, n = histograms_.size(); i < n; ++i) {
00138 Histogram* hist = histograms_[i];
00139 hist->Clear();
00140 }
00141 for (int i = 0, n = timed_vars_.size(); i < n; ++i) {
00142 TimedVariable* timedvar = timed_vars_[i];
00143 timedvar->Clear();
00144 }
00145 }
00146
00147 protected:
00149 virtual Var* NewVariable(const StringPiece& name, int index) = 0;
00150 virtual Hist* NewHistogram(const StringPiece& name) = 0;
00151 virtual TimedVar* NewTimedVariable(const StringPiece& name, int index) = 0;
00152
00153 size_t variables_size() const { return variables_.size(); }
00154 Var* variables(size_t pos) { return variables_.at(pos); }
00155
00156 size_t histograms_size() const { return histograms_.size(); }
00157 Hist* histograms(size_t pos) { return histograms_.at(pos); }
00158
00159 const GoogleString& histogram_names(size_t pos) const {
00160 return histogram_names_.at(pos);
00161 }
00162
00163 private:
00164 typedef std::vector<Var*> VarVector;
00165 typedef std::map<GoogleString, Var*> VarMap;
00166 typedef std::vector<Hist*> HistVector;
00167 typedef std::map<GoogleString, Hist*> HistMap;
00168
00169 typedef std::vector<TimedVar*> TimedVarVector;
00170 typedef std::map<GoogleString, TimedVar*> TimedVarMap;
00171 VarVector variables_;
00172 VarMap variable_map_;
00173 HistVector histograms_;
00174 HistMap histogram_map_;
00175 TimedVarVector timed_vars_;
00176 TimedVarMap timed_var_map_;
00178 std::map<GoogleString, StringVector> timed_var_group_map_;
00179 StringVector variable_names_;
00180 StringVector histogram_names_;
00181
00182 DISALLOW_COPY_AND_ASSIGN(StatisticsTemplate);
00183 };
00184
00187 template<class Var>
00188 class ScalarStatisticsTemplate
00189 : public StatisticsTemplate<Var, NullHistogram, FakeTimedVariable> {
00190 public:
00191 ScalarStatisticsTemplate() {}
00192 virtual ~ScalarStatisticsTemplate() {}
00193
00194 protected:
00195 virtual NullHistogram* NewHistogram(const StringPiece& name) {
00196 return new NullHistogram;
00197 }
00198
00199 virtual FakeTimedVariable* NewTimedVariable(const StringPiece& name,
00200 int index) {
00201 return this->NewFakeTimedVariable(name, index);
00202 }
00203 };
00204
00205 }
00206
00207 #endif ///< NET_INSTAWEB_UTIL_PUBLIC_STATISTICS_TEMPLATE_H_