lemon/counter.h
author deba
Wed, 01 Mar 2006 10:17:25 +0000
changeset 1990 15fb7a4ea6be
parent 1875 98698b69a902
child 2391 14a343be7a5a
permissions -rw-r--r--
Some classes assumed that the GraphMaps should be inherited
from an ObserverBase. These classes parents replaced with
DefaultMap which cause that the graph maps should not be
inherited from the ObserverBase.
     1 /* -*- C++ -*-
     2  *
     3  * This file is a part of LEMON, a generic C++ optimization library
     4  *
     5  * Copyright (C) 2003-2006
     6  * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
     7  * (Egervary Research Group on Combinatorial Optimization, EGRES).
     8  *
     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.
    12  *
    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
    15  * purpose.
    16  *
    17  */
    18 
    19 #ifndef LEMON_COUNTER_H
    20 #define LEMON_COUNTER_H
    21 
    22 #include <string>
    23 #include <iostream>
    24 
    25 ///\ingroup timecount
    26 ///\file
    27 ///\brief Tools for counting steps and events
    28 
    29 namespace lemon 
    30 {
    31 
    32   template<class P> class _SubNoCounter;
    33 
    34   template<class P>
    35   class _SubCounter 
    36   {
    37     P &_parent;
    38     std::string _title;
    39     std::ostream &_os;
    40     int count;
    41   public:
    42 
    43     typedef _SubCounter<_SubCounter<P> > SubCounter;
    44     typedef _SubNoCounter<_SubCounter<P> > SubNoCounter;
    45 
    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) {}
    52     ~_SubCounter() { 
    53       _os << _title << count <<std::endl;
    54       _parent+=count;
    55     }
    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;}
    64   };
    65 
    66   template<class P>
    67   class _SubNoCounter 
    68   {
    69     P &_parent;
    70   public:
    71     typedef _SubNoCounter<_SubNoCounter<P> > SubCounter;
    72     typedef _SubNoCounter<_SubNoCounter<P> > SubNoCounter;
    73   
    74     _SubNoCounter(P &parent) :_parent(parent) {}
    75     _SubNoCounter(P &parent,std::string,std::ostream &) 
    76       :_parent(parent) {}
    77     _SubNoCounter(P &parent,std::string) 
    78       :_parent(parent) {}
    79     _SubNoCounter(P &parent,const char *,std::ostream &)
    80       :_parent(parent) {}
    81     _SubNoCounter(P &parent,const char *)
    82       :_parent(parent) {}
    83     ~_SubNoCounter() {}
    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;}
    90     void reset(int) {}
    91     void reset() {}
    92     operator int() {return 0;}
    93   };
    94 
    95 
    96   /// \addtogroup timecount
    97   /// @{
    98 
    99   ///A counter class
   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
   105   class Counter 
   106   {
   107     std::string _title;
   108     std::ostream &_os;
   109     int count;
   110   public:
   111     ///\e
   112 
   113     ///\todo document please.
   114     ///
   115     typedef _SubCounter<Counter> SubCounter;
   116     ///\e
   117 
   118     ///\todo document please.
   119     ///
   120     typedef _SubNoCounter<Counter> SubNoCounter;
   121 
   122     ///\e
   123     Counter() : _title(), _os(std::cerr), count(0) {}
   124     ///\e
   125     Counter(std::string title,std::ostream &os=std::cerr) 
   126       : _title(title), _os(os), count(0) {}
   127     ///\e
   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.
   131     ~Counter() {
   132       _os << _title << count <<std::endl;
   133     }
   134     ///\e
   135     Counter &operator++() { count++; return *this;}
   136     ///\e
   137     int operator++(int) { return count++;}
   138     ///\e
   139     Counter &operator--() { count--; return *this;}
   140     ///\e
   141     int operator--(int) { return count--;}
   142     ///\e
   143     Counter &operator+=(int c) { count+=c; return *this;}
   144     ///\e
   145     Counter &operator-=(int c) { count-=c; return *this;}
   146     ///\e
   147     void reset(int c=0) {count=c;}
   148     ///\e
   149     operator int() {return count;}
   150   };
   151 
   152   ///'Do nothing' version of \ref Counter
   153 
   154   ///'Do nothing' version of \ref Counter.
   155   ///\sa Counter
   156   class NoCounter
   157   {
   158   public:
   159     typedef _SubNoCounter<NoCounter> SubCounter;
   160     typedef _SubNoCounter<NoCounter> SubNoCounter;
   161 
   162     NoCounter() {}
   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;}
   173     void reset(int) {}
   174     void reset() {}
   175     operator int() {return 0;}
   176   };
   177 
   178   ///@}
   179 }
   180 
   181 #endif