00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 #ifndef VCSN_MISC_TIMER_HH
00019 # define VCSN_MISC_TIMER_HH
00020 
00256 # include <stack>
00257 # include <map>
00258 # include <list>
00259 # include <string>
00260 # include <iosfwd>
00261 # include <boost/graph/adjacency_list.hpp>
00262 # include <boost/graph/strong_components.hpp>
00263 # include <boost/graph/graphviz.hpp>
00264 
00265 
00266 # define VAUCANSON 1
00267 
00268 # ifdef VAUCANSON
00269 #  define NAMESPACE_VCSN_BEGIN namespace vcsn {
00270 #  define NAMESPACE_VCSN_END   } // namespace vcsn
00271 #  include <vaucanson/misc/contract.hh>
00272 #  include <vaucanson/misc/timer_internal_gathering.hh>
00273 #  include <vaucanson/misc/timer_internal_graph.hh>
00274 # else
00275 #  define NAMESPACE_VCSN_BEGIN
00276 #  define NAMESPACE_VCSN_END
00277 #  include <cassert>
00278 #  define precondition(C) assert(C)
00279 #  include "timer_internal_gathering.hh"
00280 #  include "timer_internal_graph.hh"
00281 # endif
00282 
00283 NAMESPACE_VCSN_BEGIN
00284 
00285 namespace misc
00286 {
00288   class Timer;
00289 
00291   class ScopedTimer
00292   {
00293   public:
00297     ScopedTimer (Timer& timer, const unsigned int i);
00298 
00303     ScopedTimer (Timer& timer, const std::string& name);
00304 
00307     ~ScopedTimer ();
00308   private:
00309     Timer* timer_;
00310   };
00311 
00312   class Timer
00313   {
00314   public:
00315 
00317     Timer ();
00320     Timer (const Timer& rhs);
00321 
00322     ~Timer ();
00323 
00327     const Timer& operator= (const Timer& rhs);
00328 
00334     unsigned int task (const std::string& name);
00335 
00339     void start ();
00340 
00343     void stop ();
00344 
00347     void clear ();
00348 
00352     std::ostream& print (std::ostream& o,
00353                          timer::verbose_degree vd = timer::VERBOSE_NORMAL)
00354       const;
00355 
00362     std::ostream& export_dot (std::ostream&         o,
00363                               timer::verbose_degree vd = timer::VERBOSE_NORMAL,
00364                               double                ccr = 1) const;
00365 
00370     std::ostream& dump (std::ostream& o) const;
00371 
00375     void push (const std::string& name);
00376 
00377     
00378     
00380     void push (const unsigned int i);
00381 
00384     void pop (const std::string& task_name);
00385 
00388     void pop (const unsigned int i);
00389 
00392     void pop ();
00393 
00397     bool operator< (const Timer& rhs) const;
00398 
00406     Timer& operator+= (const Timer& rhs);
00407 
00414     Timer operator+ (const Timer& rhs);
00415 
00420     Timer& operator/= (unsigned rhs);
00421 
00426     Timer operator/ (unsigned rhs) const;
00427 
00428   private:
00429     
00430 
00431 
00432 
00433     
00434     friend class timer::GraphWriter;
00435     friend class timer::VertexWriter;
00436     friend class timer::EdgeWriter;
00437 
00438     
00439     void build_output_graph ();
00440     
00441     void build_connected_components ();
00442 
00443     
00444     void compute_output_graph ();
00445     
00446     void compute_connected_components ();
00447 
00448     void print_output_graph (std::ostream& o,
00449                              timer::verbose_degree vd = timer::VERBOSE_NORMAL)
00450       const;
00451 
00452     timer::call_stack           calls_;
00453     timer::task_vector          tasks_;
00454     timer::task_names_map       names_;
00455     timer::TimeStamp            time_;
00456 
00457     timer::output_graph         graph_;
00458     timer::component_id_vector  comp_id_;
00459     timer::component_vector     comp_;
00460     unsigned int                comp_count_;
00461     unsigned int                task_count_;
00462 
00463     bool                        is_running_;
00464 
00465     bool                        cleared_;
00466   };
00467 } 
00468 
00469 NAMESPACE_VCSN_END
00470 
00471 # if !defined VCSN_USE_INTERFACE_ONLY || defined VCSN_USE_LIB
00472 #  ifdef VAUCANSON
00473 #   include <vaucanson/misc/timer_internal_gathering.hxx>
00474 #   include <vaucanson/misc/timer_internal_graph.hxx>
00475 #   include <vaucanson/misc/timer.hxx>
00476 #   include <vaucanson/misc/timer_internal_gathering.cc>
00477 #   include <vaucanson/misc/timer_internal_graph.cc>
00478 #   include <vaucanson/misc/timer.cc>
00479 #  else
00480 #   include "timer_internal_gathering.hxx"
00481 #   include "timer_internal_graph.hxx"
00482 #   include "timer.hxx"
00483 #  endif
00484 # endif // !VCSN_USE_INTERFACE_ONLY
00485 
00486 #endif // !VCSN_MISC_TIMER_HH