Line data Source code
1 : /****************************************************************************/
2 : // Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
3 : // Copyright (C) 2001-2024 German Aerospace Center (DLR) and others.
4 : // This program and the accompanying materials are made available under the
5 : // terms of the Eclipse Public License 2.0 which is available at
6 : // https://www.eclipse.org/legal/epl-2.0/
7 : // This Source Code may also be made available under the following Secondary
8 : // Licenses when the conditions for such availability set forth in the Eclipse
9 : // Public License 2.0 are satisfied: GNU General Public License, version 2
10 : // or later which is available at
11 : // https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html
12 : // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-or-later
13 : /****************************************************************************/
14 : /// @file OptionsIO.h
15 : /// @author Daniel Krajzewicz
16 : /// @author Michael Behrisch
17 : /// @date Mon, 17 Dec 2001
18 : ///
19 : // Helper for parsing command line arguments and reading configuration files
20 : /****************************************************************************/
21 : #pragma once
22 : #include <config.h>
23 :
24 : #include <vector>
25 : #include <string>
26 : #include <chrono>
27 :
28 :
29 : // ===========================================================================
30 : // class declarations
31 : // ===========================================================================
32 : class OptionsCont;
33 :
34 :
35 : // ===========================================================================
36 : // class definitions
37 : // ===========================================================================
38 : /**
39 : * @class OptionsIO
40 : *
41 : * Helping methods for parsing of command line arguments and reading a
42 : * configuration file.
43 : * Any errors are reported by throwing a ProcessError exception which
44 : * contains a description about the failure.
45 : */
46 : class OptionsIO {
47 : public:
48 : /** @brief Stores the command line arguments for later parsing
49 : *
50 : * @param[in] argc number of arguments given at the command line
51 : * @param[in] argv arguments given at the command line
52 : */
53 : static void setArgs(int argc, char** argv);
54 :
55 : /** @brief Stores faked command line arguments for later parsing
56 : *
57 : * @param[in] args arguments given as substitute for the command line
58 : */
59 : static void setArgs(const std::vector<std::string>& args);
60 :
61 : /** @brief Return the number of command line arguments
62 : */
63 : static int getArgC() {
64 35831 : return (int)myArgs.size();
65 : }
66 :
67 :
68 : /** @brief Parses the command line arguments and loads the configuration
69 : *
70 : * Command line arguments are parsed, first, throwing a ProcessError
71 : * if something fails. Then options are reset to being writeable and the
72 : * configuration is loaded using "loadConfiguration". After this,
73 : * the options are reset again and the command line arguments are
74 : * reparsed.
75 : *
76 : * This workflow allows to read the name of a configuration file from
77 : * command line arguments, first, then to load values from this configuration
78 : * file and reset them by other values from the command line.
79 : */
80 : static void getOptions(const bool commandLineOnly = false);
81 :
82 :
83 : /** @brief Loads and parses the configuration
84 : *
85 : * The name of the configuration file is extracted from the global
86 : * OptionsCont ("configuration-file" is used as the name of the option to get
87 : * the name of the configuration).
88 : */
89 : static void loadConfiguration();
90 :
91 :
92 : /** @brief Retrieves the XML root element of a supposed configuration or net
93 : *
94 : * @param[in] filename the XML file to parse
95 : * @return the root element if any
96 : */
97 : static std::string getRoot(const std::string& filename);
98 :
99 : /** @brief Return the time stamp of the last init
100 : */
101 : static const std::chrono::time_point<std::chrono::system_clock>& getLoadTime() {
102 : return myLoadTime;
103 : }
104 :
105 :
106 : private:
107 : static std::vector<std::string> myArgs;
108 : static std::chrono::time_point<std::chrono::system_clock> myLoadTime;
109 :
110 : };
|