Changeset 8e70823 for src/Common/Stats
- Timestamp:
- Mar 1, 2019, 2:10:34 PM (6 years ago)
- Branches:
- ADT, aaron-thesis, arm-eh, ast-experimental, cleanup-dtors, enum, forall-pointer-decay, jacob/cs343-translation, jenkins-sandbox, master, new-ast, new-ast-unique-expr, persistent-indexer, pthread-emulation, qualifiedEnum
- Children:
- 675716e
- Parents:
- 79de2210
- Location:
- src/Common/Stats
- Files:
-
- 1 added
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
TabularUnified src/Common/Stats/Counter.cc ¶
r79de2210 r8e70823 18 18 #include <algorithm> 19 19 #include <cstring> 20 #include <functional> 20 21 #include <iomanip> 21 22 22 23 namespace Stats { 23 24 namespace Counters { 24 25 template<typename T>26 void ForAllCounters(BaseCounter::list_t & range, size_t level, T func) {27 auto it = range.head;28 while(it) {29 auto next = it->next;30 func(it, level);31 ForAllCounters(it->children, level + 1, func);32 it = next;33 }34 }35 36 25 void print() { 37 if(! BaseCounter::top.head) return;26 if(!top.head) return; 38 27 size_t nc = 0; 39 ForAllCounters(BaseCounter::top, 0, [&](BaseCounter* node, size_t level) {40 nc = std::max(nc, (4 * level) + std::strlen(node->name));28 Base::ForAll(top, 0, [&](Base::TreeImpl * node, size_t level) { 29 nc = std::max(nc, (4 * level) + node->name.size()); 41 30 }); 42 31 43 const char * consttitle = "Counter Statistic";32 const std::string & title = "Counter Statistic"; 44 33 size_t nct = nc + 14; 45 34 std::cerr << std::string(nct, '=') << std::endl; 46 std::cerr << std::string((nct - std::strlen(title)) / 2, ' ');35 std::cerr << std::string((nct - title.size()) / 2, ' '); 47 36 std::cerr << title << std::endl; 48 37 std::cerr << std::string(nct, '-') << std::endl; 49 38 50 39 51 ForAllCounters(BaseCounter::top, 0, [&](BaseCounter* node, size_t level) {40 Base::ForAll(top, 0, [&](Base::TreeImpl * node, size_t level) { 52 41 std::cerr << std::string(level * 4, ' '); 53 42 std::cerr << node->name; 54 std::cerr << std::string(nc - ((level * 4) + std::strlen(node->name)), ' ');43 std::cerr << std::string(nc - ((level * 4) + node->name.size()), ' '); 55 44 std::cerr << " | "; 56 45 std::cerr << std::setw(9); … … 58 47 std::cerr << " |"; 59 48 std::cerr << '\n'; 60 delete node; 61 }); 49 }, true); 62 50 63 51 std::cerr << std::string(nct, '-') << std::endl; 64 52 } 65 53 66 Base Counter::list_t BaseCounter::top;54 Base::TreeImpl::Top top; 67 55 } 68 56 } -
TabularUnified src/Common/Stats/Counter.h ¶
r79de2210 r8e70823 18 18 #include <cstdint> 19 19 #include <iostream> 20 #include <string> 21 22 #include "Common/Stats/Base.h" 20 23 21 24 namespace Stats { … … 23 26 void print(); 24 27 25 class BaseCounter { 28 extern Base::TreeImpl::Top top; 29 30 class CounterGroup : public Base::Tree<top> { 26 31 public: 27 BaseCounter(const char * const name) : name(name) { 28 top.append(this); 29 } 32 CounterGroup(const std::string & name ) : Base::Tree<top>(name) {} 33 CounterGroup(const std::string & name, Base::Tree<top> * parent) : Base::Tree<top>(name, parent) {} 30 34 31 BaseCounter(const char * const name, BaseCounter * parent) : name(name) { 32 parent->children.append(this); 33 } 35 virtual void print(std::ostream & os) override { os << ""; } 34 36 protected: 35 virtual ~BaseCounter() = default; 36 37 struct list_t { 38 BaseCounter * head = nullptr; 39 BaseCounter * tail = nullptr; 40 41 void append(BaseCounter * node) { 42 if(!head) { head = node; } 43 else { tail->next = node;} 44 tail = node; 45 } 46 }; 47 48 private: 49 virtual void print(std::ostream &) = 0; 50 template<typename T> 51 friend void ForAllCounters(BaseCounter::list_t &, size_t, T ); 52 friend void print(); 53 54 private: 55 const char * const name; 56 57 BaseCounter * next = nullptr; 58 list_t children; 59 60 static list_t top; 37 virtual ~CounterGroup() = default; 61 38 }; 62 39 63 class CounterGroup : public BaseCounter{40 class SimpleCounter : public Base::Tree<top> { 64 41 public: 65 CounterGroup(const char * const name ) : BaseCounter(name) {}66 CounterGroup(const char * const name, BaseCounter * parent) : BaseCounter(name, parent) {}42 SimpleCounter(const std::string & name ) : Base::Tree<top>(name) {} 43 SimpleCounter(const std::string & name, Base::Tree<top> * parent) : Base::Tree<top>(name, parent) {} 67 44 68 protected: 69 virtual ~CounterGroup() = default; 70 71 private: 72 virtual void print(std::ostream & os) { 73 os << ""; 74 } 75 template<typename T> 76 friend void ForAllCounters(BaseCounter::list_t &, size_t, T ); 77 friend void print(); 78 }; 79 80 class SimpleCounter : public BaseCounter { 81 public: 82 SimpleCounter(const char * const name ) : BaseCounter(name) {} 83 SimpleCounter(const char * const name, BaseCounter * parent) : BaseCounter(name, parent) {} 45 virtual void print(std::ostream & os) override { os << count; } 84 46 85 47 inline void operator++(int) { count++; } … … 89 51 90 52 private: 91 virtual void print(std::ostream & os) {92 os << count;93 }94 template<typename T>95 friend void ForAllCounters(BaseCounter::list_t &, size_t, T );96 friend void print();97 98 53 size_t count = 0; 99 100 54 }; 101 55 102 56 template<typename T> 103 class AverageCounter : public Base Counter{57 class AverageCounter : public Base::Tree<top> { 104 58 public: 105 AverageCounter(const char * const name ) : BaseCounter(name), sum{} {} 106 AverageCounter(const char * const name, BaseCounter * parent) : BaseCounter(name, parent), sum{} {} 59 AverageCounter(const std::string & name ) : Base::Tree<top>(name), sum{} {} 60 AverageCounter(const std::string & name, Base::Tree<top> * parent) : Base::Tree<top>(name, parent), sum{} {} 61 62 virtual void print(std::ostream & os) { os << sum / count; } 107 63 108 64 inline void push(T value) { … … 115 71 116 72 private: 117 virtual void print(std::ostream & os) {118 os << sum / count;119 }120 template<typename F>121 friend void ForAllCounters(BaseCounter::list_t &, size_t, F );122 friend void print();123 124 73 T sum; 125 74 size_t count = 1; … … 127 76 128 77 template<typename T> 129 class MaxCounter : public Base Counter{78 class MaxCounter : public Base::Tree<top> { 130 79 public: 131 MaxCounter(const char * const name ) : BaseCounter(name), max{} {}132 MaxCounter(const char * const name, BaseCounter * parent) : BaseCounter(name, parent), max{} {}80 MaxCounter(const std::string & name ) : Base::Tree<top>(name), max{} {} 81 MaxCounter(const std::string & name, Base::Tree<top> * parent) : Base::Tree<top>(name, parent), max{} {} 133 82 134 inline void push(T value) { 135 max = std::max(max, value); 136 } 83 virtual void print(std::ostream & os) { os << max; } 137 84 85 inline void push(T value) { max = std::max(max, value); } 138 86 protected: 139 87 virtual ~MaxCounter() = default; 140 88 141 89 private: 142 virtual void print(std::ostream & os) {143 os << max;144 }145 template<typename F>146 friend void ForAllCounters(BaseCounter::list_t &, size_t, F );147 friend void print();148 149 90 T max; 150 91 };
Note: See TracChangeset
for help on using the changeset viewer.