X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Utils%2FLogger%2FConfig.ih;h=004368d19e873c91b81d9f3e58e48fec376ab4d3;hb=6a0836b7f462d3d77b79b35638cdbf4c9d4202fc;hp=dae740ddc77f7498b3f21d1fa872250e16ed036f;hpb=b52002fa2001e6472d6aa3dde263b85f654c6e8e;p=senf.git diff --git a/Utils/Logger/Config.ih b/Utils/Logger/Config.ih index dae740d..004368d 100644 --- a/Utils/Logger/Config.ih +++ b/Utils/Logger/Config.ih @@ -1,8 +1,8 @@ // $Id$ // -// Copyright (C) 2007 -// Fraunhofer Institut fuer offene Kommunikationssysteme (FOKUS) -// Kompetenzzentrum fuer Satelitenkommunikation (SatCom) +// Copyright (C) 2007 +// Fraunhofer Institute for Open Communication Systems (FOKUS) +// Competence Center NETwork research (NET), St. Augustin, GERMANY // Stefan Bund // // This program is free software; you can redistribute it and/or modify @@ -30,7 +30,11 @@ #include #include #include -#include "Defaults.hh" +#include +#include +#include +#include +#include "../preprocessor.hh" ///////////////////////////////ih.p//////////////////////////////////////// @@ -38,37 +42,92 @@ namespace senf { namespace log { namespace detail { - template + struct na {}; + + /// Internal: Compile time configuration for given \a Stream and \a Area + template struct Config { - typedef typename Config::compileLimit compileLimit; + typedef typename Config::compileLimit compileLimit; }; - template - struct Config +# ifndef DOXYGEN + + template + struct Config { - typedef typename Stream::compileLimit compileLimit; + typedef typename Config::compileLimit compileLimit; }; -# define SENF_LOG_CONF_DEFINE(stream, area, level) \ - template <> \ - struct Config \ - { typedef senf::log::level compileLimit; }; + template + struct Config + { + typedef typename Config::compileLimit compileLimit; + }; -# ifdef SENF_LOG_CONF + template + struct Config + { + typedef typename QueryStream::compileLimit compileLimit; + }; -# define _ void -# define SLC_elt(r, data, elt) \ - BOOST_PP_EXPAND(SENF_LOG_CONF_DEFINE BOOST_PP_SEQ_TO_TUPLE(elt)) +# endif - BOOST_PP_SEQ_FOR_EACH(SLC_elt, x, SENF_LOG_CONF) +}}} -# undef SLC_elt -# undef _ +#define SENF_LOG_CHECK_NA_ -# endif +#define SENF_LOG_CAT(a,b) SENF_LOG_CAT_I(a,b) +#define SENF_LOG_CAT_I(a,b) a ## b + +#define SENF_LOG_IS_NA(elt) BOOST_PP_IS_EMPTY( SENF_LOG_CAT(SENF_LOG_CHECK_NA, elt) ) + +#define SENF_LOG_SEQ_TO_NAME_(s,state,elem) \ + BOOST_PP_IF( SENF_LOG_IS_NA(elem), senf::log::detail::na, state::elem ) + +#define SENF_LOG_SEQ_TO_NAME(seq) \ + BOOST_PP_SEQ_FOLD_LEFT(SENF_LOG_SEQ_TO_NAME_, , seq) + +#define SENF_LOG_PREDECL_(s, state, elem) \ + namespace elem { state } + +#define SENF_LOG_PREDECL_long(seq) \ + BOOST_PP_SEQ_FOLD_RIGHT( SENF_LOG_PREDECL_, \ + class SENF_PP_SEQ_BACK(seq);, \ + BOOST_PP_SEQ_POP_BACK(seq) ) + +#define SENF_LOG_PREDECL_short(seq) \ + BOOST_PP_IF( SENF_LOG_IS_NA( SENF_PP_SEQ_BACK(seq) ), ; , class SENF_PP_SEQ_BACK(seq); ) + +#define SENF_LOG_PREDECL(seq) \ + BOOST_PP_CAT(SENF_LOG_PREDECL_, \ + BOOST_PP_IF(BOOST_PP_DEC(BOOST_PP_SEQ_SIZE(seq)),long,short))(seq) + +#define SENF_LOG_NIL(x) + +#define SENF_LOG_CONF_DEFINE(stream, area, level) \ + SENF_LOG_PREDECL(stream) \ + SENF_LOG_PREDECL(area) \ + namespace senf { namespace log { namespace detail { \ + template \ + struct Config< SENF_LOG_SEQ_TO_NAME(stream), \ + SENF_LOG_SEQ_TO_NAME(area), \ + QueryStream, \ + true > \ + { typedef senf::log::level compileLimit; }; \ + }}} + +#ifdef SENF_LOG_CONF + +# define SLC_elt(r, data, elt) \ + SENF_LOG_CONF_DEFINE elt + + BOOST_PP_SEQ_FOR_EACH(SLC_elt, none, SENF_LOG_CONF) + +# undef SLC_elt + +#endif -}}}