1 // (C) Copyright Gennadiy Rozental 2005-2008. 2 // Distributed under the Boost Software License, Version 1.0. 3 // (See accompanying file LICENSE_1_0.txt or copy at 4 // http://www.boost.org/LICENSE_1_0.txt) 5 6 // See http://www.boost.org/libs/test for the library home page. 7 // 8 // File : $RCSfile$ 9 // 10 // Version : $Revision: 49312 $ 11 // 12 // Description : default algorithms for string to specific type convertions 13 // *************************************************************************** 14 15 #ifndef BOOST_RT_INTERPRET_ARGUMENT_VALUE_HPP_062604GER 16 #define BOOST_RT_INTERPRET_ARGUMENT_VALUE_HPP_062604GER 17 18 // Boost.Runtime.Parameter 19 #include <boost/test/utils/runtime/config.hpp> 20 #include <boost/test/utils/runtime/trace.hpp> 21 22 // Boost.Test 23 #include <boost/test/utils/basic_cstring/io.hpp> 24 #include <boost/test/utils/basic_cstring/compare.hpp> 25 26 // Boost 27 #include <boost/optional.hpp> 28 #include <boost/lexical_cast.hpp> 29 30 // STL 31 // !! could we eliminate these includes? 32 #include <list> 33 34 namespace boost { 35 36 namespace BOOST_RT_PARAM_NAMESPACE { 37 38 // ************************************************************************** // 39 // ************** runtime::interpret_argument_value ************** // 40 // ************************************************************************** // 41 // returns true if source is used false otherwise 42 43 // generic case 44 template<typename T> 45 struct interpret_argument_value_impl { 46 static bool _( cstring source, boost::optional<T>& res ) 47 { 48 BOOST_RT_PARAM_TRACE( "In interpret_argument_value_impl<" << typeid(T).name() << ">" ); 49 50 res = lexical_cast<T>( source ); 51 52 BOOST_RT_PARAM_TRACE( "String " << source << " is interpreted as " << *res ); 53 return true; 54 } 55 }; 56 57 58 //____________________________________________________________________________// 59 60 // dstring case 61 template<> 62 struct interpret_argument_value_impl<dstring> { 63 static bool _( cstring source, boost::optional<dstring>& res ) 64 { 65 BOOST_RT_PARAM_TRACE( "In interpret_argument_value_impl<dstring>" ); 66 67 res = dstring(); 68 assign_op( *res, source, 0 ); 69 70 return true; 71 } 72 }; 73 74 //____________________________________________________________________________// 75 76 // cstring case 77 template<> 78 struct interpret_argument_value_impl<cstring> { 79 static bool _( cstring source, boost::optional<cstring>& res ) 80 { 81 BOOST_RT_PARAM_TRACE( "In interpret_argument_value_impl<cstring>" ); 82 83 res = source; 84 85 return true; 86 } 87 }; 88 89 //____________________________________________________________________________// 90 91 // specialization for type bool 92 template<> 93 struct interpret_argument_value_impl<bool> { 94 static bool _( cstring source, boost::optional<bool>& res ) 95 { 96 BOOST_RT_PARAM_TRACE( "In interpret_argument_value_impl<bool>" ); 97 98 static literal_cstring YES( BOOST_RT_PARAM_CSTRING_LITERAL( "YES" ) ); 99 static literal_cstring Y( BOOST_RT_PARAM_CSTRING_LITERAL( "Y" ) ); 100 static literal_cstring NO( BOOST_RT_PARAM_CSTRING_LITERAL( "NO" ) ); 101 static literal_cstring N( BOOST_RT_PARAM_CSTRING_LITERAL( "N" ) ); 102 static literal_cstring one( BOOST_RT_PARAM_CSTRING_LITERAL( "1" ) ); 103 static literal_cstring zero( BOOST_RT_PARAM_CSTRING_LITERAL( "0" ) ); 104 105 source.trim(); 106 107 if( case_ins_eq( source, YES ) || case_ins_eq( source, Y ) || case_ins_eq( source, one ) ) { 108 res = true; 109 return true; 110 } 111 else if( case_ins_eq( source, NO ) || case_ins_eq( source, N ) || case_ins_eq( source, zero ) ) { 112 res = false; 113 return true; 114 } 115 else { 116 res = true; 117 return false; 118 } 119 } 120 }; 121 122 //____________________________________________________________________________// 123 124 template<typename T> 125 inline bool 126 interpret_argument_value( cstring source, boost::optional<T>& res, long ) 127 { 128 return interpret_argument_value_impl<T>::_( source, res ); 129 } 130 131 //____________________________________________________________________________// 132 133 // specialization for list of values 134 template<typename T> 135 inline bool 136 interpret_argument_value( cstring source, boost::optional<std::list<T> >& res, int ) 137 { 138 BOOST_RT_PARAM_TRACE( "In interpret_argument_value<std::list<T>>" ); 139 140 res = std::list<T>(); 141 142 while( !source.is_empty() ) { 143 // !! should we use token_iterator 144 cstring::iterator single_value_end = std::find( source.begin(), source.end(), BOOST_RT_PARAM_LITERAL( ',' ) ); 145 146 boost::optional<T> value; 147 interpret_argument_value( cstring( source.begin(), single_value_end ), value, 0 ); 148 149 res->push_back( *value ); 150 151 source.trim_left( single_value_end + 1 ); 152 } 153 154 return true; 155 } 156 157 //____________________________________________________________________________// 158 159 } // namespace BOOST_RT_PARAM_NAMESPACE 160 161 } // namespace boost 162 163 #endif // BOOST_RT_INTERPRET_ARGUMENT_VALUE_HPP_062604GER 164