// $Id$
//
-// Copyright (C) 2008
+// Copyright (C) 2008
// Fraunhofer Institute for Open Communication Systems (FOKUS)
// Competence Center NETwork research (NET), St. Augustin, GERMANY
// Stefan Bund <g0dil@berlios.de>
#include "Variables.ih"
//#include "Variables.mpp"
-///////////////////////////////hh.p////////////////////////////////////////
+//-/////////////////////////////////////////////////////////////////////////////////////////////////
namespace senf {
namespace console {
namespace factory {
- /** \brief Variable command attributes (const)
-
- \see VariableFactory
- */
+#ifndef DOXYGEN
+
template <class Variable>
class ConstVariableFactory
: public detail::NodeFactory
ConstVariableFactory formatter(Formatter formatter);
OverloadedCommandNode & create(DirectoryNode & dir, std::string const & name) const;
-
+
explicit ConstVariableFactory(Variable const & var);
private:
boost::optional<std::string> doc_;
boost::optional<std::string> shortdoc_;
};
-
- /** \brief Variable command attributes
+
+#endif
+
+ /** \brief Variable node factory
Variable commands allow to register any arbitrary variable as a command node. The variable
will be registered as two command overloads: One which takes a single argument of the
int var;
ScopedDirectory<> dir;
- dir.add("var", var);
+ dir.add("var", fty::Variable(var));
\endcode
Variables should be registered only with a ScopedDirectory declared in the same scope
Since a variable command is added as a combination of two ordinary overloads, it is possible
to register additional overloads with the same name before or after registering the
- variable.
+ variable.
It is also possible, to register a variable read-only. To achieve this, just wrap it with \c
- boost::cref(). Such a variable cannot be changed only queried. Therefore, it does not have
- the parser() and typeName() attributes.
+ boost::cref(). Such a variable only queried. Therefore, it does not have the parser() and
+ typeName() attributes.
\code
- dir.add("const_var", boost::cref(var))
+ dir.add("const_var", fty::Variable(boost::cref(var)));
\endcode
- \ingroup console_commands
+ \note Even though the interface is documented as a class, in reality it is implemented using
+ factory functions returning instances of an internal factory class.
+
+ \see \ref console_variables
*/
+#ifdef DOXYGEN
+ class Variable
+#else
template <class Variable>
class VariableFactory
: public ConstVariableFactory<Variable>
+#endif
{
public:
typedef typename detail::SetVariable<Variable>::Traits::Overload SetOverload;
\code
void parser(senf::console::ParseCommandInfo::TokensRange const & tokens, value_type & out);
\endcode
-
+
where \c value_type is the type of the overload
parameter. The parser must read and parse the complete
\a tokens range and return the parsed value in \a
void handler(Variable const & oldValue);
\endcode */
- OverloadedCommandNode & create(DirectoryNode & dir, std::string const & name) const;
-
- explicit VariableFactory(Variable & var);
+ explicit VariableFactory(Variable & var); ///< Create Variable node
protected:
private:
+ OverloadedCommandNode & create(DirectoryNode & dir, std::string const & name) const;
+
typename SetOverload::ptr setOverload_;
Variable & var_;
+
+ friend class senf::console::DirectoryNode;
};
+#ifndef DOXYGEN
+
template <class Var>
VariableFactory<Var> Variable(Var & var);
template <class Var>
ConstVariableFactory<Var> Variable(boost::reference_wrapper<Var const> var);
+#endif
+
}}}
-///////////////////////////////hh.e////////////////////////////////////////
+//-/////////////////////////////////////////////////////////////////////////////////////////////////
//#include "Variables.cci"
//#include "Variables.ct"
#include "Variables.cti"