47       : _parent(parent), _title(), _os(std::cerr), count(0) {} | 
    47       : _parent(parent), _title(), _os(std::cerr), count(0) {} | 
    48     _SubCounter(P &parent,std::string title,std::ostream &os=std::cerr)  | 
    48     _SubCounter(P &parent,std::string title,std::ostream &os=std::cerr)  | 
    49       : _parent(parent), _title(title), _os(os), count(0) {} | 
    49       : _parent(parent), _title(title), _os(os), count(0) {} | 
    50     _SubCounter(P &parent,const char *title,std::ostream &os=std::cerr)  | 
    50     _SubCounter(P &parent,const char *title,std::ostream &os=std::cerr)  | 
    51       : _parent(parent), _title(title), _os(os), count(0) {} | 
    51       : _parent(parent), _title(title), _os(os), count(0) {} | 
    52     ~_SubCounter() {  | 
    52     ~_SubCounter() { | 
    53       _os << _title << count <<std::endl;  | 
    53       _os << _title << count <<std::endl;  | 
    54       _parent+=count;  | 
    54       _parent+=count;  | 
    55     }  | 
    55     }  | 
    56     _SubCounter &operator++() { count++; return *this;} | 
    56     _SubCounter &operator++() { count++; return *this;} | 
    57     int operator++(int) { return count++; } | 
    57     int operator++(int) { return count++; } | 
    61     _SubCounter &operator-=(int c) { count-=c; return *this;} | 
    61     _SubCounter &operator-=(int c) { count-=c; return *this;} | 
    62     operator int() {return count;} | 
    62     operator int() {return count;} | 
    63   };  | 
    63   };  | 
    64   | 
    64   | 
    65   template<class P>  | 
    65   template<class P>  | 
    66   class _NoSubCounter   | 
    66   class _NoSubCounter  | 
    67   { | 
    67   { | 
    68     P &_parent;  | 
    68     P &_parent;  | 
    69   public:  | 
    69   public:  | 
    70     typedef _NoSubCounter<_NoSubCounter<P> > SubCounter;  | 
    70     typedef _NoSubCounter<_NoSubCounter<P> > SubCounter;  | 
    71     typedef _NoSubCounter<_NoSubCounter<P> > NoSubCounter;  | 
    71     typedef _NoSubCounter<_NoSubCounter<P> > NoSubCounter;  | 
    72     | 
    72   | 
    73     _NoSubCounter(P &parent) :_parent(parent) {} | 
    73     _NoSubCounter(P &parent) :_parent(parent) {} | 
    74     _NoSubCounter(P &parent,std::string,std::ostream &)   | 
    74     _NoSubCounter(P &parent,std::string,std::ostream &)  | 
    75       :_parent(parent) {} | 
    75       :_parent(parent) {} | 
    76     _NoSubCounter(P &parent,std::string)   | 
    76     _NoSubCounter(P &parent,std::string)  | 
    77       :_parent(parent) {} | 
    77       :_parent(parent) {} | 
    78     _NoSubCounter(P &parent,const char *,std::ostream &)  | 
    78     _NoSubCounter(P &parent,const char *,std::ostream &)  | 
    79       :_parent(parent) {} | 
    79       :_parent(parent) {} | 
    80     _NoSubCounter(P &parent,const char *)  | 
    80     _NoSubCounter(P &parent,const char *)  | 
    81       :_parent(parent) {} | 
    81       :_parent(parent) {} | 
   100   /// You can increment or decrement the counter using \c operator++,  | 
   100   /// You can increment or decrement the counter using \c operator++,  | 
   101   /// \c operator--, \c operator+= and \c operator-=. You can also  | 
   101   /// \c operator--, \c operator+= and \c operator-=. You can also  | 
   102   /// define subcounters for the different phases of the algorithm or  | 
   102   /// define subcounters for the different phases of the algorithm or  | 
   103   /// for different types of operations.  | 
   103   /// for different types of operations.  | 
   104   /// A report containing the given title and the value of the counter  | 
   104   /// A report containing the given title and the value of the counter  | 
   105   /// is automatically printed on destruction.   | 
   105   /// is automatically printed on destruction.  | 
   106   ///  | 
   106   ///  | 
   107   /// The following example shows the usage of counters and subcounters.  | 
   107   /// The following example shows the usage of counters and subcounters.  | 
   108   /// \code  | 
   108   /// \code  | 
   109   /// // Bubble sort  | 
   109   /// // Bubble sort  | 
   110   /// std::vector<T> v;  | 
   110   /// std::vector<T> v;  | 
   131   /// Assignments: 57  | 
   131   /// Assignments: 57  | 
   132   /// Operations: 102  | 
   132   /// Operations: 102  | 
   133   /// \endcode  | 
   133   /// \endcode  | 
   134   ///  | 
   134   ///  | 
   135   /// \sa NoCounter  | 
   135   /// \sa NoCounter  | 
   136   class Counter   | 
   136   class Counter  | 
   137   { | 
   137   { | 
   138     std::string _title;  | 
   138     std::string _title;  | 
   139     std::ostream &_os;  | 
   139     std::ostream &_os;  | 
   140     int count;  | 
   140     int count;  | 
   141   public:  | 
   141   public:  | 
   142   | 
   142   | 
   143     /// SubCounter class  | 
   143     /// SubCounter class  | 
   144       | 
   144   | 
   145     /// This class can be used to setup subcounters for a \ref Counter  | 
   145     /// This class can be used to setup subcounters for a \ref Counter  | 
   146     /// to have finer reports. A subcounter provides exactly the same  | 
   146     /// to have finer reports. A subcounter provides exactly the same  | 
   147     /// operations as the main \ref Counter, but it also increments and  | 
   147     /// operations as the main \ref Counter, but it also increments and  | 
   148     /// decrements the value of its parent.  | 
   148     /// decrements the value of its parent.  | 
   149     /// Subcounters can also have subcounters.  | 
   149     /// Subcounters can also have subcounters.  | 
   150     ///   | 
   150     ///  | 
   151     /// The parent counter must be given as the first parameter of the  | 
   151     /// The parent counter must be given as the first parameter of the  | 
   152     /// constructor. Apart from that a title and an \c ostream object  | 
   152     /// constructor. Apart from that a title and an \c ostream object  | 
   153     /// can also be given just like for the main \ref Counter.  | 
   153     /// can also be given just like for the main \ref Counter.  | 
   154     ///  | 
   154     ///  | 
   155     /// A report containing the given title and the value of the  | 
   155     /// A report containing the given title and the value of the  | 
   156     /// subcounter is automatically printed on destruction. If you  | 
   156     /// subcounter is automatically printed on destruction. If you  | 
   157     /// would like to turn off this report, use \ref NoSubCounter  | 
   157     /// would like to turn off this report, use \ref NoSubCounter  | 
   158     /// instead.  | 
   158     /// instead.  | 
   159     ///   | 
   159     ///  | 
   160     /// \sa NoSubCounter  | 
   160     /// \sa NoSubCounter  | 
   161     typedef _SubCounter<Counter> SubCounter;  | 
   161     typedef _SubCounter<Counter> SubCounter;  | 
   162   | 
   162   | 
   163     /// SubCounter class without printing report on destruction   | 
   163     /// SubCounter class without printing report on destruction  | 
   164       | 
   164   | 
   165     /// This class can be used to setup subcounters for a \ref Counter.  | 
   165     /// This class can be used to setup subcounters for a \ref Counter.  | 
   166     /// It is the same as \ref SubCounter but it does not print report  | 
   166     /// It is the same as \ref SubCounter but it does not print report  | 
   167     /// on destruction. (It modifies the value of its parent, so 'No'  | 
   167     /// on destruction. (It modifies the value of its parent, so 'No'  | 
   168     /// only means 'do not print'.)  | 
   168     /// only means 'do not print'.)  | 
   169     ///  | 
   169     ///  | 
   170     /// Replacing \ref SubCounter "SubCounter"s with \ref NoSubCounter  | 
   170     /// Replacing \ref SubCounter "SubCounter"s with \ref NoSubCounter  | 
   171     /// "NoSubCounter"s makes it possible to turn off reporting   | 
   171     /// "NoSubCounter"s makes it possible to turn off reporting  | 
   172     /// subcounter values without actually removing the definitions  | 
   172     /// subcounter values without actually removing the definitions  | 
   173     /// and the increment or decrement operators.  | 
   173     /// and the increment or decrement operators.  | 
   174     ///  | 
   174     ///  | 
   175     /// \sa SubCounter  | 
   175     /// \sa SubCounter  | 
   176     typedef _NoSubCounter<Counter> NoSubCounter;  | 
   176     typedef _NoSubCounter<Counter> NoSubCounter;  | 
   177   | 
   177   | 
   178     /// Constructor.  | 
   178     /// Constructor.  | 
   179     Counter() : _title(), _os(std::cerr), count(0) {} | 
   179     Counter() : _title(), _os(std::cerr), count(0) {} | 
   180     /// Constructor.  | 
   180     /// Constructor.  | 
   181     Counter(std::string title,std::ostream &os=std::cerr)   | 
   181     Counter(std::string title,std::ostream &os=std::cerr)  | 
   182       : _title(title), _os(os), count(0) {} | 
   182       : _title(title), _os(os), count(0) {} | 
   183     /// Constructor.  | 
   183     /// Constructor.  | 
   184     Counter(const char *title,std::ostream &os=std::cerr)  | 
   184     Counter(const char *title,std::ostream &os=std::cerr)  | 
   185       : _title(title), _os(os), count(0) {} | 
   185       : _title(title), _os(os), count(0) {} | 
   186     /// Destructor. Prints the given title and the value of the counter.  | 
   186     /// Destructor. Prints the given title and the value of the counter.  | 
   202     /// Resets the counter to the given value.  | 
   202     /// Resets the counter to the given value.  | 
   203   | 
   203   | 
   204     /// Resets the counter to the given value.  | 
   204     /// Resets the counter to the given value.  | 
   205     /// \note This function does not reset the values of  | 
   205     /// \note This function does not reset the values of  | 
   206     /// \ref SubCounter "SubCounter"s but it resets \ref NoSubCounter  | 
   206     /// \ref SubCounter "SubCounter"s but it resets \ref NoSubCounter  | 
   207     /// "NoSubCounter"s along with the main counter.   | 
   207     /// "NoSubCounter"s along with the main counter.  | 
   208     void reset(int c=0) {count=c;} | 
   208     void reset(int c=0) {count=c;} | 
   209     /// Returns the value of the counter.  | 
   209     /// Returns the value of the counter.  | 
   210     operator int() {return count;} | 
   210     operator int() {return count;} | 
   211   };  | 
   211   };  | 
   212   | 
   212   |