#define creaMessageTab ""
#endif
-#define CREA_PREPEND_MESSAGE_WITH_SPACE
+//#define CREA_PREPEND_MESSAGE_WITH_SPACE
#ifdef CREA_PREPEND_MESSAGE_WITH_SPACE
#define creaMessageSpace(value) \
crea::MessageManager::GetSpace(value)
do { \
creaOnMessageLevel(key,value) \
{ \
- std::cout << creaMessageCode \
- << creaMessageTab \
- << creaMessageSpace(value) \
- << MESSAGE; \
+ std::ostringstream s; \
+ s << creaMessageCode \
+ << creaMessageTab \
+ << creaMessageSpace(value) \
+ << MESSAGE; \
+ crea::MessageManager::SendMessage(key,s.str()); \
} \
} \
while (0)
// Macro for continuing a message (when one wants to split the macro
// call into multiple lines)
-#define creaMessageCont(key,value,MESSAGE) \
- do \
- { \
- creaOnMessageLevel(key,value) \
- { \
- std::cout << MESSAGE; \
- } \
- } \
- while (0)
-
-#define creaMessageInc(key,value,MESSAGE) \
+#define creaMessageCont(key,value,MESSAGE) \
do \
{ \
creaOnMessageLevel(key,value) \
{ \
- std::cout << creaMessageCode \
- << creaMessageTab \
- << creaMessageSpace(value) \
- << MESSAGE; \
- crea::MessageManager::IncTab(); \
+ std::ostringstream s; \
+ s << MESSAGE; \
+ crea::MessageManager::SendMessage(key,s.str()); \
} \
} \
while (0)
-#define creaMessageDec(key,value,MESSAGE) \
+#define creaMessageInc(key,value,MESSAGE) \
do \
{ \
- creaOnMessageLevel(key,value) \
- { \
- crea::MessageManager::DecTab(); \
- std::cout << creaMessageCode \
- << creaMessageTab \
- << creaMessageSpace(value) \
- << MESSAGE; \
+ std::ostringstream s; \
+ s << creaMessageCode \
+ << creaMessageTab \
+ << creaMessageSpace(value) \
+ << MESSAGE; \
+ crea::MessageManager::SendMessage(key,s.str()); \
+ crea::MessageManager::IncTab(); \
} \
} \
while (0)
+#define creaMessageDec(key,value,MESSAGE) \
+ do \
+ { \
+ creaOnMessageLevel(key,value) \
+ { \
+ crea::MessageManager::DecTab(); \
+ std::ostringstream s; \
+ s << creaMessageCode \
+ << creaMessageTab \
+ << creaMessageSpace(value) \
+ << MESSAGE; \
+ crea::MessageManager::SendMessage(key,s.str()); \
+ } \
+ } \
+ while (0)
+
#define creaDecTab(key,value) \
do \
{ \
//===========================================================
+// Macros for debug messages
#ifdef CREA_COMPILE_DEBUG_MESSAGES
-
-// Macro for debug messages
-#define creaDebugMessage(key,value,MESSAGE) \
- do \
- { \
- creaOnMessageLevel(key,value) \
- { \
- std::cout << creaMessageCode \
- << creaMessageTab \
- << creaMessageSpace(value) \
- << MESSAGE; \
- } \
- } \
- while (0)
-
-// Macro for continuing a debug message (when one wants to split the
-// macro call into multiple lines)
-#define creaDebugMessageCont(key,value,MESSAGE) \
- do \
- { \
- creaOnMessageLevel(key,value) \
- { \
- std::cout << MESSAGE; \
- } \
- } \
- while (0)
-
-#define creaDebugMessageInc(key,value,MESSAGE) \
- do \
- { \
- creaOnMessageLevel(key,value) \
- { \
- std::cout << creaMessageCode \
- << creaMessageTab \
- << creaMessageSpace(value) \
- << MESSAGE; \
- crea::MessageManager::IncTab(); \
- } \
- } \
- while (0)
-
-#define creaDebugMessageDec(key,value,MESSAGE) \
- do \
- { \
- creaOnMessageLevel(key,value) \
- { \
- crea::MessageManager::DecTab(); \
- std::cout << creaMessageCode \
- << creaMessageTab \
- << creaMessageSpace(value) \
- << MESSAGE; \
- } \
- } \
- while (0)
-
-#define creaDebugDecTab(key,value) \
- do \
- { \
- creaOnMessageLevel(key,value) \
- { \
- crea::MessageManager::DecTab(); \
- } \
- } \
- while (0)
-
-#define creaDebugIncTab(key,value) \
- do \
- { \
- creaOnMessageLevel(key,value) \
- { \
- crea::MessageManager::IncTab(); \
- } \
- } \
- while (0)
-
-#define creaDebugResetTab() \
- do \
- { \
- crea::MessageManager::ResetTab(); \
- } \
- while (0)
-
+#define creaDebugMessage(key,value,MESSAGE) creaMessage(key,value,MESSAGE)
+#define creaDebugMessageCont(key,value,MESSAGE) creaMessageCont(key,value,MESSAGE)
+#define creaDebugMessageInc(key,value,MESSAGE) creaMessageInc(key,value,MESSAGE)
+#define creaDebugMessageDec(key,value,MESSAGE) creaMessageDec(key,value,MESSAGE)
+#define creaDebugDecTab(key,value) creaDecTab(key,value)
+#define creaDebugIncTab(key,value) creaIncTab(key,value)
+#define creaDebugResetTab() creaResetTab()
#else
#define creaDebugMessage(key,value,MESSAGE)
#define creaDebugMessageCont(key,value,MESSAGE)
#define creaWarning(MESSAGE) \
do \
{ \
- int lev = crea::MessageManager::GetMessageLevel("Warning"); \
+ int lev = crea::MessageManager::GetMessageLevel("warning"); \
if (lev >0) \
{ \
std::cerr << "!! WARNING !! " << MESSAGE << std::endl; \
#define creaendl std::endl
//===========================================================
+// Signal/slot mechanism for message events
+#include <boost/signal.hpp>
+#include <boost/bind.hpp>
namespace crea
{
-
+
class CREA_EXPORT MessageManager
{
public:
+ //=============================================
+ typedef boost::signal<void (const std::string&)> MessageSignalType;
+ typedef MessageSignalType::slot_function_type MessageCallbackType;
+ //=============================================
///
MessageManager();
///
///
static MessageManager* GetInstance();
///
- static void RegisterMessageType(std::string key,
- std::string help,
+ static void RegisterMessageType(const std::string& key,
+ const std::string& help,
unsigned char default_level = 9);
///
- static void SetMessageLevel(std::string key, unsigned char level);
+ static void SetMessageLevel(const std::string& key, unsigned char level);
///
- static int GetMessageLevel(std::string key);
+ static int GetMessageLevel(const std::string& key);
///
+ static void SendMessage(const std::string& key, const std::string& mess);
+ ///
+ static void AddMessageObserver(const std::string& key, MessageCallbackType callback );
+ ///
+ static void SendMessagesToCout(bool v = true);
+ ///
static std::string& GetTab() { static std::string s; return s; }
///
static std::string GetSpace(int n) {
static void ResetTab() { GetTab() = std::string(""); }
///
static void PrintInfo();
-
+ ///
+
private:
- std::map<std::string,int> mMessageLevel;
- std::map<std::string,std::string> mMessageHelp;
+ struct MessageType
+ {
+ MessageType(int l, const std::string& h) : Level(l), Help(h) {}
+ int Level;
+ std::string Help;
+ MessageSignalType Signal;
+ };
+ typedef std::map<std::string,MessageType*> MessageMapType;
+ MessageMapType mMessageMap;
unsigned int mMaxMessageLength;
+ bool mSendToCout;
};
//===========================================================