00001 /*===========================================================================*\ 00002 * * 00003 * OpenFlipper * 00004 * Copyright (C) 2001-2009 by Computer Graphics Group, RWTH Aachen * 00005 * www.openflipper.org * 00006 * * 00007 *---------------------------------------------------------------------------* 00008 * This file is part of OpenFlipper. * 00009 * * 00010 * OpenFlipper is free software: you can redistribute it and/or modify * 00011 * it under the terms of the GNU Lesser General Public License as * 00012 * published by the Free Software Foundation, either version 3 of * 00013 * the License, or (at your option) any later version with the * 00014 * following exceptions: * 00015 * * 00016 * If other files instantiate templates or use macros * 00017 * or inline functions from this file, or you compile this file and * 00018 * link it with other files to produce an executable, this file does * 00019 * not by itself cause the resulting executable to be covered by the * 00020 * GNU Lesser General Public License. This exception does not however * 00021 * invalidate any other reasons why the executable file might be * 00022 * covered by the GNU Lesser General Public License. * 00023 * * 00024 * OpenFlipper is distributed in the hope that it will be useful, * 00025 * but WITHOUT ANY WARRANTY; without even the implied warranty of * 00026 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * 00027 * GNU Lesser General Public License for more details. * 00028 * * 00029 * You should have received a copy of the GNU LesserGeneral Public * 00030 * License along with OpenFlipper. If not, * 00031 * see <http://www.gnu.org/licenses/>. * 00032 * * 00033 \*===========================================================================*/ 00034 00035 /*===========================================================================*\ 00036 * * 00037 * $Revision: 6743 $ * 00038 * $Author: moebius $ * 00039 * $Date: 2009-08-05 11:03:10 +0200 (Mi, 05. Aug 2009) $ * 00040 * * 00041 \*===========================================================================*/ 00042 00043 00044 00045 00046 //============================================================================= 00047 // 00048 // CLASS Tracing 00049 // 00050 //============================================================================= 00051 00052 00053 #ifndef ACG_TRACING_HH 00054 #define ACG_TRACING_HH 00055 00056 00057 //== INCLUDES ================================================================= 00058 00059 #include "StopWatch.hh" 00060 #include <iostream> 00061 #include <string> 00062 #include "../Config/ACGDefines.hh" 00063 00064 00065 //== NAMESPACES =============================================================== 00066 00067 namespace ACG { 00068 00069 00070 //== HELPER MACROS ============================================================ 00071 00072 00073 #define ACG_TRACE(_text) ACG::Tracing acg_tracer__(_text) 00074 #define ACG_TRACE_CMD(_text, _cmd) { ACG_TRACE(_text); cmd; } 00075 00076 #define ACG_TIMED_TRACE(_text) ACG::TimedTracing acg_tracer__(_text) 00077 #define ACG_TIMED_TRACE_CMD(_text, _cmd) { ACG_TIMED_TRACE(_text); _cmd; } 00078 00079 #define ACG_TRACE_PROGRESS acg_tracer__.progress() 00080 00081 00082 //== CLASS DEFINITION ========================================================= 00083 00084 00118 class ACGDLLEXPORT Tracing 00119 { 00120 public: 00121 00123 Tracing(const std::string& _text, 00124 std::ostream& _os = std::cerr) 00125 : os_(_os) 00126 { os_ << _text << " " << std::flush; } 00127 00128 00130 ~Tracing() { os_ << "finished.\n" << std::flush; } 00131 00132 00135 void progress() { 00136 os_ << progress_[((++idx_)&=0x3)] << "\b" << std::flush; 00137 } 00138 00139 00140 protected: 00141 00142 std::ostream& os_; 00143 static char progress_[4]; 00144 static unsigned char idx_; 00145 }; 00146 00147 00148 //== CLASS DEFINITION ========================================================= 00149 00150 00151 00181 class ACGDLLEXPORT TimedTracing : public Tracing 00182 { 00183 public: 00184 00186 TimedTracing( const std::string& _text, 00187 std::ostream& _os = std::cerr ) 00188 : Tracing(_text, _os) 00189 { timer_.start(); } 00190 00191 00193 ~TimedTracing() 00194 { 00195 os_ << timer_.stop()*0.001 << " secs, "; 00196 } 00197 00198 private: 00199 00200 StopWatch timer_; 00201 }; 00202 00203 00204 00205 //============================================================================= 00206 } // namespace ACG 00207 //============================================================================= 00208 #endif // ACG_TRACING_HH defined 00209 //============================================================================= 00210