OpenFPGA/libs/EXTERNAL/libargparse/src/argparse.tpp

89 lines
3.4 KiB
C++

#include <sstream>
#include "argparse_util.hpp"
namespace argparse {
template<typename T, typename Converter>
std::shared_ptr<Argument> make_singlevalue_argument(ArgValue<T>& dest, std::string long_opt, std::string short_opt) {
auto ptr = std::make_shared<SingleValueArgument<T, Converter>>(dest, long_opt, short_opt);
//If the conversion object specifies a non-empty set of choices
//use those by default
auto default_choices = Converter().default_choices();
if (!default_choices.empty()) {
ptr->choices(default_choices);
}
return ptr;
}
template<typename T, typename Converter>
std::shared_ptr<Argument> make_multivalue_argument(ArgValue<T>& dest, std::string long_opt, std::string short_opt) {
auto ptr = std::make_shared<MultiValueArgument<T, Converter>>(dest, long_opt, short_opt);
//If the conversion object specifies a non-empty set of choices
//use those by default
auto default_choices = Converter().default_choices();
if (!default_choices.empty()) {
ptr->choices(default_choices);
}
return ptr;
}
/*
* ArgumentParser
*/
template<typename T, typename Converter>
Argument& ArgumentParser::add_argument(ArgValue<T>& dest, std::string option) {
return add_argument<T,Converter>(dest, option, std::string());
}
template<typename T, typename Converter>
Argument& ArgumentParser::add_argument(ArgValue<T>& dest, std::string long_opt, std::string short_opt) {
return argument_groups_[0].add_argument<T,Converter>(dest, long_opt, short_opt);
}
template<typename T, typename Converter>
Argument& ArgumentParser::add_argument(ArgValue<std::vector<T>>& dest, std::string option) {
return add_argument<T,Converter>(dest, option, std::string());
}
template<typename T, typename Converter>
Argument& ArgumentParser::add_argument(ArgValue<std::vector<T>>& dest, std::string long_opt, std::string short_opt) {
return argument_groups_[0].add_argument<T,Converter>(dest, long_opt, short_opt);
}
/*
* ArgumentGroup
*/
template<typename T, typename Converter>
Argument& ArgumentGroup::add_argument(ArgValue<T>& dest, std::string option) {
return add_argument<T,Converter>(dest, option, std::string());
}
template<typename T, typename Converter>
Argument& ArgumentGroup::add_argument(ArgValue<T>& dest, std::string long_opt, std::string short_opt) {
arguments_.push_back(make_singlevalue_argument<T,Converter>(dest, long_opt, short_opt));
auto& arg = arguments_[arguments_.size() - 1];
arg->group_name(name()); //Tag the option with the group
return *arg;
}
template<typename T, typename Converter>
Argument& ArgumentGroup::add_argument(ArgValue<std::vector<T>>& dest, std::string option) {
return add_argument<T,Converter>(dest, option, std::string());
}
template<typename T, typename Converter>
Argument& ArgumentGroup::add_argument(ArgValue<std::vector<T>>& dest, std::string long_opt, std::string short_opt) {
arguments_.push_back(make_multivalue_argument<std::vector<T>,Converter>(dest, long_opt, short_opt));
auto& arg = arguments_[arguments_.size() - 1];
arg->group_name(name()); //Tag the option with the group
return *arg;
}
} //namespace