Minimum mean cycle algorithm contributed by Peter Kovacs.
     3  * This file is a part of LEMON, a generic C++ optimization library
 
     5  * Copyright (C) 2003-2007
 
     6  * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
 
     7  * (Egervary Research Group on Combinatorial Optimization, EGRES).
 
     9  * Permission to use, modify and distribute this software is granted
 
    10  * provided that this copyright notice appears in all copies. For
 
    11  * precise terms see the accompanying LICENSE file.
 
    13  * This software is provided "AS IS" with no warranty of any kind,
 
    14  * express or implied, and with no claim as to its suitability for any
 
    19 #ifndef LEMON_COUNTER_H
 
    20 #define LEMON_COUNTER_H
 
    27 ///\brief Tools for counting steps and events
 
    32   template<class P> class _SubNoCounter;
 
    43     typedef _SubCounter<_SubCounter<P> > SubCounter;
 
    44     typedef _SubNoCounter<_SubCounter<P> > SubNoCounter;
 
    46     _SubCounter(P &parent)
 
    47       : _parent(parent), _title(), _os(std::cerr), count(0) {}
 
    48     _SubCounter(P &parent,std::string title,std::ostream &os=std::cerr)
 
    49       : _parent(parent), _title(title), _os(os), count(0) {}
 
    50     _SubCounter(P &parent,const char *title,std::ostream &os=std::cerr)
 
    51       : _parent(parent), _title(title), _os(os), count(0) {}
 
    53       _os << _title << count <<std::endl;
 
    56     _SubCounter &operator++() { count++; return *this;}
 
    57     int operator++(int) { return count++; }
 
    58     _SubCounter &operator--() { count--; return *this;}
 
    59     int operator--(int) { return count--; }
 
    60     _SubCounter &operator+=(int c) { count+=c; return *this;}
 
    61     _SubCounter &operator-=(int c) { count-=c; return *this;}
 
    62     void reset(int c=0) {count=c;}
 
    63     operator int() {return count;}
 
    71     typedef _SubNoCounter<_SubNoCounter<P> > SubCounter;
 
    72     typedef _SubNoCounter<_SubNoCounter<P> > SubNoCounter;
 
    74     _SubNoCounter(P &parent) :_parent(parent) {}
 
    75     _SubNoCounter(P &parent,std::string,std::ostream &) 
 
    77     _SubNoCounter(P &parent,std::string) 
 
    79     _SubNoCounter(P &parent,const char *,std::ostream &)
 
    81     _SubNoCounter(P &parent,const char *)
 
    84     _SubNoCounter &operator++() { ++_parent; return *this;}
 
    85     int operator++(int) { _parent++; return 0;}
 
    86     _SubNoCounter &operator--() { --_parent; return *this;}
 
    87     int operator--(int) { _parent--; return 0;}
 
    88     _SubNoCounter &operator+=(int c) { _parent+=c; return *this;}
 
    89     _SubNoCounter &operator-=(int c) { _parent-=c; return *this;}
 
    92     operator int() {return 0;}
 
    96   /// \addtogroup timecount
 
   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.
 
   113     ///\todo document please.
 
   115     typedef _SubCounter<Counter> SubCounter;
 
   118     ///\todo document please.
 
   120     typedef _SubNoCounter<Counter> SubNoCounter;
 
   123     Counter() : _title(), _os(std::cerr), count(0) {}
 
   125     Counter(std::string title,std::ostream &os=std::cerr) 
 
   126       : _title(title), _os(os), count(0) {}
 
   128     Counter(const char *title,std::ostream &os=std::cerr)
 
   129       : _title(title), _os(os), count(0) {}
 
   130     ///Destructor. Prints the given title and the value of the counter.
 
   132       _os << _title << count <<std::endl;
 
   135     Counter &operator++() { count++; return *this;}
 
   137     int operator++(int) { return count++;}
 
   139     Counter &operator--() { count--; return *this;}
 
   141     int operator--(int) { return count--;}
 
   143     Counter &operator+=(int c) { count+=c; return *this;}
 
   145     Counter &operator-=(int c) { count-=c; return *this;}
 
   147     void reset(int c=0) {count=c;}
 
   149     operator int() {return count;}
 
   152   ///'Do nothing' version of \ref Counter
 
   154   ///'Do nothing' version of \ref Counter.
 
   159     typedef _SubNoCounter<NoCounter> SubCounter;
 
   160     typedef _SubNoCounter<NoCounter> SubNoCounter;
 
   163     NoCounter(std::string,std::ostream &) {}
 
   164     NoCounter(const char *,std::ostream &) {}
 
   165     NoCounter(std::string) {}
 
   166     NoCounter(const char *) {}
 
   167     NoCounter &operator++() { return *this; }
 
   168     int operator++(int) { return 0; }
 
   169     NoCounter &operator--() { return *this; }
 
   170     int operator--(int) { return 0; }
 
   171     NoCounter &operator+=(int) { return *this;}
 
   172     NoCounter &operator-=(int) { return *this;}
 
   175     operator int() {return 0;}