// $Id$
//
-// Copyright (C) 2008
+// Copyright (C) 2008
// Fraunhofer Institute for Open Communication Systems (FOKUS)
-// Competence Center NETwork research (NET), St. Augustin, GERMANY
-// Stefan Bund <g0dil@berlios.de>
//
-// This program is free software; you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation; either version 2 of the License, or
-// (at your option) any later version.
+// The contents of this file are subject to the Fraunhofer FOKUS Public License
+// Version 1.0 (the "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+// http://senf.berlios.de/license.html
//
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
+// The Fraunhofer FOKUS Public License Version 1.0 is based on,
+// but modifies the Mozilla Public License Version 1.1.
+// See the full license text for the amendments.
//
-// You should have received a copy of the GNU General Public License
-// along with this program; if not, write to the
-// Free Software Foundation, Inc.,
-// 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+// Software distributed under the License is distributed on an "AS IS" basis,
+// WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+// for the specific language governing rights and limitations under the License.
+//
+// The Original Code is Fraunhofer FOKUS code.
+//
+// The Initial Developer of the Original Code is Fraunhofer-Gesellschaft e.V.
+// (registered association), Hansastraße 27 c, 80686 Munich, Germany.
+// All Rights Reserved.
+//
+// Contributor(s):
+// Stefan Bund <g0dil@berlios.de>
/** \file
\brief Traits internal header */
// Custom includes
#include <string>
+#include <limits>
#include <boost/preprocessor/seq/for_each.hpp>
#include <boost/preprocessor/stringize.hpp>
#include <boost/preprocessor/facilities/empty.hpp>
#include <boost/bimap.hpp>
#include <boost/assign/list_inserter.hpp>
#include <boost/algorithm/string/case_conv.hpp>
-#include <senf/Utils/singleton.hh>
+#include <boost/mpl/if.hpp>
-///////////////////////////////ih.p////////////////////////////////////////
+//-/////////////////////////////////////////////////////////////////////////////////////////////////
namespace senf {
namespace console {
+
+ template <class _> struct ArgumentTraits;
+ template <class _> struct ReturnValueTraits;
+
namespace detail {
+ template <class CharT>
+ struct MatchingShortType
+ : public boost::mpl::if_c<std::numeric_limits<CharT>::is_signed,short,unsigned short>
+ {};
+
+ template <class CharT>
+ struct CharArgumentTraits
+ : public ArgumentTraits<typename MatchingShortType<CharT>::type>
+ {
+ typedef ArgumentTraits<typename MatchingShortType<CharT>::type> base;
+ typedef CharT type;
+ static void parse(ParseCommandInfo::TokensRange const & tokens, CharT & out);
+ static std::string description();
+ };
+
+ template <class CharT>
+ struct CharReturnValueTraits
+ : public ReturnValueTraits<typename MatchingShortType<CharT>::type>
+ {
+ typedef CharT type;
+ };
+
#ifndef DOXYGEN
struct StringILess
{
bool operator()(std::string const & left, std::string const & right) const
- { return boost::algorithm::to_lower_copy(left)
+ { return boost::algorithm::to_lower_copy(left)
< boost::algorithm::to_lower_copy(right); }
};
long parseEnum(EnumTable const & table, ParseCommandInfo::TokensRange const & tokens);
std::string formatEnum(EnumTable const & table, long value);
-# define SENF_CONSOLE_REGISTER_ENUM_ELT(r,d,e) \
- ( BOOST_PP_STRINGIZE(e), static_cast<long>(d e) )
+# define SENF_CONSOLE_REGISTER_ENUM_ELT(r,d,e) \
+ BOOST_PP_IF( SENF_CONSOLE_REGISTER_ENUM_HASKEY(e), \
+ SENF_CONSOLE_REGISTER_ENUM_WITHKEY, \
+ SENF_CONSOLE_REGISTER_ENUM_NOKEY )(d, e)
+
+# define SENF_CONSOLE_REGISTER_ENUM_GOBBLE__key(k,e)
+# define SENF_CONSOLE_REGISTER_ENUM_GET_KEY__key(k,e) k
+# define SENF_CONSOLE_REGISTER_ENUM_GET_ENUM__key(k,e) e
+# define SENF_CONSOLE_REGISTER_ENUM_HASKEY(e) \
+ BOOST_PP_IS_EMPTY( SENF_CAT_RECURS1(SENF_CONSOLE_REGISTER_ENUM_GOBBLE__, e) )
+
+# define SENF_CONSOLE_REGISTER_ENUM_KEY_GETENUM(e) \
+ SENF_CAT_RECURS2(SENF_CONSOLE_REGISTER_ENUM_GET_ENUM__, e)
+# define SENF_CONSOLE_REGISTER_ENUM_KEY_GETKEY(e) \
+ SENF_CAT_RECURS3(SENF_CONSOLE_REGISTER_ENUM_GET_KEY__, e)
+
+# define SENF_CONSOLE_REGISTER_ENUM_NOKEY(prefix, e) \
+ ( BOOST_PP_STRINGIZE(e), static_cast<long>(prefix e) )
+
+# define SENF_CONSOLE_REGISTER_ENUM_WITHKEY(prefix, e) \
+ ( SENF_CONSOLE_REGISTER_ENUM_KEY_GETKEY(e), \
+ static_cast<long>(prefix SENF_CONSOLE_REGISTER_ENUM_KEY_GETENUM(e)) )
+
# define SENF_CONSOLE_REGISTER_ENUM_(Prefix, Type, Values) \
inline senf::console::detail::EnumTable & senf_console_enum_table(Prefix Type) \
}}}
-///////////////////////////////ih.e////////////////////////////////////////
+//-/////////////////////////////////////////////////////////////////////////////////////////////////
#endif
\f