X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Utils%2FConsole%2FTraits.ih;h=40e55e50bd1ac6d33b44f3b64a4f683aad8c30ac;hb=d677b6337f001480fccd73889bab3d62e719826b;hp=b9f3b1ba7f72eacd0f26cd540452fa1d8d696523;hpb=958bdb52c39fa39f4ef91cafd9628bcb4f85a03c;p=senf.git diff --git a/Utils/Console/Traits.ih b/Utils/Console/Traits.ih index b9f3b1b..40e55e5 100644 --- a/Utils/Console/Traits.ih +++ b/Utils/Console/Traits.ih @@ -33,6 +33,7 @@ #include #include #include +#include #include "../../Utils/singleton.hh" ///////////////////////////////ih.p//////////////////////////////////////// @@ -42,45 +43,41 @@ namespace console { namespace detail { #ifndef DOXYGEN + struct StringILess + { + bool operator()(std::string const & left, std::string const & right) const + { return boost::algorithm::to_lower_copy(left) + < boost::algorithm::to_lower_copy(right); } + }; - typedef boost::bimap EnumTable; + typedef boost::bimap, long> EnumTable; long parseEnum(EnumTable const & table, ParseCommandInfo::TokensRange const & tokens); std::string formatEnum(EnumTable const & table, long value); - template - struct EnumTraits : public senf::singleton< EnumTraits > - { - using senf::singleton< EnumTraits >::instance; - EnumTable table; - }; - # define SENF_CONSOLE_REGISTER_ENUM_ELT(r,d,e) \ - (BOOST_PP_STRINGIZE(e), static_cast(d e)) + ( BOOST_PP_STRINGIZE(e), static_cast(d e) ) # define SENF_CONSOLE_REGISTER_ENUM_(Prefix, Type, Values) \ - void senf_console_init_enum_table(Prefix Type) \ + inline senf::console::detail::EnumTable & senf_console_enum_table(Prefix Type) \ { \ - senf::console::detail::EnumTraits & traits ( \ - senf::console::detail::EnumTraits::instance() ); \ - if (traits.table.empty()) \ - boost::assign::insert(traits.table) \ + static senf::console::detail::EnumTable table; \ + if (table.empty()) \ + boost::assign::insert(table) \ BOOST_PP_SEQ_FOR_EACH( SENF_CONSOLE_REGISTER_ENUM_ELT, Prefix, Values ); \ + return table; \ } \ - void senf_console_parse_argument( \ + inline void senf_console_parse_argument( \ senf::console::ParseCommandInfo::TokensRange const & tokens, Prefix Type & out) \ { \ - senf_console_init_enum_table( Prefix Type() ); \ out = static_cast( \ senf::console::detail::parseEnum( \ - senf::console::detail::EnumTraits::instance().table, tokens)); \ + senf_console_enum_table( Prefix Type() ), tokens) ); \ } \ - void senf_console_format_value(Prefix Type value, std::ostream & os) \ + inline void senf_console_format_value(Prefix Type value, std::ostream & os) \ { \ - senf_console_init_enum_table( Prefix Type() ); \ os << senf::console::detail::formatEnum( \ - senf::console::detail::EnumTraits::instance().table, \ - static_cast(value) ); \ + senf_console_enum_table( Prefix Type() ), static_cast(value) ); \ } #endif