[Orxonox-commit 4100] r8771 - code/branches/output/src/libraries/util/output

landauf at orxonox.net landauf at orxonox.net
Sun Jul 24 01:22:12 CEST 2011


Author: landauf
Date: 2011-07-24 01:22:11 +0200 (Sun, 24 Jul 2011)
New Revision: 8771

Modified:
   code/branches/output/src/libraries/util/output/OutputDefinitions.h
   code/branches/output/src/libraries/util/output/OutputManager.cc
   code/branches/output/src/libraries/util/output/OutputManager.h
   code/branches/output/src/libraries/util/output/OutputStream.h
Log:
added function to register new output contexts.
OutputManager owns helper functions to return names of output levels and contexts.
OutputStream now also seems to compile and link with msvc.

Modified: code/branches/output/src/libraries/util/output/OutputDefinitions.h
===================================================================
--- code/branches/output/src/libraries/util/output/OutputDefinitions.h	2011-07-21 16:07:00 UTC (rev 8770)
+++ code/branches/output/src/libraries/util/output/OutputDefinitions.h	2011-07-23 23:22:11 UTC (rev 8771)
@@ -30,6 +30,7 @@
 #define _OutputDefinitions_H__
 
 #include "util/UtilPrereqs.h"
+#include <string>
 
 namespace orxonox
 {
@@ -57,14 +58,16 @@
 
     typedef uint64_t OutputContext;
 
+    extern _UtilExport OutputContext registerContext(const std::string& name);
+
     namespace context
     {
         static const OutputContext all       = 0xFFFFFFFFFFFFFFFF;
         static const OutputContext none      = 0x0000000000000000;
-        static const OutputContext undefined = 0x0000000000000001;
+        static const OutputContext undefined = registerContext("undefined");
 
-        static const OutputContext test1     = 0x0000000000000002;
-        static const OutputContext test2     = 0x0000000000000004;
+        static const OutputContext test1     = registerContext("test1");
+        static const OutputContext test2     = registerContext("test2");
     }
 }
 }

Modified: code/branches/output/src/libraries/util/output/OutputManager.cc
===================================================================
--- code/branches/output/src/libraries/util/output/OutputManager.cc	2011-07-21 16:07:00 UTC (rev 8770)
+++ code/branches/output/src/libraries/util/output/OutputManager.cc	2011-07-23 23:22:11 UTC (rev 8771)
@@ -46,7 +46,7 @@
         protected:
             virtual void output(OutputLevel level, OutputContext context, const std::string& message)
             {
-                COUT(0) << (int)level << " / " << context << " : " << message << endl;
+                COUT(0) << OutputManager::getInstance().getLevelName(level) << " / " << OutputManager::getInstance().getContextName(context) << " : " << message << endl;
             }
     };
 
@@ -118,5 +118,82 @@
         for (size_t i = 0; i < this->listeners_.size(); ++i)
             this->combinedContextMask_ |= this->listeners_[i]->getContextMask();
     }
+
+    OutputContext OutputManager::registerContext(const std::string& name)
+    {
+        boost::bimap<OutputContext, std::string>::right_map::iterator it = this->contexts_.right.find(name);
+        if (it == this->contexts_.right.end())
+        {
+            OutputContext context = 0x1 << this->contexts_.size();
+            this->contexts_.insert(boost::bimap<OutputContext, std::string>::value_type(context, name));
+            return context;
+        }
+        else
+        {
+            return it->second;
+        }
+    }
+
+    OutputContext registerContext(const std::string& name)
+    {
+        COUT(0) << "### register context " << name << std::endl;
+        return OutputManager::getInstance().registerContext(name);
+    }
+
+    const std::string& OutputManager::getLevelName(OutputLevel level) const
+    {
+        switch (level)
+        {
+            case level::none:               { static std::string name = "None"; return name; }
+            case level::debug_output:       { static std::string name = "Debug"; return name; }
+            case level::user_error:         { static std::string name = "Error"; return name; }
+            case level::user_warning:       { static std::string name = "Warning"; return name; }
+            case level::user_status:        { static std::string name = "Status"; return name; }
+            case level::user_info:          { static std::string name = "Info"; return name; }
+            case level::internal_error:     { static std::string name = "Error (internal)"; return name; }
+            case level::internal_warning:   { static std::string name = "Warning (internal)"; return name; }
+            case level::internal_status:    { static std::string name = "Status (internal)"; return name; }
+            case level::internal_info:      { static std::string name = "Info (internal)"; return name; }
+            case level::verbose:            { static std::string name = "Verbose"; return name; }
+            case level::verbose_more:       { static std::string name = "Verbose (more)"; return name; }
+            case level::verbose_ultra:      { static std::string name = "Verbose (ultra)"; return name; }
+            default:                        { static std::string name = ""; return name; }
+        }
+    }
+
+    const std::string& OutputManager::getContextName(OutputContext context) const
+    {
+        if (context != context::undefined)
+        {
+            boost::bimap<OutputContext, std::string>::left_map::const_iterator it = this->contexts_.left.find(context);
+            if (it != this->contexts_.left.end())
+            {
+                return it->second;
+            }
+            else
+            {
+                static std::string composed_context;
+                composed_context = "";
+                size_t counter = 0;
+                for (OutputContext context_test = 0x1; context_test != 0x0; context_test = context_test << 1)
+                {
+                    if (context & context_test)
+                    {
+                        it = this->contexts_.left.find(context_test);
+                        if (it != this->contexts_.left.end())
+                        {
+                            if (counter)
+                                composed_context += ", ";
+
+                            composed_context += it->second;
+                            ++counter;
+                        }
+                    }
+                }
+                return composed_context;
+            }
+        }
+        return BLANKSTRING;
+    }
 }
 }

Modified: code/branches/output/src/libraries/util/output/OutputManager.h
===================================================================
--- code/branches/output/src/libraries/util/output/OutputManager.h	2011-07-21 16:07:00 UTC (rev 8770)
+++ code/branches/output/src/libraries/util/output/OutputManager.h	2011-07-23 23:22:11 UTC (rev 8771)
@@ -33,6 +33,8 @@
 
 #include <vector>
 
+#include <boost/bimap.hpp>
+
 #include "OutputDefinitions.h"
 
 namespace orxonox
@@ -65,6 +67,11 @@
             inline bool acceptsOutput(OutputLevel level, OutputContext context) const
                 { return ((this->combinedLevelMask_ & level) && (this->combinedContextMask_ & context)); }
 
+            OutputContext registerContext(const std::string& name);
+
+            const std::string& getLevelName(OutputLevel level) const;
+            const std::string& getContextName(OutputContext context) const;
+
         private:
             OutputManager();
             OutputManager(const OutputManager&);
@@ -76,6 +83,8 @@
 
             OutputLevel   combinedLevelMask_;
             OutputContext combinedContextMask_;
+
+            boost::bimap<OutputContext, std::string> contexts_;
     };
 }
 }

Modified: code/branches/output/src/libraries/util/output/OutputStream.h
===================================================================
--- code/branches/output/src/libraries/util/output/OutputStream.h	2011-07-21 16:07:00 UTC (rev 8770)
+++ code/branches/output/src/libraries/util/output/OutputStream.h	2011-07-23 23:22:11 UTC (rev 8771)
@@ -39,14 +39,14 @@
 {
 namespace test
 {
-    class _UtilExport OutputStream : public std::ostringstream
+    class OutputStream : public std::ostringstream
     {
         typedef std::ostream& (*EndlType)(std::ostream&);
 
         public:
-            OutputStream();
+            _UtilExport OutputStream();
 
-            void setOutputAttributes(OutputLevel level, OutputContext context);
+            void _UtilExport setOutputAttributes(OutputLevel level, OutputContext context);
 
             template <class T>
             inline OutputStream& operator<<(const T& val) { return this->output(val); }
@@ -73,7 +73,7 @@
                 return *this;
             }
 
-            void sendMessage();
+            void _UtilExport sendMessage();
 
             OutputLevel level_;
             OutputContext context_;




More information about the Orxonox-commit mailing list