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