61#if __cplusplus > 199711L 
   70static std::unique_ptr<const std::map<TMVA::EMsgType, std::string> > 
gOwnTypeMap;
 
   71static std::unique_ptr<const std::map<TMVA::EMsgType, std::string> > 
gOwnColorMap;
 
   80   : fObjSource ( source ),
 
   93     fStrSource ( source ),
 
  105     fStrSource ( 
"Unknown" ),
 
  106     fActiveType( kINFO ),
 
  117     std::ostringstream(),
 
  137   if (&parent != 
this) {
 
  152   std::string source_name;
 
  153   if (fActiveType == kHEADER)
 
  155       source_name = fStrSource;
 
  157   if (fActiveType == kWARNING)
 
  159       source_name =
"<WARNING>";
 
  161   if (source_name.size() > fgMaxSourceSize) {
 
  162      source_name = source_name.substr( 0, fgMaxSourceSize - 3 );
 
  163      source_name += 
"...";
 
  174   std::string source_name = GetFormattedSource();
 
  175   if (source_name.size() < fgMaxSourceSize)
 
  176      for (std::string::size_type i=source_name.size(); i<fgMaxSourceSize; i++) source_name.push_back( 
' ' );
 
  178   return fgPrefix + source_name + fgSuffix;
 
  187   std::string source_name = GetFormattedSource();
 
  189   std::string message = this->str();
 
  190   std::string::size_type previous_pos = 0, current_pos = 0;
 
  194      current_pos = message.find( 
'\n', previous_pos );
 
  195      std::string 
line = message.substr( previous_pos, current_pos - previous_pos );
 
  197      std::ostringstream message_to_send;
 
  199      message_to_send.setf( std::ios::adjustfield, std::ios::left );
 
  200      message_to_send.width( fgMaxSourceSize );
 
  201      message_to_send << source_name << fgSuffix << 
line;
 
  202      std::string msg = message_to_send.str();
 
  203      this->WriteMsg( fActiveType, msg );
 
  205      if (current_pos == message.npos) 
break;
 
  206      previous_pos = current_pos + 1;
 
  221  if ( (
type < fMinType || fgInhibitOutput) && 
type!=kFATAL ) 
return; 
 
  223  std::map<EMsgType, std::string>::const_iterator stype;
 
  225  if ((stype = fgTypeMap.load()->find( 
type )) != fgTypeMap.load()->end()) {
 
  229   if (
type == kHEADER || 
type ==kWARNING)
 
  230     std::cout << fgPrefix << 
line << std::endl;
 
  231   else if (
type == kINFO || 
type == kVERBOSE)
 
  233     std::cout << 
line << std::endl;
 
  236     std::cout << fgColorMap.load()->find( 
type )->second << 
"<" << stype->second << 
">" << 
line << 
"\033[0m" << std::endl;
 
  241   if (
type == kINFO) std::cout << fgPrefix << 
line << std::endl;
 
  242   else               std::cout << fgPrefix << 
"<" << stype->second << 
"> " << 
line << std::endl;
 
  248   if (
type == kFATAL) {
 
  249      std::cout << 
"***> abort program execution" << std::endl;
 
  250      throw std::runtime_error(
"FATAL error");
 
  272      std::map<TMVA::EMsgType, std::string>*tmp  = 
new std::map<TMVA::EMsgType, std::string>();
 
  274      (*tmp)[kVERBOSE]  = std::string(
"VERBOSE");
 
  275      (*tmp)[kDEBUG]    = std::string(
"DEBUG");
 
  276      (*tmp)[kINFO]     = std::string(
"INFO");
 
  277      (*tmp)[kWARNING]  = std::string(
"WARNING");
 
  278      (*tmp)[kERROR]    = std::string(
"ERROR");
 
  279      (*tmp)[kFATAL]    = std::string(
"FATAL");
 
  280      (*tmp)[kSILENT]   = std::string(
"SILENT");
 
  281      (*tmp)[kHEADER]   = std::string(
"HEADER");
 
  282      const std::map<TMVA::EMsgType, std::string>* expected=0;
 
  283      if(fgTypeMap.compare_exchange_strong(expected,tmp)) {
 
  293      std::map<TMVA::EMsgType, std::string>*tmp  = 
new std::map<TMVA::EMsgType, std::string>();
 
  295      (*tmp)[kVERBOSE] = std::string(
"");
 
  296      (*tmp)[kDEBUG]   = std::string(
"\033[34m");
 
  297      (*tmp)[kINFO]    = std::string(
"");
 
  298      (*tmp)[kWARNING] = std::string(
"\033[1;31m");
 
  299      (*tmp)[kERROR]   = std::string(
"\033[31m");
 
  300      (*tmp)[kFATAL]   = std::string(
"\033[37;41;1m");
 
  301      (*tmp)[kSILENT]  = std::string(
"\033[30m");
 
  303      const std::map<TMVA::EMsgType, std::string>* expected=0;
 
  304      if(fgColorMap.compare_exchange_strong(expected,tmp)) {
 
static std::unique_ptr< const std::map< TMVA::EMsgType, std::string > > gOwnTypeMap
static std::unique_ptr< const std::map< TMVA::EMsgType, std::string > > gOwnColorMap
ostringstream derivative to redirect and format output
static const UInt_t fgMaxSourceSize
static const std::string fgPrefix
MsgLogger(const TObject *source, EMsgType minType=kINFO)
constructor
MsgLogger & operator=(const MsgLogger &parent)
assignment operator
std::string GetPrintedSource() const
the full logger prefix
static void InhibitOutput()
const TObject * fObjSource
static const std::string fgSuffix
static void EnableOutput()
static const std::map< EMsgType, std::string > * fgTypeMap
std::string GetFormattedSource() const
make sure the source name is no longer than fgMaxSourceSize:
static Bool_t fgInhibitOutput
void InitMaps()
Create the message type and color maps.
void WriteMsg(EMsgType type, const std::string &line) const
putting the output string, the message type, and the color switcher together into a single string
static MsgLogger & Endmsg(MsgLogger &logger)
end line
static const std::map< EMsgType, std::string > * fgColorMap
void Send()
activates the logger writer
Mother of all ROOT objects.