e13c248b56fde0ddeb76d79a8d02774b5c9bcf16
[senf.git] / senf / Utils / Console / Utility.hh
1 // $Id$
2 //
3 // Copyright (C) 2009
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 Utility public header */
25
26 #ifndef HH_SENF_Utils_Console_Utility_
27 #define HH_SENF_Utils_Console_Utility_ 1
28
29 // Custom includes
30 #include "Parse.hh"
31
32 //#include "Utility.mpp"
33 ///////////////////////////////hh.p////////////////////////////////////////
34
35 /** \defgroup senf_console_utilities Special console utility types
36
37     These types are provided by the %console library to support special argument or return value
38     formatting rules.
39  */
40
41 namespace senf {
42 namespace console {
43
44     /** \brief Parse character value as single-char string
45
46         This helper types is a wrapper around \a CharT which must be a character type. A value of
47         this type will be represented as a single character string, not as numeric value (the
48         default interpretation of char arguments in the console library).
49
50         This wrapper is used via type conversion using \c boost::function to convert the
51         argument/return type \a CharT  to CharAsString<CharT>:
52         \code
53         char foo(char v) { return v; }
54
55         senf::console::root().add(
56             "foo", fty::Command< CharAsString<char> (CharAsString<char>) >(&foo));
57         \endcode
58
59         \tparam CharT character type, one of \c char, \c signed \c char or \c unsigned \c char
60
61         \ingroup senf_console_utilities
62      */
63     template <class CharT>
64     struct CharAsString
65     {
66         CharAsString();
67         CharAsString(CharT value_);
68         operator CharT () const;
69         CharT value;
70     };
71
72 #ifndef DOXYGEN
73
74     template <class CharT>
75     struct ArgumentTraits< CharAsString<CharT> >
76     {
77         typedef CharAsString<CharT> type;
78         static bool const singleToken = true;
79
80         static void parse(ParseCommandInfo::TokensRange const & tokens, CharAsString<CharT> & out);
81         static std::string description();
82         static std::string str(CharAsString<CharT> value);
83     };
84
85     template <class CharT>
86     struct ReturnValueTraits< CharAsString<CharT> >
87     {
88         typedef CharAsString<CharT> type;
89
90         static void format(CharAsString<CharT> value, std::ostream & os);
91     };
92
93 #endif
94
95     /** \brief Value range
96
97         A value range may be represented in the console either by a single value (setting both \a
98         low and \a high to the same value) or as a lower and upper bound seperated by a colon.
99
100         \ingroup senf_console_utilities
101      */
102     template <class T>
103     struct ValueRange
104     {
105         T low;
106         T high;
107     };
108
109 #ifndef DOXYGEN
110
111     template <class T>
112     struct ArgumentTraits< ValueRange<T> >
113     {
114         typedef ValueRange<T> type;
115         static bool const singleToken = true;
116
117         static void parse(ParseCommandInfo::TokensRange const & tokens, type & out);
118         static std::string description();
119         static std::string str(type const & value);
120     };
121
122     template <class T>
123     struct ReturnValueTraits< ValueRange<T> >
124     {
125         typedef ValueRange<T> type;
126
127         static void format(type const & value, std::ostream & os);
128     };
129
130 #endif
131
132     /** \brief Bit-mask flag argument type
133
134         senf::console::FlagCollection supplies a special argument type for use in registering
135         console commands. This argument type is used to represent a bit-mask of single flags.
136
137         \code
138         // Function taking a flags argument
139         void func(unsigned flags);
140
141         // Enum containing all the possible flag values
142         enum MyFlags { Foo = 1,
143                      Bar = 2,
144                      Baz = 4,
145                      Doo = 8 };
146         SENF_CONSOLE_REGISTER_ENUM(MyFlags, (Foo)(Bar)(Baz)(Boo));
147
148         // Register the function with a FlagCollection argument type
149         consoleDir.add("func", fty::Command<void (FlagCollection<MyFlags>)>(&func));
150         \endcode
151
152         To use the FlagCollection class
153         \li you need a function which takes a bit-mask of flags as argument
154         \li you define and register an enum with all possible flag values
155         \li you register the function with a FlagCollection argument type using \c boost::function
156             for the conversion. This is also possible for return values.
157
158         The nice thing is, that \c boot::function supports compatible argument types and does
159         automatic type conversion. Since a FlagCollection is convertible to and from unsigned long,
160         this conversion will work.
161
162         After registering this function, you can call it with a collection of flags as argument
163
164         <pre>
165         console:/$ help func
166         Usage:
167             func arg11:MyFlags
168         console:/$ func Foo
169         console:/$ func (Foo Boo)
170         </pre>
171
172         \ingroup senf_console_utilities
173      */
174     template <class Enum>
175     struct FlagCollection
176     {
177         operator unsigned long() const { return value; }
178         FlagCollection() : value (0) {}
179         FlagCollection(unsigned long value_) : value (value_) {}
180         FlagCollection(Enum value_) : value (value_) {}
181         unsigned long value;
182     };
183
184 #ifndef DOXYGEN
185
186     template <class Enum>
187     struct ArgumentTraits< FlagCollection<Enum> >
188     {
189         typedef FlagCollection<Enum> type;
190         static bool const singleToken = false;
191         static void parse(ParseCommandInfo::TokensRange const & tokens, type & out);
192         static std::string description();
193         static std::string str(type const & value);
194     };
195
196     template <class Enum>
197     struct ReturnValueTraits< FlagCollection<Enum> >
198     {
199         typedef FlagCollection<Enum> type;
200         static void format(type const & value, std::ostream & os);
201     };
202
203 #endif
204
205 }}
206
207 ///////////////////////////////hh.e////////////////////////////////////////
208 //#include "Utility.cci"
209 #include "Utility.ct"
210 #include "Utility.cti"
211 #endif
212
213 \f
214 // Local Variables:
215 // mode: c++
216 // fill-column: 100
217 // comment-column: 40
218 // c-file-style: "senf"
219 // indent-tabs-mode: nil
220 // ispell-local-dictionary: "american"
221 // compile-command: "scons -u test"
222 // End: