annotate DEPENDENCIES/generic/include/boost/test/utils/runtime/cla/parser.hpp @ 125:34e428693f5d vext

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