Argument is now a class. Also it's friends with ArgumentParser. Moved a number of methods to private

This commit is contained in:
Pranav Srinivas Kumar 2019-04-01 21:04:50 -04:00
parent 20a67c21a9
commit 8fd51f982d

View File

@ -85,17 +85,9 @@ T get_from_list(const std::vector<T>& aList, size_t aIndex) {
return aList[aIndex]; return aList[aIndex];
} }
struct Argument { class Argument {
std::vector<std::string> mNames; friend class ArgumentParser;
std::string mHelp; public:
std::any mDefaultValue;
std::any mImplicitValue;
std::function<std::any(const std::string&)> mAction;
std::vector<std::any> mValues;
std::vector<std::string> mRawValues;
size_t mNumArgs;
bool mIsOptional;
Argument() : Argument() :
mNames({}), mNames({}),
mHelp(""), mHelp(""),
@ -131,97 +123,6 @@ struct Argument {
return *this; return *this;
} }
template <typename T>
T get() const {
if (mValues.size() == 0) {
if (mDefaultValue.has_value()) {
return std::any_cast<T>(mDefaultValue);
}
else
return T();
}
else {
if (mRawValues.size() > 0)
return std::any_cast<T>(mValues[0]);
else {
if (mDefaultValue.has_value())
return std::any_cast<T>(mDefaultValue);
else
return T();
}
}
}
template <typename T>
T get_vector() const {
T tResult;
if (mValues.size() == 0) {
if (mDefaultValue.has_value()) {
T tDefaultValues = std::any_cast<T>(mDefaultValue);
for (size_t i = 0; i < tDefaultValues.size(); i++) {
tResult.push_back(std::any_cast<typename T::value_type>(tDefaultValues[i]));
}
return tResult;
}
else
return T();
}
else {
if (mRawValues.size() > 0) {
for (size_t i = 0; i < mValues.size(); i++) {
tResult.push_back(std::any_cast<typename T::value_type>(mValues[i]));
}
return tResult;
}
else {
if (mDefaultValue.has_value()) {
std::vector<T> tDefaultValues = std::any_cast<std::vector<T>>(mDefaultValue);
for (size_t i = 0; i < tDefaultValues.size(); i++) {
tResult.push_back(std::any_cast<typename T::value_type>(tDefaultValues[i]));
}
return tResult;
}
else
return T();
}
}
}
template <typename T>
T get_list() const {
T tResult;
if (mValues.size() == 0) {
if (mDefaultValue.has_value()) {
T tDefaultValues = std::any_cast<T>(mDefaultValue);
for (size_t i = 0; i < tDefaultValues.size(); i++) {
tResult.push_back(std::any_cast<typename T::value_type>(get_from_list(tDefaultValues, i)));
}
return tResult;
}
else
return T();
}
else {
if (mRawValues.size() > 0) {
for (size_t i = 0; i < mValues.size(); i++) {
tResult.push_back(std::any_cast<typename T::value_type>(mValues[i]));
}
return tResult;
}
else {
if (mDefaultValue.has_value()) {
std::list<T> tDefaultValues = std::any_cast<std::list<T>>(mDefaultValue);
for (size_t i = 0; i < tDefaultValues.size(); i++) {
tResult.push_back(std::any_cast<typename T::value_type>(get_from_list(tDefaultValues, i)));
}
return tResult;
}
else
return T();
}
}
}
template <typename T> template <typename T>
bool operator!=(const T& aRhs) const { bool operator!=(const T& aRhs) const {
return !(*this == aRhs); return !(*this == aRhs);
@ -266,6 +167,108 @@ struct Argument {
} }
} }
private:
template <typename T>
T get() const {
if (mValues.size() == 0) {
if (mDefaultValue.has_value()) {
return std::any_cast<T>(mDefaultValue);
}
else
return T();
}
else {
if (mRawValues.size() > 0)
return std::any_cast<T>(mValues[0]);
else {
if (mDefaultValue.has_value())
return std::any_cast<T>(mDefaultValue);
else
return T();
}
}
}
template <typename T>
T get_vector() const {
T tResult;
if (mValues.size() == 0) {
if (mDefaultValue.has_value()) {
T tDefaultValues = std::any_cast<T>(mDefaultValue);
for (size_t i = 0; i < tDefaultValues.size(); i++) {
tResult.push_back(std::any_cast<typename T::value_type>(tDefaultValues[i]));
}
return tResult;
}
else
return T();
}
else {
if (mRawValues.size() > 0) {
for (size_t i = 0; i < mValues.size(); i++) {
tResult.push_back(std::any_cast<typename T::value_type>(mValues[i]));
}
return tResult;
}
else {
if (mDefaultValue.has_value()) {
std::vector<T> tDefaultValues = std::any_cast<std::vector<T>>(mDefaultValue);
for (size_t i = 0; i < tDefaultValues.size(); i++) {
tResult.push_back(std::any_cast<typename T::value_type>(tDefaultValues[i]));
}
return tResult;
}
else
return T();
}
}
}
template <typename T>
T get_list() const {
T tResult;
if (mValues.size() == 0) {
if (mDefaultValue.has_value()) {
T tDefaultValues = std::any_cast<T>(mDefaultValue);
for (size_t i = 0; i < tDefaultValues.size(); i++) {
tResult.push_back(std::any_cast<typename T::value_type>(get_from_list(tDefaultValues, i)));
}
return tResult;
}
else
return T();
}
else {
if (mRawValues.size() > 0) {
for (size_t i = 0; i < mValues.size(); i++) {
tResult.push_back(std::any_cast<typename T::value_type>(mValues[i]));
}
return tResult;
}
else {
if (mDefaultValue.has_value()) {
std::list<T> tDefaultValues = std::any_cast<std::list<T>>(mDefaultValue);
for (size_t i = 0; i < tDefaultValues.size(); i++) {
tResult.push_back(std::any_cast<typename T::value_type>(get_from_list(tDefaultValues, i)));
}
return tResult;
}
else
return T();
}
}
}
std::vector<std::string> mNames;
std::string mHelp;
std::any mDefaultValue;
std::any mImplicitValue;
std::function<std::any(const std::string&)> mAction;
std::vector<std::any> mValues;
std::vector<std::string> mRawValues;
size_t mNumArgs;
bool mIsOptional;
}; };
class ArgumentParser { class ArgumentParser {