diff --git a/include/argparse.hpp b/include/argparse.hpp index 4910c9a..2cc9e69 100644 --- a/include/argparse.hpp +++ b/include/argparse.hpp @@ -57,17 +57,6 @@ bool starts_with(const std::string& haystack, const std::string& needle) { return needle.length() <= haystack.length() && std::equal(needle.begin(), needle.end(), haystack.begin()); } - -// Get value at index from std::list -template -T get_from_list(const std::list& aList, size_t aIndex) { - if (aList.size() > aIndex) { - auto tIterator = aList.begin(); - std::advance(tIterator, aIndex); - return *tIterator; - } - return T(); -} } class Argument { @@ -150,33 +139,29 @@ public: template typename std::enable_if::value, bool>::type operator==(const T& aRhs) const { + using ValueType = typename T::value_type; T tLhs = get(); if (tLhs.size() != aRhs.size()) return false; else { - for (size_t i = 0; i < tLhs.size(); i++) { - auto tValueAtIndex = std::any_cast(tLhs[i]); - if (tValueAtIndex != aRhs[i]) - return false; - } - return true; + return std::equal(std::begin(tLhs), std::begin(tLhs), std::begin(aRhs), [](const auto& lhs, const auto& rhs) { + return std::any_cast(lhs) == rhs; + }); } } // Template specialization for std::list<...> template typename std::enable_if::value, bool>::type - operator==(const T& aRhs) const { + operator==(const T& aRhs) const { + using ValueType = typename T::value_type; T tLhs = get(); if (tLhs.size() != aRhs.size()) return false; else { - for (size_t i = 0; i < tLhs.size(); i++) { - auto tValueAtIndex = std::any_cast(get_from_list(tLhs, i)); - if (tValueAtIndex != get_from_list(aRhs, i)) - return false; - } - return true; + return std::equal(std::begin(tLhs), std::begin(tLhs), std::begin(aRhs), [](const auto& lhs, const auto& rhs) { + return std::any_cast(lhs) == rhs; + }); } } @@ -214,13 +199,13 @@ public: template typename std::enable_if::value, T>::type get() const { + using ValueType = typename T::value_type; T tResult; if (mValues.empty()) { if (mDefaultValue.has_value()) { T tDefaultValues = std::any_cast(mDefaultValue); - for (size_t i = 0; i < tDefaultValues.size(); i++) { - tResult.emplace_back(std::any_cast(tDefaultValues[i])); - } + std::transform(std::begin(tDefaultValues), std::end(tDefaultValues), + std::back_inserter(tResult), std::any_cast); return tResult; } else @@ -229,16 +214,15 @@ public: else { if (!mRawValues.empty()) { for (const auto& mValue : mValues) { - tResult.emplace_back(std::any_cast(mValue)); + tResult.emplace_back(std::any_cast(mValue)); } return tResult; } else { if (mDefaultValue.has_value()) { - std::vector tDefaultValues = std::any_cast>(mDefaultValue); - for (size_t i = 0; i < tDefaultValues.size(); i++) { - tResult.emplace_back(std::any_cast(tDefaultValues[i])); - } + auto tDefaultValues = std::any_cast>(mDefaultValue); + std::transform(std::begin(tDefaultValues), std::end(tDefaultValues), + std::back_inserter(tResult), std::any_cast); return tResult; } else @@ -251,13 +235,13 @@ public: template typename std::enable_if::value, T>::type get() const { + using ValueType = typename T::value_type; T tResult; if (mValues.empty()) { if (mDefaultValue.has_value()) { T tDefaultValues = std::any_cast(mDefaultValue); - for (size_t i = 0; i < tDefaultValues.size(); i++) { - tResult.emplace_back(std::any_cast(get_from_list(tDefaultValues, i))); - } + std::transform(std::begin(tDefaultValues), std::end(tDefaultValues), + std::back_inserter(tResult), std::any_cast); return tResult; } else @@ -266,16 +250,15 @@ public: else { if (!mRawValues.empty()) { for (const auto& mValue : mValues) { - tResult.emplace_back(std::any_cast(mValue)); + tResult.emplace_back(std::any_cast(mValue)); } return tResult; } else { if (mDefaultValue.has_value()) { - std::list tDefaultValues = std::any_cast>(mDefaultValue); - for (size_t i = 0; i < tDefaultValues.size(); i++) { - tResult.emplace_back(std::any_cast(get_from_list(tDefaultValues, i))); - } + auto tDefaultValues = std::any_cast>(mDefaultValue); + std::transform(std::begin(tDefaultValues), std::end(tDefaultValues), + std::back_inserter(tResult), std::any_cast); return tResult; } else diff --git a/test/test_compound_arguments.hpp b/test/test_compound_arguments.hpp index 88bbb85..a096f02 100644 --- a/test/test_compound_arguments.hpp +++ b/test/test_compound_arguments.hpp @@ -1,6 +1,7 @@ #pragma once #include #include +#include TEST_CASE("Parse compound toggle arguments with implicit values", "[compound_arguments]") { argparse::ArgumentParser program("test"); @@ -97,9 +98,9 @@ TEST_CASE("Parse compound toggle arguments with implicit values and nargs and ot REQUIRE(numbers[2] == 3); auto numbers_list = program.get>("numbers"); REQUIRE(numbers.size() == 3); - REQUIRE(argparse::get_from_list(numbers_list, 0) == 1); - REQUIRE(argparse::get_from_list(numbers_list, 1) == 2); - REQUIRE(argparse::get_from_list(numbers_list, 2) == 3); + REQUIRE(testutility::get_from_list(numbers_list, 0) == 1); + REQUIRE(testutility::get_from_list(numbers_list, 1) == 2); + REQUIRE(testutility::get_from_list(numbers_list, 2) == 3); } TEST_CASE("Parse out-of-order compound arguments", "[compound_arguments]") { diff --git a/test/test_container_arguments.hpp b/test/test_container_arguments.hpp index 7b12e16..8d3d754 100644 --- a/test/test_container_arguments.hpp +++ b/test/test_container_arguments.hpp @@ -1,6 +1,7 @@ #pragma once #include #include +#include TEST_CASE("Parse vector of arguments", "[vector]") { argparse::ArgumentParser program("test"); @@ -24,8 +25,8 @@ TEST_CASE("Parse list of arguments", "[vector]") { auto inputs = program.get>("input"); REQUIRE(inputs.size() == 2); - REQUIRE(argparse::get_from_list(inputs, 0) == "rocket.mesh"); - REQUIRE(argparse::get_from_list(inputs, 1) == "thrust_profile.csv"); + REQUIRE(testutility::get_from_list(inputs, 0) == "rocket.mesh"); + REQUIRE(testutility::get_from_list(inputs, 1) == "thrust_profile.csv"); } TEST_CASE("Parse list of arguments with default values", "[vector]") { @@ -38,11 +39,11 @@ TEST_CASE("Parse list of arguments with default values", "[vector]") { auto inputs = program.get>("--input"); REQUIRE(inputs.size() == 5); - REQUIRE(argparse::get_from_list(inputs, 0) == 1); - REQUIRE(argparse::get_from_list(inputs, 1) == 2); - REQUIRE(argparse::get_from_list(inputs, 2) == 3); - REQUIRE(argparse::get_from_list(inputs, 3) == 4); - REQUIRE(argparse::get_from_list(inputs, 4) == 5); + REQUIRE(testutility::get_from_list(inputs, 0) == 1); + REQUIRE(testutility::get_from_list(inputs, 1) == 2); + REQUIRE(testutility::get_from_list(inputs, 2) == 3); + REQUIRE(testutility::get_from_list(inputs, 3) == 4); + REQUIRE(testutility::get_from_list(inputs, 4) == 5); REQUIRE(program["--input"] == std::list{1, 2, 3, 4, 5}); } diff --git a/test/test_utility.hpp b/test/test_utility.hpp new file mode 100644 index 0000000..fd061de --- /dev/null +++ b/test/test_utility.hpp @@ -0,0 +1,17 @@ +#ifndef ARGPARSE_TEST_UTILITY_HPP +#define ARGPARSE_TEST_UTILITY_HPP + +namespace testutility { +// Get value at index from std::list +template +T get_from_list(const std::list& aList, size_t aIndex) { + if (aList.size() > aIndex) { + auto tIterator = aList.begin(); + std::advance(tIterator, aIndex); + return *tIterator; + } + return T(); +} +} + +#endif //ARGPARSE_TEST_UTILITY_HPP