23
23
24
24
#include " CmdOptions.hpp"
25
25
26
- #include < primesieve/calculator.hpp>
27
26
#include < primesieve/PrimeSieve.hpp>
28
27
#include < primesieve/primesieve_error.hpp>
29
28
@@ -50,29 +49,6 @@ enum IsParam
50
49
OPTIONAL_PARAM
51
50
};
52
51
53
- // / Command-line option
54
- struct Option
55
- {
56
- // Example:
57
- // str = "--threads=32"
58
- // opt = "--threads"
59
- // val = "32"
60
- std::string str;
61
- std::string opt;
62
- std::string val;
63
-
64
- template <typename T>
65
- T getValue () const
66
- {
67
- try {
68
- return calculator::eval<T>(val);
69
- }
70
- catch (std::exception &) {
71
- throw primesieve_error (" invalid option '" + opt + " =" + val + " '" );
72
- }
73
- }
74
- };
75
-
76
52
// / Options start with "-" or "--", then
77
53
// / follows a Latin ASCII character.
78
54
// /
@@ -210,29 +186,42 @@ Option parseOption(int argc,
210
186
return opt;
211
187
}
212
188
213
- void optionPrint (Option& opt,
214
- CmdOptions& opts)
189
+ } // namespace
190
+
191
+ void CmdOptions::setMainOption (OptionID optionID,
192
+ const std::string& optStr)
215
193
{
216
- opts.quiet = true ;
194
+ // Multiple main options are not allowed
195
+ if (!optionStr.empty ())
196
+ throw primesieve_error (" incompatible options: " + optionStr + " " + optStr);
197
+ else
198
+ {
199
+ optionStr = optStr;
200
+ option = optionID;
201
+ }
202
+ }
203
+
204
+ void CmdOptions::optionPrint (Option& opt)
205
+ {
206
+ quiet = true ;
217
207
218
208
// by default print primes
219
209
if (opt.val .empty ())
220
210
opt.val = " 1" ;
221
211
222
212
switch (opt.getValue <int >())
223
213
{
224
- case 1 : opts. flags |= PRINT_PRIMES; break ;
225
- case 2 : opts. flags |= PRINT_TWINS; break ;
226
- case 3 : opts. flags |= PRINT_TRIPLETS; break ;
227
- case 4 : opts. flags |= PRINT_QUADRUPLETS; break ;
228
- case 5 : opts. flags |= PRINT_QUINTUPLETS; break ;
229
- case 6 : opts. flags |= PRINT_SEXTUPLETS; break ;
214
+ case 1 : flags |= PRINT_PRIMES; break ;
215
+ case 2 : flags |= PRINT_TWINS; break ;
216
+ case 3 : flags |= PRINT_TRIPLETS; break ;
217
+ case 4 : flags |= PRINT_QUADRUPLETS; break ;
218
+ case 5 : flags |= PRINT_QUINTUPLETS; break ;
219
+ case 6 : flags |= PRINT_SEXTUPLETS; break ;
230
220
default : throw primesieve_error (" invalid option '" + opt.str + " '" );
231
221
}
232
222
}
233
223
234
- void optionCount (Option& opt,
235
- CmdOptions& opts)
224
+ void CmdOptions::optionCount (Option& opt)
236
225
{
237
226
// by default count primes
238
227
if (opt.val .empty ())
@@ -244,52 +233,48 @@ void optionCount(Option& opt,
244
233
{
245
234
switch (n % 10 )
246
235
{
247
- case 1 : opts. flags |= COUNT_PRIMES; break ;
248
- case 2 : opts. flags |= COUNT_TWINS; break ;
249
- case 3 : opts. flags |= COUNT_TRIPLETS; break ;
250
- case 4 : opts. flags |= COUNT_QUADRUPLETS; break ;
251
- case 5 : opts. flags |= COUNT_QUINTUPLETS; break ;
252
- case 6 : opts. flags |= COUNT_SEXTUPLETS; break ;
236
+ case 1 : flags |= COUNT_PRIMES; break ;
237
+ case 2 : flags |= COUNT_TWINS; break ;
238
+ case 3 : flags |= COUNT_TRIPLETS; break ;
239
+ case 4 : flags |= COUNT_QUADRUPLETS; break ;
240
+ case 5 : flags |= COUNT_QUINTUPLETS; break ;
241
+ case 6 : flags |= COUNT_SEXTUPLETS; break ;
253
242
default : throw primesieve_error (" invalid option '" + opt.str + " '" );
254
243
}
255
244
}
256
245
}
257
246
258
- void optionDistance (Option& opt,
259
- CmdOptions& opts)
247
+ void CmdOptions::optionDistance (Option& opt)
260
248
{
261
249
uint64_t start = 0 ;
262
250
uint64_t val = opt.getValue <uint64_t >();
263
- auto & numbers = opts.numbers ;
264
251
265
252
if (!numbers.empty ())
266
253
start = numbers[0 ];
267
254
268
255
numbers.push_back (start + val);
269
256
}
270
257
271
- void optionStressTest (Option& opt,
272
- CmdOptions& opts)
258
+ void CmdOptions::optionStressTest (Option& opt)
273
259
{
274
- opts. option = OPTION_STRESS_TEST;
260
+ setMainOption ( OPTION_STRESS_TEST, opt. str ) ;
275
261
std::transform (opt.val .begin (), opt.val .end (), opt.val .begin (),
276
262
[](unsigned char c){ return std::toupper (c); });
277
263
278
264
// If the stress test mode is not specified
279
265
// we use "CPU" by default.
280
266
if (opt.val .empty ())
281
- opts. stressTestMode = " CPU" ;
267
+ stressTestMode = " CPU" ;
282
268
else if (opt.val == " CPU" )
283
- opts. stressTestMode = " CPU" ;
269
+ stressTestMode = " CPU" ;
284
270
else if (opt.val == " RAM" )
285
- opts. stressTestMode = " RAM" ;
271
+ stressTestMode = " RAM" ;
286
272
else
287
273
throw primesieve_error (" invalid option '" + opt.str + " =" + opt.val + " '" );
288
274
}
289
275
290
276
// / Stress test timeout
291
- void optionTimeout (Option& opt,
292
- CmdOptions& opts)
277
+ void CmdOptions::optionTimeout (Option& opt)
293
278
{
294
279
std::transform (opt.val .begin (), opt.val .end (), opt.val .begin (),
295
280
[](unsigned char c){ return std::tolower (c); });
@@ -298,19 +283,17 @@ void optionTimeout(Option& opt,
298
283
// https://manpages.debian.org/unstable/stress-ng/stress-ng.1.en.html
299
284
switch (opt.val .back ())
300
285
{
301
- case ' s' : opt.val .pop_back (); opts. timeout = opt.getValue <int64_t >(); break ;
302
- case ' m' : opt.val .pop_back (); opts. timeout = opt.getValue <int64_t >() * 60 ; break ;
303
- case ' h' : opt.val .pop_back (); opts. timeout = opt.getValue <int64_t >() * 3600 ; break ;
304
- case ' d' : opt.val .pop_back (); opts. timeout = opt.getValue <int64_t >() * 24 * 3600 ; break ;
305
- case ' y' : opt.val .pop_back (); opts. timeout = opt.getValue <int64_t >() * 365 * 24 * 3600 ; break ;
286
+ case ' s' : opt.val .pop_back (); timeout = opt.getValue <int64_t >(); break ;
287
+ case ' m' : opt.val .pop_back (); timeout = opt.getValue <int64_t >() * 60 ; break ;
288
+ case ' h' : opt.val .pop_back (); timeout = opt.getValue <int64_t >() * 3600 ; break ;
289
+ case ' d' : opt.val .pop_back (); timeout = opt.getValue <int64_t >() * 24 * 3600 ; break ;
290
+ case ' y' : opt.val .pop_back (); timeout = opt.getValue <int64_t >() * 365 * 24 * 3600 ; break ;
306
291
307
292
// By default assume seconds like stress-ng
308
- default : opts. timeout = opt.getValue <int64_t >();
293
+ default : timeout = opt.getValue <int64_t >();
309
294
}
310
295
}
311
296
312
- } // namespace
313
-
314
297
CmdOptions parseOptions (int argc, char * argv[])
315
298
{
316
299
// No command-line options provided
@@ -361,18 +344,18 @@ CmdOptions parseOptions(int argc, char* argv[])
361
344
362
345
switch (optionID)
363
346
{
364
- case OPTION_COUNT: optionCount (opt, opts ); break ;
365
- case OPTION_DISTANCE: optionDistance (opt, opts ); break ;
366
- case OPTION_PRINT: optionPrint (opt, opts ); break ;
367
- case OPTION_STRESS_TEST: optionStressTest (opt, opts ); break ;
368
- case OPTION_TIMEOUT: optionTimeout (opt, opts ); break ;
347
+ case OPTION_COUNT: opts. optionCount (opt); break ;
348
+ case OPTION_DISTANCE: opts. optionDistance (opt); break ;
349
+ case OPTION_PRINT: opts. optionPrint (opt); break ;
350
+ case OPTION_STRESS_TEST: opts. optionStressTest (opt); break ;
351
+ case OPTION_TIMEOUT: opts. optionTimeout (opt); break ;
369
352
case OPTION_SIZE: opts.sieveSize = opt.getValue <int >(); break ;
370
353
case OPTION_THREADS: opts.threads = opt.getValue <int >(); break ;
371
354
case OPTION_QUIET: opts.quiet = true ; break ;
372
355
case OPTION_NO_STATUS: opts.status = false ; break ;
373
356
case OPTION_TIME: opts.time = true ; break ;
374
357
case OPTION_NUMBER: opts.numbers .push_back (opt.getValue <uint64_t >()); break ;
375
- default : opts.option = optionID;
358
+ default : opts.setMainOption ( optionID, opt. str ) ;
376
359
}
377
360
}
378
361
0 commit comments