From: g0dil Date: Thu, 17 Apr 2008 10:19:37 +0000 (+0000) Subject: Console: Complete 'Variable' command implementation X-Git-Url: http://g0dil.de/git?a=commitdiff_plain;h=80c6cb7ba9ad7776824c84809f422209adf27331;p=senf.git Console: Complete 'Variable' command implementation Console: Add support for read-only 'Variable' commands git-svn-id: https://svn.berlios.de/svnroot/repos/senf/trunk@817 270642c3-0616-0410-b53a-bc976706d245 --- diff --git a/Console/Node.cci b/Console/Node.cci index 11d212e..6f24e9c 100644 --- a/Console/Node.cci +++ b/Console/Node.cci @@ -235,6 +235,14 @@ prefix_ senf::console::SimpleCommandNode::cptr senf::console::SimpleCommandNode: return boost::static_pointer_cast(shared_from_this()); } +prefix_ senf::console::SimpleCommandNode & +senf::console::senf_console_add_node(DirectoryNode & node, std::string const & name, + SimpleCommandNode::Function fn, int) +{ + return node.add(name, SimpleCommandNode::create(fn)); +} + + ///////////////////////////////cci.e/////////////////////////////////////// #undef prefix_ diff --git a/Console/Node.cti b/Console/Node.cti index 69baef1..a6e113f 100644 --- a/Console/Node.cti +++ b/Console/Node.cti @@ -37,7 +37,7 @@ template prefix_ typename senf::console::NodeCreateTraits::result_type senf::console::NodeCreateTraits::Creator::create(DirectoryNode & node, std::string const & name, - Object const & ob) + Object & ob) { return senf_console_add_node(node, name, ob, 0); } @@ -59,17 +59,14 @@ template prefix_ typename senf::console::NodeCreateTraits::result_type senf::console::DirectoryNode::add(std::string const & name, Object const & ob) { - return NodeCreateTraits::Creator::create(*this, name, ob); + return NodeCreateTraits::Creator::create(*this, name, ob); } -/////////////////////////////////////////////////////////////////////////// -// senf::console::SimpleCommandNode - -template -prefix_ senf::console::SimpleCommandNode & senf::console:: -senf_console_add_node(DirectoryNode & node, std::string const & name, Function const & fn, ...) +template +prefix_ typename senf::console::NodeCreateTraits::result_type +senf::console::DirectoryNode::add(std::string const & name, Object & ob) { - return node.add(name, SimpleCommandNode::create(fn)); + return NodeCreateTraits::Creator::create(*this, name, ob); } ///////////////////////////////cti.e/////////////////////////////////////// diff --git a/Console/Node.hh b/Console/Node.hh index 71c66f7..6a2732c 100644 --- a/Console/Node.hh +++ b/Console/Node.hh @@ -307,7 +307,7 @@ namespace console { typedef BOOST_TYPEOF_TPL( senf_console_add_node( * static_cast(0), * static_cast(0), - * static_cast(0), + * static_cast(0), 0) ) base_type; typedef typename senf::remove_cvref::type value_type; @@ -317,7 +317,7 @@ namespace console { /// Internal struct Creator { static result_type create(DirectoryNode & node, std::string const & name, - Object const & ob); + Object & ob); }; }; @@ -383,8 +383,8 @@ namespace console { \a name is empty, it is set to 'unnamed'. */ template - typename NodeCreateTraits::result_type add (std::string const & name, - Object const & ob); + typename NodeCreateTraits::result_type add(std::string const & name, + Object const & ob); ///< Generic child node factory /**< This member is used to create a new child node of the current directory. The type of node created depends on @@ -409,6 +409,12 @@ namespace console { is not used but serves to disambiguate the overloads). */ + template + typename NodeCreateTraits::result_type add(std::string const & name, + Object & ob); + ///< Generic child node factory + /**< \see add() */ + GenericNode::ptr remove(std::string const & name); ///< Remove node \a name from the tree /**< The returned pointer may either be discarded, which @@ -634,9 +640,10 @@ namespace console { }; #ifndef DOXYGEN - template + SimpleCommandNode & senf_console_add_node(DirectoryNode & node, std::string const & name, - Function const & fn, ...); + SimpleCommandNode::Function fn, int); + #endif DirectoryNode & root(); diff --git a/Console/ParsedCommand.cti b/Console/ParsedCommand.cti index 1aa2020..64e8100 100644 --- a/Console/ParsedCommand.cti +++ b/Console/ParsedCommand.cti @@ -67,14 +67,6 @@ prefix_ std::string senf::console::detail::ArgumentInfo::defaultV // senf::console::ParsedCommandOverloadBase template -prefix_ senf::console::detail::ArgumentInfo & -senf::console::ParsedCommandOverloadBase::arg(unsigned n) - const -{ - return dynamic_cast &>(arg(n)); -} - -template prefix_ void senf::console::ParsedCommandOverloadBase::addParameter() { parameters_.push_back(detail::ArgumentInfo::create()); @@ -89,24 +81,6 @@ prefix_ void senf::console::ParsedCommandOverloadBase::addParameter() #include BOOST_PP_ITERATE() /////////////////////////////////////////////////////////////////////////// -// senf::console::ParsedCommandAttributorBase - -template -prefix_ void senf::console::ParsedCommandAttributorBase::defaultValue(Type const & value) - const -{ - overload().arg(index_).defaultValue = value; - overload().arg(index_).hasDefault = true; -} - -template -prefix_ void senf::console::ParsedCommandAttributorBase::parser(Fn fn) - const -{ - overload().arg(index_).parser = fn; -} - -/////////////////////////////////////////////////////////////////////////// // senf::console::ParsedCommandAttributor template @@ -306,7 +280,8 @@ prefix_ void senf::console::ParsedArgumentAttributor:: defaultValue(value_type const & value) const { - ParsedCommandAttributorBase::defaultValue(value); + this->overload().arg().defaultValue = value; + this->overload().arg(index).hasDefault = true; } template @@ -314,7 +289,7 @@ template prefix_ void senf::console::ParsedArgumentAttributor::parser(Fn fn) const { - ParsedCommandAttributorBase::parser(fn); + this->overload().arg().parser = fn; } /////////////////////////////////////////////////////////////////////////// @@ -324,8 +299,8 @@ template prefix_ senf::console::ParsedArgumentAttributor:: ParsedArgumentAttributor(Overload & overload) - : ParsedArgumentAttributorBase< Overload, - ParsedArgumentAttributor > (overload, index) + : ParsedArgumentAttributorBase< + Overload, ParsedArgumentAttributor > (overload, index) {} /////////////////////////////////////////////////////////////////////////// diff --git a/Console/ParsedCommand.hh b/Console/ParsedCommand.hh index ba32137..af8dfe7 100644 --- a/Console/ParsedCommand.hh +++ b/Console/ParsedCommand.hh @@ -137,15 +137,13 @@ namespace console { typedef boost::intrusive_ptr ptr; detail::ArgumentInfoBase & arg(unsigned n) const; - template detail::ArgumentInfo & arg(unsigned n) const; void doc(std::string const & d); protected: ParsedCommandOverloadBase(); - template - void addParameter(); + template void addParameter(); private: virtual unsigned v_numArguments() const; @@ -212,14 +210,12 @@ namespace console { void argName(std::string const & name) const; void argDoc(std::string const & doc) const; - template void defaultValue(Type const & value) const; void typeName(std::string const & doc) const; void defaultDoc(std::string const & doc) const; ParsedCommandOverloadBase & overload() const; void overloadDoc(std::string const & doc) const; void nodeDoc(std::string const & doc) const; - template void parser(Fn fn) const; private: ParsedCommandOverloadBase & overload_; diff --git a/Console/ParsedCommand.ih b/Console/ParsedCommand.ih index c2d887b..d9c2610 100644 --- a/Console/ParsedCommand.ih +++ b/Console/ParsedCommand.ih @@ -48,8 +48,12 @@ namespace console { namespace detail { -#ifndef DOXYGEN + /** \brief Internal: Argument information structure + + This class is used to hold argument information for automatically parsed commands. + \see ParsedCommandOverloadBase + */ struct ArgumentInfoBase : public intrusive_refcount { @@ -66,6 +70,12 @@ namespace detail { virtual std::string defaultValueStr() const = 0; }; + /** \brief Internal: Argument information structure + + This class is used to hold argument information for automatically parsed commands. + + \see ParsedCommandOverloadBase + */ template struct ArgumentInfo : public ArgumentInfoBase @@ -83,6 +93,8 @@ namespace detail { virtual std::string defaultValueStr() const; }; +#ifndef DOXYGEN + // FirstArgType returns void, if the function has no arguments, otherwise it returns arg1_type template 0)> diff --git a/Console/ParsedCommand.mpp b/Console/ParsedCommand.mpp index ede6974..a1c5e46 100644 --- a/Console/ParsedCommand.mpp +++ b/Console/ParsedCommand.mpp @@ -38,6 +38,8 @@ #include #include #include +#include +#include // ///////////////////////////mpp.p//////////////////////////////////////// #elif BOOST_PP_IS_ITERATING // //////////////////////////////////////////// @@ -47,8 +49,11 @@ #define mpp_ArgTypeN(n) BOOST_PP_CAT(BOOST_PP_CAT(arg, BOOST_PP_INC(n)), _type) #define mpp_ArgN(n) BOOST_PP_CAT(arg, BOOST_PP_INC(n)) -#define mpp_ArgTypes_(z,n,d) typename traits::mpp_ArgTypeN(n) -#define mpp_TrailingArgTypes() BOOST_PP_ENUM_TRAILING( BOOST_PP_ITERATION(), mpp_ArgTypes_, _ ) +#define mpp_TrailingArgTypes_(z,n,d) typename traits::mpp_ArgTypeN(n) +#define mpp_TrailingArgTypes() BOOST_PP_ENUM_TRAILING( BOOST_PP_ITERATION(), mpp_TrailingArgTypes_, _ ) + +#define mpp_ArgTypes_(z,n,d) mpp_ArgTypeN(n) +#define mpp_ArgTypes() BOOST_PP_ENUM( BOOST_PP_ITERATION(), mpp_ArgTypes_, _ ) #define mpp_Args_(z,n,d) mpp_ArgN(n) #define mpp_TrailingArgs() BOOST_PP_ENUM_TRAILING( BOOST_PP_ITERATION(), mpp_Args_, _ ) @@ -80,10 +85,16 @@ public: BOOST_PP_REPEAT( BOOST_PP_ITERATION(), mpp_l, _ ) # undef mpp_l + typedef boost::mpl::vector< mpp_ArgTypes() > arg_types; + static ptr create(Function fn); void formatter(Formatter f); + using ParsedCommandOverloadBase::arg; + template + detail::ArgumentInfo::type> & arg() const; + protected: private: @@ -112,8 +123,14 @@ public: BOOST_PP_REPEAT( BOOST_PP_ITERATION(), mpp_l, _ ) # undef mpp_l + typedef boost::mpl::vector< mpp_ArgTypes() > arg_types; + static ptr create(Function fn); + using ParsedCommandOverloadBase::arg; + template + detail::ArgumentInfo::type> & arg() const; + protected: private: @@ -147,6 +164,20 @@ formatter(Formatter f) } template +template +senf::console::detail::ArgumentInfo< + typename boost::mpl::at_c< + typename senf::console::ParsedCommandOverload< + FunctionTraits, ReturnValue, BOOST_PP_ITERATION()>::arg_types, + n>::type> & +senf::console::ParsedCommandOverload:: +arg() const +{ + return static_cast< detail::ArgumentInfo< + typename boost::mpl::at_c::type > & >(arg(n)); +} + +template prefix_ senf::console::ParsedCommandOverload:: ParsedCommandOverload(Function fn) @@ -166,6 +197,20 @@ create(Function fn) } template +template +senf::console::detail::ArgumentInfo< + typename boost::mpl::at_c< + typename senf::console::ParsedCommandOverload< + FunctionTraits, void, BOOST_PP_ITERATION()>::arg_types, + n>::type> & +senf::console::ParsedCommandOverload:: +arg() const +{ + return static_cast< detail::ArgumentInfo< + typename boost::mpl::at_c::type > & >(arg(n)); +} + +template prefix_ senf::console::ParsedCommandOverload:: ParsedCommandOverload(Function fn) @@ -197,12 +242,12 @@ v_execute(std::ostream & os, ParseCommandInfo const & command) riterator const i_end (boost::rend(command.arguments())); # define mpp_l(z,n,d) \ - mpp_ArgTypeN(n) mpp_ArgN(n) (arg< mpp_ArgTypeN(n) >( n ).defaultValue); \ + mpp_ArgTypeN(n) mpp_ArgN(n) (arg().defaultValue); \ if (! arg(n).hasDefault || nDefaults-- <= 0) { \ if (i == i_end) \ throw SyntaxErrorException("invalid number of arguments"); \ - if (arg< mpp_ArgTypeN(n) >(n).parser) \ - arg< mpp_ArgTypeN(n) >(n).parser( *(i++), mpp_ArgN(n) ); \ + if (arg().parser) \ + arg().parser( *(i++), mpp_ArgN(n) ); \ else \ ArgumentTraits< mpp_ArgTypeN(n) >::parse( *(i++), mpp_ArgN(n) ); \ } @@ -233,12 +278,12 @@ v_execute(std::ostream & os, ParseCommandInfo const & command) riterator const i_end (boost::rend(command.arguments())); # define mpp_l(z,n,d) \ - mpp_ArgTypeN(n) mpp_ArgN(n) (arg< mpp_ArgTypeN(n) >( n ).defaultValue); \ + mpp_ArgTypeN(n) mpp_ArgN(n) (arg().defaultValue); \ if (! arg(n).hasDefault || nDefaults-- <= 0) { \ if (i == i_end) \ throw SyntaxErrorException("invalid number of arguments"); \ - if (arg< mpp_ArgTypeN(n) >(n).parser) \ - arg< mpp_ArgTypeN(n) >(n).parser( *(i++), mpp_ArgN(n) ); \ + if (arg().parser) \ + arg().parser( *(i++), mpp_ArgN(n) ); \ else \ ArgumentTraits< mpp_ArgTypeN(n) >::parse( *(i++), mpp_ArgN(n) ); \ } diff --git a/Console/ScopedDirectory.cti b/Console/ScopedDirectory.cti index 2a3664f..d2ab881 100644 --- a/Console/ScopedDirectory.cti +++ b/Console/ScopedDirectory.cti @@ -39,7 +39,7 @@ prefix_ typename senf::console::OwnerNodeCreateTraits::result_type senf::console::OwnerNodeCreateTraits::Creator::create(DirectoryNode & node, Owner & owner, std::string const & name, - Object const & ob) + Object & ob) { return senf_console_add_node(node, owner, name, ob, 0); } @@ -59,6 +59,14 @@ template prefix_ typename senf::console::OwnerNodeCreateTraits::result_type senf::console::ScopedDirectory::add(std::string const & name, Object const & ob) { + return OwnerNodeCreateTraits::Creator::create(node(), *owner_, name, ob); +} + +template +template +prefix_ typename senf::console::OwnerNodeCreateTraits::result_type +senf::console::ScopedDirectory::add(std::string const & name, Object & ob) +{ return OwnerNodeCreateTraits::Creator::create(node(), *owner_, name, ob); } @@ -96,6 +104,13 @@ senf::console::ScopedDirectory::add(std::string const & name, Object const return node().add(name, ob); } +template +prefix_ typename senf::console::NodeCreateTraits::result_type +senf::console::ScopedDirectory::add(std::string const & name, Object & ob) +{ + return node().add(name, ob); +} + ///////////////////////////////cti.e/////////////////////////////////////// #undef prefix_ diff --git a/Console/ScopedDirectory.hh b/Console/ScopedDirectory.hh index 91909b6..cd5b9b4 100644 --- a/Console/ScopedDirectory.hh +++ b/Console/ScopedDirectory.hh @@ -49,7 +49,7 @@ namespace console { * static_cast(0), * static_cast(0), * static_cast(0), - * static_cast(0), + * static_cast(0), * static_cast(0)) ) base_type; typedef typename senf::remove_cvref::type value_type; @@ -59,7 +59,7 @@ namespace console { /// Internal struct Creator { static result_type create(DirectoryNode & node, Owner & owner, - std::string const & name, Object const & ob); + std::string const & name, Object & ob); }; }; @@ -157,6 +157,12 @@ namespace console { implementation just forwards the call to the proxied directory node. */ + template + typename OwnerNodeCreateTraits::result_type add(std::string const & name, + Object & ob); + ///< Create new child node + /**< \see add() */ + protected: private: @@ -172,6 +178,10 @@ namespace console { template typename NodeCreateTraits::result_type add(std::string const & name, Object const & ob); + + template + typename NodeCreateTraits::result_type add(std::string const & name, + Object & ob); }; template diff --git a/Console/Variables.cti b/Console/Variables.cti index 2cdff1b..f074c5f 100644 --- a/Console/Variables.cti +++ b/Console/Variables.cti @@ -73,32 +73,121 @@ prefix_ void senf::console::detail::SetVariable::onChange(OnChangeHand } /////////////////////////////////////////////////////////////////////////// +// senf::console::ConstVariableAttributor + +template +prefix_ senf::console::ConstVariableAttributor +senf::console::ConstVariableAttributor::doc(std::string const & doc) +{ + queryOverload_.node().doc(doc); + return *this; +} + +template +prefix_ senf::console::ConstVariableAttributor +senf::console::ConstVariableAttributor::formatter(Formatter formatter) +{ + queryOverload_.formatter(formatter); + return *this; +} + +template +prefix_ senf::console::ConstVariableAttributor:: +ConstVariableAttributor(QueryOverload & queryOverload) + : queryOverload_ (queryOverload) +{} + +/////////////////////////////////////////////////////////////////////////// // senf::console::VariableAttributor template +prefix_ senf::console::VariableAttributor +senf::console::VariableAttributor::parser(Parser parser) +{ + setOverload_.template arg<0>().parser = parser; + return *this; +} + +template +prefix_ senf::console::VariableAttributor +senf::console::VariableAttributor::typeName(std::string const & name) +{ + setOverload_.arg(0).type = name; + return *this; +} + +template +prefix_ typename senf::console::VariableAttributor +senf::console::VariableAttributor::doc(std::string const & doc) +{ + ConstVariableAttributor::doc(doc); + return *this; +} + +template +prefix_ typename senf::console::VariableAttributor +senf::console::VariableAttributor::formatter(Formatter formatter) +{ + ConstVariableAttributor::formatter(formatter); + return *this; +} + +template prefix_ senf::console::VariableAttributor::VariableAttributor(QueryOverload & queryOverload, SetOverload & setOverload) - : queryOverload_ (queryOverload), setOverload_ (setOverload) + : ConstVariableAttributor (queryOverload), setOverload_ (setOverload) {} /////////////////////////////////////////////////////////////////////////// -template +template prefix_ senf::console::VariableAttributor -senf::console::senf_console_add_node(DirectoryNode & node, std::string const & name, - Variable * var, int) +senf::console::detail::VariableNodeCreator::add(DirectoryNode & node, + std::string const & name, + Variable & var) { typename VariableAttributor::SetOverload & setOverload ( node.add(name, typename detail::SetVariable::Function( - detail::SetVariable(*var))).overload() ); + detail::SetVariable(var))) + .arg("new_value") + .overload() ); typename VariableAttributor::QueryOverload & queryOverload ( node.add(name, typename detail::QueryVariable::Function( - detail::QueryVariable(*var))).overload() ); + detail::QueryVariable(var))).overload() ); return VariableAttributor(queryOverload, setOverload); } +template +prefix_ senf::console::ConstVariableAttributor +senf::console::detail::VariableNodeCreator::add(DirectoryNode & node, + std::string const & name, + Variable & var) +{ + typename VariableAttributor::QueryOverload & queryOverload ( + node.add(name, typename detail::QueryVariable::Function( + detail::QueryVariable(var))).overload() ); + + return ConstVariableAttributor(queryOverload); +} + +template +prefix_ senf::console::VariableAttributor senf::console:: +senf_console_add_node(DirectoryNode & node, std::string const & name, Variable & var, int, + typename boost::disable_if< boost::is_convertible >::type *) +{ + return detail::VariableNodeCreator::add(node, name, var); +} + +template +prefix_ typename senf::console::detail::VariableNodeCreator::result_type +senf::console::senf_console_add_node(DirectoryNode & node, std::string const & name, + boost::reference_wrapper var, int) +{ + return detail::VariableNodeCreator::add(node, name, var.get()); +} + ///////////////////////////////cti.e/////////////////////////////////////// #undef prefix_ diff --git a/Console/Variables.hh b/Console/Variables.hh index 58924b2..5b1b728 100644 --- a/Console/Variables.hh +++ b/Console/Variables.hh @@ -27,6 +27,9 @@ #define HH_Variables_ 1 // Custom includes +#include +#include +#include #include "ParsedCommand.hh" #include "Variables.ih" @@ -36,40 +39,68 @@ namespace senf { namespace console { + class ScopedDirectoryBase; + template class VariableAttributor; + template - class VariableAttributor + VariableAttributor senf_console_add_node( + DirectoryNode & node, std::string const & name, Variable & var, int, + typename boost::disable_if< boost::is_convertible >::type * = 0); + + template + typename detail::VariableNodeCreator::result_type + senf_console_add_node(DirectoryNode & node, std::string const & name, + boost::reference_wrapper var, int); + + template + class ConstVariableAttributor { public: - typedef typename detail::SetVariable::Traits::Overload SetOverload; typedef typename detail::QueryVariable::Traits::Overload QueryOverload; - + typedef typename QueryOverload::Formatter Formatter; typedef OverloadedCommandNode node_type; - typedef VariableAttributor return_type; + typedef ConstVariableAttributor return_type; + + ConstVariableAttributor doc(std::string const & doc); + ConstVariableAttributor formatter(Formatter formatter); protected: + explicit ConstVariableAttributor(QueryOverload & queryOverload); private: - VariableAttributor(QueryOverload & queryOverload, SetOverload & setOverload); - QueryOverload & queryOverload_; - SetOverload & setOverload_; -#ifndef DOXYGEN + friend class detail::VariableNodeCreator; + }; + + template + class VariableAttributor + : public ConstVariableAttributor + { + public: + typedef typename detail::SetVariable::Traits::Overload SetOverload; + typedef typename detail::ArgumentInfo::Parser Parser; + typedef OverloadedCommandNode node_type; + typedef VariableAttributor return_type; - template - friend VariableAttributor senf_console_add_node(DirectoryNode & node, - std::string const & name, - V * var, int); + typedef typename ConstVariableAttributor::Formatter Formatter; + typedef typename ConstVariableAttributor::QueryOverload QueryOverload; -#endif + VariableAttributor parser(Parser parser); + VariableAttributor typeName(std::string const & name); + + VariableAttributor doc(std::string const & doc); + VariableAttributor formatter(Formatter formatter); + + protected: - }; + private: + VariableAttributor(QueryOverload & queryOverload, SetOverload & setOverload); - template - VariableAttributor senf_console_add_node(DirectoryNode & node, - std::string const & name, - Variable * var, int); + SetOverload & setOverload_; + friend class detail::VariableNodeCreator; + }; }} ///////////////////////////////hh.e//////////////////////////////////////// diff --git a/Console/Variables.ih b/Console/Variables.ih index e1a2ce8..88b2207 100644 --- a/Console/Variables.ih +++ b/Console/Variables.ih @@ -28,11 +28,16 @@ // Custom includes #include +#include ///////////////////////////////ih.p//////////////////////////////////////// namespace senf { namespace console { + + template class ConstVariableAttributor; + template class VariableAttributor; + namespace detail { template @@ -66,6 +71,22 @@ namespace detail { OnChangeHandler handler_; }; + template ::value> + struct VariableNodeCreator + { + typedef VariableAttributor result_type; + static VariableAttributor add(DirectoryNode & node, std::string const & name, + Variable & var); + }; + + template + struct VariableNodeCreator + { + typedef ConstVariableAttributor result_type; + static ConstVariableAttributor add(DirectoryNode & node, std::string const & name, + Variable & var); + }; + }}} ///////////////////////////////ih.e//////////////////////////////////////// diff --git a/Console/Variables.test.cc b/Console/Variables.test.cc index a190cea..6b1e315 100644 --- a/Console/Variables.test.cc +++ b/Console/Variables.test.cc @@ -40,6 +40,14 @@ #define prefix_ ///////////////////////////////cc.p//////////////////////////////////////// +namespace { + void testParser(senf::console::ParseCommandInfo::TokensRange const &, int & value) + { value = 0; } + + void testFormatter(int value, std::ostream & os) + { os << '[' << value << ']'; } +} + BOOST_AUTO_UNIT_TEST(variables) { senf::console::Executor executor; @@ -50,12 +58,47 @@ BOOST_AUTO_UNIT_TEST(variables) int var (5); std::stringstream ss; - dir.add("var", &var); + dir.add("var", var) + .doc("Current blorg limit") + .formatter(&testFormatter) + .parser(&testParser) + .typeName("number"); parser.parse("test/var; test/var 10; test/var", boost::bind( boost::ref(executor), boost::ref(ss), _1 )); - BOOST_CHECK_EQUAL( ss.str(), "5\n10\n" ); + BOOST_CHECK_EQUAL( ss.str(), "[5]\n[0]\n" ); + + ss.str(""); + dir("var").help(ss); + BOOST_CHECK_EQUAL(ss.str(), + "Usage:\n" + " 1- var new_value:number\n" + " 2- var\n" + "\n" + "Current blorg limit\n"); + + dir.add("refvar", boost::ref(var)) + .doc("Current blorg limit") + .formatter(&testFormatter) + .parser(&testParser) + .typeName("number"); + + dir.add("crefvar", boost::cref(var)) + .doc("Current blorg limit") + .formatter(&testFormatter); } +#ifdef COMPILE_CHECK + +COMPILE_FAIL(constVariable) +{ + senf::console::ScopedDirectory<> dir; + int var; + dir.add("var", boost::cref(var)) + .parser(&testParser); +} + +#endif + ///////////////////////////////cc.e//////////////////////////////////////// #undef prefix_ diff --git a/senfscons/CompileCheck.py b/senfscons/CompileCheck.py index 81f38d3..34d3617 100644 --- a/senfscons/CompileCheck.py +++ b/senfscons/CompileCheck.py @@ -64,7 +64,7 @@ def generate(env): builder = env.Builder( action = CompileCheck, - suffix = '.tsto', + suffix = '.checked', src_suffix = '.cc', source_scanner = SCons.Scanner.C.CScanner(), single_source=1