-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathArgumentParser.cpp
More file actions
114 lines (104 loc) · 2.82 KB
/
ArgumentParser.cpp
File metadata and controls
114 lines (104 loc) · 2.82 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
#include <iostream>
#include <getopt.h>
#include "ArgumentParser.hpp"
#define DIESEL_CAPACITY 1000
#define ELECTRIC_CAPACITY 1002
#define DIESEL_FUEL_CONSUMPTION 1003
#define ELECTRIC_FUEL_CONSUMPTION 1004
ArgumentParser::ArgumentParser(int argc, char **argv)
{
this->argc = argc;
this->argv = argv;
}
// Modified example from
// https://www.man7.org/linux/man-pages/man3/getopt.3.html
Arguments ArgumentParser::parse(Arguments &defaultArguments)
{
Arguments arguments = defaultArguments;
const char *shortOptions = "hd:e:s:m";
struct option longOptions[] = {
{"help", no_argument, 0, 'h'},
{"df", required_argument, 0, DIESEL_CAPACITY},
{"ef", required_argument, 0, ELECTRIC_CAPACITY},
{"dc", required_argument, 0, DIESEL_FUEL_CONSUMPTION},
{"ec", required_argument, 0, ELECTRIC_FUEL_CONSUMPTION},
{0, 0, 0, 0}};
int opt;
int optIndex;
while ((opt = getopt_long(this->argc, this->argv, shortOptions, longOptions, &optIndex)) != -1)
{
switch (opt)
{
case 0:
break;
case 'h':
printHelp();
exit(0);
case 'd':
arguments.dieselTruckCount = getNumericArgument();
break;
case 'e':
arguments.electricTruckCount = getNumericArgument();
break;
case DIESEL_CAPACITY:
arguments.dieselFuelCapacity = getNumericArgument();
break;
case ELECTRIC_CAPACITY:
arguments.electricFuelCapacity = getNumericArgument();
break;
case DIESEL_FUEL_CONSUMPTION:
arguments.dieselFuelConsumption = getNumericArgument();
break;
case ELECTRIC_FUEL_CONSUMPTION:
arguments.electricFuelConsumption = getNumericArgument();
break;
case 's':
arguments.simulationDuration = getNumericArgument();
break;
case 'm':
arguments.packageManufacturingTime = getNumericArgument();
break;
case '?':
/* getopt_long already printed an error message. */
exit(INVALID_ARUMENT_ERROR);
break;
default:
abort();
}
}
return arguments;
}
void ArgumentParser::printHelp()
{
std::cout << "-d <count> Diesel truck count" << std::endl;
std::cout << "-e <count> Electric truck count" << std::endl;
std::cout << "-s <minutes> Simulation duration" << std::endl;
std::cout << "-m <minutes> Package manufacturing time" << std::endl;
std::cout << "--df <ml> Diesel fuel capacity" << std::endl;
std::cout << "--ef <Wh> Electric battery capacity" << std::endl;
std::cout << "--dc <ml/km> Diesel fuel consumption" << std::endl;
std::cout << "--ec <Wh/km> Electric battery consumption" << std::endl;
}
std::string ArgumentParser::getArgument()
{
if (optarg == NULL && optind < this->argc && this->argv[optind][0] != '-')
{
return this->argv[optind++];
}
else
{
return optarg;
}
}
int ArgumentParser::getNumericArgument()
{
try
{
return std::stoi(this->getArgument());
}
catch (const std::invalid_argument &e)
{
std::cerr << "Invalid argument type" << std::endl;
exit(INVALID_ARUMENT_ERROR);
}
}