cmtkProgress.h

Go to the documentation of this file.
00001 /*
00002 //
00003 //  Copyright 1997-2009 Torsten Rohlfing
00004 //
00005 //  Copyright 2004-2010 SRI International
00006 //
00007 //  This file is part of the Computational Morphometry Toolkit.
00008 //
00009 //  http://www.nitrc.org/projects/cmtk/
00010 //
00011 //  The Computational Morphometry Toolkit is free software: you can
00012 //  redistribute it and/or modify it under the terms of the GNU General Public
00013 //  License as published by the Free Software Foundation, either version 3 of
00014 //  the License, or (at your option) any later version.
00015 //
00016 //  The Computational Morphometry Toolkit is distributed in the hope that it
00017 //  will be useful, but WITHOUT ANY WARRANTY; without even the implied
00018 //  warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00019 //  GNU General Public License for more details.
00020 //
00021 //  You should have received a copy of the GNU General Public License along
00022 //  with the Computational Morphometry Toolkit.  If not, see
00023 //  <http://www.gnu.org/licenses/>.
00024 //
00025 //  $Revision: 2296 $
00026 //
00027 //  $LastChangedDate: 2010-08-25 16:23:03 -0700 (Wed, 25 Aug 2010) $
00028 //
00029 //  $LastChangedBy: torstenrohlfing $
00030 //
00031 */
00032 
00033 #ifndef __cmtkProgress_h_included_
00034 #define __cmtkProgress_h_included_
00035 
00036 #include <cmtkconfig.h>
00037 
00038 #include <string>
00039 #include <queue>
00040 
00041 namespace
00042 cmtk
00043 {
00044 
00047 
00050 class Progress 
00051 {
00052 public:
00054   typedef enum {
00056     OK,
00058     INTERRUPT,
00060     TIMEOUT,
00062     FAILED
00063   } ResultEnum;  
00064 
00066   typedef Progress Self;
00067 
00069   Progress()
00070   {
00071     Self::SetProgressInstance( this );
00072   }
00073 
00075   virtual ~Progress() {};
00076   
00078   static void Begin( const double start, const double end, const double increment, const std::string& taskName = std::string("") );
00079 
00081   static ResultEnum SetProgress( const double progress );
00082 
00084   static void Done();
00085 
00087   virtual ResultEnum UpdateProgress() = 0;
00088   
00090   void SetProgressCurrent( const double progress );
00091   
00093   static void SetProgressInstance( Self *const progressInstance ) 
00094   {
00095     Self::ProgressInstance = progressInstance;
00096   }
00097   
00098 protected:
00100   bool IsTopLevel() const
00101   {
00102     return m_RangeStack.size() == 1;
00103   }
00104 
00106   const std::string GetCurrentTaskName() const;
00107 
00109   double GetFractionComplete() const;
00110 
00112   virtual void BeginVirtual( const double start, const double end, const double increment, const std::string& taskName = std::string("") );
00113 
00117   virtual void DoneVirtual();
00118 
00119 private:
00121   static Self* ProgressInstance;
00122 
00124   class Range
00125   {
00126   public:
00128     Range( const double start, const double end, const double increment, const std::string& taskName = std::string("") )
00129       : m_Start( start ), m_End( end ), m_Increment( increment ), m_TaskName( taskName )
00130     {
00131       this->m_Current = this->m_Start;
00132     }
00133 
00135     double GetFractionComplete( const double nestedFraction = 0 
00136       ) const;
00137 
00139     double m_Start;
00140 
00142     double m_End;
00143 
00145     double m_Increment;
00146 
00148     double m_Current;
00149 
00151     const std::string m_TaskName;
00152   };
00153 
00155   typedef std::deque<Self::Range> RangeStackType;
00156 
00158   RangeStackType m_RangeStack;
00159 };
00160 
00162 
00163 } // namespace cmtk
00164 
00165 #endif // #ifndef __cmtkProgress_h_included_
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines