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