///////////////////////////////ct.p////////////////////////////////////////
template <class Type>
-prefix_ void
+prefix_ bool
senf::console::senf_console_parse_argument(ParseCommandInfo::TokensRange const & tokens,
Type & out)
{
catch (std::bad_cast & ex) {
throw SyntaxErrorException("parameter syntax error");
}
+ return false;
+}
+
+///////////////////////////////////////////////////////////////////////////
+// senf::console::ArgumentTraits< senf::console::FlagCollection<Enum> >
+
+template <class Enum>
+prefix_ void senf::console::ArgumentTraits< senf::console::FlagCollection<Enum> >::
+parse(ParseCommandInfo::TokensRange const & tokens, type & out)
+{
+ CheckedArgumentIteratorWrapper arg (tokens);
+ out.value = 0;
+ while (arg) {
+ Enum v;
+ senf::console::parse( *(arg++), v);
+ out.value |= v;
+ }
+}
+
+template <class Enum>
+prefix_ std::string
+senf::console::ArgumentTraits< senf::console::FlagCollection<Enum> >::description()
+{
+ return ArgumentTraits<Enum>::description();
+}
+
+template <class Enum>
+prefix_ std::string
+senf::console::ArgumentTraits< senf::console::FlagCollection<Enum> >::str(type const & value)
+{
+ std::stringstream ss;
+ senf::console::format(value, ss);
+ return ss.str();
+}
+
+///////////////////////////////////////////////////////////////////////////
+// senf::console::ReturnValueTraits< senf::console::FlagCollection<Enum> >
+
+template <class Enum>
+prefix_ void senf::console::ReturnValueTraits< senf::console::FlagCollection<Enum> >::
+format(type const & value, std::ostream & os)
+{
+ unsigned n (0);
+ std::stringstream ss;
+ unsigned long flag (1);
+ for (unsigned bit (0); bit<sizeof(value.value)*CHAR_BIT; ++bit, flag<<=1) {
+ if (value.value & flag) {
+ if (n++) ss << " ";
+ senf::console::format(static_cast<Enum>(flag), ss);
+ }
+ }
+ os << (n != 1 ? "(" + ss.str() + ")" : ss.str());
}
///////////////////////////////ct.e////////////////////////////////////////