// 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 |