annotate DEPENDENCIES/generic/include/boost/program_options/detail/parsers.hpp @ 133:4acb5d8d80b6 tip

Don't fail environmental check if README.md exists (but .txt and no-suffix don't)
author Chris Cannam
date Tue, 30 Jul 2019 12:25:44 +0100
parents 2665513ce2d3
children
rev   line source
Chris@16 1 // Copyright Vladimir Prus 2004.
Chris@16 2 // Distributed under the Boost Software License, Version 1.0.
Chris@16 3 // (See accompanying file LICENSE_1_0.txt
Chris@16 4 // or copy at http://www.boost.org/LICENSE_1_0.txt)
Chris@16 5
Chris@16 6 #ifndef BOOST_PARSERS_HPP_VP_2004_05_06
Chris@16 7 #define BOOST_PARSERS_HPP_VP_2004_05_06
Chris@16 8
Chris@16 9 #include <boost/program_options/detail/convert.hpp>
Chris@16 10
Chris@16 11 #include <iterator>
Chris@16 12
Chris@16 13 namespace boost { namespace program_options {
Chris@16 14
Chris@16 15 namespace detail {
Chris@16 16 template<class charT, class Iterator>
Chris@16 17 std::vector<std::basic_string<charT> >
Chris@16 18 make_vector(Iterator i, Iterator e)
Chris@16 19 {
Chris@16 20 std::vector<std::basic_string<charT> > result;
Chris@16 21 // Some compilers don't have templated constructor for
Chris@16 22 // vector, so we can't create vector from (argv+1, argv+argc) range
Chris@16 23 for(; i != e; ++i)
Chris@16 24 result.push_back(*i);
Chris@16 25 return result;
Chris@16 26 }
Chris@16 27 }
Chris@16 28
Chris@16 29 template<class charT>
Chris@16 30 basic_command_line_parser<charT>::
Chris@16 31 basic_command_line_parser(const std::vector<
Chris@16 32 std::basic_string<charT> >& xargs)
Chris@16 33 : detail::cmdline(to_internal(xargs))
Chris@16 34 {}
Chris@16 35
Chris@16 36
Chris@16 37 template<class charT>
Chris@16 38 basic_command_line_parser<charT>::
Chris@16 39 basic_command_line_parser(int argc, const charT* const argv[])
Chris@16 40 : detail::cmdline(
Chris@16 41 // Explicit template arguments are required by gcc 3.3.1
Chris@16 42 // (at least mingw version), and do no harm on other compilers.
Chris@16 43 to_internal(detail::make_vector<charT, const charT* const*>(argv+1, argv+argc+!argc)))
Chris@16 44 {}
Chris@16 45
Chris@16 46
Chris@16 47 template<class charT>
Chris@16 48 basic_command_line_parser<charT>&
Chris@16 49 basic_command_line_parser<charT>::options(const options_description& desc)
Chris@16 50 {
Chris@16 51 detail::cmdline::set_options_description(desc);
Chris@16 52 m_desc = &desc;
Chris@16 53 return *this;
Chris@16 54 }
Chris@16 55
Chris@16 56 template<class charT>
Chris@16 57 basic_command_line_parser<charT>&
Chris@16 58 basic_command_line_parser<charT>::positional(
Chris@16 59 const positional_options_description& desc)
Chris@16 60 {
Chris@16 61 detail::cmdline::set_positional_options(desc);
Chris@16 62 return *this;
Chris@16 63 }
Chris@16 64
Chris@16 65 template<class charT>
Chris@16 66 basic_command_line_parser<charT>&
Chris@16 67 basic_command_line_parser<charT>::style(int xstyle)
Chris@16 68 {
Chris@16 69 detail::cmdline::style(xstyle);
Chris@16 70 return *this;
Chris@16 71 }
Chris@16 72
Chris@16 73 template<class charT>
Chris@16 74 basic_command_line_parser<charT>&
Chris@16 75 basic_command_line_parser<charT>::extra_parser(ext_parser ext)
Chris@16 76 {
Chris@16 77 detail::cmdline::set_additional_parser(ext);
Chris@16 78 return *this;
Chris@16 79 }
Chris@16 80
Chris@16 81 template<class charT>
Chris@16 82 basic_command_line_parser<charT>&
Chris@16 83 basic_command_line_parser<charT>::allow_unregistered()
Chris@16 84 {
Chris@16 85 detail::cmdline::allow_unregistered();
Chris@16 86 return *this;
Chris@16 87 }
Chris@16 88
Chris@16 89 template<class charT>
Chris@16 90 basic_command_line_parser<charT>&
Chris@16 91 basic_command_line_parser<charT>::extra_style_parser(style_parser s)
Chris@16 92 {
Chris@16 93 detail::cmdline::extra_style_parser(s);
Chris@16 94 return *this;
Chris@16 95 }
Chris@16 96
Chris@16 97
Chris@16 98
Chris@16 99 template<class charT>
Chris@16 100 basic_parsed_options<charT>
Chris@16 101 basic_command_line_parser<charT>::run()
Chris@16 102 {
Chris@16 103 // save the canonical prefixes which were used by this cmdline parser
Chris@16 104 // eventually inside the parsed results
Chris@16 105 // This will be handy to format recognisable options
Chris@16 106 // for diagnostic messages if everything blows up much later on
Chris@16 107 parsed_options result(m_desc, detail::cmdline::get_canonical_option_prefix());
Chris@16 108 result.options = detail::cmdline::run();
Chris@16 109
Chris@16 110 // Presense of parsed_options -> wparsed_options conversion
Chris@16 111 // does the trick.
Chris@16 112 return basic_parsed_options<charT>(result);
Chris@16 113 }
Chris@16 114
Chris@16 115
Chris@16 116 template<class charT>
Chris@16 117 basic_parsed_options<charT>
Chris@16 118 parse_command_line(int argc, const charT* const argv[],
Chris@16 119 const options_description& desc,
Chris@16 120 int style,
Chris@16 121 function1<std::pair<std::string, std::string>,
Chris@16 122 const std::string&> ext)
Chris@16 123 {
Chris@16 124 return basic_command_line_parser<charT>(argc, argv).options(desc).
Chris@16 125 style(style).extra_parser(ext).run();
Chris@16 126 }
Chris@16 127
Chris@16 128 template<class charT>
Chris@16 129 std::vector< std::basic_string<charT> >
Chris@16 130 collect_unrecognized(const std::vector< basic_option<charT> >& options,
Chris@16 131 enum collect_unrecognized_mode mode)
Chris@16 132 {
Chris@16 133 std::vector< std::basic_string<charT> > result;
Chris@16 134 for(unsigned i = 0; i < options.size(); ++i)
Chris@16 135 {
Chris@16 136 if (options[i].unregistered ||
Chris@16 137 (mode == include_positional && options[i].position_key != -1))
Chris@16 138 {
Chris@16 139 copy(options[i].original_tokens.begin(),
Chris@16 140 options[i].original_tokens.end(),
Chris@16 141 back_inserter(result));
Chris@16 142 }
Chris@16 143 }
Chris@16 144 return result;
Chris@16 145 }
Chris@16 146
Chris@16 147
Chris@16 148 }}
Chris@16 149
Chris@16 150 #endif