3b787bdf02c27f7166b95342292d3a5db722a2d9
[senf.git] / senf / Utils / Console / Variables.cti
1 // $Id$
2 //
3 // Copyright (C) 2008
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 Variables inline template implementation */
25
26 #include "Variables.ih"
27
28 // Custom includes
29
30 #define prefix_ inline
31 //-/////////////////////////////////////////////////////////////////////////////////////////////////
32
33 //-/////////////////////////////////////////////////////////////////////////////////////////////////
34 // senf::console::detail::QueryVariable<Variable>
35
36 template <class Variable>
37 prefix_ senf::console::detail::QueryVariable<Variable>::QueryVariable(Variable const & var)
38     : var_ (var)
39 {}
40
41 template <class Variable>
42 prefix_ typename senf::console::detail::QueryVariable<Variable>::Traits::Overload::ptr
43 senf::console::detail::QueryVariable<Variable>::create(Variable const & var)
44 {
45     return CreateOverload::create(Function(QueryVariable(var)));
46 }
47
48 template <class Variable>
49 prefix_ Variable const & senf::console::detail::QueryVariable<Variable>::operator()()
50     const
51 {
52     return var_;
53 }
54
55 //-/////////////////////////////////////////////////////////////////////////////////////////////////
56 // senf::console::detail::SetVariable<Variable>
57
58 template <class Variable>
59 prefix_ senf::console::detail::SetVariable<Variable>::SetVariable(Variable & var,
60                                                                   OnChangeHandler handler)
61     : var_ (var), handler_ (handler)
62 {}
63
64 template <class Variable>
65 prefix_ typename senf::console::detail::SetVariable<Variable>::Traits::Overload::ptr
66 senf::console::detail::SetVariable<Variable>::create(Variable & var)
67 {
68     typename Traits::Overload::ptr overload (CreateOverload::create(Function(SetVariable(var))));
69     overload->arg(0).name = "new_value";
70     return overload;
71 }
72
73 template <class Variable>
74 prefix_ void senf::console::detail::SetVariable<Variable>::operator()(Variable const & value)
75     const
76 {
77     if (handler_) {
78         Variable old (var_);
79         var_ = value;
80         handler_(old);
81     }
82     else
83         var_ = value;
84 }
85
86 //-/////////////////////////////////////////////////////////////////////////////////////////////////
87 // senf::console::ConstVariableFactory<Variable>
88
89 template <class Variable>
90 prefix_ senf::console::factory::ConstVariableFactory<Variable>
91 senf::console::factory::ConstVariableFactory<Variable>::doc(std::string const & doc)
92 {
93     doc_ = doc;
94     return *this;
95 }
96
97 template <class Variable>
98 prefix_ senf::console::factory::ConstVariableFactory<Variable>
99 senf::console::factory::ConstVariableFactory<Variable>::shortdoc(std::string const & doc)
100 {
101     shortdoc_ = doc;
102     return *this;
103 }
104
105 template <class Variable>
106 prefix_ senf::console::factory::ConstVariableFactory<Variable>
107 senf::console::factory::ConstVariableFactory<Variable>::formatter(Formatter formatter)
108 {
109     queryOverload_->formatter(formatter);
110     return *this;
111 }
112
113 template <class Variable>
114 prefix_ senf::console::OverloadedCommandNode &
115 senf::console::factory::ConstVariableFactory<Variable>::create(DirectoryNode & dir,
116                                                                std::string const & name)
117     const
118 {
119     OverloadedCommandNode & node (OverloadedCommandNode::insertOverload(dir, name, queryOverload_));
120     if (doc_) node.doc(*doc_);
121     if (shortdoc_) node.shortdoc(*shortdoc_);
122     return node;
123 }
124
125 template <class Variable>
126 prefix_ senf::console::factory::ConstVariableFactory<Variable>::
127 ConstVariableFactory(Variable const & var)
128     : queryOverload_ (detail::QueryVariable<Variable>::create(var))
129 {}
130
131 //-/////////////////////////////////////////////////////////////////////////////////////////////////
132 // senf::console::VariableFactory<Variable>
133
134 template <class Variable>
135 prefix_ typename senf::console::factory::VariableFactory<Variable>
136 senf::console::factory::VariableFactory<Variable>::parser(Parser parser)
137 {
138     setOverload_->template arg<0>().parser = parser;
139     return *this;
140 }
141
142 template <class Variable>
143 prefix_ typename senf::console::factory::VariableFactory<Variable>
144 senf::console::factory::VariableFactory<Variable>::typeName(std::string const & name)
145 {
146     setOverload_->arg(0).type = name;
147     return *this;
148 }
149
150 template <class Variable>
151 prefix_ typename senf::console::factory::VariableFactory<Variable>
152 senf::console::factory::VariableFactory<Variable>::onChange(OnChangeHandler handler)
153 {
154     setOverload_->function(
155         boost::bind(detail::SetVariable<Variable>(var_, handler),_2));
156     return *this;
157 }
158
159 template <class Variable>
160 prefix_ typename senf::console::factory::VariableFactory<Variable>
161 senf::console::factory::VariableFactory<Variable>::doc(std::string const & doc)
162 {
163     ConstVariableFactory<Variable>::doc(doc);
164     return *this;
165 }
166
167 template <class Variable>
168 prefix_ typename senf::console::factory::VariableFactory<Variable>
169 senf::console::factory::VariableFactory<Variable>::shortdoc(std::string const & doc)
170 {
171     ConstVariableFactory<Variable>::shortdoc(doc);
172     return *this;
173 }
174
175 template <class Variable>
176 prefix_ typename senf::console::factory::VariableFactory<Variable>
177 senf::console::factory::VariableFactory<Variable>::formatter(Formatter formatter)
178 {
179     ConstVariableFactory<Variable>::formatter(formatter);
180     return *this;
181 }
182
183 template <class Variable>
184 prefix_ senf::console::OverloadedCommandNode &
185 senf::console::factory::VariableFactory<Variable>::create(DirectoryNode & dir,
186                                                           std::string const & name)
187     const
188 {
189     OverloadedCommandNode & node (ConstVariableFactory<Variable>::create(dir,name));
190     node.add(setOverload_);
191     return node;
192 }
193
194 template <class Variable>
195 prefix_ senf::console::factory::VariableFactory<Variable>::VariableFactory(Variable & var)
196     : ConstVariableFactory<Variable> (var),
197       setOverload_ (detail::SetVariable<Variable>::create(var)),
198       var_ (var)
199 {}
200
201 //-/////////////////////////////////////////////////////////////////////////////////////////////////
202
203 template <class Var>
204 prefix_ senf::console::factory::VariableFactory<Var>
205 senf::console::factory::Variable(Var & var)
206 {
207     return VariableFactory<Var>(var);
208 }
209
210 template <class Var>
211 prefix_ senf::console::factory::VariableFactory<Var>
212 senf::console::factory::Variable(boost::reference_wrapper<Var> var)
213 {
214     return VariableFactory<Var>(var);
215 }
216
217 template <class Var>
218 prefix_ senf::console::factory::ConstVariableFactory<Var>
219 senf::console::factory::Variable(Var const & var)
220 {
221     return ConstVariableFactory<Var>(var);
222 }
223
224 template <class Var>
225 prefix_ senf::console::factory::ConstVariableFactory<Var>
226 senf::console::factory::Variable(boost::reference_wrapper<Var const> var)
227 {
228     return ConstVariableFactory<Var>(var);
229 }
230
231 //-/////////////////////////////////////////////////////////////////////////////////////////////////
232 #undef prefix_
233
234 \f
235 // Local Variables:
236 // mode: c++
237 // fill-column: 100
238 // comment-column: 40
239 // c-file-style: "senf"
240 // indent-tabs-mode: nil
241 // ispell-local-dictionary: "american"
242 // compile-command: "scons -u test"
243 // End: