CoinUtils  2.11.2
CoinMessageHandler.hpp
Go to the documentation of this file.
1 /* $Id: CoinMessageHandler.hpp 2083 2019-01-06 19:38:09Z unxusr $ */
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 
78  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 
122  int externalNumber_;
125  char detail_;
127  char severity_;
129  mutable char message_[400];
131 };
132 
141 
142 public:
148  enum Language {
149  us_en = 0,
152  };
153 
157  CoinMessages(int numberMessages = 0);
159  ~CoinMessages();
161  CoinMessages(const CoinMessages &);
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 
217  int numberMessages_;
222  char source_[5];
224  int class_;
232 };
233 
234 // for convenience eol
238 };
239 
346 
347  friend bool CoinMessageHandlerUnitTest();
348 
349 public:
354  virtual int print();
357  virtual void checkSeverity();
359 
365  CoinMessageHandler(FILE *fp);
367  virtual ~CoinMessageHandler();
373  virtual CoinMessageHandler *clone() const;
375 
377  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 
550  CoinMessageHandler &message(int detail = -1);
551 
564  CoinMessageHandler &message(int externalNumber, const char *source,
565  const char *msg,
566  char severity, int detail = -1);
567 
572  CoinMessageHandler &operator<<(int intvalue);
573 #if COIN_BIG_INDEX == 1
574 
578  CoinMessageHandler &operator<<(long longvalue);
579 #endif
580 #if COIN_BIG_INDEX == 2
581 
585  CoinMessageHandler &operator<<(long long longvalue);
586 #endif
587 
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();
626  CoinMessageHandler &printing(bool onOff);
627 
629 
638 #define COIN_NUM_LOG 4
639 #define COIN_MESSAGE_HANDLER_MAX_BUFFER_SIZE 1000
641 protected:
644  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 
700  int internalPrint();
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 */
int numberDoubleFields() const
Number of double fields already processed.
CoinMessageMarker
char source_[5]
Source (null-terminated string, maximum 4 characters).
virtual ~CoinMessageHandler()
Destructor.
std::string source_
Current source of message.
void setExternalNumber(int number)
Set message ID number.
char * format_
Format string for message (remainder)
int numberStringFields() const
Number of string fields already processed.
void replaceMessage(const char *message)
Replace message text (e.g., text in a different language)
int internalNumber_
Internal number for use with enums.
int numberIntFields() const
Number of integer fields already processed.
int finish()
Finish (and print) the message.
#define COIN_NUM_LOG
Log levels will be by type and will then use type given in CoinMessage::class_.
int getClass() const
Returns class.
void setPrefix(bool yesNo)
Switch message prefix on or off.
char charValue(int position) const
Values of char fields already processed.
int printStatus_
0 - Normal.
int detail(int messageNumber, const CoinMessages &normalMessage) const
Get detail level of a message.
char severity() const
Severity.
CoinOneMessage & operator=(const CoinOneMessage &)
assignment operator.
CoinOneMessage currentMessage() const
Current message.
CoinMessageHandler & operator<<(int intvalue)
Process an integer parameter value.
int externalNumber_
number to print out (also determines severity)
FILE * filePointer() const
Get current file pointer.
Language language() const
Language.
int class_
Class - see later on before CoinMessageHandler.
Base class for message handling.
void setDetail(int level)
Set detail level.
int lengthMessages_
Length of fake CoinOneMessage array.
~CoinMessages()
Destructor.
std::vector< char > charValue_
void setLanguage(Language newlanguage)
Set language.
char severity_
Severity.
bool prefix() const
Current setting for printing message prefix.
const char * messageBuffer() const
Output buffer.
CoinMessageHandler()
Constructor.
std::string stringValue(int position) const
Values of string fields already processed.
CoinMessageHandler & operator=(const CoinMessageHandler &)
Assignment operator.
CoinMessages(int numberMessages=0)
Constructor with number of messages.
FILE * fp_
File pointer.
Language language_
Language.
void fromCompact()
Moves from compact format.
double doubleValue(int position) const
Values of double fields already processed.
char message_[400]
Messages (in correct language) (not all 400 may exist)
void setPrecision(unsigned int new_precision)
Set the number of significant digits for printing floating point numbers.
CoinOneMessage currentMessage_
Current message.
int highestNumber() const
Highest message number (indicates any errors)
void setDetailMessages(int newLevel, int numberMessages, int *messageNumbers)
Change detail level for several messages.
void setDetailMessage(int newLevel, int messageNumber)
Change detail level for one message.
std::vector< CoinBigIndex > longValue_
CoinOneMessage ** message_
Messages.
int numberCharFields() const
Number of char fields already processed.
virtual int print()
Print message, return 0 normally.
virtual CoinMessageHandler * clone() const
Clone.
int highestNumber_
Highest message number (indicates any errors)
int g_precision_
Current number of significant digits for floating point numbers.
bool CoinMessageHandlerUnitTest()
A function that tests the methods in the CoinMessageHandler class.
virtual void checkSeverity()
Check message severity - if too bad then abort.
CoinMessageHandler & message(int messageNumber, const CoinMessages &messages)
Start a message.
int logLevel(int which) const
Get alternative log level.
char * message() const
Return the message text.
Language
Supported languages.
char messageBuffer_[COIN_MESSAGE_HANDLER_MAX_BUFFER_SIZE]
Output buffer.
int CoinBigIndex
void replaceMessage(int messageNumber, const char *message)
Replaces the text of the specified message.
CoinMessageHandler & printing(bool onOff)
Enable or disable printing of an optional portion of a message.
std::vector< double > doubleValue_
values in message
int logLevel() const
Get current log (detail) level.
void addMessage(int messageNumber, const CoinOneMessage &message)
Installs a new message in the specified index position.
char detail_
Will only print if detail matches.
std::string currentSource() const
Source of current message.
CoinOneMessage()
Default constructor.
int detail() const
Get detail level.
int numberMessages_
Number of messages.
void toCompact()
Moves to compact format.
char g_format_[8]
Current format for floating point numbers.
int externalNumber() const
Get message ID number.
friend bool CoinMessageHandlerUnitTest()
A function that tests the methods in the CoinMessageHandler class.
~CoinOneMessage()
Destructor.
int logLevels_[COIN_NUM_LOG]
Log levels.
int prefix_
Whether we want prefix (may get more subtle so is int)
char * messageOut_
Position in output buffer.
CoinMessages & operator=(const CoinMessages &)
assignment operator.
Class to hold and manipulate an array of massaged messages.
std::vector< std::string > stringValue_
Class for one massaged message.
void setLogLevel(int value)
Set current log (detail) level.
void setFilePointer(FILE *fp)
Set new file pointer.
#define COIN_MESSAGE_HANDLER_MAX_BUFFER_SIZE
Maximum length of constructed message (characters)
CoinBigIndex intValue(int position) const
Values of integer fields already processed.
int precision()
Current number of significant digits for printing floating point numbers.