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
60public:
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
129 mutable char message_[400];
131};
132
141
142public:
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();
214
222 char source_[5];
232};
233
234// for convenience eol
239
346
348
349public:
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);
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
641protected:
645 std::vector< double > doubleValue_;
646 std::vector< CoinBigIndex > longValue_;
647 std::vector< char > charValue_;
648 std::vector< std::string > stringValue_;
660 char *format_;
666 std::string source_;
679 FILE *fp_;
681 char g_format_[8];
685
686private:
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.
CoinMessageHandler & operator=(const CoinMessageHandler &)
Assignment operator.
int logLevels_[COIN_NUM_LOG]
Log levels.
int internalNumber_
Internal number for use with enums.
CoinOneMessage currentMessage_
Current message.
int logLevel(int which) const
Get alternative log level.
void setPrecision(unsigned int new_precision)
Set the number of significant digits for printing floating point numbers.
int internalPrint()
Internal printing function.
const char * messageBuffer() const
Output buffer.
int numberCharFields() const
Number of char fields already processed.
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.
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.
FILE * filePointer() const
Get current file pointer.
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.
char g_format_[8]
Current format for floating point numbers.
std::vector< char > charValue_
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 * format_
Format string for message (remainder)
CoinMessageHandler & operator<<(CoinMessageMarker)
Process a marker.
virtual CoinMessageHandler * clone() const
Clone.
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.
char * nextPerCent(char *start, const bool initial=false)
Internal function to locate next format code.
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 & operator<<(double doublevalue)
Process a double parameter value.
CoinMessageHandler & message(int detail=-1)
Start or continue a message.
CoinMessageHandler & message(int externalNumber, const char *source, const char *msg, char severity, int detail=-1)
Print a complete message.
CoinMessageHandler & operator<<(const char *stringvalue)
Process a C-style string parameter value.
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)
CoinMessageHandler & printing(bool onOff)
Enable or disable printing of an optional portion of a message.
FILE * fp_
File pointer.
CoinMessageHandler & operator<<(int intvalue)
Process an integer parameter value.
virtual ~CoinMessageHandler()
Destructor.
int prefix_
Whether we want prefix (may get more subtle so is int)
CoinMessageHandler & message(int messageNumber, const CoinMessages &messages)
Start a message.
CoinBigIndex intValue(int position) const
Values of integer fields already processed.
int printStatus_
0 - Normal.
CoinMessageHandler & operator<<(char charvalue)
Process a char parameter value.
CoinMessageHandler & operator<<(const std::string &stringvalue)
Process a STL string parameter value.
double doubleValue(int position) const
Values of double fields already processed.
virtual void checkSeverity()
Check message severity - if too bad then abort.
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 & operator=(const CoinOneMessage &)
assignment operator.
~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 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)
char * message() const
Return the message text.
CoinOneMessage()
Default constructor.
int externalNumber() const
Get message ID number.
CoinOneMessage(const CoinOneMessage &)
The copy constructor.