Chris@16: // (C) Copyright Gennadiy Rozental 2005-2008. Chris@16: // Distributed under the Boost Software License, Version 1.0. Chris@16: // (See accompanying file LICENSE_1_0.txt or copy at Chris@16: // http://www.boost.org/LICENSE_1_0.txt) Chris@16: Chris@16: // See http://www.boost.org/libs/test for the library home page. Chris@16: // Chris@16: // File : $RCSfile$ Chris@16: // Chris@101: // Version : $Revision$ Chris@16: // Chris@16: // Description : default algorithms for string to specific type convertions Chris@16: // *************************************************************************** Chris@16: Chris@16: #ifndef BOOST_RT_INTERPRET_ARGUMENT_VALUE_HPP_062604GER Chris@16: #define BOOST_RT_INTERPRET_ARGUMENT_VALUE_HPP_062604GER Chris@16: Chris@16: // Boost.Runtime.Parameter Chris@16: #include Chris@16: #include Chris@16: Chris@16: // Boost.Test Chris@16: #include Chris@16: #include Chris@16: Chris@16: // Boost Chris@16: #include Chris@16: #include Chris@16: Chris@16: // STL Chris@16: // !! could we eliminate these includes? Chris@16: #include Chris@16: Chris@16: namespace boost { Chris@16: Chris@16: namespace BOOST_RT_PARAM_NAMESPACE { Chris@16: Chris@16: // ************************************************************************** // Chris@16: // ************** runtime::interpret_argument_value ************** // Chris@16: // ************************************************************************** // Chris@16: // returns true if source is used false otherwise Chris@16: Chris@16: // generic case Chris@16: template Chris@16: struct interpret_argument_value_impl { Chris@16: static bool _( cstring source, boost::optional& res ) Chris@16: { Chris@16: BOOST_RT_PARAM_TRACE( "In interpret_argument_value_impl<" << typeid(T).name() << ">" ); Chris@16: Chris@16: res = lexical_cast( source ); Chris@16: Chris@16: BOOST_RT_PARAM_TRACE( "String " << source << " is interpreted as " << *res ); Chris@16: return true; Chris@16: } Chris@16: }; Chris@16: Chris@16: Chris@16: //____________________________________________________________________________// Chris@16: Chris@16: // dstring case Chris@16: template<> Chris@16: struct interpret_argument_value_impl { Chris@16: static bool _( cstring source, boost::optional& res ) Chris@16: { Chris@16: BOOST_RT_PARAM_TRACE( "In interpret_argument_value_impl" ); Chris@16: Chris@16: res = dstring(); Chris@16: assign_op( *res, source, 0 ); Chris@16: Chris@16: return true; Chris@16: } Chris@16: }; Chris@16: Chris@16: //____________________________________________________________________________// Chris@16: Chris@16: // cstring case Chris@16: template<> Chris@16: struct interpret_argument_value_impl { Chris@16: static bool _( cstring source, boost::optional& res ) Chris@16: { Chris@16: BOOST_RT_PARAM_TRACE( "In interpret_argument_value_impl" ); Chris@16: Chris@16: res = source; Chris@16: Chris@16: return true; Chris@16: } Chris@16: }; Chris@16: Chris@16: //____________________________________________________________________________// Chris@16: Chris@16: // specialization for type bool Chris@16: template<> Chris@16: struct interpret_argument_value_impl { Chris@16: static bool _( cstring source, boost::optional& res ) Chris@16: { Chris@16: BOOST_RT_PARAM_TRACE( "In interpret_argument_value_impl" ); Chris@16: Chris@16: static literal_cstring YES( BOOST_RT_PARAM_CSTRING_LITERAL( "YES" ) ); Chris@16: static literal_cstring Y( BOOST_RT_PARAM_CSTRING_LITERAL( "Y" ) ); Chris@16: static literal_cstring NO( BOOST_RT_PARAM_CSTRING_LITERAL( "NO" ) ); Chris@16: static literal_cstring N( BOOST_RT_PARAM_CSTRING_LITERAL( "N" ) ); Chris@16: static literal_cstring one( BOOST_RT_PARAM_CSTRING_LITERAL( "1" ) ); Chris@16: static literal_cstring zero( BOOST_RT_PARAM_CSTRING_LITERAL( "0" ) ); Chris@16: Chris@16: source.trim(); Chris@16: Chris@16: if( case_ins_eq( source, YES ) || case_ins_eq( source, Y ) || case_ins_eq( source, one ) ) { Chris@16: res = true; Chris@16: return true; Chris@16: } Chris@16: else if( case_ins_eq( source, NO ) || case_ins_eq( source, N ) || case_ins_eq( source, zero ) ) { Chris@16: res = false; Chris@16: return true; Chris@16: } Chris@16: else { Chris@16: res = true; Chris@16: return false; Chris@16: } Chris@16: } Chris@16: }; Chris@16: Chris@16: //____________________________________________________________________________// Chris@16: Chris@16: template Chris@16: inline bool Chris@16: interpret_argument_value( cstring source, boost::optional& res, long ) Chris@16: { Chris@16: return interpret_argument_value_impl::_( source, res ); Chris@16: } Chris@16: Chris@16: //____________________________________________________________________________// Chris@16: Chris@16: // specialization for list of values Chris@16: template Chris@16: inline bool Chris@16: interpret_argument_value( cstring source, boost::optional >& res, int ) Chris@16: { Chris@16: BOOST_RT_PARAM_TRACE( "In interpret_argument_value>" ); Chris@16: Chris@16: res = std::list(); Chris@16: Chris@16: while( !source.is_empty() ) { Chris@16: // !! should we use token_iterator Chris@16: cstring::iterator single_value_end = std::find( source.begin(), source.end(), BOOST_RT_PARAM_LITERAL( ',' ) ); Chris@16: Chris@16: boost::optional value; Chris@16: interpret_argument_value( cstring( source.begin(), single_value_end ), value, 0 ); Chris@16: Chris@16: res->push_back( *value ); Chris@16: Chris@16: source.trim_left( single_value_end + 1 ); Chris@16: } Chris@16: Chris@16: return true; Chris@16: } Chris@16: Chris@16: //____________________________________________________________________________// Chris@16: Chris@16: } // namespace BOOST_RT_PARAM_NAMESPACE Chris@16: Chris@16: } // namespace boost Chris@16: Chris@16: #endif // BOOST_RT_INTERPRET_ARGUMENT_VALUE_HPP_062604GER