Search:

SENF Extensible Network Framework

  • Home
  • Download
  • Wiki
  • BerliOS
  • ChangeLog
  • Browse SVN
  • Bug Tracker
  • Overview
  • Examples
  • HowTos
  • Glossary
  • PPI
  • Packets
  • Scheduler
  • Socket
  • Utils
  • Console
  • Daemon
  • Logger
  • Termlib
  • Main Page
  • Related Pages
  • Modules
  • Namespaces
  • Classes
  • Files
  • File List
  • File Members

Variables.cti

Go to the documentation of this file.
00001 // $Id: Variables.cti 1742 2010-11-04 14:51:56Z g0dil $
00002 //
00003 // Copyright (C) 2008
00004 // Fraunhofer (FOKUS)
00005 // Competence Center NETwork research (NET), St. Augustin, GERMANY
00006 //     Stefan Bund <g0dil@berlios.de>
00007 //
00008 // This program is free software; you can redistribute it and/or modify
00009 // it under the terms of the GNU General Public License as published by
00010 // the Free Software Foundation; either version 2 of the License, or
00011 // (at your option) any later version.
00012 //
00013 // This program is distributed in the hope that it will be useful,
00014 // but WITHOUT ANY WARRANTY; without even the implied warranty of
00015 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00016 // GNU General Public License for more details.
00017 //
00018 // You should have received a copy of the GNU General Public License
00019 // along with this program; if not, write to the
00020 // Free Software Foundation, Inc.,
00021 // 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
00022 
00026 #include "Variables.ih"
00027 
00028 // Custom includes
00029 
00030 #define prefix_ inline
00031 //-/////////////////////////////////////////////////////////////////////////////////////////////////
00032 
00033 //-/////////////////////////////////////////////////////////////////////////////////////////////////
00034 // senf::console::detail::QueryVariable<Variable>
00035 
00036 template <class Variable>
00037 prefix_ senf::console::detail::QueryVariable<Variable>::QueryVariable(Variable const & var)
00038     : var_ (var)
00039 {}
00040 
00041 template <class Variable>
00042 prefix_ typename senf::console::detail::QueryVariable<Variable>::Traits::Overload::ptr
00043 senf::console::detail::QueryVariable<Variable>::create(Variable const & var)
00044 {
00045     return CreateOverload::create(Function(QueryVariable(var)));
00046 }
00047 
00048 template <class Variable>
00049 prefix_ Variable const & senf::console::detail::QueryVariable<Variable>::operator()()
00050     const
00051 {
00052     return var_;
00053 }
00054 
00055 //-/////////////////////////////////////////////////////////////////////////////////////////////////
00056 // senf::console::detail::SetVariable<Variable>
00057 
00058 template <class Variable>
00059 prefix_ senf::console::detail::SetVariable<Variable>::SetVariable(Variable & var,
00060                                                                   OnChangeHandler handler)
00061     : var_ (var), handler_ (handler)
00062 {}
00063 
00064 template <class Variable>
00065 prefix_ typename senf::console::detail::SetVariable<Variable>::Traits::Overload::ptr
00066 senf::console::detail::SetVariable<Variable>::create(Variable & var)
00067 {
00068     typename Traits::Overload::ptr overload (CreateOverload::create(Function(SetVariable(var))));
00069     overload->arg(0).name = "new_value";
00070     return overload;
00071 }
00072 
00073 template <class Variable>
00074 prefix_ void senf::console::detail::SetVariable<Variable>::operator()(Variable const & value)
00075     const
00076 {
00077     if (handler_) {
00078         Variable old (var_);
00079         var_ = value;
00080         handler_(old);
00081     }
00082     else
00083         var_ = value;
00084 }
00085 
00086 //-/////////////////////////////////////////////////////////////////////////////////////////////////
00087 // senf::console::ConstVariableFactory<Variable>
00088 
00089 template <class Variable>
00090 prefix_ senf::console::factory::ConstVariableFactory<Variable>
00091 senf::console::factory::ConstVariableFactory<Variable>::doc(std::string const & doc)
00092 {
00093     doc_ = doc;
00094     return *this;
00095 }
00096 
00097 template <class Variable>
00098 prefix_ senf::console::factory::ConstVariableFactory<Variable>
00099 senf::console::factory::ConstVariableFactory<Variable>::shortdoc(std::string const & doc)
00100 {
00101     shortdoc_ = doc;
00102     return *this;
00103 }
00104 
00105 template <class Variable>
00106 prefix_ senf::console::factory::ConstVariableFactory<Variable>
00107 senf::console::factory::ConstVariableFactory<Variable>::formatter(Formatter formatter)
00108 {
00109     queryOverload_->formatter(formatter);
00110     return *this;
00111 }
00112 
00113 template <class Variable>
00114 prefix_ senf::console::OverloadedCommandNode &
00115 senf::console::factory::ConstVariableFactory<Variable>::create(DirectoryNode & dir,
00116                                                                std::string const & name)
00117     const
00118 {
00119     OverloadedCommandNode & node (OverloadedCommandNode::insertOverload(dir, name, queryOverload_));
00120     if (doc_) node.doc(*doc_);
00121     if (shortdoc_) node.shortdoc(*shortdoc_);
00122     return node;
00123 }
00124 
00125 template <class Variable>
00126 prefix_ senf::console::factory::ConstVariableFactory<Variable>::
00127 ConstVariableFactory(Variable const & var)
00128     : queryOverload_ (detail::QueryVariable<Variable>::create(var))
00129 {}
00130 
00131 //-/////////////////////////////////////////////////////////////////////////////////////////////////
00132 // senf::console::VariableFactory<Variable>
00133 
00134 template <class Variable>
00135 prefix_ typename senf::console::factory::VariableFactory<Variable>
00136 senf::console::factory::VariableFactory<Variable>::parser(Parser parser)
00137 {
00138     setOverload_->template arg<0>().parser = parser;
00139     return *this;
00140 }
00141 
00142 template <class Variable>
00143 prefix_ typename senf::console::factory::VariableFactory<Variable>
00144 senf::console::factory::VariableFactory<Variable>::typeName(std::string const & name)
00145 {
00146     setOverload_->arg(0).type = name;
00147     return *this;
00148 }
00149 
00150 template <class Variable>
00151 prefix_ typename senf::console::factory::VariableFactory<Variable>
00152 senf::console::factory::VariableFactory<Variable>::onChange(OnChangeHandler handler)
00153 {
00154     setOverload_->function(
00155         boost::bind(detail::SetVariable<Variable>(var_, handler),_2));
00156     return *this;
00157 }
00158 
00159 template <class Variable>
00160 prefix_ typename senf::console::factory::VariableFactory<Variable>
00161 senf::console::factory::VariableFactory<Variable>::doc(std::string const & doc)
00162 {
00163     ConstVariableFactory<Variable>::doc(doc);
00164     return *this;
00165 }
00166 
00167 template <class Variable>
00168 prefix_ typename senf::console::factory::VariableFactory<Variable>
00169 senf::console::factory::VariableFactory<Variable>::shortdoc(std::string const & doc)
00170 {
00171     ConstVariableFactory<Variable>::shortdoc(doc);
00172     return *this;
00173 }
00174 
00175 template <class Variable>
00176 prefix_ typename senf::console::factory::VariableFactory<Variable>
00177 senf::console::factory::VariableFactory<Variable>::formatter(Formatter formatter)
00178 {
00179     ConstVariableFactory<Variable>::formatter(formatter);
00180     return *this;
00181 }
00182 
00183 template <class Variable>
00184 prefix_ senf::console::OverloadedCommandNode &
00185 senf::console::factory::VariableFactory<Variable>::create(DirectoryNode & dir,
00186                                                           std::string const & name)
00187     const
00188 {
00189     OverloadedCommandNode & node (ConstVariableFactory<Variable>::create(dir,name));
00190     node.add(setOverload_);
00191     return node;
00192 }
00193 
00194 template <class Variable>
00195 prefix_ senf::console::factory::VariableFactory<Variable>::VariableFactory(Variable & var)
00196     : ConstVariableFactory<Variable> (var),
00197       setOverload_ (detail::SetVariable<Variable>::create(var)),
00198       var_ (var)
00199 {}
00200 
00201 //-/////////////////////////////////////////////////////////////////////////////////////////////////
00202 
00203 template <class Var>
00204 prefix_ senf::console::factory::VariableFactory<Var>
00205 senf::console::factory::Variable(Var & var)
00206 {
00207     return VariableFactory<Var>(var);
00208 }
00209 
00210 template <class Var>
00211 prefix_ senf::console::factory::VariableFactory<Var>
00212 senf::console::factory::Variable(boost::reference_wrapper<Var> var)
00213 {
00214     return VariableFactory<Var>(var);
00215 }
00216 
00217 template <class Var>
00218 prefix_ senf::console::factory::ConstVariableFactory<Var>
00219 senf::console::factory::Variable(Var const & var)
00220 {
00221     return ConstVariableFactory<Var>(var);
00222 }
00223 
00224 template <class Var>
00225 prefix_ senf::console::factory::ConstVariableFactory<Var>
00226 senf::console::factory::Variable(boost::reference_wrapper<Var const> var)
00227 {
00228     return ConstVariableFactory<Var>(var);
00229 }
00230 
00231 //-/////////////////////////////////////////////////////////////////////////////////////////////////
00232 #undef prefix_
00233 
00234 
00235 // Local Variables:
00236 // mode: c++
00237 // fill-column: 100
00238 // comment-column: 40
00239 // c-file-style: "senf"
00240 // indent-tabs-mode: nil
00241 // ispell-local-dictionary: "american"
00242 // compile-command: "scons -u test"
00243 // End:

Contact: senf-dev@lists.berlios.de | © 2006-2010 Fraunhofer Institute for Open Communication Systems, Network Research