X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Console%2FOverloadedCommand.hh;h=e1481e5dda99bf5e44ea0fef8d793f22f182f26e;hb=18ebf1e9edb34f1aa8a32173275421a5d54400f7;hp=a255eb588ed16239caa5c55f607d43efb0eadedd;hpb=30c1daf8a1c404209210f76a9a54bcfde443603b;p=senf.git diff --git a/Console/OverloadedCommand.hh b/Console/OverloadedCommand.hh index a255eb5..e1481e5 100644 --- a/Console/OverloadedCommand.hh +++ b/Console/OverloadedCommand.hh @@ -39,7 +39,10 @@ namespace console { class OverloadedCommandNode; - /** \brief + /** \brief Base class for command overload of OverloadedCommandNode + + This class is the base class of the commands which may be added to an + OverloadedCommandNode. */ class CommandOverload : public senf::intrusive_refcount @@ -56,9 +59,14 @@ namespace console { virtual ~CommandOverload(); void operator()(std::ostream & os, Arguments const & arguments); - void help(std::ostream & os); + ///< Call the overload + /**< If the \a arguments are not acceptable for this + overload, a SyntaxErrorException must be thrown. */ + void help(std::ostream & os); ///< Provide help for this specific overload - OverloadedCommandNode & node(); + OverloadedCommandNode & node(); ///< Access owning node + /**< \pre The command \e must have been added to an + OverloadedCommandNode. */ protected: CommandOverload(); @@ -77,9 +85,22 @@ namespace console { /** \brief Command node which allows multiple registered callbacks - OverloadedCommand is like SimpleCommand but allows to register multiple commands to a single - node. This works by calling each command in the list consecutively until no 'SyntaxError' - exception is thrown. + OverloadedCommandNode is like SimpleCommandNode but allows to register multiple commands to + a single node. This works by calling each command in the list consecutively until no + 'SyntaxErrorException' exception is thrown. + + This works by first adding an OverloadedCommandNode to the directory in question and then + adding commands to that node. Commands are derived from CommandOverload. + \code + senf::console::DirectoryNode & dir (...); + senf::console::OverloadedCommandNode & cmd ( + dir.add("cmd", senf::console::OverloadedCommandNode::create()) ); + cmd.add(senf::console::SimpleCommandOverload::create(&callback)); + cmd.add(senf::console::SimpleCommandOverload::create(&anotherCallback)); + \endcode + + However, this facility is mostly used not directly but indirectly (and automatically) when + adding argument parsing callbacks. \warning For this to work, the commands must do all syntax checking before doing any operation @@ -105,13 +126,15 @@ namespace console { ///@} /////////////////////////////////////////////////////////////////////////// - - void add(CommandOverload::ptr overload); + + template + Command & add(boost::intrusive_ptr overload); ///< Add an additional overload ptr thisptr(); cptr thisptr() const; OverloadedCommandNode & doc(std::string const & doc); + ///< Assign global help for all overloads protected: @@ -127,7 +150,10 @@ namespace console { std::string doc_; }; - /** \brief + /** \brief Basic command overload + + This is an implementation of CommandOverload which allows to call an arbitrary callback with + the correct signature (void (std::ostream &, Arguments const &)) */ class SimpleCommandOverload : public CommandOverload @@ -144,11 +170,14 @@ namespace console { ///@{ static SimpleCommandOverload::ptr create(Function fn); + ///< Create new SimpleCommandOverload + /**< \param[in] fn callback to call */ ///@} /////////////////////////////////////////////////////////////////////////// SimpleCommandOverload & doc(std::string const & doc); + ///< Assign overload specific documentation protected: @@ -167,7 +196,7 @@ namespace console { ///////////////////////////////hh.e//////////////////////////////////////// #include "OverloadedCommand.cci" //#include "OverloadedCommand.ct" -//#include "OverloadedCommand.cti" +#include "OverloadedCommand.cti" #endif