CoinUtils  2.11.4
CoinMessageHandler.hpp
Go to the documentation of this file.
1 /* $Id$ */
2 // Copyright (C) 2002, International Business Machines
3 // Corporation and others. All Rights Reserved.
4 // This code is licensed under the terms of the Eclipse Public License (EPL).
5 
6 #ifndef CoinMessageHandler_H
7 #define CoinMessageHandler_H
8 
9 #include "CoinUtilsConfig.h"
10 #include "CoinPragma.hpp"
11 #include "CoinTypes.hpp"
12 
13 #include <iostream>
14 #include <cstdio>
15 #include <string>
16 #include <vector>
17 
32 /*
33  I (jjf) am strongly in favo(u)r of language support for an open
34  source project, but I have tried to make it as lightweight as
35  possible in the sense that only a subset of messages need to be
36  defined - the rest default to US English. There will be different
37  sets of messages for each component - so at present there is a
38  Clp component and a Coin component.
39 
40  Because messages are only used in a controlled environment and have no
41  impact on code and are tested by other tests I have included tests such
42  as language and derivation in other unit tests.
43 */
44 /*
45  Where there are derived classes I (jjf) have started message numbers at 1001.
46 */
47 
59 
60 public:
67  const char *message);
75 
79  void replaceMessage(const char *message);
81 
85  inline int externalNumber() const
86  {
87  return externalNumber_;
88  }
94  inline void setExternalNumber(int number)
95  {
96  externalNumber_ = number;
97  }
99  inline char severity() const
100  {
101  return severity_;
102  }
104  inline void setDetail(int level)
105  {
106  detail_ = static_cast< char >(level);
107  }
109  inline int detail() const
110  {
111  return detail_;
112  }
114  inline char *message() const
115  {
116  return message_;
117  }
119 
125  char detail_;
127  char severity_;
129  mutable char message_[400];
131 };
132 
141 
142 public:
148  enum Language {
149  us_en = 0,
151  it
152  };
153 
157  CoinMessages(int numberMessages = 0);
165 
173  void addMessage(int messageNumber, const CoinOneMessage &message);
179  void replaceMessage(int messageNumber, const char *message);
181  inline Language language() const
182  {
183  return language_;
184  }
186  void setLanguage(Language newlanguage)
187  {
188  language_ = newlanguage;
189  }
191  void setDetailMessage(int newLevel, int messageNumber);
199  void setDetailMessages(int newLevel, int numberMessages,
200  int *messageNumbers);
202  void setDetailMessages(int newLevel, int low, int high);
203 
205  inline int getClass() const
206  {
207  return class_;
208  }
210  void toCompact();
212  void fromCompact();
214 
222  char source_[5];
224  int class_;
232 };
233 
234 // for convenience eol
238 };
239 
346 
348 
349 public:
354  virtual int print();
357  virtual void checkSeverity();
359 
373  virtual CoinMessageHandler *clone() const;
375 
378  inline int detail(int messageNumber, const CoinMessages &normalMessage) const
379  {
380  return normalMessage.message_[messageNumber]->detail();
381  }
383  inline int logLevel() const
384  {
385  return logLevel_;
386  }
404  void setLogLevel(int value);
406  inline int logLevel(int which) const
407  {
408  return logLevels_[which];
409  }
414  void setLogLevel(int which, int value);
415 
417  void setPrecision(unsigned int new_precision);
419  inline int precision() { return (g_precision_); }
420 
422  void setPrefix(bool yesNo);
424  bool prefix() const;
430  inline double doubleValue(int position) const
431  {
432  return doubleValue_[position];
433  }
438  inline int numberDoubleFields() const
439  {
440  return static_cast< int >(doubleValue_.size());
441  }
447  inline CoinBigIndex intValue(int position) const
448  {
449  return longValue_[position];
450  }
455  inline int numberIntFields() const
456  {
457  return static_cast< int >(longValue_.size());
458  }
464  inline char charValue(int position) const
465  {
466  return charValue_[position];
467  }
472  inline int numberCharFields() const
473  {
474  return static_cast< int >(charValue_.size());
475  }
481  inline std::string stringValue(int position) const
482  {
483  return stringValue_[position];
484  }
489  inline int numberStringFields() const
490  {
491  return static_cast< int >(stringValue_.size());
492  }
493 
496  {
497  return currentMessage_;
498  }
500  inline std::string currentSource() const
501  {
502  return source_;
503  }
505  inline const char *messageBuffer() const
506  {
507  return messageBuffer_;
508  }
510  inline int highestNumber() const
511  {
512  return highestNumber_;
513  }
515  inline FILE *filePointer() const
516  {
517  return fp_;
518  }
520  inline void setFilePointer(FILE *fp)
521  {
522  fp_ = fp;
523  }
525 
534  CoinMessageHandler &message(int messageNumber,
535  const CoinMessages &messages);
536 
551 
564  CoinMessageHandler &message(int externalNumber, const char *source,
565  const char *msg,
566  char severity, int detail = -1);
567 
573 #if COIN_BIG_INDEX == 1
578  CoinMessageHandler &operator<<(long longvalue);
579 #endif
580 #if COIN_BIG_INDEX == 2
585  CoinMessageHandler &operator<<(long long longvalue);
586 #endif
591  CoinMessageHandler &operator<<(double doublevalue);
596  CoinMessageHandler &operator<<(const std::string &stringvalue);
601  CoinMessageHandler &operator<<(char charvalue);
606  CoinMessageHandler &operator<<(const char *stringvalue);
616  int finish();
627 
629 
638 #define COIN_NUM_LOG 4
640 #define COIN_MESSAGE_HANDLER_MAX_BUFFER_SIZE 1000
641 protected:
645  std::vector< double > doubleValue_;
646  std::vector< CoinBigIndex > longValue_;
647  std::vector< char > charValue_;
648  std::vector< std::string > stringValue_;
654  int prefix_;
660  char *format_;
664  char *messageOut_;
666  std::string source_;
679  FILE *fp_;
681  char g_format_[8];
685 
686 private:
688  void gutsOfCopy(const CoinMessageHandler &rhs);
689 
694  char *nextPerCent(char *start, const bool initial = false);
695 
701 
703  void calcPrintStatus(int msglvl, int msgclass);
704 };
705 
706 //#############################################################################
713 
714 #endif
715 
716 /* vi: softtabstop=2 shiftwidth=2 expandtab tabstop=2
717 */
bool CoinMessageHandlerUnitTest()
A function that tests the methods in the CoinMessageHandler class.
#define COIN_NUM_LOG
Log levels will be by type and will then use type given in CoinMessage::class_.
#define COIN_MESSAGE_HANDLER_MAX_BUFFER_SIZE
Maximum length of constructed message (characters)
CoinMessageMarker
@ CoinMessageNewline
@ CoinMessageEol
int CoinBigIndex
Base class for message handling.
void setLogLevel(int value)
Set current log (detail) level.
int logLevels_[COIN_NUM_LOG]
Log levels.
int internalNumber_
Internal number for use with enums.
CoinMessageHandler & printing(bool onOff)
Enable or disable printing of an optional portion of a message.
CoinOneMessage currentMessage_
Current message.
int logLevel(int which) const
Get alternative log level.
CoinMessageHandler & operator<<(int intvalue)
Process an integer parameter value.
CoinMessageHandler & operator<<(char charvalue)
Process a char parameter value.
void setPrecision(unsigned int new_precision)
Set the number of significant digits for printing floating point numbers.
int internalPrint()
Internal printing function.
int numberCharFields() const
Number of char fields already processed.
FILE * filePointer() const
Get current file pointer.
CoinOneMessage currentMessage() const
Current message.
int numberIntFields() const
Number of integer fields already processed.
bool prefix() const
Current setting for printing message prefix.
CoinMessageHandler()
Constructor.
CoinMessageHandler & operator=(const CoinMessageHandler &)
Assignment operator.
char charValue(int position) const
Values of char fields already processed.
void setLogLevel(int which, int value)
Set alternative log level value.
friend bool CoinMessageHandlerUnitTest()
A function that tests the methods in the CoinMessageHandler class.
int finish()
Finish (and print) the message.
int numberStringFields() const
Number of string fields already processed.
int numberDoubleFields() const
Number of double fields already processed.
std::vector< std::string > stringValue_
std::string stringValue(int position) const
Values of string fields already processed.
void calcPrintStatus(int msglvl, int msgclass)
Decide if this message should print.
std::string currentSource() const
Source of current message.
CoinMessageHandler & operator<<(double doublevalue)
Process a double parameter value.
char g_format_[8]
Current format for floating point numbers.
std::vector< char > charValue_
CoinMessageHandler & operator<<(const char *stringvalue)
Process a C-style string parameter value.
virtual int print()
Print message, return 0 normally.
void gutsOfCopy(const CoinMessageHandler &rhs)
The body of the copy constructor and the assignment operator.
int detail(int messageNumber, const CoinMessages &normalMessage) const
Get detail level of a message.
char * nextPerCent(char *start, const bool initial=false)
Internal function to locate next format code.
char * format_
Format string for message (remainder)
int precision()
Current number of significant digits for printing floating point numbers.
int highestNumber() const
Highest message number (indicates any errors)
CoinMessageHandler(const CoinMessageHandler &)
The copy constructor.
std::vector< double > doubleValue_
values in message
int highestNumber_
Highest message number (indicates any errors)
int logLevel() const
Get current log (detail) level.
char * messageOut_
Position in output buffer.
int g_precision_
Current number of significant digits for floating point numbers.
CoinMessageHandler & operator<<(const std::string &stringvalue)
Process a STL string parameter value.
CoinMessageHandler & message(int externalNumber, const char *source, const char *msg, char severity, int detail=-1)
Print a complete message.
void setPrefix(bool yesNo)
Switch message prefix on or off.
std::string source_
Current source of message.
char messageBuffer_[COIN_MESSAGE_HANDLER_MAX_BUFFER_SIZE]
Output buffer.
CoinMessageHandler & message(int detail=-1)
Start or continue a message.
virtual CoinMessageHandler * clone() const
Clone.
void setFilePointer(FILE *fp)
Set new file pointer.
std::vector< CoinBigIndex > longValue_
CoinMessageHandler(FILE *fp)
Constructor to put to file pointer (won't be closed)
FILE * fp_
File pointer.
virtual ~CoinMessageHandler()
Destructor.
CoinMessageHandler & operator<<(CoinMessageMarker)
Process a marker.
int prefix_
Whether we want prefix (may get more subtle so is int)
CoinBigIndex intValue(int position) const
Values of integer fields already processed.
const char * messageBuffer() const
Output buffer.
int printStatus_
0 - Normal.
double doubleValue(int position) const
Values of double fields already processed.
virtual void checkSeverity()
Check message severity - if too bad then abort.
CoinMessageHandler & message(int messageNumber, const CoinMessages &messages)
Start a message.
Class to hold and manipulate an array of massaged messages.
void toCompact()
Moves to compact format.
void setDetailMessages(int newLevel, int numberMessages, int *messageNumbers)
Change detail level for several messages.
CoinOneMessage ** message_
Messages.
void setDetailMessages(int newLevel, int low, int high)
Change detail level for all messages with low <= ID number < high.
int getClass() const
Returns class.
int numberMessages_
Number of messages.
CoinMessages(const CoinMessages &)
The copy constructor.
Language language_
Language.
Language language() const
Language.
Language
Supported languages.
CoinMessages(int numberMessages=0)
Constructor with number of messages.
void setDetailMessage(int newLevel, int messageNumber)
Change detail level for one message.
char source_[5]
Source (null-terminated string, maximum 4 characters).
void setLanguage(Language newlanguage)
Set language.
void addMessage(int messageNumber, const CoinOneMessage &message)
Installs a new message in the specified index position.
~CoinMessages()
Destructor.
int class_
Class - see later on before CoinMessageHandler.
void fromCompact()
Moves from compact format.
CoinMessages & operator=(const CoinMessages &)
assignment operator.
int lengthMessages_
Length of fake CoinOneMessage array.
void replaceMessage(int messageNumber, const char *message)
Replaces the text of the specified message.
Class for one massaged message.
char detail_
Will only print if detail matches.
void setExternalNumber(int number)
Set message ID number.
~CoinOneMessage()
Destructor.
void replaceMessage(const char *message)
Replace message text (e.g., text in a different language)
char message_[400]
Messages (in correct language) (not all 400 may exist)
void setDetail(int level)
Set detail level.
int detail() const
Get detail level.
char * message() const
Return the message text.
char severity() const
Severity.
CoinOneMessage(int externalNumber, char detail, const char *message)
Normal constructor.
char severity_
Severity.
int externalNumber_
number to print out (also determines severity)
CoinOneMessage()
Default constructor.
CoinOneMessage & operator=(const CoinOneMessage &)
assignment operator.
int externalNumber() const
Get message ID number.
CoinOneMessage(const CoinOneMessage &)
The copy constructor.