48#if !defined(__GNUC__) || (__GNUC__ >= 5)
53 class stringstream_proxy
56 stringstream_proxy() =
default;
59 stringstream_proxy(std::string
const& value) :
64 stringstream_proxy(
const stringstream_proxy& other) :
65 stream_(other.stream_.str())
67 stream_.setstate(other.stream_.rdstate());
70 void setstate(std::ios_base::iostate state) { stream_.setstate(state); }
76 stringstream_proxy& operator >> (T& thing)
84 std::string str()
const {
return stream_.str(); }
86 std::stringbuf* rdbuf()
const {
return stream_.rdbuf(); }
90 explicit operator bool()
const {
return !!stream_; }
92 ~stringstream_proxy() =
default;
94 std::istringstream stream_;
110 parser(std::initializer_list<char const* const> pre_reg_names)
114 {
parse(argv, mode); }
117 {
parse(argc, argv, mode); }
120 void add_params(std::initializer_list<char const* const> init_list);
125 std::multiset<std::string>
const&
flags()
const {
return flags_; }
126 std::map<std::string, std::string>
const&
params()
const {
return params_; }
127 std::vector<std::string>
const&
pos_args()
const {
return pos_args_; }
130 std::vector<std::string>::const_iterator
begin()
const {
return pos_args_.cbegin(); }
131 std::vector<std::string>::const_iterator
end()
const {
return pos_args_.cend(); }
132 size_t size()
const {
return pos_args_.size(); }
138 bool operator[](std::string
const& name)
const;
141 bool operator[](std::initializer_list<char const* const> init_list)
const;
144 std::string
const&
operator[](
size_t ind)
const;
174 std::string trim_leading_dashes(std::string
const& name)
const;
175 bool is_number(std::string
const& arg)
const;
176 bool is_option(std::string
const& arg)
const;
177 bool got_flag(std::string
const& name)
const;
178 bool is_param(std::string
const& name)
const;
181 std::vector<std::string> args_;
182 std::map<std::string, std::string> params_;
183 std::vector<std::string> pos_args_;
184 std::multiset<std::string> flags_;
185 std::set<std::string> registeredParams_;
195 for (
auto argvp = argv; *argvp; ++argc, ++argvp);
196 parse(argc, argv, mode);
204 args_.resize(
static_cast<decltype(args_)::size_type
>(argc));
205 std::transform(argv, argv + argc, args_.begin(), [](
const char*
const arg) { return arg; });
208 for (
auto i = 0u; i < args_.size(); ++i)
210 if (!is_option(args_[i]))
212 pos_args_.emplace_back(args_[i]);
216 auto name = trim_leading_dashes(args_[i]);
220 auto equalPos = name.find(
'=');
221 if (equalPos != std::string::npos)
223 params_.insert({ name.substr(0, equalPos), name.substr(equalPos + 1) });
229 if (1 == (args_[i].
size() - name.size()) &&
233 std::string keep_param;
235 if (!name.empty() && is_param(std::string(1ul, name.back())))
237 keep_param += name.back();
238 name.resize(name.size() - 1);
241 for (
auto const& c : name)
243 flags_.emplace(std::string{ c });
246 if (!keep_param.empty())
258 if (i == args_.size() - 1 || is_option(args_[i + 1]))
260 flags_.emplace(name);
277 if (is_param(name) || preferParam)
279 params_.insert({ name, args_[i + 1] });
285 flags_.emplace(name);
295 bad.setstate(std::ios_base::failbit);
301 inline bool parser::is_number(std::string
const& arg)
const
304 std::istringstream istr(arg);
307 return !(istr.fail() || istr.bad());
312 inline bool parser::is_option(std::string
const& arg)
const
314 assert(0 != arg.size());
317 return '-' == arg[0];
322 inline std::string parser::trim_leading_dashes(std::string
const& name)
const
324 auto pos = name.find_first_not_of(
'-');
325 return std::string::npos != pos ? name.substr(pos) : name;
330 inline bool argh::parser::got_flag(std::string
const& name)
const
332 return flags_.end() != flags_.find(trim_leading_dashes(name));
337 inline bool argh::parser::is_param(std::string
const& name)
const
339 return registeredParams_.count(name);
346 return got_flag(name);
353 return std::any_of(init_list.begin(), init_list.end(), [&](
char const*
const name) { return got_flag(name); });
360 if (ind < pos_args_.size())
361 return pos_args_[ind];
369 auto optIt = params_.find(trim_leading_dashes(name));
370 if (params_.end() != optIt)
379 for (
auto& name : init_list)
381 auto optIt = params_.find(trim_leading_dashes(name));
382 if (params_.end() != optIt)
393 auto optIt = params_.find(trim_leading_dashes(name));
394 if (params_.end() != optIt)
397 std::ostringstream ostr;
398 ostr.precision(std::numeric_limits<long double>::max_digits10);
409 for (
auto& name : init_list)
411 auto optIt = params_.find(trim_leading_dashes(name));
412 if (params_.end() != optIt)
415 std::ostringstream ostr;
416 ostr.precision(std::numeric_limits<long double>::max_digits10);
425 if (pos_args_.size() <= ind)
436 if (pos_args_.size() <= ind)
438 std::ostringstream ostr;
439 ostr.precision(std::numeric_limits<long double>::max_digits10);
451 registeredParams_.insert(trim_leading_dashes(name));
458 for (
auto& name : init_list)
459 registeredParams_.insert(trim_leading_dashes(name));
string_stream operator()(size_t ind) const
Definition argh.h:423
void add_params(std::initializer_list< char const *const > init_list)
Definition argh.h:456
std::map< std::string, std::string > const & params() const
Definition argh.h:126
std::vector< std::string > const & pos_args() const
Definition argh.h:127
std::vector< std::string >::const_iterator end() const
Definition argh.h:131
parser(const char *const argv[], int mode=PREFER_FLAG_FOR_UNREG_OPTION)
Definition argh.h:113
bool operator[](std::string const &name) const
Definition argh.h:344
void parse(const char *const argv[], int mode=PREFER_FLAG_FOR_UNREG_OPTION)
Definition argh.h:192
Mode
Definition argh.h:102
@ PREFER_PARAM_FOR_UNREG_OPTION
Definition argh.h:103
@ SINGLE_DASH_IS_MULTIFLAG
Definition argh.h:105
@ NO_SPLIT_ON_EQUALSIGN
Definition argh.h:104
@ PREFER_FLAG_FOR_UNREG_OPTION
Definition argh.h:102
parser(int argc, const char *const argv[], int mode=PREFER_FLAG_FOR_UNREG_OPTION)
Definition argh.h:116
void add_param(std::string const &name)
Definition argh.h:449
parser(std::initializer_list< char const *const > pre_reg_names)
Definition argh.h:110
size_t size() const
Definition argh.h:132
std::vector< std::string >::const_iterator begin() const
Definition argh.h:130
std::multiset< std::string > const & flags() const
Definition argh.h:125
std::istringstream string_stream
Definition argh.h:49