Skip to content
Snippets Groups Projects
Commit d5acef30 authored by g0dil's avatar g0dil
Browse files

Console: Add member function argument parsing

parent df9a16ba
No related branches found
No related tags found
No related merge requests found
...@@ -26,6 +26,7 @@ ...@@ -26,6 +26,7 @@
#include "ParsedCommand.ih" #include "ParsedCommand.ih"
// Custom includes // Custom includes
#include "../Utils/membind.hh"
#define prefix_ inline #define prefix_ inline
///////////////////////////////cti.p/////////////////////////////////////// ///////////////////////////////cti.p///////////////////////////////////////
...@@ -112,6 +113,26 @@ senf::console::senf_console_add_node(DirectoryNode & node, std::string const & n ...@@ -112,6 +113,26 @@ senf::console::senf_console_add_node(DirectoryNode & node, std::string const & n
typename CmdTraits::traits, ! CmdTraits::has_ostream_arg>::create(fn) ); typename CmdTraits::traits, ! CmdTraits::has_ostream_arg>::create(fn) );
} }
template <class Owner, class Function>
prefix_ senf::console::ParsedCommandOverload<
typename senf::console::detail::ParsedCommandTraits<Function>::traits> &
senf::console::
senf_console_add_node(DirectoryNode & node, Owner & owner, std::string const & name,
Function fn, int,
typename boost::enable_if_c<detail::ParsedCommandTraits<Function>::is_member>::type *)
{
OverloadedCommandNode & cmdNode (
node.hasChild(name)
? dynamic_cast<OverloadedCommandNode &>(node(name))
: node.add(name, OverloadedCommandNode::create()) );
typedef senf::console::detail::ParsedCommandTraits<Function> CmdTraits;
return cmdNode.add( CreateParsedCommandOverload<
typename CmdTraits::traits, ! CmdTraits::has_ostream_arg>::create(
senf::membind(fn,&owner)) );
}
///////////////////////////////cti.e/////////////////////////////////////// ///////////////////////////////cti.e///////////////////////////////////////
#undef prefix_ #undef prefix_
......
...@@ -32,6 +32,7 @@ ...@@ -32,6 +32,7 @@
#include <boost/type_traits/is_member_pointer.hpp> #include <boost/type_traits/is_member_pointer.hpp>
#include <boost/type_traits/is_same.hpp> #include <boost/type_traits/is_same.hpp>
#include <boost/mpl/if.hpp> #include <boost/mpl/if.hpp>
#include <boost/utility.hpp>
#include "../config.hh" #include "../config.hh"
#include "OverloadedCommand.hh" #include "OverloadedCommand.hh"
#include "ParseParameter.hh" #include "ParseParameter.hh"
...@@ -74,10 +75,20 @@ namespace console { ...@@ -74,10 +75,20 @@ namespace console {
1)) 1))
# include BOOST_PP_ITERATE() # include BOOST_PP_ITERATE()
#ifndef DOXYGEN
template <class Function> template <class Function>
ParsedCommandOverload<typename detail::ParsedCommandTraits<Function>::traits> & ParsedCommandOverload<typename detail::ParsedCommandTraits<Function>::traits> &
senf_console_add_node(DirectoryNode & node, std::string const & name, Function fn, int); senf_console_add_node(DirectoryNode & node, std::string const & name, Function fn, int);
template <class Owner, class Function>
ParsedCommandOverload<typename detail::ParsedCommandTraits<Function>::traits> &
senf_console_add_node(DirectoryNode & node, Owner & owner, std::string const & name,
Function fn, int,
typename boost::enable_if_c<detail::ParsedCommandTraits<Function>::is_member>::type * = 0);
#endif
}} }}
#include BOOST_TYPEOF_INCREMENT_REGISTRATION_GROUP() #include BOOST_TYPEOF_INCREMENT_REGISTRATION_GROUP()
......
...@@ -33,6 +33,7 @@ ...@@ -33,6 +33,7 @@
#include <boost/preprocessor/arithmetic/inc.hpp> #include <boost/preprocessor/arithmetic/inc.hpp>
#include <boost/preprocessor/repetition/repeat.hpp> #include <boost/preprocessor/repetition/repeat.hpp>
#include <boost/type_traits/remove_reference.hpp> #include <boost/type_traits/remove_reference.hpp>
#include <boost/type_traits/remove_const.hpp>
#include <boost/bind.hpp> #include <boost/bind.hpp>
// ///////////////////////////mpp.p//////////////////////////////////////// // ///////////////////////////mpp.p////////////////////////////////////////
...@@ -68,9 +69,10 @@ public: ...@@ -68,9 +69,10 @@ public:
typedef boost::function<typename traits::result_type(std::ostream & typedef boost::function<typename traits::result_type(std::ostream &
mpp_TrailingArgTypes())> Function; mpp_TrailingArgTypes())> Function;
# define mpp_l(z,n,d) \ # define mpp_l(z,n,d) \
typedef typename boost::remove_reference<typename traits::mpp_ArgTypeN(n)>::type \ typedef typename boost::remove_const< \
mpp_ArgTypeN(n); typename boost::remove_reference< typename traits::mpp_ArgTypeN(n) >::type >::type \
mpp_ArgTypeN(n);
BOOST_PP_REPEAT( BOOST_PP_ITERATION(), mpp_l, _ ) BOOST_PP_REPEAT( BOOST_PP_ITERATION(), mpp_l, _ )
# undef mpp_l # undef mpp_l
......
...@@ -113,8 +113,55 @@ BOOST_AUTO_UNIT_TEST(parsedCommand) ...@@ -113,8 +113,55 @@ BOOST_AUTO_UNIT_TEST(parsedCommand)
boost::bind<void>( boost::ref(executor), boost::ref(ss), _1 )), boost::bind<void>( boost::ref(executor), boost::ref(ss), _1 )),
senf::console::SyntaxErrorException ); senf::console::SyntaxErrorException );
} }
{
std::stringstream ss;
dir.add("cb", &cb1);
dir.add("cb", &cb5);
dir.add("cb", &cb2);
parser.parse("test/cb 111 222.4; test/cb 222; test/cb",
boost::bind<void>( boost::ref(executor), boost::ref(ss), _1 ));
BOOST_CHECK_EQUAL( ss.str(), "333\n" "Value: 222\n" "1.2\n" );
}
}
namespace {
struct Test
{
senf::console::ScopedDirectory<Test> dir;
std::string name_;
Test(std::string const & name) : dir(this), name_ (name) {
dir.add("name", &Test::name);
}
std::string name(std::string const & suffix) {
return name_ + suffix;
}
};
} }
BOOST_AUTO_UNIT_TEST(memberParsedCommand)
{
senf::console::Executor executor;
senf::console::CommandParser parser;
senf::console::ScopedDirectory<> dir;
senf::console::root().add("test", dir);
{
Test obj ("bar");
dir.add("obj", obj.dir);
std::stringstream ss;
parser.parse("test/obj/name \": foo\"",
boost::bind<void>( boost::ref(executor), boost::ref(ss), _1 ));
BOOST_CHECK_EQUAL( ss.str(), "bar: foo\n" );
}
}
///////////////////////////////cc.e//////////////////////////////////////// ///////////////////////////////cc.e////////////////////////////////////////
#undef prefix_ #undef prefix_
......
...@@ -41,7 +41,7 @@ senf::console::OwnerNodeCreateTraits<Owner,Object>::Creator::create(DirectoryNod ...@@ -41,7 +41,7 @@ senf::console::OwnerNodeCreateTraits<Owner,Object>::Creator::create(DirectoryNod
std::string const & name, std::string const & name,
Object const & ob) Object const & ob)
{ {
return senf_console_add_node(node, owner, name, ob); return senf_console_add_node(node, owner, name, ob, 0);
} }
/////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////
...@@ -65,7 +65,7 @@ senf::console::ScopedDirectory<Owner>::add(std::string const & name, Object cons ...@@ -65,7 +65,7 @@ senf::console::ScopedDirectory<Owner>::add(std::string const & name, Object cons
template <class Owner, class Function> template <class Owner, class Function>
prefix_ senf::console::SimpleCommandNode & senf::console:: prefix_ senf::console::SimpleCommandNode & senf::console::
senf_console_add_node(DirectoryNode & node, Owner & , std::string const & name, senf_console_add_node(DirectoryNode & node, Owner & , std::string const & name,
Function const & fn) Function const & fn, ...)
{ {
return node.add(name,fn); return node.add(name,fn);
} }
...@@ -73,7 +73,7 @@ senf_console_add_node(DirectoryNode & node, Owner & , std::string const & name, ...@@ -73,7 +73,7 @@ senf_console_add_node(DirectoryNode & node, Owner & , std::string const & name,
template <class Owner> template <class Owner>
prefix_ senf::console::SimpleCommandNode & senf::console:: prefix_ senf::console::SimpleCommandNode & senf::console::
senf_console_add_node(DirectoryNode & node, Owner & owner, std::string const & name, senf_console_add_node(DirectoryNode & node, Owner & owner, std::string const & name,
void (Owner::*fn)(std::ostream &, ParseCommandInfo const &)) void (Owner::*fn)(std::ostream &, ParseCommandInfo const &), int)
{ {
return node.add(name, boost::bind(fn,boost::ref(owner),_1,_2)); return node.add(name, boost::bind(fn,boost::ref(owner),_1,_2));
} }
......
...@@ -49,7 +49,8 @@ namespace console { ...@@ -49,7 +49,8 @@ namespace console {
* static_cast<DirectoryNode *>(0), * static_cast<DirectoryNode *>(0),
* static_cast<Owner *>(0), * static_cast<Owner *>(0),
* static_cast<std::string const *>(0), * static_cast<std::string const *>(0),
* static_cast<Object const *>(0)) ) result_type; * static_cast<Object const *>(0),
* static_cast<int *>(0)) ) result_type;
typedef typename boost::remove_reference<result_type>::type NodeType; typedef typename boost::remove_reference<result_type>::type NodeType;
...@@ -172,12 +173,12 @@ namespace console { ...@@ -172,12 +173,12 @@ namespace console {
#ifndef DOXYGEN #ifndef DOXYGEN
template <class Owner, class Function> template <class Owner, class Function>
SimpleCommandNode & senf_console_add_node( SimpleCommandNode & senf_console_add_node(
DirectoryNode & node, Owner & owner, std::string const & name, Function const & fn); DirectoryNode & node, Owner & owner, std::string const & name, Function const & fn, ...);
template <class Owner> template <class Owner>
SimpleCommandNode & senf_console_add_node( SimpleCommandNode & senf_console_add_node(
DirectoryNode & node, Owner & owner, std::string const & name, DirectoryNode & node, Owner & owner, std::string const & name,
void (Owner::*fn)(std::ostream &, ParseCommandInfo const &)); void (Owner::*fn)(std::ostream &, ParseCommandInfo const &), int);
template <class Node> template <class Node>
DirectoryNode & senf_console_add_node( DirectoryNode & senf_console_add_node(
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment