Packets: senf::Parse_Variant documentation
[senf.git] / Utils / Logger / Stream.hh
1 // $Id$
2 //
3 // Copyright (C) 2007 
4 // Fraunhofer Institut fuer offene Kommunikationssysteme (FOKUS)
5 // Kompetenzzentrum fuer Satelitenkommunikation (SatCom)
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 Stream public header */
25
26 #ifndef HH_Stream_
27 #define HH_Stream_ 1
28
29 // Custom includes
30 #include <map>
31 #include <functional>
32 #include <boost/iterator/transform_iterator.hpp>
33 #include "Levels.hh"
34 #include "../singleton.hh"
35
36 //#include "Stream.mpp"
37 ///////////////////////////////hh.p////////////////////////////////////////
38
39 /** \brief Define log stream
40
41     Defines a new log stream named \a stream. The stream is defined as a symbol in the current
42     scope.
43
44     \a defaultLevel defines the default log level for messages posted to this stream. \a
45     runtimeLimit defines the default log limit. Messages with a level below this will not be
46     output.  \a compileLimit defines the default log level limit at compile time: Messages
47     posted with a level below \a compileLimit will be discarded at compile time.
48
49     \hideinitializer
50  */
51 #define SENF_LOG_DEF_STREAM(stream, defaultLevel_, runtimeLimit_, compileLimit_)                  \
52     struct stream                                                                                 \
53         : public senf::log::detail::StreamBase, public senf::singleton<stream>                    \
54     {                                                                                             \
55         typedef defaultLevel_ defaultLevel;                                                       \
56         typedef runtimeLimit_ runtimeLimit;                                                       \
57         typedef compileLimit_ compileLimit;                                                       \
58         static std::string name() { return instance().v_name(); }                                 \
59     private:                                                                                      \
60         stream() { init(); }                                                                      \
61         friend class senf::singleton<stream>;                                                     \
62     }
63
64 namespace senf {
65 namespace log {
66
67     namespace detail { struct StreamBase; }
68
69     class StreamRegistry 
70         : public senf::singleton<StreamRegistry>
71     {
72         typedef std::map<std::string, detail::StreamBase const *> Registry;
73
74         struct SelectName 
75         {
76             typedef std::string result_type;
77             std::string const & operator()(Registry::value_type const & v) const;
78         };
79
80     public:
81         typedef boost::transform_iterator<SelectName, Registry::const_iterator> iterator;
82
83         using senf::singleton<StreamRegistry>::instance;
84
85         iterator begin();
86         iterator end();
87
88     private:
89         StreamRegistry();
90
91         void registerStream(detail::StreamBase const & stream);
92
93         Registry registry_;
94
95         friend class senf::singleton<StreamRegistry>;
96         friend class detail::StreamBase;
97         friend class Target;
98     };
99
100 }}
101
102 ///////////////////////////////hh.e////////////////////////////////////////#
103 #include "Stream.cci"
104 //#include "Stream.ct"
105 //#include "Stream.cti"
106 #endif
107
108 \f
109 // Local Variables:
110 // mode: c++
111 // fill-column: 100
112 // comment-column: 40
113 // c-file-style: "senf"
114 // indent-tabs-mode: nil
115 // ispell-local-dictionary: "american"
116 // compile-command: "scons -u test"
117 // End: