Skip to content

use optional<size_t> instead of stupid -1 #2120

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Apr 26, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions src/goto-cc/goto_cc_cmdline.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ bool goto_cc_cmdlinet::prefix_in_list(

std::size_t goto_cc_cmdlinet::get_optnr(const std::string &opt_string)
{
int optnr;
optionalt<std::size_t> optnr;
cmdlinet::optiont option;

if(has_prefix(opt_string, "--")) // starts with -- ?
Expand Down Expand Up @@ -107,13 +107,13 @@ std::size_t goto_cc_cmdlinet::get_optnr(const std::string &opt_string)
}

// new?
if(optnr==-1)
if(!optnr.has_value())
{
options.push_back(option);
return options.size()-1;
}

return optnr;
return *optnr;
}

void goto_cc_cmdlinet::add_infile_arg(const std::string &arg)
Expand Down
14 changes: 7 additions & 7 deletions src/goto-cc/ms_cl_cmdline.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -425,7 +425,7 @@ void ms_cl_cmdlinet::process_cl_option(const std::string &s)
if(std::string(s, 1, std::string::npos)==ms_cl_flags[j])
{
cmdlinet::optiont option;
int optnr;
optionalt<std::size_t> optnr;

if(s.size()==2)
{
Expand All @@ -442,13 +442,13 @@ void ms_cl_cmdlinet::process_cl_option(const std::string &s)
optnr=getoptnr(option.optstring);
}

if(optnr==-1)
if(!optnr.has_value())
{
options.push_back(option);
optnr=options.size()-1;
}

options[optnr].isset=true;
options[*optnr].isset=true;
return;
}
}
Expand All @@ -461,7 +461,7 @@ void ms_cl_cmdlinet::process_cl_option(const std::string &s)
{
cmdlinet::optiont option;

int optnr;
optionalt<std::size_t> optnr;

if(ms_cl_prefix.size()==1)
{
Expand All @@ -478,14 +478,14 @@ void ms_cl_cmdlinet::process_cl_option(const std::string &s)
optnr=getoptnr(option.optstring);
}

if(optnr==-1)
if(!optnr.has_value())
{
options.push_back(option);
optnr=options.size()-1;
}

options[optnr].isset=true;
options[optnr].values.push_back(
options[*optnr].isset=true;
options[*optnr].values.push_back(
std::string(s, ms_cl_prefix.size()+1, std::string::npos));

return;
Expand Down
110 changes: 67 additions & 43 deletions src/util/cmdline.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -26,92 +26,114 @@ void cmdlinet::clear()

bool cmdlinet::isset(char option) const
{
int i=getoptnr(option);
if(i<0)
auto i=getoptnr(option);
if(i.has_value())
return options[*i].isset;
else
return false;
return options[i].isset;
}

bool cmdlinet::isset(const char *option) const
{
int i=getoptnr(option);
if(i<0)
auto i=getoptnr(option);
if(i.has_value())
return options[*i].isset;
else
return false;
return options[i].isset;
}

std::string cmdlinet::get_value(char option) const
{
int i=getoptnr(option);
if(i<0)
return "";
if(options[i].values.empty())
auto i=getoptnr(option);

if(i.has_value())
{
if(options[*i].values.empty())
return "";
else
return options[*i].values.front();
}
else
return "";
return options[i].values.front();
}

void cmdlinet::set(const std::string &option)
{
int i=getoptnr(option);
if(i<0)
return; // ignore
options[i].isset=true;
auto i=getoptnr(option);

if(i.has_value())
options[*i].isset=true;

// otherwise ignore
}

void cmdlinet::set(const std::string &option, const std::string &value)
{
int i=getoptnr(option);
if(i<0)
return; // ignore
options[i].isset=true;
options[i].values.push_back(value);
auto i=getoptnr(option);

if(i.has_value())
{
options[*i].isset=true;
options[*i].values.push_back(value);
}

// otherwise ignore
}

static std::list<std::string> immutable_empty_list;

const std::list<std::string> &cmdlinet::get_values(char option) const
{
int i=getoptnr(option);
if(i<0)
auto i=getoptnr(option);

if(i.has_value())
return options[*i].values;
else
return immutable_empty_list;
return options[i].values;
}

std::string cmdlinet::get_value(const char *option) const
{
int i=getoptnr(option);
if(i<0)
return "";
if(options[i].values.empty())
auto i=getoptnr(option);

if(i.has_value())
{
if(options[*i].values.empty())
return "";
else
return options[*i].values.front();
}
else
return "";
return options[i].values.front();
}

const std::list<std::string> &cmdlinet::get_values(
const std::string &option) const
{
int i=getoptnr(option);
if(i<0)
auto i=getoptnr(option);

if(i.has_value())
return options[*i].values;
else
return immutable_empty_list;
return options[i].values;
}

int cmdlinet::getoptnr(char option) const
optionalt<std::size_t> cmdlinet::getoptnr(char option) const
{
for(std::size_t i=0; i<options.size(); i++)
if(options[i].optchar==option)
return i;

return -1;
return optionalt<std::size_t>();
}

int cmdlinet::getoptnr(const std::string &option) const
optionalt<std::size_t> cmdlinet::getoptnr(const std::string &option) const
{
for(std::size_t i=0; i<options.size(); i++)
if(options[i].optstring==option)
return i;

return -1;
return optionalt<std::size_t>();
}

bool cmdlinet::parse(int argc, const char **argv, const char *optstring)
Expand Down Expand Up @@ -165,7 +187,7 @@ bool cmdlinet::parse(int argc, const char **argv, const char *optstring)
args.push_back(argv[i]);
else
{
int optnr;
optionalt<std::size_t> optnr;

if(argv[i][1]!=0 && argv[i][2]==0)
optnr=getoptnr(argv[i][1]); // single-letter option -X
Expand All @@ -177,29 +199,31 @@ bool cmdlinet::parse(int argc, const char **argv, const char *optstring)
// We first try single-letter.
optnr=getoptnr(argv[i][1]);

if(optnr<0) // try multi-letter
if(!optnr.has_value()) // try multi-letter
optnr=getoptnr(argv[i]+1);
}

if(optnr<0)
if(!optnr.has_value())
{
unknown_arg=argv[i];
return true;
}
options[optnr].isset=true;
if(options[optnr].hasval)

options[*optnr].isset=true;

if(options[*optnr].hasval)
{
if(argv[i][2]==0 || options[optnr].islong)
if(argv[i][2]==0 || options[*optnr].islong)
{
i++;
if(i==argc)
return true;
if(argv[i][0]=='-' && argv[i][1]!=0)
return true;
options[optnr].values.push_back(argv[i]);
options[*optnr].values.push_back(argv[i]);
}
else
options[optnr].values.push_back(argv[i]+2);
options[*optnr].values.push_back(argv[i]+2);
}
}
}
Expand Down
8 changes: 5 additions & 3 deletions src/util/cmdline.h
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@ Author: Daniel Kroening, [email protected]
#include <list>
#include <string>

#include "optional.h"

class cmdlinet
{
public:
Expand Down Expand Up @@ -53,13 +55,13 @@ class cmdlinet
hasval(false),
islong(false),
optchar(0)
{}
{}
};

std::vector<optiont> options;

int getoptnr(char option) const;
int getoptnr(const std::string &option) const;
optionalt<std::size_t> getoptnr(char option) const;
optionalt<std::size_t> getoptnr(const std::string &option) const;
};

#endif // CPROVER_UTIL_CMDLINE_H