1// (C) Copyright Gennadiy Rozental 2005-2008. 2// Use, modification, and distribution are subject to the 3// Boost Software License, Version 1.0. (See accompanying file 4// LICENSE_1_0.txt or copy at 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: 57992 $ 11// 12// Description : defines parser - public interface for CLA parsing and accessing 13// *************************************************************************** 14 15#ifndef BOOST_RT_CLA_PARSER_HPP_062604GER 16#define BOOST_RT_CLA_PARSER_HPP_062604GER 17 18// Boost.Runtime.Parameter 19#include <boost/test/utils/runtime/config.hpp> 20#include <boost/test/utils/runtime/fwd.hpp> 21#include <boost/test/utils/runtime/argument.hpp> 22 23#include <boost/test/utils/runtime/cla/fwd.hpp> 24#include <boost/test/utils/runtime/cla/modifier.hpp> 25#include <boost/test/utils/runtime/cla/argv_traverser.hpp> 26 27// Boost 28#include <boost/optional.hpp> 29 30// STL 31#include <list> 32 33namespace boost { 34 35namespace BOOST_RT_PARAM_NAMESPACE { 36 37namespace cla { 38 39// ************************************************************************** // 40// ************** runtime::cla::parser ************** // 41// ************************************************************************** // 42 43namespace cla_detail { 44 45template<typename Modifier> 46class global_mod_parser { 47public: 48 global_mod_parser( parser& p, Modifier const& m ) 49 : m_parser( p ) 50 , m_modifiers( m ) 51 {} 52 53 template<typename Param> 54 global_mod_parser const& 55 operator<<( shared_ptr<Param> param ) const 56 { 57 param->accept_modifier( m_modifiers ); 58 59 m_parser << param; 60 61 return *this; 62 } 63 64private: 65 // Data members; 66 parser& m_parser; 67 Modifier const& m_modifiers; 68}; 69 70} 71 72// ************************************************************************** // 73// ************** runtime::cla::parser ************** // 74// ************************************************************************** // 75 76class parser { 77public: 78 typedef std::list<parameter_ptr>::const_iterator param_iterator; 79 80 // Constructor 81 explicit parser( cstring program_name = cstring() ); 82 83 // parameter list construction interface 84 parser& operator<<( parameter_ptr param ); 85 86 // parser and global parameters modifiers 87 template<typename Modifier> 88 cla_detail::global_mod_parser<Modifier> 89 operator-( Modifier const& m ) 90 { 91 nfp::optionally_assign( m_traverser.p_separator.value, m, input_separator ); 92 nfp::optionally_assign( m_traverser.p_ignore_mismatch.value, m, ignore_mismatch_m ); 93 94 return cla_detail::global_mod_parser<Modifier>( *this, m ); 95 } 96 97 // input processing method 98 void parse( int& argc, char_type** argv ); 99 100 // parameters access 101 param_iterator first_param() const; 102 param_iterator last_param() const; 103 104 // arguments access 105 const_argument_ptr operator[]( cstring string_id ) const; 106 cstring get( cstring string_id ) const; 107 108 template<typename T> 109 T const& get( cstring string_id ) const 110 { 111 return arg_value<T>( valid_argument( string_id ) ); 112 } 113 114 template<typename T> 115 void get( cstring string_id, boost::optional<T>& res ) const 116 { 117 const_argument_ptr actual_arg = (*this)[string_id]; 118 119 if( actual_arg ) 120 res = arg_value<T>( *actual_arg ); 121 else 122 res.reset(); 123 } 124 125 // help/usage 126 void usage( out_stream& ostr ); 127 void help( out_stream& ostr ); 128 129private: 130 argument const& valid_argument( cstring string_id ) const; 131 132 // Data members 133 argv_traverser m_traverser; 134 std::list<parameter_ptr> m_parameters; 135 dstring m_program_name; 136}; 137 138//____________________________________________________________________________// 139 140} // namespace cla 141 142} // namespace BOOST_RT_PARAM_NAMESPACE 143 144} // namespace boost 145 146#ifndef BOOST_RT_PARAM_OFFLINE 147 148# define BOOST_RT_PARAM_INLINE inline 149# include <boost/test/utils/runtime/cla/parser.ipp> 150 151#endif 152 153#endif // BOOST_RT_CLA_PARSER_HPP_062604GER 154