1 // Copyright Vladimir Prus 2004.
\r
2 // Distributed under the Boost Software License, Version 1.0.
\r
3 // (See accompanying file LICENSE_1_0.txt
\r
4 // or copy at http://www.boost.org/LICENSE_1_0.txt)
\r
6 #ifndef BOOST_PARSERS_HPP_VP_2004_05_06
\r
7 #define BOOST_PARSERS_HPP_VP_2004_05_06
\r
9 #include <boost/program_options/detail/convert.hpp>
\r
13 namespace boost { namespace program_options {
\r
16 template<class charT, class Iterator>
\r
17 std::vector<std::basic_string<charT> >
\r
18 make_vector(Iterator i, Iterator e)
\r
20 std::vector<std::basic_string<charT> > result;
\r
21 // Some compilers don't have templated constructor for
\r
22 // vector, so we can't create vector from (argv+1, argv+argc) range
\r
24 result.push_back(*i);
\r
29 template<class charT>
\r
30 basic_command_line_parser<charT>::
\r
31 basic_command_line_parser(const std::vector<
\r
32 std::basic_string<charT> >& args)
\r
33 : detail::cmdline(to_internal(args))
\r
37 template<class charT>
\r
38 basic_command_line_parser<charT>::
\r
39 basic_command_line_parser(int argc, charT* argv[])
\r
41 // Explicit template arguments are required by gcc 3.3.1
\r
42 // (at least mingw version), and do no harm on other compilers.
\r
43 to_internal(detail::make_vector<charT, charT**>(argv+1, argv+argc+!argc)))
\r
47 template<class charT>
\r
48 basic_command_line_parser<charT>&
\r
49 basic_command_line_parser<charT>::options(const options_description& desc)
\r
51 detail::cmdline::set_options_description(desc);
\r
56 template<class charT>
\r
57 basic_command_line_parser<charT>&
\r
58 basic_command_line_parser<charT>::positional(
\r
59 const positional_options_description& desc)
\r
61 detail::cmdline::set_positional_options(desc);
\r
65 template<class charT>
\r
66 basic_command_line_parser<charT>&
\r
67 basic_command_line_parser<charT>::style(int style)
\r
69 detail::cmdline::style(style);
\r
73 template<class charT>
\r
74 basic_command_line_parser<charT>&
\r
75 basic_command_line_parser<charT>::extra_parser(ext_parser ext)
\r
77 detail::cmdline::set_additional_parser(ext);
\r
81 template<class charT>
\r
82 basic_command_line_parser<charT>&
\r
83 basic_command_line_parser<charT>::allow_unregistered()
\r
85 detail::cmdline::allow_unregistered();
\r
89 template<class charT>
\r
90 basic_command_line_parser<charT>&
\r
91 basic_command_line_parser<charT>::extra_style_parser(style_parser s)
\r
93 detail::cmdline::extra_style_parser(s);
\r
99 template<class charT>
\r
100 basic_parsed_options<charT>
\r
101 basic_command_line_parser<charT>::run()
\r
103 parsed_options result(m_desc);
\r
104 result.options = detail::cmdline::run();
\r
106 // Presense of parsed_options -> wparsed_options conversion
\r
108 return basic_parsed_options<charT>(result);
\r
112 template<class charT>
\r
113 basic_parsed_options<charT>
\r
114 parse_command_line(int argc, charT* argv[],
\r
115 const options_description& desc,
\r
117 function1<std::pair<std::string, std::string>,
\r
118 const std::string&> ext)
\r
120 return basic_command_line_parser<charT>(argc, argv).options(desc).
\r
121 style(style).extra_parser(ext).run();
\r
124 template<class charT>
\r
125 std::vector< std::basic_string<charT> >
\r
126 collect_unrecognized(const std::vector< basic_option<charT> >& options,
\r
127 enum collect_unrecognized_mode mode)
\r
129 std::vector< std::basic_string<charT> > result;
\r
130 for(unsigned i = 0; i < options.size(); ++i)
\r
132 if (options[i].unregistered ||
\r
133 (mode == include_positional && options[i].position_key != -1))
\r
135 copy(options[i].original_tokens.begin(),
\r
136 options[i].original_tokens.end(),
\r
137 back_inserter(result));
\r