Skip to content

Commit

Permalink
Add a test for mixed types of arguments, fix declaration order problems.
Browse files Browse the repository at this point in the history
Seriously, C++, this is just silly :/
  • Loading branch information
griwes committed Mar 29, 2015
1 parent 2b4bfa8 commit e086493
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 3 deletions.
15 changes: 12 additions & 3 deletions include/reaver/configuration/options.h
Expand Up @@ -429,23 +429,32 @@ namespace reaver
return desc;
}

template<typename... Args, typename Config>
auto _get(boost::program_options::variables_map & map, Config && config);

template<typename Config>
auto _get(boost::program_options::variables_map & map, Config && config)
auto _get_impl(boost::program_options::variables_map & map, Config && config)
{
return std::forward<Config>(config);
}

template<typename Head, typename... Tail, typename Config, typename std::enable_if<Head::is_void, int>::type = 0>
auto _get(boost::program_options::variables_map & map, Config && config)
auto _get_impl(boost::program_options::variables_map & map, Config && config)
{
return _get<Tail...>(map, std::forward<Config>(config).template add<Head>(map.count(_name(Head::name))));
}

template<typename Head, typename... Tail, typename Config, typename std::enable_if<!Head::is_void, int>::type = 0>
auto _get(boost::program_options::variables_map & map, Config && config)
auto _get_impl(boost::program_options::variables_map & map, Config && config)
{
return _get<Tail...>(map, std::forward<Config>(config).template add<Head>(map[_name(Head::name)].template as<typename Head::type>()));
}

template<typename... Args, typename Config>
auto _get(boost::program_options::variables_map & map, Config && config)
{
return _get_impl<Args...>(map, std::forward<Config>(config));
}
}

template<typename... Args>
Expand Down
13 changes: 13 additions & 0 deletions tests/options.cpp
Expand Up @@ -132,6 +132,19 @@ MAYFLY_ADD_TESTCASE("multiple positional", []

// TODO: need checks for static asserts in positional comparator (checking for overlapping "regions" of positional arguments)

MAYFLY_ADD_TESTCASE("mixed arguments", []
{
const char * argv[] = { "", "upgrade", "--version", "--count", "5", "456", "--output", "foo", "--help" };
auto parsed = test::reaver::options::parse_argv(9, argv, test::reaver::id<command>{}, test::reaver::id<value>{}, test::reaver::id<help>{}, test::reaver::id<version>{},
test::reaver::id<output>{}, test::reaver::id<count>{});
MAYFLY_REQUIRE(parsed.get<command>() == "upgrade");
MAYFLY_REQUIRE(parsed.get<value>() == 456);
MAYFLY_REQUIRE(parsed.get<help>());
MAYFLY_REQUIRE(parsed.get<version>());
MAYFLY_REQUIRE(parsed.get<output>() == "foo");
MAYFLY_REQUIRE(parsed.get<count>() == 5);
});

MAYFLY_END_SUITE;
MAYFLY_END_SUITE;

0 comments on commit e086493

Please sign in to comment.