Utils/Logger: Reorganize source code
[senf.git] / Utils / Logger / AreaRegistry.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 AreaRegistry public header */
25
26 #ifndef HH_AreaRegistry_
27 #define HH_AreaRegistry_ 1
28
29 // Custom includes
30 #include <map>
31 #include <functional>
32 #include <boost/iterator/transform_iterator.hpp>
33 #include "../singleton.hh"
34
35 //#include "AreaRegistry.mpp"
36 #include "AreaRegistry.ih"
37 ///////////////////////////////hh.p////////////////////////////////////////
38
39 namespace senf {
40 namespace log { 
41
42     namespace detail { struct AreaBase; }
43
44     /** \brief Area registry 
45         
46         The area registry keeps track of all areas defined. Area classes are defined as singletons
47         and will automatically register with this registry.
48
49         The area registry exposes a forward sequence interface which is a sequence of the names of
50         all registered areas.
51      */
52     class AreaRegistry
53         : public senf::singleton<AreaRegistry>
54     {
55         typedef std::map<std::string, detail::AreaBase const *> Registry;
56
57         struct SelectName 
58         {
59             typedef std::string result_type;
60             std::string const & operator()(Registry::value_type const & v) const;
61         };
62
63     public:
64         typedef boost::transform_iterator<SelectName, Registry::const_iterator> iterator;
65
66 #       ifdef DOXYGEN
67         // Hmm ... doxygen does not understand using declarations ...
68         /// Access area registry singleton instance
69         static AreaRegistry & instance();
70 #       endif
71
72         using senf::singleton<AreaRegistry>::instance;
73
74         iterator begin();
75         iterator end();
76
77     private:
78         AreaRegistry();
79
80         void registerArea(detail::AreaBase const & area);
81
82         Registry registry_;
83
84         friend class senf::singleton<AreaRegistry>;
85         friend class detail::AreaBase;
86         friend class Target;
87     };        
88     
89 }}
90
91 ///////////////////////////////hh.e////////////////////////////////////////
92 #include "AreaRegistry.cci"
93 //#include "AreaRegistry.ct"
94 //#include "AreaRegistry.cti"
95 #endif
96
97 \f
98 // Local Variables:
99 // mode: c++
100 // fill-column: 100
101 // comment-column: 40
102 // c-file-style: "senf"
103 // indent-tabs-mode: nil
104 // ispell-local-dictionary: "american"
105 // compile-command: "scons -u test"
106 // End: