f2f67774eef3886ba57526f8e77c4358fc0edf20
[senf.git] / Utils / Logger / Config.ih
1 // $Id$
2 //
3 // Copyright (C) 2007
4 // Fraunhofer Institute for Open Communication Systems (FOKUS)
5 // Competence Center NETwork research (NET), St. Augustin, GERMANY
6 //     Stefan Bund <g0dil@berlios.de>
7 //
8 // This program is free software; you can redistribute it and/or modify
9 // it under the terms of the GNU General Public License as published by
10 // the Free Software Foundation; either version 2 of the License, or
11 // (at your option) any later version.
12 //
13 // This program is distributed in the hope that it will be useful,
14 // but WITHOUT ANY WARRANTY; without even the implied warranty of
15 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 // GNU General Public License for more details.
17 //
18 // You should have received a copy of the GNU General Public License
19 // along with this program; if not, write to the
20 // Free Software Foundation, Inc.,
21 // 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
22
23 /** \file
24     \brief Config internal header */
25
26 #ifndef IH_Config_
27 #define IH_Config_ 1
28
29 // Custom includes
30 #include <boost/preprocessor/expand.hpp>
31 #include <boost/preprocessor/seq/for_each.hpp>
32 #include <boost/preprocessor/seq/to_tuple.hpp>
33 #include <boost/preprocessor/seq/fold_right.hpp>
34 #include <boost/preprocessor/seq/pop_back.hpp>
35 #include <boost/preprocessor/if.hpp>
36 #include "../preprocessor.hh"
37
38 ///////////////////////////////ih.p////////////////////////////////////////
39
40 namespace senf {
41 namespace log {
42 namespace detail {
43
44     struct na {};
45
46     /// Internal: Compile time configuration for given \a Stream and \a Area
47     template <class Stream, class Area, class QueryStream=Stream, bool Query=true>
48     struct Config
49     {
50         typedef typename Config<na, Area, Stream, Query>::compileLimit compileLimit;
51     };
52
53 #   ifndef DOXYGEN
54
55     template <class Area, class QueryStream, bool Query>
56     struct Config<na, Area, QueryStream, Query>
57     {
58         typedef typename Config<QueryStream, na, QueryStream, Query>::compileLimit compileLimit;
59     };
60
61     template <class Stream, class QueryStream, bool Query>
62     struct Config<Stream, na, QueryStream, Query>
63     {
64         typedef typename Config<na, na, QueryStream, Query>::compileLimit compileLimit;
65     };
66
67     template <class QueryStream, bool Query>
68     struct Config<na, na, QueryStream, Query>
69     {
70         typedef typename QueryStream::compileLimit compileLimit;
71     };
72
73 #   endif
74
75 }}}
76
77 #define SENF_LOG_SEQ_TO_NAME_(s,state,elem) state::elem
78
79 #define SENF_LOG_SEQ_TO_NAME(seq)                                                                 \
80     BOOST_PP_SEQ_FOLD_LEFT(SENF_LOG_SEQ_TO_NAME_, , seq)
81
82 #define SENF_LOG_PREDECL_(s, state, elem)                                                         \
83     namespace elem { state }
84
85 #define SENF_LOG_PREDECL_long(seq)                                                                \
86     BOOST_PP_SEQ_FOLD_RIGHT( SENF_LOG_PREDECL_,                                                   \
87                              class SENF_PP_SEQ_BACK(seq);,                                        \
88                              BOOST_PP_SEQ_POP_BACK(seq) )
89
90 #define SENF_LOG_PREDECL_short(seq)                                                               \
91         class SENF_PP_SEQ_BACK(seq);
92
93 #define SENF_LOG_PREDECL(seq)                                                                     \
94     BOOST_PP_CAT(SENF_LOG_PREDECL_,                                                               \
95                  BOOST_PP_IF(BOOST_PP_DEC(BOOST_PP_SEQ_SIZE(seq)),long,short))(seq)
96
97 #define SENF_LOG_NIL(x)
98
99 #define SENF_LOG_CONF_DEFINE(stream, area, level)                                                 \
100     SENF_LOG_PREDECL(stream)                                                                      \
101     SENF_LOG_PREDECL(area)                                                                        \
102     namespace senf { namespace log { namespace detail {                                           \
103         template <class QueryStream>                                                              \
104         struct Config< SENF_LOG_SEQ_TO_NAME(stream),                                              \
105                        SENF_LOG_SEQ_TO_NAME(area),                                                \
106                        QueryStream,                                                               \
107                        true >                                                                     \
108         { typedef senf::log::level compileLimit; };                                               \
109     }}}
110
111 #ifdef SENF_LOG_CONF
112
113 #   define _ senf::log::detail::na
114 #   define SLC_elt(r, data, elt) \
115         SENF_LOG_CONF_DEFINE elt
116
117     BOOST_PP_SEQ_FOR_EACH(SLC_elt, none, SENF_LOG_CONF)
118
119 #   undef SLC_elt
120 #   undef _
121
122 #endif
123
124
125
126
127 ///////////////////////////////ih.e////////////////////////////////////////
128 #endif
129
130 \f
131 // Local Variables:
132 // mode: c++
133 // fill-column: 100
134 // comment-column: 40
135 // c-file-style: "senf"
136 // indent-tabs-mode: nil
137 // ispell-local-dictionary: "american"
138 // compile-command: "scons -u test"
139 // End: