switch to new MPL based Fraunhofer FOKUS Public License
[senf.git] / senf / Utils / Logger / AreaRegistry.hh
1 // $Id$
2 //
3 // Copyright (C) 2007
4 // Fraunhofer Institute for Open Communication Systems (FOKUS)
5 //
6 // The contents of this file are subject to the Fraunhofer FOKUS Public License
7 // Version 1.0 (the "License"); you may not use this file except in compliance
8 // with the License. You may obtain a copy of the License at 
9 // http://senf.berlios.de/license.html
10 //
11 // The Fraunhofer FOKUS Public License Version 1.0 is based on, 
12 // but modifies the Mozilla Public License Version 1.1.
13 // See the full license text for the amendments.
14 //
15 // Software distributed under the License is distributed on an "AS IS" basis, 
16 // WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License 
17 // for the specific language governing rights and limitations under the License.
18 //
19 // The Original Code is Fraunhofer FOKUS code.
20 //
21 // The Initial Developer of the Original Code is Fraunhofer-Gesellschaft e.V. 
22 // (registered association), Hansastraße 27 c, 80686 Munich, Germany.
23 // All Rights Reserved.
24 //
25 // Contributor(s):
26 //   Stefan Bund <g0dil@berlios.de>
27
28 /** \file
29     \brief AreaRegistry public header */
30
31 #ifndef HH_SENF_Utils_Logger_AreaRegistry_
32 #define HH_SENF_Utils_Logger_AreaRegistry_ 1
33
34 // Custom includes
35 #include <map>
36 #include <boost/iterator/transform_iterator.hpp>
37 #include <senf/Utils/singleton.hh>
38
39 //#include "AreaRegistry.mpp"
40 #include "AreaRegistry.ih"
41 //-/////////////////////////////////////////////////////////////////////////////////////////////////
42
43 namespace senf {
44 namespace log {
45
46     namespace detail { struct AreaBase; }
47
48     /** \brief Area registry
49
50         The area registry keeps track of all areas defined.
51
52         The area registry exposes a forward sequence interface which allows to query the list of all
53         registered areas.
54
55         \implementation Area classes are defined as singletons and will automatically register with
56         this registry.
57      */
58     class AreaRegistry
59         : public senf::singleton<AreaRegistry>
60     {
61         typedef std::map<std::string, detail::AreaBase const *> Registry;
62
63         struct SelectName
64         {
65             typedef std::string result_type;
66             std::string const & operator()(Registry::value_type const & v) const;
67         };
68
69     public:
70         typedef boost::transform_iterator<SelectName, Registry::const_iterator> iterator;
71                                         ///< Iterator type
72
73 #       ifdef DOXYGEN
74         // Hmm ... doxygen does not understand using declarations ...
75         /// Access area registry singleton instance
76         static AreaRegistry & instance();
77 #       endif
78
79         using senf::singleton<AreaRegistry>::instance;
80
81         iterator begin();               ///< Beginning of area name sequence
82         iterator end();                 ///< End of area name sequence
83
84         detail::AreaBase const * lookup(std::string const & name);
85
86     private:
87         AreaRegistry();
88
89         void registerArea(detail::AreaBase const & area);
90
91         Registry registry_;
92
93         friend class senf::singleton<AreaRegistry>;
94         friend class detail::AreaBase;
95         friend class Target;
96     };
97
98 }}
99
100 //-/////////////////////////////////////////////////////////////////////////////////////////////////
101 #include "AreaRegistry.cci"
102 //#include "AreaRegistry.ct"
103 //#include "AreaRegistry.cti"
104 #endif
105
106 \f
107 // Local Variables:
108 // mode: c++
109 // fill-column: 100
110 // comment-column: 40
111 // c-file-style: "senf"
112 // indent-tabs-mode: nil
113 // ispell-local-dictionary: "american"
114 // compile-command: "scons -u test"
115 // End: