From 02b3ed187840a0c2ac59bb8b9320178cd287e781 Mon Sep 17 00:00:00 2001 From: Stephan van Veen Date: Mon, 13 May 2019 22:09:27 +0200 Subject: [PATCH] Cleanup Argument::get methods --- include/argparse.hpp | 105 +++++++++---------------------------------- 1 file changed, 21 insertions(+), 84 deletions(-) diff --git a/include/argparse.hpp b/include/argparse.hpp index 06bacd3..d92ddba 100644 --- a/include/argparse.hpp +++ b/include/argparse.hpp @@ -182,98 +182,35 @@ public: // Getter for template types other than std::vector and std::list template - typename std::enable_if::value && - !is_specialization::value, T>::type + enable_if_not_container get() const { - if (mValues.empty()) { - if (mDefaultValue.has_value()) { - return std::any_cast(mDefaultValue); - } - else - return T(); + if (!mValues.empty()) { + return std::any_cast(mValues.front()); } - else { - if (!mRawValues.empty()) - return std::any_cast(mValues[0]); - else { - if (mDefaultValue.has_value()) - return std::any_cast(mDefaultValue); - else - return T(); - } + if (mDefaultValue.has_value()) { + return std::any_cast(mDefaultValue); } + throw std::logic_error("No value provided"); } - // Getter for std::vector. Here T = std::vector<...> - template - typename std::enable_if::value, T>::type + // Getter for container types + template + enable_if_container get() const { - using ValueType = typename T::value_type; - T tResult; - if (mValues.empty()) { - if (mDefaultValue.has_value()) { - T tDefaultValues = std::any_cast(mDefaultValue); - std::transform(std::begin(tDefaultValues), std::end(tDefaultValues), - std::back_inserter(tResult), std::any_cast); - return tResult; - } - else - return T(); + using ValueType = typename CONTAINER::value_type; + CONTAINER tResult; + if (!mValues.empty()) { + std::transform(std::begin(mValues), std::end(mValues), + std::back_inserter(tResult), std::any_cast); + return tResult; } - else { - if (!mRawValues.empty()) { - for (const auto& mValue : mValues) { - tResult.emplace_back(std::any_cast(mValue)); - } - return tResult; - } - else { - if (mDefaultValue.has_value()) { - auto tDefaultValues = std::any_cast>(mDefaultValue); - std::transform(std::begin(tDefaultValues), std::end(tDefaultValues), - std::back_inserter(tResult), std::any_cast); - return tResult; - } - else - return T(); - } - } - } - - // Getter for std::list. Here T = std::list<...> - 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); - std::transform(std::begin(tDefaultValues), std::end(tDefaultValues), - std::back_inserter(tResult), std::any_cast); - return tResult; - } - else - return T(); - } - else { - if (!mRawValues.empty()) { - for (const auto& mValue : mValues) { - tResult.emplace_back(std::any_cast(mValue)); - } - return tResult; - } - else { - if (mDefaultValue.has_value()) { - auto tDefaultValues = std::any_cast>(mDefaultValue); - std::transform(std::begin(tDefaultValues), std::end(tDefaultValues), - std::back_inserter(tResult), std::any_cast); - return tResult; - } - else - return T(); - } + if (mDefaultValue.has_value()) { + const auto& tDefaultValues = std::any_cast(mDefaultValue); + std::transform(std::begin(tDefaultValues), std::end(tDefaultValues), + std::back_inserter(tResult), std::any_cast); + return tResult; } + throw std::logic_error("No value provided"); } std::vector mNames;