bool terminal = false;
};
class help_entry_t {
public:
help_entry_t(const char *arg, const char *message, bool opt)
: m_arg(arg), m_message(message), m_opt(opt) {}
struct help_entry_t {
std::vector<const char *> opt_long;
std::vector<char> opt_short;
void push(char sh) { m_opt_short.push_back(sh); }
void push(const char *lg) { m_opt_long.push_back(lg); }
const char *arg;
const char *message;
bool opt;
const auto arg() const { return m_arg; }
const auto message() const { return m_message; }
const auto &opt_short() const { return m_opt_short; }
const auto &opt_long() const { return m_opt_long; }
help_entry_t(const char *arg, const char *message, bool opt)
: arg(arg), message(message), opt(opt) {}
const auto opt() const { return m_opt; }
void push(char sh) { opt_short.push_back(sh); }
void push(const char *lg) { opt_long.push_back(lg); }
bool operator<(const help_entry_t &rhs) const {
if (m_opt_long.empty() && rhs.m_opt_long.empty())
return m_opt_short.front() < rhs.m_opt_short.front();
if (opt_long.empty() && rhs.opt_long.empty())
return opt_short.front() < rhs.opt_short.front();
if (m_opt_long.empty())
return m_opt_short.front() <= rhs.m_opt_long.front()[0];
if (opt_long.empty())
return opt_short.front() <= rhs.opt_long.front()[0];
if (rhs.m_opt_long.empty())
return m_opt_long.front()[0] <= rhs.m_opt_short.front();
if (rhs.opt_long.empty())
return opt_long.front()[0] <= rhs.opt_short.front();
return std::strcmp(m_opt_long.front(), rhs.m_opt_long.front()) < 0;
return std::strcmp(opt_long.front(), rhs.opt_long.front()) < 0;
}
private:
std::vector<char> m_opt_short;
std::vector<const char *> m_opt_long;
const char *m_arg;
const char *m_message;
bool m_opt;
};
void help(const char *name) const {