| 509 | } |
| 510 | |
| 511 | int parse_args(int argc, char** argv) { |
| 512 | #define CHECK_ARGC \ |
| 513 | if (i >= argc) \ |
| 514 | break |
| 515 | #define PARSE_COMMON_TYPE(type) \ |
| 516 | do { \ |
| 517 | for (auto iter = get_s_##type##_Flags().begin(); iter != get_s_##type##_Flags().end(); ++iter) { \ |
| 518 | if (iter->opt == argv[i]) { \ |
| 519 | ++iRet; \ |
| 520 | ++i; \ |
| 521 | if (i < argc) { \ |
| 522 | if (parse_##type(iter->optPtr, argv[i])) { \ |
| 523 | ++i; \ |
| 524 | } \ |
| 525 | } \ |
| 526 | break; \ |
| 527 | } else if (const char* p = is_separated_with(argv[i], iter->opt.c_str(), "-=")) { \ |
| 528 | ++iRet; \ |
| 529 | if (!parse_##type(iter->optPtr, p)) { \ |
| 530 | std::cout << "Warning -- Flag parse : not a valid expression: " << argv[i] << std::endl; \ |
| 531 | } else { \ |
| 532 | ++i; \ |
| 533 | } \ |
| 534 | break; \ |
| 535 | } \ |
| 536 | } \ |
| 537 | } while (0) |
| 538 | |
| 539 | #define PARSE_BOOL_TYPE(type) \ |
| 540 | do { \ |
| 541 | for (auto iter = get_s_##type##_Flags().begin(); iter != get_s_##type##_Flags().end(); ++iter) { \ |
| 542 | if (iter->opt == argv[i]) { \ |
| 543 | ++iRet; \ |
| 544 | ++i; \ |
| 545 | if (i < argc) { \ |
| 546 | if (parse_##type(iter->optPtr, argv[i])) { \ |
| 547 | ++i; \ |
| 548 | } \ |
| 549 | } else { \ |
| 550 | *iter->optPtr = !*iter->optPtr; \ |
| 551 | } \ |
| 552 | break; \ |
| 553 | } else if (const char* p = is_separated_with(argv[i], iter->opt.c_str(), "-=")) { \ |
| 554 | ++iRet; \ |
| 555 | if (!parse_##type(iter->optPtr, p)) { \ |
| 556 | std::cout << "Warning -- Flag parse : not a valid expression: " << argv[i] << std::endl; \ |
| 557 | } else { \ |
| 558 | ++i; \ |
| 559 | } \ |
| 560 | break; \ |
| 561 | } \ |
| 562 | } \ |
| 563 | } while (0) |
| 564 | |
| 565 | #define PARSE_LIST_TYPE(type) \ |
| 566 | do { \ |
| 567 | for (auto iter = get_s_##type##_Flags().begin(); iter != get_s_##type##_Flags().end(); ++iter) { \ |
| 568 | if (iter->opt == argv[i]) { \ |