00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00026 #ifndef HH_SENF_Scheduler_Console_Variables_
00027 #define HH_SENF_Scheduler_Console_Variables_ 1
00028
00029
00030 #include <boost/utility.hpp>
00031 #include <boost/type_traits/is_convertible.hpp>
00032 #include <boost/ref.hpp>
00033 #include "Node.hh"
00034
00035 #include "Variables.ih"
00036
00037
00038
00039 namespace senf {
00040 namespace console {
00041
00042 class ScopedDirectoryBase;
00043 template <class Variable> class VariableAttributor;
00044
00045 namespace factory {
00046
00047 #ifndef DOXYGEN
00048
00049 template <class Variable>
00050 class ConstVariableFactory
00051 : public detail::NodeFactory
00052 {
00053 public:
00054 typedef typename detail::QueryVariable<Variable>::Traits::Overload QueryOverload;
00055 typedef typename QueryOverload::Formatter Formatter;
00056 typedef OverloadedCommandNode node_type;
00057 typedef OverloadedCommandNode & result_type;
00058
00059 ConstVariableFactory doc(std::string const & doc);
00060 ConstVariableFactory shortdoc(std::string const & doc);
00061 ConstVariableFactory formatter(Formatter formatter);
00062
00063 OverloadedCommandNode & create(DirectoryNode & dir, std::string const & name) const;
00064
00065 explicit ConstVariableFactory(Variable const & var);
00066
00067 private:
00068 typename QueryOverload::ptr queryOverload_;
00069 boost::optional<std::string> doc_;
00070 boost::optional<std::string> shortdoc_;
00071 };
00072
00073 #endif
00074
00108 #ifdef DOXYGEN
00109 class Variable
00110 #else
00111 template <class Variable>
00112 class VariableFactory
00113 : public ConstVariableFactory<Variable>
00114 #endif
00115 {
00116 public:
00117 typedef typename detail::SetVariable<Variable>::Traits::Overload SetOverload;
00118 typedef typename detail::ArgumentInfo<typename SetOverload::arg1_type>::Parser Parser;
00119 typedef typename detail::SetVariable<Variable>::OnChangeHandler OnChangeHandler;
00120
00121 typedef typename ConstVariableFactory<Variable>::Formatter Formatter;
00122 typedef typename ConstVariableFactory<Variable>::QueryOverload QueryOverload;
00123
00124 VariableFactory doc(std::string const & doc);
00125 VariableFactory shortdoc(std::string const & doc);
00126 VariableFactory formatter(Formatter formatter);
00127
00134 VariableFactory parser(Parser parser);
00135
00146 VariableFactory typeName(std::string const & name);
00147 VariableFactory onChange(OnChangeHandler handler);
00148
00157 explicit VariableFactory(Variable & var);
00158
00159 protected:
00160
00161 private:
00162 OverloadedCommandNode & create(DirectoryNode & dir, std::string const & name) const;
00163
00164 typename SetOverload::ptr setOverload_;
00165 Variable & var_;
00166
00167 friend class senf::console::DirectoryNode;
00168 };
00169
00170 #ifndef DOXYGEN
00171
00172 template <class Var>
00173 VariableFactory<Var> Variable(Var & var);
00174
00175 template <class Var>
00176 VariableFactory<Var> Variable(boost::reference_wrapper<Var> var);
00177
00178 template <class Var>
00179 ConstVariableFactory<Var> Variable(Var const & var);
00180
00181 template <class Var>
00182 ConstVariableFactory<Var> Variable(boost::reference_wrapper<Var const> var);
00183
00184 #endif
00185
00186 }}}
00187
00188
00189
00190
00191 #include "Variables.cti"
00192 #endif
00193
00194
00195
00196
00197
00198
00199
00200
00201
00202
00203