X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Utils%2FLogger%2FParameters.ih;h=5370f9702dcfc80ca02cb20c08c21a8d7edd06ff;hb=ac86c2bb40746fbedf70a19af3307e5da642b04a;hp=882af7cdb182a2f349f3f3c35189e1888468e3a6;hpb=9bfe0b87be0926193b5baf13865cf045f0de0b0d;p=senf.git diff --git a/Utils/Logger/Parameters.ih b/Utils/Logger/Parameters.ih index 882af7c..5370f97 100644 --- a/Utils/Logger/Parameters.ih +++ b/Utils/Logger/Parameters.ih @@ -33,32 +33,34 @@ #include #include #include -#include "Defaults.hh" +#include +#include +#include #include "../mpl.hh" -#include "Stream.hh" -#include "Area.hh" -#include "Levels.hh" #include "Config.hh" ///////////////////////////////ih.p//////////////////////////////////////// -#ifndef _senf_LOG_STREAM -# define _senf_LOG_STREAM std::cerr -#endif - -typedef senf::log::Debug SENFLogDefaultStream; -typedef senf::log::DefaultArea SENFLogDefaultArea; -typedef senf::log::NONE SENFLogDefaultLevel; - namespace senf { namespace log { + + class DefaultArea; + class Debug; + class NONE; + namespace detail { - struct AliasBase {}; + class StreamBase; + class AreaBase; + class LevelBase; + class AliasBase; + /// Internal: Parameter extractor template struct Parameters_ {}; +#ifndef DOXYGEN + senf::mpl::rv<1> Parameters_select_(StreamBase *); template struct Parameters_ : public Base @@ -67,7 +69,7 @@ namespace detail { senf::mpl::rv<2> Parameters_select_(AreaBase *); template struct Parameters_ : public Base - { typedef Param area; }; + { typedef Param area; typedef Param area_base; }; senf::mpl::rv<3> Parameters_select_(LevelBase *); template @@ -85,23 +87,47 @@ namespace detail { : public Param::template apply::type {}; + // This trick makes any class with a SENFLogArea typedef member usable as area. A typedef of + // this name is created by SENF_LOG_CLASS_AREA() + template + senf::mpl::rv<6> Parameters_select_( + T *, + typename boost::disable_if< boost::is_convertible >::type * = 0, + typename boost::disable_if< boost::is_convertible >::type * = 0, + typename boost::disable_if< boost::is_convertible >::type * = 0, + typename boost::disable_if< boost::is_convertible >::type * = 0); + template + struct Parameters_ : public Base + { typedef typename Param::SENFLogArea area; typedef Param area_base; }; + +#endif + + /// Internal: Log message parameter collection template struct Parameters : public Base { + typedef typename boost::mpl::if_c< Base::level::value == NONE::value, + typename Base::stream::defaultLevel, + typename Base::level >::type level; - static bool const compile_enabled = senf::log::Enabled< + static bool const compileEnabled = senf::log::Enabled< typename Base::stream, - typename Base::area, - typename Base::level>::value; + typename Base::area_base, + level>::value; - static bool enabled() { return compile_enabled; } - static std::ostream & log_stream() { return _senf_LOG_STREAM; } + static bool enabled() { + return compileEnabled + && Base::area::instance().limit(Base::stream::instance()) <= level::value; + } }; + /// Internal: Empty base class struct empty {}; - struct Parameters_Merge_ + /// Internal: Merge log message parameter list + struct Parameters_Merge { + /// Internal: Embedded mpl template meta-function template struct apply { typedef Parameters_< @@ -113,13 +139,17 @@ namespace detail { }}} +typedef senf::log::Debug SENFLogDefaultStream; +typedef senf::log::DefaultArea SENFLogDefaultArea; +typedef senf::log::NONE SENFLogDefaultLevel; + #define SENF_LOG_MERGE_ARG(r, data, i, elem) BOOST_PP_COMMA_IF(i) elem #define SENF_LOG_MERGE_PARAMETERS_I(base, args) \ boost::mpl::fold< \ boost::mpl::vector< BOOST_PP_SEQ_FOR_EACH_I(SENF_LOG_MERGE_ARG, _, args) >, \ base, \ - senf::log::detail::Parameters_Merge_ >::type + senf::log::detail::Parameters_Merge >::type #define SENF_LOG_MERGE_PARAMETERS(args) \ senf::log::detail::Parameters< SENF_LOG_MERGE_PARAMETERS_I( \