gravatar
kpeter (Peter Kovacs)
kpeter@inf.elte.hu
Improved documentation for counters
0 1 0
default
1 file changed with 84 insertions and 18 deletions:
↑ Collapse diff ↑
Ignore white space 6 line context
... ...
@@ -96,38 +96,97 @@
96 96
  /// \addtogroup timecount
97 97
  /// @{
98 98

	
99
  ///A counter class
99
  /// A counter class
100 100

	
101
  ///This class makes it easier to count certain events. You can increment
102
  ///or decrement the counter using operator++ and operator--.
103
  ///A report is automatically printed on destruction.
104
  ///\todo More doc
101
  /// This class makes it easier to count certain events (e.g. for debug
102
  /// reasons).
103
  /// You can increment or decrement the counter using \c operator++,
104
  /// \c operator--, \c operator+= and \c operator-=. You can also
105
  /// define subcounters for the different phases of the algorithm or
106
  /// for different types of operations.
107
  /// A report containing the given title and the value of the counter
108
  /// is automatically printed on destruction. 
109
  ///
110
  /// The following example shows the usage of counters and subcounters.
111
  /// \code
112
  /// // Bubble sort
113
  /// std::vector<T> v;
114
  /// ...
115
  /// Counter op("Operations: ");
116
  /// Counter::SubCounter as(op, "Assignments: ");
117
  /// Counter::SubCounter co(op, "Comparisons: ");
118
  /// for (int i = v.size()-1; i > 0; --i) {
119
  ///   for (int j = 0; j < i; ++j) {
120
  ///     if (v[j] > v[j+1]) {
121
  ///       T tmp = v[j];
122
  ///       v[j] = v[j+1];
123
  ///       v[j+1] = tmp;
124
  ///       as += 3;          // three assignments
125
  ///     }
126
  ///     ++co;               // one comparison
127
  ///   }
128
  /// }
129
  /// \endcode
130
  ///
131
  /// This code prints out something like that:
132
  /// \code
133
  /// Comparisons: 45
134
  /// Assignments: 57
135
  /// Operations: 102
136
  /// \endcode
137
  ///
138
  /// \sa NoCounter
105 139
  class Counter 
106 140
  {
107 141
    std::string _title;
108 142
    std::ostream &_os;
109 143
    int count;
110 144
  public:
111
    ///\e
112 145

	
113
    ///\todo document please.
146
    /// SubCounter class
147
    
148
    /// This class can be used to setup subcounters for a \ref Counter
149
    /// to have finer reports. A subcounter provides exactly the same
150
    /// operations as the main \ref Counter, but it also increments and
151
    /// decrements the value of its parent.
152
    /// Subcounters can also have subcounters.
153
    /// 
154
    /// The parent counter must be given as the first parameter of the
155
    /// constructor. Apart from that a title and an \c ostream object
156
    /// can also be given just like for the main \ref Counter.
114 157
    ///
158
    /// A report containing the given title and the value of the
159
    /// subcounter is automatically printed on destruction. If you
160
    /// would like to turn off this report, use \ref NoSubCounter
161
    /// instead.
162
    /// 
163
    /// \sa NoSubCounter
115 164
    typedef _SubCounter<Counter> SubCounter;
116
    ///\e
117 165

	
118
    ///\todo document please.
166
    /// SubCounter class without printing report on destruction 
167
    
168
    /// This class can be used to setup subcounters for a \ref Counter.
169
    /// It is the same as \ref SubCounter but it does not print report
170
    /// on destruction. (It modifies the value of its parent, so 'No'
171
    /// only means 'do not print'.)
119 172
    ///
173
    /// Replacing \ref SubCounter "SubCounter"s with \ref NoSubCounter
174
    /// "NoSubCounter"s makes it possible to turn off reporting 
175
    /// subcounter values without actually removing the definitions
176
    /// and the increment or decrement operators.
177
    ///
178
    /// \sa SubCounter
120 179
    typedef _NoSubCounter<Counter> NoSubCounter;
121 180

	
122
    ///\e
181
    /// Constructor.
123 182
    Counter() : _title(), _os(std::cerr), count(0) {}
124
    ///\e
183
    /// Constructor.
125 184
    Counter(std::string title,std::ostream &os=std::cerr) 
126 185
      : _title(title), _os(os), count(0) {}
127
    ///\e
186
    /// Constructor.
128 187
    Counter(const char *title,std::ostream &os=std::cerr)
129 188
      : _title(title), _os(os), count(0) {}
130
    ///Destructor. Prints the given title and the value of the counter.
189
    /// Destructor. Prints the given title and the value of the counter.
131 190
    ~Counter() {
132 191
      _os << _title << count <<std::endl;
133 192
    }
... ...
@@ -143,16 +202,23 @@
143 202
    Counter &operator+=(int c) { count+=c; return *this;}
144 203
    ///\e
145 204
    Counter &operator-=(int c) { count-=c; return *this;}
146
    ///\e
205
    /// Resets the counter to the given value.
147 206
    void reset(int c=0) {count=c;}
148
    ///\e
207
    /// Returns the value of the counter.
149 208
    operator int() {return count;}
150 209
  };
151 210

	
152
  ///'Do nothing' version of \ref Counter
211
  /// 'Do nothing' version of Counter.
153 212

	
154
  ///'Do nothing' version of \ref Counter.
155
  ///\sa Counter
213
  /// This class can be used in the same way as \ref Counter however it
214
  /// does not count at all and does not print report on destruction.
215
  ///
216
  /// Replacing a \ref Counter with a \ref NoCounter makes it possible
217
  /// to turn off all counting and reporting (SubCounters should also
218
  /// be replaced with NoSubCounters), so it does not affect the
219
  /// efficiency of the program at all.
220
  ///
221
  /// \sa Counter
156 222
  class NoCounter
157 223
  {
158 224
  public:
0 comments (0 inline)