xref: /aosp_15_r20/external/armnn/third-party/cxxopts/README.md (revision 89c4ff92f2867872bb9e2354d150bf0c8c502810)
1*89c4ff92SAndroid Build Coastguard Worker[![Build Status](https://travis-ci.org/jarro2783/cxxopts.svg?branch=master)](https://travis-ci.org/jarro2783/cxxopts)
2*89c4ff92SAndroid Build Coastguard Worker
3*89c4ff92SAndroid Build Coastguard Worker# Release versions
4*89c4ff92SAndroid Build Coastguard Worker
5*89c4ff92SAndroid Build Coastguard WorkerNote that `master` is generally a work in progress, and you probably want to use a
6*89c4ff92SAndroid Build Coastguard Workertagged release version.
7*89c4ff92SAndroid Build Coastguard Worker
8*89c4ff92SAndroid Build Coastguard Worker## Version 3 breaking changes
9*89c4ff92SAndroid Build Coastguard Worker
10*89c4ff92SAndroid Build Coastguard WorkerIf you have used version 2, there are a couple of breaking changes in (the as
11*89c4ff92SAndroid Build Coastguard Workeryet unreleased, current master) version 3 that you should be aware of. If you are new to
12*89c4ff92SAndroid Build Coastguard Worker`cxxopts` you can skip this section.
13*89c4ff92SAndroid Build Coastguard Worker
14*89c4ff92SAndroid Build Coastguard WorkerThe parser no longer modifies its arguments, so you can pass a const `argc` and
15*89c4ff92SAndroid Build Coastguard Worker`argv` and expect them not to be changed.
16*89c4ff92SAndroid Build Coastguard Worker
17*89c4ff92SAndroid Build Coastguard WorkerThe `ParseResult` object no longer depends on the parser. So it can be returned
18*89c4ff92SAndroid Build Coastguard Workerfrom a scope outside the parser and still work. Now that the inputs are not
19*89c4ff92SAndroid Build Coastguard Workermodified, `ParseResult` stores a list of the unmatched arguments. These are
20*89c4ff92SAndroid Build Coastguard Workerretrieved like follows:
21*89c4ff92SAndroid Build Coastguard Worker
22*89c4ff92SAndroid Build Coastguard Worker```cpp
23*89c4ff92SAndroid Build Coastguard Workerauto result = options.parse(argc, argv);
24*89c4ff92SAndroid Build Coastguard Workerresult.unmatched(); // get the unmatched arguments
25*89c4ff92SAndroid Build Coastguard Worker```
26*89c4ff92SAndroid Build Coastguard Worker
27*89c4ff92SAndroid Build Coastguard Worker# Quick start
28*89c4ff92SAndroid Build Coastguard Worker
29*89c4ff92SAndroid Build Coastguard WorkerThis is a lightweight C++ option parser library, supporting the standard GNU
30*89c4ff92SAndroid Build Coastguard Workerstyle syntax for options.
31*89c4ff92SAndroid Build Coastguard Worker
32*89c4ff92SAndroid Build Coastguard WorkerOptions can be given as:
33*89c4ff92SAndroid Build Coastguard Worker
34*89c4ff92SAndroid Build Coastguard Worker    --long
35*89c4ff92SAndroid Build Coastguard Worker    --long=argument
36*89c4ff92SAndroid Build Coastguard Worker    --long argument
37*89c4ff92SAndroid Build Coastguard Worker    -a
38*89c4ff92SAndroid Build Coastguard Worker    -ab
39*89c4ff92SAndroid Build Coastguard Worker    -abc argument
40*89c4ff92SAndroid Build Coastguard Worker
41*89c4ff92SAndroid Build Coastguard Workerwhere c takes an argument, but a and b do not.
42*89c4ff92SAndroid Build Coastguard Worker
43*89c4ff92SAndroid Build Coastguard WorkerAdditionally, anything after `--` will be parsed as a positional argument.
44*89c4ff92SAndroid Build Coastguard Worker
45*89c4ff92SAndroid Build Coastguard Worker## Basics
46*89c4ff92SAndroid Build Coastguard Worker
47*89c4ff92SAndroid Build Coastguard Worker```cpp
48*89c4ff92SAndroid Build Coastguard Worker#include <cxxopts.hpp>
49*89c4ff92SAndroid Build Coastguard Worker```
50*89c4ff92SAndroid Build Coastguard Worker
51*89c4ff92SAndroid Build Coastguard WorkerCreate a `cxxopts::Options` instance.
52*89c4ff92SAndroid Build Coastguard Worker
53*89c4ff92SAndroid Build Coastguard Worker```cpp
54*89c4ff92SAndroid Build Coastguard Workercxxopts::Options options("MyProgram", "One line description of MyProgram");
55*89c4ff92SAndroid Build Coastguard Worker```
56*89c4ff92SAndroid Build Coastguard Worker
57*89c4ff92SAndroid Build Coastguard WorkerThen use `add_options`.
58*89c4ff92SAndroid Build Coastguard Worker
59*89c4ff92SAndroid Build Coastguard Worker```cpp
60*89c4ff92SAndroid Build Coastguard Workeroptions.add_options()
61*89c4ff92SAndroid Build Coastguard Worker  ("d,debug", "Enable debugging") // a bool parameter
62*89c4ff92SAndroid Build Coastguard Worker  ("i,integer", "Int param", cxxopts::value<int>())
63*89c4ff92SAndroid Build Coastguard Worker  ("f,file", "File name", cxxopts::value<std::string>())
64*89c4ff92SAndroid Build Coastguard Worker  ("v,verbose", "Verbose output", cxxopts::value<bool>()->default_value("false"))
65*89c4ff92SAndroid Build Coastguard Worker  ;
66*89c4ff92SAndroid Build Coastguard Worker```
67*89c4ff92SAndroid Build Coastguard Worker
68*89c4ff92SAndroid Build Coastguard WorkerOptions are declared with a long and an optional short option. A description
69*89c4ff92SAndroid Build Coastguard Workermust be provided. The third argument is the value, if omitted it is boolean.
70*89c4ff92SAndroid Build Coastguard WorkerAny type can be given as long as it can be parsed, with operator>>.
71*89c4ff92SAndroid Build Coastguard Worker
72*89c4ff92SAndroid Build Coastguard WorkerTo parse the command line do:
73*89c4ff92SAndroid Build Coastguard Worker
74*89c4ff92SAndroid Build Coastguard Worker```cpp
75*89c4ff92SAndroid Build Coastguard Workerauto result = options.parse(argc, argv);
76*89c4ff92SAndroid Build Coastguard Worker```
77*89c4ff92SAndroid Build Coastguard Worker
78*89c4ff92SAndroid Build Coastguard WorkerTo retrieve an option use `result.count("option")` to get the number of times
79*89c4ff92SAndroid Build Coastguard Workerit appeared, and
80*89c4ff92SAndroid Build Coastguard Worker
81*89c4ff92SAndroid Build Coastguard Worker```cpp
82*89c4ff92SAndroid Build Coastguard Workerresult["opt"].as<type>()
83*89c4ff92SAndroid Build Coastguard Worker```
84*89c4ff92SAndroid Build Coastguard Worker
85*89c4ff92SAndroid Build Coastguard Workerto get its value. If "opt" doesn't exist, or isn't of the right type, then an
86*89c4ff92SAndroid Build Coastguard Workerexception will be thrown.
87*89c4ff92SAndroid Build Coastguard Worker
88*89c4ff92SAndroid Build Coastguard WorkerNote that the result of `options.parse` should only be used as long as the
89*89c4ff92SAndroid Build Coastguard Worker`options` object that created it is in scope.
90*89c4ff92SAndroid Build Coastguard Worker
91*89c4ff92SAndroid Build Coastguard Worker## Unrecognised arguments
92*89c4ff92SAndroid Build Coastguard Worker
93*89c4ff92SAndroid Build Coastguard WorkerYou can allow unrecognised arguments to be skipped. This applies to both
94*89c4ff92SAndroid Build Coastguard Workerpositional arguments that are not parsed into another option, and `--`
95*89c4ff92SAndroid Build Coastguard Workerarguments that do not match an argument that you specify. This is done by
96*89c4ff92SAndroid Build Coastguard Workercalling:
97*89c4ff92SAndroid Build Coastguard Worker
98*89c4ff92SAndroid Build Coastguard Worker```cpp
99*89c4ff92SAndroid Build Coastguard Workeroptions.allow_unrecognised_options();
100*89c4ff92SAndroid Build Coastguard Worker```
101*89c4ff92SAndroid Build Coastguard Worker
102*89c4ff92SAndroid Build Coastguard Workerand in the result object they are retrieved with:
103*89c4ff92SAndroid Build Coastguard Worker
104*89c4ff92SAndroid Build Coastguard Worker```cpp
105*89c4ff92SAndroid Build Coastguard Workerresult.unmatched()
106*89c4ff92SAndroid Build Coastguard Worker```
107*89c4ff92SAndroid Build Coastguard Worker
108*89c4ff92SAndroid Build Coastguard Worker## Exceptions
109*89c4ff92SAndroid Build Coastguard Worker
110*89c4ff92SAndroid Build Coastguard WorkerExceptional situations throw C++ exceptions. There are two types of
111*89c4ff92SAndroid Build Coastguard Workerexceptions: errors defining the options, and errors when parsing a list of
112*89c4ff92SAndroid Build Coastguard Workerarguments. All exceptions derive from `cxxopts::OptionException`. Errors
113*89c4ff92SAndroid Build Coastguard Workerdefining options derive from `cxxopts::OptionSpecException` and errors
114*89c4ff92SAndroid Build Coastguard Workerparsing arguments derive from `cxxopts::OptionParseException`.
115*89c4ff92SAndroid Build Coastguard Worker
116*89c4ff92SAndroid Build Coastguard WorkerAll exceptions define a `what()` function to get a printable string
117*89c4ff92SAndroid Build Coastguard Workerexplaining the error.
118*89c4ff92SAndroid Build Coastguard Worker
119*89c4ff92SAndroid Build Coastguard Worker## Help groups
120*89c4ff92SAndroid Build Coastguard Worker
121*89c4ff92SAndroid Build Coastguard WorkerOptions can be placed into groups for the purposes of displaying help messages.
122*89c4ff92SAndroid Build Coastguard WorkerTo place options in a group, pass the group as a string to `add_options`. Then,
123*89c4ff92SAndroid Build Coastguard Workerwhen displaying the help, pass the groups that you would like displayed as a
124*89c4ff92SAndroid Build Coastguard Workervector to the `help` function.
125*89c4ff92SAndroid Build Coastguard Worker
126*89c4ff92SAndroid Build Coastguard Worker## Positional Arguments
127*89c4ff92SAndroid Build Coastguard Worker
128*89c4ff92SAndroid Build Coastguard WorkerPositional arguments can be optionally parsed into one or more options.
129*89c4ff92SAndroid Build Coastguard WorkerTo set up positional arguments, call
130*89c4ff92SAndroid Build Coastguard Worker
131*89c4ff92SAndroid Build Coastguard Worker```cpp
132*89c4ff92SAndroid Build Coastguard Workeroptions.parse_positional({"first", "second", "last"})
133*89c4ff92SAndroid Build Coastguard Worker```
134*89c4ff92SAndroid Build Coastguard Worker
135*89c4ff92SAndroid Build Coastguard Workerwhere "last" should be the name of an option with a container type, and the
136*89c4ff92SAndroid Build Coastguard Workerothers should have a single value.
137*89c4ff92SAndroid Build Coastguard Worker
138*89c4ff92SAndroid Build Coastguard Worker## Default and implicit values
139*89c4ff92SAndroid Build Coastguard Worker
140*89c4ff92SAndroid Build Coastguard WorkerAn option can be declared with a default or an implicit value, or both.
141*89c4ff92SAndroid Build Coastguard Worker
142*89c4ff92SAndroid Build Coastguard WorkerA default value is the value that an option takes when it is not specified
143*89c4ff92SAndroid Build Coastguard Workeron the command line. The following specifies a default value for an option:
144*89c4ff92SAndroid Build Coastguard Worker
145*89c4ff92SAndroid Build Coastguard Worker```cpp
146*89c4ff92SAndroid Build Coastguard Workercxxopts::value<std::string>()->default_value("value")
147*89c4ff92SAndroid Build Coastguard Worker```
148*89c4ff92SAndroid Build Coastguard Worker
149*89c4ff92SAndroid Build Coastguard WorkerAn implicit value is the value that an option takes when it is given on the
150*89c4ff92SAndroid Build Coastguard Workercommand line without an argument. The following specifies an implicit value:
151*89c4ff92SAndroid Build Coastguard Worker
152*89c4ff92SAndroid Build Coastguard Worker```cpp
153*89c4ff92SAndroid Build Coastguard Workercxxopts::value<std::string>()->implicit_value("implicit")
154*89c4ff92SAndroid Build Coastguard Worker```
155*89c4ff92SAndroid Build Coastguard Worker
156*89c4ff92SAndroid Build Coastguard WorkerIf an option had both, then not specifying it would give the value `"value"`,
157*89c4ff92SAndroid Build Coastguard Workerwriting it on the command line as `--option` would give the value `"implicit"`,
158*89c4ff92SAndroid Build Coastguard Workerand writing `--option=another` would give it the value `"another"`.
159*89c4ff92SAndroid Build Coastguard Worker
160*89c4ff92SAndroid Build Coastguard WorkerNote that the default and implicit value is always stored as a string,
161*89c4ff92SAndroid Build Coastguard Workerregardless of the type that you want to store it in. It will be parsed as
162*89c4ff92SAndroid Build Coastguard Workerthough it was given on the command line.
163*89c4ff92SAndroid Build Coastguard Worker
164*89c4ff92SAndroid Build Coastguard Worker## Boolean values
165*89c4ff92SAndroid Build Coastguard Worker
166*89c4ff92SAndroid Build Coastguard WorkerBoolean options have a default implicit value of `"true"`, which can be
167*89c4ff92SAndroid Build Coastguard Workeroverridden. The effect is that writing `-o` by itself will set option `o` to
168*89c4ff92SAndroid Build Coastguard Worker`true`. However, they can also be written with various strings using `=value`.
169*89c4ff92SAndroid Build Coastguard WorkerThere is no way to disambiguate positional arguments from the value following
170*89c4ff92SAndroid Build Coastguard Workera boolean, so we have chosen that they will be positional arguments, and
171*89c4ff92SAndroid Build Coastguard Workertherefore, `-o false` does not work.
172*89c4ff92SAndroid Build Coastguard Worker
173*89c4ff92SAndroid Build Coastguard Worker## `std::vector<T>` values
174*89c4ff92SAndroid Build Coastguard Worker
175*89c4ff92SAndroid Build Coastguard WorkerParsing of list of values in form of an `std::vector<T>` is also supported, as long as `T`
176*89c4ff92SAndroid Build Coastguard Workercan be parsed. To separate single values in a list the definition `CXXOPTS_VECTOR_DELIMITER`
177*89c4ff92SAndroid Build Coastguard Workeris used, which is ',' by default. Ensure that you use no whitespaces between values because
178*89c4ff92SAndroid Build Coastguard Workerthose would be interpreted as the next command line option. Example for a command line option
179*89c4ff92SAndroid Build Coastguard Workerthat can be parsed as a `std::vector<double>`:
180*89c4ff92SAndroid Build Coastguard Worker
181*89c4ff92SAndroid Build Coastguard Worker~~~
182*89c4ff92SAndroid Build Coastguard Worker--my_list=1,-2.1,3,4.5
183*89c4ff92SAndroid Build Coastguard Worker~~~
184*89c4ff92SAndroid Build Coastguard Worker
185*89c4ff92SAndroid Build Coastguard Worker## Options specified multiple times
186*89c4ff92SAndroid Build Coastguard Worker
187*89c4ff92SAndroid Build Coastguard WorkerThe same option can be specified several times, with different arguments, which will all
188*89c4ff92SAndroid Build Coastguard Workerbe recorded in order of appearance. An example:
189*89c4ff92SAndroid Build Coastguard Worker
190*89c4ff92SAndroid Build Coastguard Worker~~~
191*89c4ff92SAndroid Build Coastguard Worker--use train --use bus --use ferry
192*89c4ff92SAndroid Build Coastguard Worker~~~
193*89c4ff92SAndroid Build Coastguard Worker
194*89c4ff92SAndroid Build Coastguard Workerthis is supported through the use of a vector of value for the option:
195*89c4ff92SAndroid Build Coastguard Worker
196*89c4ff92SAndroid Build Coastguard Worker~~~
197*89c4ff92SAndroid Build Coastguard Workeroptions.add_options()
198*89c4ff92SAndroid Build Coastguard Worker  ("use", "Usable means of transport", cxxopts::value<std::vector<std::string>>())
199*89c4ff92SAndroid Build Coastguard Worker~~~
200*89c4ff92SAndroid Build Coastguard Worker
201*89c4ff92SAndroid Build Coastguard Worker## Custom help
202*89c4ff92SAndroid Build Coastguard Worker
203*89c4ff92SAndroid Build Coastguard WorkerThe string after the program name on the first line of the help can be
204*89c4ff92SAndroid Build Coastguard Workercompletely replaced by calling `options.custom_help`. Note that you might
205*89c4ff92SAndroid Build Coastguard Workeralso want to override the positional help by calling `options.positional_help`.
206*89c4ff92SAndroid Build Coastguard Worker
207*89c4ff92SAndroid Build Coastguard Worker
208*89c4ff92SAndroid Build Coastguard Worker## Example
209*89c4ff92SAndroid Build Coastguard Worker
210*89c4ff92SAndroid Build Coastguard WorkerPutting all together:
211*89c4ff92SAndroid Build Coastguard Worker```cpp
212*89c4ff92SAndroid Build Coastguard Workerint main(int argc, char** argv)
213*89c4ff92SAndroid Build Coastguard Worker{
214*89c4ff92SAndroid Build Coastguard Worker    cxxopts::Options options("test", "A brief description");
215*89c4ff92SAndroid Build Coastguard Worker
216*89c4ff92SAndroid Build Coastguard Worker    options.add_options()
217*89c4ff92SAndroid Build Coastguard Worker        ("b,bar", "Param bar", cxxopts::value<std::string>())
218*89c4ff92SAndroid Build Coastguard Worker        ("d,debug", "Enable debugging", cxxopts::value<bool>()->default_value("false"))
219*89c4ff92SAndroid Build Coastguard Worker        ("f,foo", "Param foo", cxxopts::value<int>()->default_value("10"))
220*89c4ff92SAndroid Build Coastguard Worker        ("h,help", "Print usage")
221*89c4ff92SAndroid Build Coastguard Worker    ;
222*89c4ff92SAndroid Build Coastguard Worker
223*89c4ff92SAndroid Build Coastguard Worker    auto result = options.parse(argc, argv);
224*89c4ff92SAndroid Build Coastguard Worker
225*89c4ff92SAndroid Build Coastguard Worker    if (result.count("help"))
226*89c4ff92SAndroid Build Coastguard Worker    {
227*89c4ff92SAndroid Build Coastguard Worker      std::cout << options.help() << std::endl;
228*89c4ff92SAndroid Build Coastguard Worker      exit(0);
229*89c4ff92SAndroid Build Coastguard Worker    }
230*89c4ff92SAndroid Build Coastguard Worker    bool debug = result["debug"].as<bool>();
231*89c4ff92SAndroid Build Coastguard Worker    std::string bar;
232*89c4ff92SAndroid Build Coastguard Worker    if (result.count("bar"))
233*89c4ff92SAndroid Build Coastguard Worker      bar = result["bar"].as<std::string>();
234*89c4ff92SAndroid Build Coastguard Worker    int foo = result["foo"].as<int>();
235*89c4ff92SAndroid Build Coastguard Worker
236*89c4ff92SAndroid Build Coastguard Worker    return 0;
237*89c4ff92SAndroid Build Coastguard Worker}
238*89c4ff92SAndroid Build Coastguard Worker```
239*89c4ff92SAndroid Build Coastguard Worker
240*89c4ff92SAndroid Build Coastguard Worker# Linking
241*89c4ff92SAndroid Build Coastguard Worker
242*89c4ff92SAndroid Build Coastguard WorkerThis is a header only library.
243*89c4ff92SAndroid Build Coastguard Worker
244*89c4ff92SAndroid Build Coastguard Worker# Requirements
245*89c4ff92SAndroid Build Coastguard Worker
246*89c4ff92SAndroid Build Coastguard WorkerThe only build requirement is a C++ compiler that supports C++11 features such as:
247*89c4ff92SAndroid Build Coastguard Worker
248*89c4ff92SAndroid Build Coastguard Worker* regex
249*89c4ff92SAndroid Build Coastguard Worker* constexpr
250*89c4ff92SAndroid Build Coastguard Worker* default constructors
251*89c4ff92SAndroid Build Coastguard Worker
252*89c4ff92SAndroid Build Coastguard WorkerGCC >= 4.9 or clang >= 3.1 with libc++ are known to work.
253*89c4ff92SAndroid Build Coastguard Worker
254*89c4ff92SAndroid Build Coastguard WorkerThe following compilers are known not to work:
255*89c4ff92SAndroid Build Coastguard Worker
256*89c4ff92SAndroid Build Coastguard Worker* MSVC 2013
257*89c4ff92SAndroid Build Coastguard Worker
258*89c4ff92SAndroid Build Coastguard Worker# TODO list
259*89c4ff92SAndroid Build Coastguard Worker
260*89c4ff92SAndroid Build Coastguard Worker* Allow unrecognised options.
261