You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and dots ('.'), can be up to 35 characters long. Letters must be lowercase.
146 lines
4.3 KiB
146 lines
4.3 KiB
// Copyright Vladimir Prus 2004. |
|
// Distributed under the Boost Software License, Version 1.0. |
|
// (See accompanying file LICENSE_1_0.txt |
|
// or copy at http://www.boost.org/LICENSE_1_0.txt) |
|
|
|
#ifndef BOOST_PARSERS_HPP_VP_2004_05_06 |
|
#define BOOST_PARSERS_HPP_VP_2004_05_06 |
|
|
|
#include <boost/program_options/detail/convert.hpp> |
|
|
|
#include <iterator> |
|
|
|
namespace boost { namespace program_options { |
|
|
|
namespace detail { |
|
template<class charT, class Iterator> |
|
std::vector<std::basic_string<charT> > |
|
make_vector(Iterator i, Iterator e) |
|
{ |
|
std::vector<std::basic_string<charT> > result; |
|
// Some compilers don't have templated constructor for |
|
// vector, so we can't create vector from (argv+1, argv+argc) range |
|
for(; i != e; ++i) |
|
result.push_back(*i); |
|
return result; |
|
} |
|
} |
|
|
|
template<class charT> |
|
basic_command_line_parser<charT>:: |
|
basic_command_line_parser(const std::vector< |
|
std::basic_string<charT> >& xargs) |
|
: detail::cmdline(to_internal(xargs)) |
|
{} |
|
|
|
|
|
template<class charT> |
|
basic_command_line_parser<charT>:: |
|
basic_command_line_parser(int argc, const charT* const argv[]) |
|
: detail::cmdline( |
|
// Explicit template arguments are required by gcc 3.3.1 |
|
// (at least mingw version), and do no harm on other compilers. |
|
to_internal(detail::make_vector<charT, const charT* const*>(argv+1, argv+argc+!argc))) |
|
{} |
|
|
|
|
|
template<class charT> |
|
basic_command_line_parser<charT>& |
|
basic_command_line_parser<charT>::options(const options_description& desc) |
|
{ |
|
detail::cmdline::set_options_description(desc); |
|
m_desc = &desc; |
|
return *this; |
|
} |
|
|
|
template<class charT> |
|
basic_command_line_parser<charT>& |
|
basic_command_line_parser<charT>::positional( |
|
const positional_options_description& desc) |
|
{ |
|
detail::cmdline::set_positional_options(desc); |
|
return *this; |
|
} |
|
|
|
template<class charT> |
|
basic_command_line_parser<charT>& |
|
basic_command_line_parser<charT>::style(int xstyle) |
|
{ |
|
detail::cmdline::style(xstyle); |
|
return *this; |
|
} |
|
|
|
template<class charT> |
|
basic_command_line_parser<charT>& |
|
basic_command_line_parser<charT>::extra_parser(ext_parser ext) |
|
{ |
|
detail::cmdline::set_additional_parser(ext); |
|
return *this; |
|
} |
|
|
|
template<class charT> |
|
basic_command_line_parser<charT>& |
|
basic_command_line_parser<charT>::allow_unregistered() |
|
{ |
|
detail::cmdline::allow_unregistered(); |
|
return *this; |
|
} |
|
|
|
template<class charT> |
|
basic_command_line_parser<charT>& |
|
basic_command_line_parser<charT>::extra_style_parser(style_parser s) |
|
{ |
|
detail::cmdline::extra_style_parser(s); |
|
return *this; |
|
} |
|
|
|
|
|
|
|
template<class charT> |
|
basic_parsed_options<charT> |
|
basic_command_line_parser<charT>::run() |
|
{ |
|
parsed_options result(m_desc); |
|
result.options = detail::cmdline::run(); |
|
|
|
// Presense of parsed_options -> wparsed_options conversion |
|
// does the trick. |
|
return basic_parsed_options<charT>(result); |
|
} |
|
|
|
|
|
template<class charT> |
|
basic_parsed_options<charT> |
|
parse_command_line(int argc, const charT* const argv[], |
|
const options_description& desc, |
|
int style, |
|
function1<std::pair<std::string, std::string>, |
|
const std::string&> ext) |
|
{ |
|
return basic_command_line_parser<charT>(argc, argv).options(desc). |
|
style(style).extra_parser(ext).run(); |
|
} |
|
|
|
template<class charT> |
|
std::vector< std::basic_string<charT> > |
|
collect_unrecognized(const std::vector< basic_option<charT> >& options, |
|
enum collect_unrecognized_mode mode) |
|
{ |
|
std::vector< std::basic_string<charT> > result; |
|
for(unsigned i = 0; i < options.size(); ++i) |
|
{ |
|
if (options[i].unregistered || |
|
(mode == include_positional && options[i].position_key != -1)) |
|
{ |
|
copy(options[i].original_tokens.begin(), |
|
options[i].original_tokens.end(), |
|
back_inserter(result)); |
|
} |
|
} |
|
return result; |
|
} |
|
|
|
|
|
}} |
|
|
|
#endif
|
|
|