ISIS Core Library 0.7.2 (api 3.0.0)

/scr/tee1/isis/lib/Core/CoreUtils/log.hpp

Go to the documentation of this file.
00001 //
00002 // C++ Interface: log
00003 //
00004 // Description:
00005 //
00006 //
00007 // Author: Enrico Reimer<reimer@cbs.mpg.de>, (C) 2008
00008 //
00009 // Copyright: See COPYING file that comes with this distribution
00010 //
00011 //
00012 
00013 #ifndef LOG_H
00014 #define LOG_H
00015 
00016 #include <string>
00017 #include <boost/scoped_ptr.hpp>
00018 #include "message.hpp"
00019 #include "singletons.hpp"
00020 #include <limits.h>
00021 
00023 namespace isis
00024 {
00025 namespace util
00026 {
00027 namespace _internal
00028 {
00029 
00030 template<class MODULE> class Log
00031 {
00032     friend class util::Singletons;
00033     boost::shared_ptr<MessageHandlerBase> m_handle;
00034     static boost::shared_ptr<MessageHandlerBase> &getHandle() {
00035         boost::shared_ptr<util::MessageHandlerBase> &handle = Singletons::get < Log<MODULE>, INT_MAX - 1 > ().m_handle;
00036         return handle;
00037     }
00038     Log(): m_handle( new DefaultMsgPrint( notice ) ) {}
00039 public:
00040     template<class HANDLE_CLASS> static void enable( LogLevel enable ) {
00041         setHandler( boost::shared_ptr<MessageHandlerBase>( enable ? new HANDLE_CLASS( enable ) : 0 ) );
00042     }
00043     static void setHandler( boost::shared_ptr<MessageHandlerBase> handler ) {
00044         getHandle() = handler;
00045     }
00046     static Message send( const char file[], const char object[], int line, LogLevel level ) {
00047         boost::shared_ptr<util::MessageHandlerBase> &handle = getHandle();
00048         return Message( object, MODULE::name(), file, line, level, handle );
00049     }
00050 };
00051 
00052 }
00053 }
00054 }
00056 
00057 #define ENABLE_LOG(MODULE,HANDLE_CLASS,set)\
00058     if(!MODULE::use);else isis::util::_internal::Log<MODULE>::enable<HANDLE_CLASS>(set)
00059 
00060 #define LOG(MODULE,LEVEL)\
00061     if(!MODULE::use);else isis::util::_internal::Log<MODULE>::send(__FILE__,__FUNCTION__,__LINE__,LEVEL)
00062 
00063 #define LOG_IF(PRED,MODULE,LEVEL)\
00064     if(!(MODULE::use && (PRED)));else isis::util::_internal::Log<MODULE>::send(__FILE__,__FUNCTION__,__LINE__,LEVEL)
00065 
00066 #endif