Utils/Logger: Complete unit testing
[senf.git] / Utils / Logger / Target.hh
index 56cf519..b4137d6 100644 (file)
@@ -30,6 +30,7 @@
 #include <set>
 #include <boost/date_time/posix_time/posix_time.hpp>
 #include <boost/utility.hpp>
+#include <boost/type_traits/is_convertible.hpp>
 #include "../singleton.hh"
 #include "../mpl.hh"
 #include "StreamRegistry.hh"
@@ -62,6 +63,34 @@ namespace log {
 
         enum action_t { ACCEPT, REJECT };
 
+        struct RoutingEntry 
+        {
+            RoutingEntry();
+            bool operator==(RoutingEntry const & other);
+
+            std::string stream() const;
+            std::string area() const;
+            unsigned level() const;
+            action_t action() const;
+            
+        private:
+            RoutingEntry(detail::StreamBase const * stream, detail::AreaBase const * area, 
+                         unsigned level, action_t action);
+
+            detail::StreamBase const * stream_;
+            detail::AreaBase const * area_;
+            unsigned level_;
+            action_t action_;
+            
+            friend class Target;
+        };
+
+    private:
+        typedef std::vector<RoutingEntry> RIB;
+
+    public:
+        typedef RIB::const_iterator iterator;
+
         ///////////////////////////////////////////////////////////////////////////
         ///\name Structors and default members
         ///@{
@@ -71,46 +100,76 @@ namespace log {
 
         ///@}
 
-        template <class Stream>
-        void route(action_t action=ACCEPT);
-
-        template <class Stream, class Arg>
-        void route(action_t action=ACCEPT);
-
-        template <class Stream, class Area, class Level>
-        void route(action_t action=ACCEPT);
-
-        void route(std::string const & stream, action_t action=ACCEPT);
-        void route(std::string const & stream, std::string const & area, action_t action=ACCEPT);
-        void route(std::string const & stream, unsigned level, action_t action=ACCEPT);
-        void route(std::string const & stream, std::string const & area, unsigned level, 
-                   action_t action=ACCEPT);
+        template <class Stream> void route(
+            action_t action = ACCEPT, int index = -1);
+        template <class Stream, class Level> void route(
+            action_t action = ACCEPT, int index = -1,
+            typename boost::enable_if< boost::is_convertible<Level*,
+                                                             detail::LevelBase *> >::type * = 0);
+        template <class Stream, class Area> void route(
+            action_t action = ACCEPT, int index = -1,
+            typename boost::enable_if< boost::is_convertible<Area*,
+                                                             detail::AreaBase *> >::type * = 0);
+        template <class Stream, class AreaClass> void route(
+            action_t action = ACCEPT, int index = -1,
+            typename boost::enable_if< boost::is_convertible<typename AreaClass::SENFLogArea *,
+                                                             detail::AreaBase *> >::type * = 0);
+        template <class Stream, class Area, class Level> void route(
+            action_t action = ACCEPT, int index = -1,
+            typename boost::enable_if< boost::is_convertible<Area *,
+                                                             detail::AreaBase *> >::type * = 0);
+        template <class Stream, class AreaClass, class Level> void route(
+            action_t action = ACCEPT, int index = -1,
+            typename boost::enable_if< boost::is_convertible<typename AreaClass::SENFLogArea *,
+                                                             detail::AreaBase *> >::type * = 0);
+
+        void route(std::string const & stream, std::string const & area = "", 
+                   unsigned level = NONE::value, action_t action = ACCEPT, int index = -1);
+
+        template <class Stream> void unroute(
+            action_t action = ACCEPT);
+        template <class Stream, class Level> void unroute(
+            action_t action = ACCEPT,
+            typename boost::enable_if< boost::is_convertible<Level*,
+                                                             detail::LevelBase *> >::type * = 0);
+        template <class Stream, class Area> void unroute(
+            action_t action = ACCEPT,
+            typename boost::enable_if< boost::is_convertible<Area*,
+                                                             detail::AreaBase *> >::type * = 0);
+        template <class Stream, class AreaClass> void unroute(
+            action_t action = ACCEPT,
+            typename boost::enable_if< boost::is_convertible<typename AreaClass::SENFLogArea *,
+                                                             detail::AreaBase *> >::type * = 0);
+        template <class Stream, class Area, class Level> void unroute(
+            action_t action = ACCEPT,
+            typename boost::enable_if< boost::is_convertible<Area*,
+                                                             detail::AreaBase *> >::type * = 0);
+        template <class Stream, class AreaClass, class Level> void unroute(
+            action_t action = ACCEPT,
+            typename boost::enable_if< boost::is_convertible<typename AreaClass::SENFLogArea *,
+                                                             detail::AreaBase *> >::type * = 0);
+
+        void unroute(std::string const & stream, std::string const & area = "", 
+                     unsigned level = NONE::value, action_t action = ACCEPT);
+        void unroute(int index);
 
         struct InvalidStreamException : public std::exception
         { virtual char const * what() const throw() 
                 { return "senf::log::Target::InvalidStreamException"; } };
-
+        
         struct InvalidAreaException : public std::exception
         { virtual char const * what() const throw() 
                 { return "senf::log::Target::InvalidAreaException"; } };
-        
-    protected:
-
-        std::string timestamp();
 
+        iterator begin() const;
+        iterator end() const;
+        
     private:
-
         void route(detail::StreamBase const * stream, detail::AreaBase const * area, 
-                   unsigned level, action_t action);
+                   unsigned level, action_t action, int index);
         void unroute(detail::StreamBase const * stream, detail::AreaBase const * area, 
                      unsigned level, action_t action);
 
-        template <class Area>
-        void route(detail::StreamBase const * stream, detail::AreaBase const *, action_t action);
-
-        template <class Level>
-        void route(detail::StreamBase const * stream, detail::LevelBase const *, action_t action);
-        
         void updateRoutingCache(detail::StreamBase const * stream, detail::AreaBase const * area);
 
         void write(boost::posix_time::ptime timestamp, detail::StreamBase const & stream,
@@ -128,21 +187,6 @@ namespace log {
     private:
 #   endif
 
-        struct RoutingEntry 
-        {
-            RoutingEntry(detail::StreamBase const * stream_, detail::AreaBase const * area_, 
-                         unsigned level_, action_t action_);
-            RoutingEntry();
-
-            bool operator==(RoutingEntry const & other);
-
-            detail::StreamBase const * stream;
-            detail::AreaBase const * area;
-            unsigned level;            action_t action;
-        };
-
-        typedef std::vector<RoutingEntry> RIB;
-
         RIB rib_;
         
         friend class detail::AreaBase;