#ifndef _TRISKELE_DEBUG_HPP #define _TRISKELE_DEBUG_HPP #include #include #include #include #ifdef SMART_LOG #ifndef DEF_LOG #define DEF_LOG(name, expr) ::triskele::Log log (name); { std::cerr << expr << std::endl << std::flush; } //#define DEF_LOG_(name) DEF_LOG(name, "") XXXX #endif #ifndef LOG #define LOG(expr) { std::cerr << log << "| " << expr << std::endl << std::flush; } #endif #ifndef DEBUG #define DEBUG(expr) { std::cerr << expr << std::endl << std::flush; } #endif #else #ifndef DEF_LOG #define DEF_LOG(name, expr) //#define DEF_LOG_(name) XXXX #endif #ifndef LOG #define LOG(expr) #endif #ifndef DEBUG #define DEBUG(expr) #endif #endif namespace triskele { // ======================================== using namespace std; class Log { static unsigned int indent; string functName; public: Log (const string &funct) : functName (funct) { ++indent; cerr << *this << "> "; } ~Log () { cerr << *this << "<" << endl << flush; --indent; } friend inline ostream &operator << (ostream &out, const Log &log) { return out << setw (3) << setw ((log.indent % 20)*2) << "" << log.functName; } }; // ======================================== }//namespace triskele #endif //_TRISKELE_DEBUG_HPP