ROOT logo
#ifndef __TMrbLogger_h__
#define __TMrbLogger_h__

//_________________________________________________[C++ CLASS DEFINITION FILE]
//////////////////////////////////////////////////////////////////////////////
// Name:           utils/inc/TMrbLogger.h
// Purpose:        Define utilities to be used with MARaBOU
// Class:          TMrbLogger    -- message/error logging
// Description:    Common class definitions to be used within MARaBOU
// Author:         R. Lutter
// Revision:       $Id: TMrbLogger.h,v 1.13 2008-08-26 06:33:24 Rudolf.Lutter Exp $       
// Date:           
// Keywords:
//////////////////////////////////////////////////////////////////////////////

namespace std {} using namespace std;

#include <cstdlib>
#include <iostream>
#include <sstream>
#include <iomanip>
#include <fstream>

#include "TObject.h"
#include "TNamed.h"
#include "TSystem.h"
#include "TObjArray.h"
#include "TDatime.h"

#include "RQ_OBJECT.h"

//______________________________________________________[C++ CLASS DEFINITION]
//////////////////////////////////////////////////////////////////////////////
// Name:           TMrbLogMessage
// Purpose:        (Error) Message with date, time, and calling info
// Description:    Message bookkeeping
// Keywords:
//////////////////////////////////////////////////////////////////////////////

class TMrbLogMessage: public TObject {

	public:
		enum EMrbMsgType	{	kMrbMsgMessage	= BIT(0), 		// normal message
								kMrbMsgError	= BIT(1),		// error message
								kMrbMsgWarning	= BIT(2),		// warning
								kMrbMsgAny		= kMrbMsgMessage | kMrbMsgError | kMrbMsgWarning
							};
					
	public:

		TMrbLogMessage() {};
		TMrbLogMessage(EMrbMsgType Type, const Char_t * Color,
										const Char_t * ClassName, const Char_t * Method, const Char_t * Text, Bool_t Indent = kFALSE);
		
		~TMrbLogMessage() {};
		
		inline UInt_t GetDatime() const { return(fDatime.Get()); };
		inline EMrbMsgType GetType() const { return(fType); };
		inline const Char_t * GetColor() const { return(fColor.Data()); };
		inline const Char_t * GetClassName() const { return(fClassName.Data()); };
		inline const Char_t * GetMethod() const { return(fMethod.Data()); };
		inline const Char_t * GetText() const { return(fText.Data()); };
		const Char_t * Get(TString & FmtMsg,
									const Char_t * ProgName,
									Bool_t WithDate = kFALSE,
									Bool_t WithColors = kTRUE) const;
				
		inline void Help() { gSystem->Exec(Form("mrbHelp %s", this->ClassName())); };

	protected:
		Bool_t fIndent;
		TDatime fDatime;
		EMrbMsgType fType;
		TString fColor;
		TString fClassName;
		TString fMethod;
		TString fText;
		
	ClassDef(TMrbLogMessage, 1) 	// [Utils] Single (error) message
};	
		
//______________________________________________________[C++ CLASS DEFINITION]
//////////////////////////////////////////////////////////////////////////////
// Name:           TMrbLogger
// Purpose:        MARaBOU's message/error logger
// Description:    Methods to output (error) messages to different output channels.
// Keywords:
//////////////////////////////////////////////////////////////////////////////

class TMrbLogger: public TNamed {

	RQ_OBJECT("TMrbLogger")

	public:
		enum EMrbMsgRoute		{	kMrbMsgCout 	= BIT(0), 		// stdout/cout
									kMrbMsgCerr 	= BIT(1), 		// stderr/cerr
									kMrbMsgLog		= BIT(2)		// log file
								};

		enum EMrbMsgFileMode	{	kMrbMsgFileNew,
									kMrbMsgFileAppend
								};

	public:
		TMrbLogger(const Char_t * LogFile = "marabou.log", const Char_t * ProgName = "");   // ctor

		~TMrbLogger() { Reset(); };						// dtor

		Bool_t Flush(const Char_t * ClassNameL = "", const Char_t * Method = "", const Char_t * Color = NULL, Bool_t Indent = kFALSE);	// *SIGNAL*
		Bool_t Open(const Char_t * LogFile = "marabou.log", const Char_t * Option = "APPEND");
		Bool_t Close();
				
		void SetProgName(const Char_t * ProgName);
		inline const Char_t * GetProgName() const { return(fProgName.Data()); };
		
		Int_t GetNofEntries(UInt_t Type = TMrbLogMessage::kMrbMsgAny) const; 	// number of entries
		inline Int_t GetEntries(TObjArray & MsgArr, Int_t Start = 0) const { return(GetEntriesByType(MsgArr, Start, TMrbLogMessage::kMrbMsgAny)); };
		inline Int_t GetMessages(TObjArray & MsgArr, Int_t Start = 0) const { return(GetEntriesByType(MsgArr, Start, TMrbLogMessage::kMrbMsgMessage)); };
		inline Int_t GetErrors(TObjArray & MsgArr, Int_t Start = 0) const { return(GetEntriesByType(MsgArr, Start, TMrbLogMessage::kMrbMsgError)); };
		inline Int_t GetWarnings(TObjArray & MsgArr, Int_t Start = 0) const { return(GetEntriesByType(MsgArr, Start, TMrbLogMessage::kMrbMsgWarning)); };
		
		inline Int_t GetEntriesSinceLastCall(TObjArray & MsgArr) const { return(GetEntries(MsgArr, fIndexOfLastPrinted)); };
		inline Int_t GetMessagesSinceLastCall(TObjArray & MsgArr) const { return(GetMessages(MsgArr, fIndexOfLastPrinted)); };
		inline Int_t GetErrorsSinceLastCall(TObjArray & MsgArr) const { return(GetErrors(MsgArr, fIndexOfLastPrinted)); };
		inline Int_t GetWarningsSinceLastCall(TObjArray & MsgArr) const { return(GetWarnings(MsgArr, fIndexOfLastPrinted)); };
		
		Int_t GetEntriesByType(TObjArray & MsgArr, Int_t Start = 0, UInt_t Type = TMrbLogMessage::kMrbMsgAny) const;
	
		TMrbLogMessage * GetLast(const Char_t * Option = "*") const;
		TMrbLogMessage * GetLast(UInt_t Type) const;
		
		inline UInt_t Enable(UInt_t Bits) { fEnabled |= Bits; return(fEnabled); };
		inline UInt_t Disable(UInt_t Bits) { fEnabled &= ~Bits; return(fEnabled); };
		
		void Print(Option_t * Option) const { TObject::Print(Option); }
		void Print(Int_t Tail = 0, const Char_t * Option = "*") const;
		void Print(Int_t Tail, UInt_t Type) const;
		
		void PrintSinceLastCall(const Char_t * Option = "Error");
		void PrintSinceLastCall(UInt_t Type);
				
		inline void Reset() {
//			fLofMessages.Delete();
			fIndexOfLastPrinted = 0;
		};
		
		inline Int_t GetIndexOfLastPrinted() const { return(fIndexOfLastPrinted); };
				
		const Char_t * Prefix(const Char_t * Identifier = "*", const Char_t * ProgName = NULL); 	// line prefix
		
		inline Bool_t Out(const Char_t * Msg, const Char_t * ClassNameL = "", const Char_t * Method = "", const Char_t * Color = NULL) {
				return(this->OutputMessage(TMrbLogMessage::kMrbMsgMessage, Msg, ClassNameL, Method, Color));
		};
		inline Bool_t Err(const Char_t * Msg, const Char_t * ClassNameL = "", const Char_t * Method = "", const Char_t * Color = NULL) {
				return(this->OutputMessage(TMrbLogMessage::kMrbMsgError, Msg, ClassNameL, Method, Color));
		};
		inline Bool_t Wrn(const Char_t * Msg, const Char_t * ClassNameL = "", const Char_t * Method = "", const Char_t * Color = NULL) {
				return(this->OutputMessage(TMrbLogMessage::kMrbMsgWarning, Msg, ClassNameL, Method, Color));
		};
	
		inline ostringstream & Out() { return(*fOut); };
		inline ostringstream & Err() { return(*fErr); };
		inline ostringstream & Wrn() { return(*fWrn); };
		inline ofstream & Log() { return(*fLog); };
				
		inline void Help() { gSystem->Exec(Form("mrbHelp %s", this->ClassName())); };

	protected:
		Bool_t OutputMessage(TMrbLogMessage::EMrbMsgType MsgType, const Char_t * Msg,
									const Char_t * ClassNameL = "", const Char_t * Method = "", const Char_t * Color = NULL, Bool_t Indent = kFALSE);

	protected:

		TString fLogFile;			// name of log file on disk
		TString fProgName;			// program issuing messages
		TString fPrefix;			// line prefix
				
		UInt_t fEnabled;			// one bit for each stream
		ofstream * fLog;			//!
		ostringstream * fOut;		//!
		ostringstream * fErr;		//!
		ostringstream * fWrn;		//!

		Int_t fIndexOfLastPrinted;	// index at last printout
		TObjArray fLofMessages; 	// list of messages
		
	ClassDef(TMrbLogger, 1) 		// [Utils] Message/error logger
};

#endif
 TMrbLogger.h:1
 TMrbLogger.h:2
 TMrbLogger.h:3
 TMrbLogger.h:4
 TMrbLogger.h:5
 TMrbLogger.h:6
 TMrbLogger.h:7
 TMrbLogger.h:8
 TMrbLogger.h:9
 TMrbLogger.h:10
 TMrbLogger.h:11
 TMrbLogger.h:12
 TMrbLogger.h:13
 TMrbLogger.h:14
 TMrbLogger.h:15
 TMrbLogger.h:16
 TMrbLogger.h:17
 TMrbLogger.h:18
 TMrbLogger.h:19
 TMrbLogger.h:20
 TMrbLogger.h:21
 TMrbLogger.h:22
 TMrbLogger.h:23
 TMrbLogger.h:24
 TMrbLogger.h:25
 TMrbLogger.h:26
 TMrbLogger.h:27
 TMrbLogger.h:28
 TMrbLogger.h:29
 TMrbLogger.h:30
 TMrbLogger.h:31
 TMrbLogger.h:32
 TMrbLogger.h:33
 TMrbLogger.h:34
 TMrbLogger.h:35
 TMrbLogger.h:36
 TMrbLogger.h:37
 TMrbLogger.h:38
 TMrbLogger.h:39
 TMrbLogger.h:40
 TMrbLogger.h:41
 TMrbLogger.h:42
 TMrbLogger.h:43
 TMrbLogger.h:44
 TMrbLogger.h:45
 TMrbLogger.h:46
 TMrbLogger.h:47
 TMrbLogger.h:48
 TMrbLogger.h:49
 TMrbLogger.h:50
 TMrbLogger.h:51
 TMrbLogger.h:52
 TMrbLogger.h:53
 TMrbLogger.h:54
 TMrbLogger.h:55
 TMrbLogger.h:56
 TMrbLogger.h:57
 TMrbLogger.h:58
 TMrbLogger.h:59
 TMrbLogger.h:60
 TMrbLogger.h:61
 TMrbLogger.h:62
 TMrbLogger.h:63
 TMrbLogger.h:64
 TMrbLogger.h:65
 TMrbLogger.h:66
 TMrbLogger.h:67
 TMrbLogger.h:68
 TMrbLogger.h:69
 TMrbLogger.h:70
 TMrbLogger.h:71
 TMrbLogger.h:72
 TMrbLogger.h:73
 TMrbLogger.h:74
 TMrbLogger.h:75
 TMrbLogger.h:76
 TMrbLogger.h:77
 TMrbLogger.h:78
 TMrbLogger.h:79
 TMrbLogger.h:80
 TMrbLogger.h:81
 TMrbLogger.h:82
 TMrbLogger.h:83
 TMrbLogger.h:84
 TMrbLogger.h:85
 TMrbLogger.h:86
 TMrbLogger.h:87
 TMrbLogger.h:88
 TMrbLogger.h:89
 TMrbLogger.h:90
 TMrbLogger.h:91
 TMrbLogger.h:92
 TMrbLogger.h:93
 TMrbLogger.h:94
 TMrbLogger.h:95
 TMrbLogger.h:96
 TMrbLogger.h:97
 TMrbLogger.h:98
 TMrbLogger.h:99
 TMrbLogger.h:100
 TMrbLogger.h:101
 TMrbLogger.h:102
 TMrbLogger.h:103
 TMrbLogger.h:104
 TMrbLogger.h:105
 TMrbLogger.h:106
 TMrbLogger.h:107
 TMrbLogger.h:108
 TMrbLogger.h:109
 TMrbLogger.h:110
 TMrbLogger.h:111
 TMrbLogger.h:112
 TMrbLogger.h:113
 TMrbLogger.h:114
 TMrbLogger.h:115
 TMrbLogger.h:116
 TMrbLogger.h:117
 TMrbLogger.h:118
 TMrbLogger.h:119
 TMrbLogger.h:120
 TMrbLogger.h:121
 TMrbLogger.h:122
 TMrbLogger.h:123
 TMrbLogger.h:124
 TMrbLogger.h:125
 TMrbLogger.h:126
 TMrbLogger.h:127
 TMrbLogger.h:128
 TMrbLogger.h:129
 TMrbLogger.h:130
 TMrbLogger.h:131
 TMrbLogger.h:132
 TMrbLogger.h:133
 TMrbLogger.h:134
 TMrbLogger.h:135
 TMrbLogger.h:136
 TMrbLogger.h:137
 TMrbLogger.h:138
 TMrbLogger.h:139
 TMrbLogger.h:140
 TMrbLogger.h:141
 TMrbLogger.h:142
 TMrbLogger.h:143
 TMrbLogger.h:144
 TMrbLogger.h:145
 TMrbLogger.h:146
 TMrbLogger.h:147
 TMrbLogger.h:148
 TMrbLogger.h:149
 TMrbLogger.h:150
 TMrbLogger.h:151
 TMrbLogger.h:152
 TMrbLogger.h:153
 TMrbLogger.h:154
 TMrbLogger.h:155
 TMrbLogger.h:156
 TMrbLogger.h:157
 TMrbLogger.h:158
 TMrbLogger.h:159
 TMrbLogger.h:160
 TMrbLogger.h:161
 TMrbLogger.h:162
 TMrbLogger.h:163
 TMrbLogger.h:164
 TMrbLogger.h:165
 TMrbLogger.h:166
 TMrbLogger.h:167
 TMrbLogger.h:168
 TMrbLogger.h:169
 TMrbLogger.h:170
 TMrbLogger.h:171
 TMrbLogger.h:172
 TMrbLogger.h:173
 TMrbLogger.h:174
 TMrbLogger.h:175
 TMrbLogger.h:176
 TMrbLogger.h:177
 TMrbLogger.h:178
 TMrbLogger.h:179
 TMrbLogger.h:180
 TMrbLogger.h:181
 TMrbLogger.h:182
 TMrbLogger.h:183
 TMrbLogger.h:184
 TMrbLogger.h:185
 TMrbLogger.h:186
 TMrbLogger.h:187
 TMrbLogger.h:188
 TMrbLogger.h:189
 TMrbLogger.h:190