1 // Created on: 2015-03-15 2 // Created by: Danila ULYANOV 3 // Copyright (c) 2014 OPEN CASCADE SAS 4 // 5 // This file is part of Open CASCADE Technology software library. 6 // 7 // This library is free software; you can redistribute it and/or modify it under 8 // the terms of the GNU Lesser General Public License version 2.1 as published 9 // by the Free Software Foundation, with special exception defined in the file 10 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT 11 // distribution for complete text of the license and disclaimer of any warranty. 12 // 13 // Alternatively, this file may be used under the terms of Open CASCADE 14 // commercial license or contractual agreement. 15 16 #ifndef _ViewerTest_CmdParser_HeaderFile 17 #define _ViewerTest_CmdParser_HeaderFile 18 19 #include <Graphic3d_Vec3.hxx> 20 21 #include <limits> 22 #include <map> 23 #include <vector> 24 #include <set> 25 #include <string> 26 27 class Quantity_Color; 28 class Quantity_ColorRGBA; 29 class gp_Vec; 30 class gp_Pnt; 31 32 //! A key for a command line option used for a ViewerTest_CmdParser work 33 typedef std::size_t ViewerTest_CommandOptionKey; 34 35 //! A set of keys for command-line options 36 typedef std::set<ViewerTest_CommandOptionKey> ViewerTest_CommandOptionKeySet; 37 38 //! Command parser. 39 class ViewerTest_CmdParser 40 { 41 public: 42 //! The key of the unnamed command option 43 static const std::size_t THE_UNNAMED_COMMAND_OPTION_KEY; 44 45 //! The key of the help command option 46 static const std::size_t THE_HELP_COMMAND_OPTION_KEY; 47 48 //! Initializes help option. 49 //! @param theDescription the description of the command 50 ViewerTest_CmdParser (const std::string& theDescription = std::string()); 51 52 //! Sets description for command. SetDescription(const std::string & theDescription)53 void SetDescription (const std::string& theDescription) 54 { 55 myDescription = theDescription; 56 } 57 58 //! Adds option to available option list. Several names may be provided if separated with '|'. 59 //! @param theOptionNames the list of possible option names separated with '|' 60 //! (the first name is main, the other names are aliases) 61 //! @param theOptionDescription the description of the option 62 //! @return an access key of the newly added option 63 ViewerTest_CommandOptionKey AddOption (const std::string& theOptionNames, 64 const std::string& theOptionDescription = std::string()); 65 66 //! Prints help message based on provided command and options descriptions. 67 void PrintHelp() const; 68 69 //! Parses argument list (skips the command name); assigns local arguments to each option. 70 void Parse (Standard_Integer theArgsNb, const char* const* theArgVec); 71 72 //! Gets an option name by its access key 73 //! @param theOptionKey the access key of the option which name is to be found 74 //! @retuan a name of the option with the given access key 75 std::string GetOptionNameByKey (ViewerTest_CommandOptionKey theOptionKey) const; 76 77 //! Gets a set of used options 78 //! @return a set of used options 79 ViewerTest_CommandOptionKeySet GetUsedOptions() const; 80 81 //! Tests if there were no command line options provided 82 //! @return true if no command line options were provided, or false otherwise 83 bool HasNoOption() const; 84 85 //! Tests if the unnamed command line option was provided 86 //! @return true if the unnamed command line option was provided, or false otherwise 87 bool HasUnnamedOption() const; 88 89 //! Tests if only unnamed command line option was provided 90 //! @return true if only unnamed command line option was provided, or false otherwise 91 bool HasOnlyUnnamedOption() const; 92 93 //! Checks if option was used with given minimal number of arguments. 94 //! Prints error message if isFatal flag was set. 95 //! @param theOptionName the name of the option to be checked 96 //! @param theMandatoryArgsNb the number of mandatory arguments 97 //! @param isFatal the flag that controls printing of an error message 98 //! @return true if an option was set, or false otherwise 99 bool HasOption (const std::string& theOptionName, 100 std::size_t theMandatoryArgsNb = 0, 101 bool isFatal = Standard_False) const; 102 103 //! Checks if option was used with given minimal number of arguments. 104 //! Prints error message if isFatal flag was set. 105 //! @param theOptionKey the access key of the option to be checked 106 //! @param theMandatoryArgsNb the number of mandatory arguments 107 //! @param isFatal the flag that controls printing of an error message 108 //! @return true if an option was set, or false otherwise 109 bool HasOption (ViewerTest_CommandOptionKey theOptionKey, 110 std::size_t theMandatoryArgsNb = 0, 111 bool isFatal = Standard_False) const; 112 113 //! Gets a number of option arguments 114 //! @param theOptionName the name of the option 115 //! @return a number of option arguments, or 0 if option was not used 116 Standard_Integer GetNumberOfOptionArguments (const std::string& theOptionName) const; 117 118 //! Gets a number of option arguments 119 //! @param theOptionKey the access key of the option 120 //! @return a number of option arguments, or 0 if option was not used 121 Standard_Integer GetNumberOfOptionArguments (ViewerTest_CommandOptionKey theOptionKey) const; 122 123 //! Accesses local argument of option 'theOptionName' with index 'theArgumentIndex'. 124 //! @param theOptionName the name of the option which argument is to be accessed 125 //! @param theArgumentIndex the index of an accessed argument 126 //! @param theOptionArgument an argument of the option with the given name 127 //! @return true if an access was successful, or false otherwise 128 bool Arg (const std::string& theOptionName, Standard_Integer theArgumentIndex, std::string& theOptionArgument) const; 129 130 //! Accesses a local argument with the index 'theArgumentIndex' of the option with the key 'theOptionKey'. 131 //! @param theOptionKey the access key of the option which argument is to be accessed 132 //! @param theArgumentIndex the index of an accessed argument 133 //! @param theOptionArgument an argument of the option with the given key 134 //! @return true if an access was successful, or false otherwise 135 bool Arg (ViewerTest_CommandOptionKey theOptionKey, 136 Standard_Integer theArgumentIndex, 137 std::string& theOptionArgument) const; 138 139 //! Accesses local argument of option 'theOptionName' with index 'theArgumentIndex'. 140 //! @param theOptionName the name of the option which argument is to be accessed 141 //! @param theArgumentIndex the index of an accessed argument 142 //! @return an argument of the option with the given name 143 std::string Arg (const std::string& theOptionName, Standard_Integer theArgumentIndex) const; 144 145 //! Accesses a local argument with the index 'theArgumentIndex' of the option with the key 'theOptionKey'. 146 //! @param theOptionKey the access key of the option which argument is to be accessed 147 //! @param theArgumentIndex the index of an accessed argument 148 //! @return an argument of the option with the given key 149 std::string Arg (ViewerTest_CommandOptionKey theOptionKey, Standard_Integer theArgumentIndex) const; 150 151 // Interprets arguments of option 'theOptionName' as float vector starting with index 'theArgumentIndex'. 152 Graphic3d_Vec3 ArgVec3f (const std::string& theOptionName, const Standard_Integer theArgumentIndex = 0) const; 153 154 // Interprets arguments of option 'theOptionName' as double vector starting with index 'theArgumentIndex'. 155 Graphic3d_Vec3d ArgVec3d (const std::string& theOptionName, const Standard_Integer theArgumentIndex = 0) const; 156 157 // Interprets arguments of option 'theOptionName' as gp vector starting with index 'theArgumentIndex'. 158 gp_Vec ArgVec (const std::string& theOptionName, const Standard_Integer theArgumentIndex = 0) const; 159 160 // Interprets arguments of option 'theOptionName' as gp vector starting with index 'theArgumentIndex'. 161 gp_Pnt ArgPnt (const std::string& theOptionName, const Standard_Integer theArgumentIndex = 0) const; 162 163 // Interprets arguments of option 'theOptionName' as double at index 'theArgumentIndex'. 164 Standard_Real ArgDouble (const std::string& theOptionName, const Standard_Integer theArgumentIndex = 0) const; 165 166 // Interprets arguments of option 'theOptionName' as float at index 'theArgumentIndex'. 167 Standard_ShortReal ArgFloat (const std::string& theOptionName, const Standard_Integer theArgumentIndex = 0) const; 168 169 // Interprets arguments of option 'theOptionName' as integer at index 'theArgumentIndex'. 170 Standard_Integer ArgInt (const std::string& theOptionName, const Standard_Integer theArgumentIndex = 0) const; 171 172 // Interprets arguments of option 'theOptionName' as boolean at index 'theArgumentIndex'. 173 bool ArgBool (const std::string& theOptionName, const Standard_Integer theArgumentIndex = 0) const; 174 175 //! Interprets arguments of the option 'theOptionName' with the index 'theArgumentIndex' as an RGB(A) color object. 176 //! @tparam theColor the type of a resulting RGB(A) color object 177 //! @param theOptionName the name of the option which arguments are to be interpreted 178 //! @param theArgumentIndex the index of the first argument to be interpreted 179 //! (will be promoted to the next argument after the block of interpreted arguments) 180 //! @param theColor a color that is an interpretation of argument(s) of the option with the given name 181 //! @return true if an interpretation was successful, or false otherwise 182 template <typename TheColor> 183 bool ArgColor (const std::string& theOptionName, Standard_Integer& theArgumentIndex, TheColor& theColor) const; 184 185 //! Interprets arguments of the option with the key 'theOptionKey' as an RGB(A) color object. 186 //! @tparam theColor the type of a resulting RGB(A) color object 187 //! @param theOptionKey the access key of the option which arguments are to be interpreted 188 //! @param theArgumentIndex the index of the first argument to be interpreted 189 //! (will be promoted to the next argument after the block of interpreted arguments) 190 //! @param theColor a color that is an interpretation of argument(s) of the option with the given name 191 //! @return true if an interpretation was successful, or false otherwise 192 template <typename TheColor> 193 bool ArgColor (ViewerTest_CommandOptionKey theOptionKey, 194 Standard_Integer& theArgumentIndex, 195 TheColor& theColor) const; 196 197 private: 198 //! A list of aliases to a command option name 199 typedef std::vector<std::string> OptionAliases; 200 201 //! A map from all possible option names to option access keys 202 typedef std::map<std::string, ViewerTest_CommandOptionKey> OptionMap; 203 204 //! A map from keys of used options to their indices in the storage 205 typedef std::map<ViewerTest_CommandOptionKey, std::size_t> UsedOptionMap; 206 207 //! A list of command option arguments 208 typedef std::vector<std::string> OptionArguments; 209 210 //! A storage of arguments of different command options 211 typedef std::vector<OptionArguments> OptionArgumentsStorage; 212 213 //! A full description of a command option 214 struct CommandOption 215 { 216 std::string Name; //!< A command option name 217 OptionAliases Aliases; //!< A list of aliases to a command option name 218 std::string Description; //!< A text description of a command option 219 }; 220 221 // A storage of command options descriptions 222 typedef std::vector<CommandOption> CommandOptionStorage; 223 224 // A list of raw string arguments 225 typedef std::vector<const char*> RawStringArguments; 226 227 //! Description of command. 228 std::string myDescription; 229 230 //! Container which stores option objects. 231 std::vector<CommandOption> myOptionStorage; 232 233 //! Map from all possible option names to option access keys (that are indices in myOptionStorage) 234 OptionMap myOptionMap; 235 236 //! Map from keys of used options to their indices in the option arguments storage 237 UsedOptionMap myUsedOptionMap; 238 239 //! Container which stores the arguments of all used options 240 OptionArgumentsStorage myOptionArgumentStorage; 241 242 //! Gets an access key of the option 243 //! @param theOptionName the name of the option which key is to be found 244 //! @param theOptionKey an access key of the option with the given name 245 //! @return true if the given option was found, or false otherwise 246 bool findOptionKey (const std::string& theOptionName, ViewerTest_CommandOptionKey& theOptionKey) const; 247 248 //! Gets an index of an option that was used 249 //! @param theOptionKey the access key of the used option which index is to be found 250 //! @param theUsedOptionIndex an index of the used option with the given access key 251 //! @return true if the given option was not found or not used, or false otherwise 252 bool findUsedOptionIndex (ViewerTest_CommandOptionKey theOptionKey, std::size_t& theUsedOptionIndex) const; 253 254 //! Gets an index of an option that was used 255 //! @param theOptionName the name of the used option which index is to be found 256 //! @param theUsedOptionIndex an index of the used option with the given name 257 //! @return true if the given option was not found or not used, or false otherwise 258 bool findUsedOptionIndex (const std::string& theOptionName, std::size_t& theUsedOptionIndex) const; 259 260 //! Adds the option that is used in the passed command line parameters 261 //! @param theNewUsedOptionKey the access key of the adding option 262 //! @return an index of a newly added option 263 std::size_t addUsedOption (ViewerTest_CommandOptionKey theNewUsedOptionKey); 264 265 //! Gets an index of an option that was used 266 //! @param theOptionName the name of the used option which index is to be found 267 //! @param theUsedOptionIndex an index of the used option with the given name 268 //! @return true if the given option was not found or not used, or false otherwise 269 RawStringArguments getRawStringArguments (std::size_t theUsedOptionIndex) const; 270 }; 271 272 #endif // _ViewerTest_CmdParser_HeaderFile 273