xref: /aosp_15_r20/external/armnn/samples/common/src/Utils/CmdArgsParser.cpp (revision 89c4ff92f2867872bb9e2354d150bf0c8c502810)
1*89c4ff92SAndroid Build Coastguard Worker //
2*89c4ff92SAndroid Build Coastguard Worker // Copyright © 2020 Arm Ltd and Contributors. All rights reserved.
3*89c4ff92SAndroid Build Coastguard Worker // SPDX-License-Identifier: MIT
4*89c4ff92SAndroid Build Coastguard Worker //
5*89c4ff92SAndroid Build Coastguard Worker 
6*89c4ff92SAndroid Build Coastguard Worker #include "CmdArgsParser.hpp"
7*89c4ff92SAndroid Build Coastguard Worker #include <iostream>
8*89c4ff92SAndroid Build Coastguard Worker /*
9*89c4ff92SAndroid Build Coastguard Worker  * Checks that a particular option was specified by the user
10*89c4ff92SAndroid Build Coastguard Worker  */
CheckOptionSpecified(const std::map<std::string,std::string> & options,const std::string & option)11*89c4ff92SAndroid Build Coastguard Worker bool CheckOptionSpecified(const std::map<std::string, std::string>& options, const std::string& option)
12*89c4ff92SAndroid Build Coastguard Worker {
13*89c4ff92SAndroid Build Coastguard Worker     auto it = options.find(option);
14*89c4ff92SAndroid Build Coastguard Worker     return it!=options.end();
15*89c4ff92SAndroid Build Coastguard Worker }
16*89c4ff92SAndroid Build Coastguard Worker 
17*89c4ff92SAndroid Build Coastguard Worker /*
18*89c4ff92SAndroid Build Coastguard Worker  * Retrieves the user provided option
19*89c4ff92SAndroid Build Coastguard Worker  */
GetSpecifiedOption(const std::map<std::string,std::string> & options,const std::string & option)20*89c4ff92SAndroid Build Coastguard Worker std::string GetSpecifiedOption(const std::map<std::string, std::string>& options, const std::string& option)
21*89c4ff92SAndroid Build Coastguard Worker {
22*89c4ff92SAndroid Build Coastguard Worker     if (CheckOptionSpecified(options, option)){
23*89c4ff92SAndroid Build Coastguard Worker         return options.at(option);
24*89c4ff92SAndroid Build Coastguard Worker     }
25*89c4ff92SAndroid Build Coastguard Worker     else
26*89c4ff92SAndroid Build Coastguard Worker     {
27*89c4ff92SAndroid Build Coastguard Worker         throw std::invalid_argument("Required option: " + option + " not defined.");
28*89c4ff92SAndroid Build Coastguard Worker     }
29*89c4ff92SAndroid Build Coastguard Worker }
30*89c4ff92SAndroid Build Coastguard Worker 
31*89c4ff92SAndroid Build Coastguard Worker /*
32*89c4ff92SAndroid Build Coastguard Worker  * Parses all the command line options provided by the user and stores in a map.
33*89c4ff92SAndroid Build Coastguard Worker  */
ParseOptions(std::map<std::string,std::string> & options,std::map<std::string,std::string> & acceptedOptions,char * argv[],int argc)34*89c4ff92SAndroid Build Coastguard Worker int ParseOptions(std::map<std::string, std::string>& options, std::map<std::string, std::string>& acceptedOptions,
35*89c4ff92SAndroid Build Coastguard Worker                  char *argv[], int argc)
36*89c4ff92SAndroid Build Coastguard Worker {
37*89c4ff92SAndroid Build Coastguard Worker     for (int i = 1; i < argc; ++i)
38*89c4ff92SAndroid Build Coastguard Worker     {
39*89c4ff92SAndroid Build Coastguard Worker         std::string currentOption = std::string(argv[i]);
40*89c4ff92SAndroid Build Coastguard Worker         auto it = acceptedOptions.find(currentOption);
41*89c4ff92SAndroid Build Coastguard Worker         if (it != acceptedOptions.end())
42*89c4ff92SAndroid Build Coastguard Worker         {
43*89c4ff92SAndroid Build Coastguard Worker             if (i + 1 < argc && std::string(argv[i + 1]).rfind("--", 0) != 0)
44*89c4ff92SAndroid Build Coastguard Worker             {
45*89c4ff92SAndroid Build Coastguard Worker                 std::string value = argv[++i];
46*89c4ff92SAndroid Build Coastguard Worker                 options.insert({it->first, value});
47*89c4ff92SAndroid Build Coastguard Worker             }
48*89c4ff92SAndroid Build Coastguard Worker             else if (std::string(argv[i]) == "HELP")
49*89c4ff92SAndroid Build Coastguard Worker             {
50*89c4ff92SAndroid Build Coastguard Worker                 std::cout << "Available options" << std::endl;
51*89c4ff92SAndroid Build Coastguard Worker                 for (auto & acceptedOption : acceptedOptions)
52*89c4ff92SAndroid Build Coastguard Worker                 {
53*89c4ff92SAndroid Build Coastguard Worker                     std::cout << acceptedOption.first << " : " << acceptedOption.second << std::endl;
54*89c4ff92SAndroid Build Coastguard Worker                 }
55*89c4ff92SAndroid Build Coastguard Worker                 return 2;
56*89c4ff92SAndroid Build Coastguard Worker             }
57*89c4ff92SAndroid Build Coastguard Worker             else
58*89c4ff92SAndroid Build Coastguard Worker             {
59*89c4ff92SAndroid Build Coastguard Worker                 std::cerr << std::string(argv[i]) << " option requires one argument." << std::endl;
60*89c4ff92SAndroid Build Coastguard Worker                 return 1;
61*89c4ff92SAndroid Build Coastguard Worker             }
62*89c4ff92SAndroid Build Coastguard Worker         }
63*89c4ff92SAndroid Build Coastguard Worker         else
64*89c4ff92SAndroid Build Coastguard Worker         {
65*89c4ff92SAndroid Build Coastguard Worker             std::cerr << "Unrecognised option: " << std::string(argv[i]) << std::endl;
66*89c4ff92SAndroid Build Coastguard Worker             return 1;
67*89c4ff92SAndroid Build Coastguard Worker         }
68*89c4ff92SAndroid Build Coastguard Worker     }
69*89c4ff92SAndroid Build Coastguard Worker     return 0;
70*89c4ff92SAndroid Build Coastguard Worker }
71