Chris@16: // (C) Copyright Gennadiy Rozental 2005-2008. Chris@16: // Use, modification, and distribution are subject to the Chris@16: // Boost Software License, Version 1.0. (See accompanying file Chris@16: // LICENSE_1_0.txt or copy at 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 : defines parser - public interface for CLA parsing and accessing Chris@16: // *************************************************************************** Chris@16: Chris@16: #ifndef BOOST_RT_CLA_PARSER_HPP_062604GER Chris@16: #define BOOST_RT_CLA_PARSER_HPP_062604GER Chris@16: Chris@16: // Boost.Runtime.Parameter Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: Chris@16: // Boost Chris@16: #include Chris@16: Chris@16: // STL Chris@16: #include Chris@16: Chris@16: namespace boost { Chris@16: Chris@16: namespace BOOST_RT_PARAM_NAMESPACE { Chris@16: Chris@16: namespace cla { Chris@16: Chris@16: // ************************************************************************** // Chris@16: // ************** runtime::cla::parser ************** // Chris@16: // ************************************************************************** // Chris@16: Chris@16: namespace cla_detail { Chris@16: Chris@16: template Chris@16: class global_mod_parser { Chris@16: public: Chris@16: global_mod_parser( parser& p, Modifier const& m ) Chris@16: : m_parser( p ) Chris@16: , m_modifiers( m ) Chris@16: {} Chris@16: Chris@16: template Chris@16: global_mod_parser const& Chris@16: operator<<( shared_ptr param ) const Chris@16: { Chris@16: param->accept_modifier( m_modifiers ); Chris@16: Chris@16: m_parser << param; Chris@16: Chris@16: return *this; Chris@16: } Chris@16: Chris@16: private: Chris@16: // Data members; Chris@16: parser& m_parser; Chris@16: Modifier const& m_modifiers; Chris@16: }; Chris@16: Chris@16: } Chris@16: Chris@16: // ************************************************************************** // Chris@16: // ************** runtime::cla::parser ************** // Chris@16: // ************************************************************************** // Chris@16: Chris@16: class parser { Chris@16: public: Chris@16: typedef std::list::const_iterator param_iterator; Chris@16: Chris@16: // Constructor Chris@16: explicit parser( cstring program_name = cstring() ); Chris@16: Chris@16: // parameter list construction interface Chris@16: parser& operator<<( parameter_ptr param ); Chris@16: Chris@16: // parser and global parameters modifiers Chris@16: template Chris@16: cla_detail::global_mod_parser Chris@16: operator-( Modifier const& m ) Chris@16: { Chris@16: nfp::optionally_assign( m_traverser.p_separator.value, m, input_separator ); Chris@16: nfp::optionally_assign( m_traverser.p_ignore_mismatch.value, m, ignore_mismatch_m ); Chris@16: Chris@16: return cla_detail::global_mod_parser( *this, m ); Chris@16: } Chris@16: Chris@16: // input processing method Chris@16: void parse( int& argc, char_type** argv ); Chris@16: Chris@16: // parameters access Chris@16: param_iterator first_param() const; Chris@16: param_iterator last_param() const; Chris@16: Chris@16: // arguments access Chris@16: const_argument_ptr operator[]( cstring string_id ) const; Chris@16: cstring get( cstring string_id ) const; Chris@16: Chris@16: template Chris@16: T const& get( cstring string_id ) const Chris@16: { Chris@16: return arg_value( valid_argument( string_id ) ); Chris@16: } Chris@16: Chris@16: template Chris@16: void get( cstring string_id, boost::optional& res ) const Chris@16: { Chris@16: const_argument_ptr actual_arg = (*this)[string_id]; Chris@16: Chris@16: if( actual_arg ) Chris@16: res = arg_value( *actual_arg ); Chris@16: else Chris@16: res.reset(); Chris@16: } Chris@16: Chris@16: // help/usage Chris@16: void usage( out_stream& ostr ); Chris@16: void help( out_stream& ostr ); Chris@16: Chris@16: private: Chris@16: argument const& valid_argument( cstring string_id ) const; Chris@16: Chris@16: // Data members Chris@16: argv_traverser m_traverser; Chris@16: std::list m_parameters; Chris@16: dstring m_program_name; Chris@16: }; Chris@16: Chris@16: //____________________________________________________________________________// Chris@16: Chris@16: } // namespace cla Chris@16: Chris@16: } // namespace BOOST_RT_PARAM_NAMESPACE Chris@16: Chris@16: } // namespace boost Chris@16: Chris@16: #ifndef BOOST_RT_PARAM_OFFLINE Chris@16: Chris@16: # define BOOST_RT_PARAM_INLINE inline Chris@16: # include Chris@16: Chris@16: #endif Chris@16: Chris@16: #endif // BOOST_RT_CLA_PARSER_HPP_062604GER