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