much closer to working
This commit is contained in:
parent
e31c9af607
commit
3fed557cf2
@ -908,6 +908,12 @@ namespace cxxopts
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::shared_ptr<Value>
|
||||||
|
make_storage() const
|
||||||
|
{
|
||||||
|
return m_value->clone();
|
||||||
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
String m_desc;
|
String m_desc;
|
||||||
std::shared_ptr<const Value> m_value;
|
std::shared_ptr<const Value> m_value;
|
||||||
@ -935,14 +941,54 @@ namespace cxxopts
|
|||||||
std::vector<HelpOptionDetails> options;
|
std::vector<HelpOptionDetails> options;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class OptionValue
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
void
|
||||||
|
parse
|
||||||
|
(
|
||||||
|
std::shared_ptr<const OptionDetails> details,
|
||||||
|
const std::string& text
|
||||||
|
)
|
||||||
|
{
|
||||||
|
ensure_value(details);
|
||||||
|
++m_count;
|
||||||
|
m_value->parse(text);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
parse_default(std::shared_ptr<const OptionDetails> details)
|
||||||
|
{
|
||||||
|
ensure_value(details);
|
||||||
|
m_value->parse();
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t
|
||||||
|
count() const
|
||||||
|
{
|
||||||
|
return m_count;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
void
|
||||||
|
ensure_value(std::shared_ptr<const OptionDetails> details)
|
||||||
|
{
|
||||||
|
if (m_value == nullptr)
|
||||||
|
{
|
||||||
|
m_value = details->make_storage();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
std::shared_ptr<Value> m_value;
|
||||||
|
size_t m_count = 0;
|
||||||
|
};
|
||||||
|
|
||||||
class ParseResult
|
class ParseResult
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
||||||
template <typename Iterator>
|
|
||||||
ParseResult(
|
ParseResult(
|
||||||
Iterator,
|
const std::unordered_map<std::string, std::shared_ptr<OptionDetails>>&,
|
||||||
Iterator,
|
|
||||||
std::vector<std::string>,
|
std::vector<std::string>,
|
||||||
int&, char**&);
|
int&, char**&);
|
||||||
|
|
||||||
@ -955,7 +1001,9 @@ namespace cxxopts
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
return iter->second->count();
|
auto riter = m_results.find(iter->second);
|
||||||
|
|
||||||
|
return riter->second.count();
|
||||||
}
|
}
|
||||||
|
|
||||||
const OptionDetails&
|
const OptionDetails&
|
||||||
@ -973,6 +1021,9 @@ namespace cxxopts
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
|
OptionValue&
|
||||||
|
get_option(std::shared_ptr<OptionDetails>);
|
||||||
|
|
||||||
void
|
void
|
||||||
parse(int& argc, char**& argv);
|
parse(int& argc, char**& argv);
|
||||||
|
|
||||||
@ -990,6 +1041,9 @@ namespace cxxopts
|
|||||||
const std::string& arg = ""
|
const std::string& arg = ""
|
||||||
);
|
);
|
||||||
|
|
||||||
|
void
|
||||||
|
parse_default(std::shared_ptr<OptionDetails> details);
|
||||||
|
|
||||||
void
|
void
|
||||||
checked_parse_arg
|
checked_parse_arg
|
||||||
(
|
(
|
||||||
@ -1000,10 +1054,12 @@ namespace cxxopts
|
|||||||
const std::string& name
|
const std::string& name
|
||||||
);
|
);
|
||||||
|
|
||||||
std::unordered_map<std::string, std::shared_ptr<OptionDetails>> m_options;
|
const std::unordered_map<std::string, std::shared_ptr<OptionDetails>>
|
||||||
|
&m_options;
|
||||||
std::vector<std::string> m_positional;
|
std::vector<std::string> m_positional;
|
||||||
std::vector<std::string>::iterator m_next_positional;
|
std::vector<std::string>::iterator m_next_positional;
|
||||||
std::unordered_set<std::string> m_positional_set;
|
std::unordered_set<std::string> m_positional_set;
|
||||||
|
std::unordered_map<std::shared_ptr<OptionDetails>, OptionValue> m_results;
|
||||||
};
|
};
|
||||||
|
|
||||||
class Options
|
class Options
|
||||||
@ -1084,7 +1140,7 @@ namespace cxxopts
|
|||||||
String m_help_string;
|
String m_help_string;
|
||||||
std::string m_positional_help;
|
std::string m_positional_help;
|
||||||
|
|
||||||
std::map<std::string, std::shared_ptr<OptionDetails>> m_options;
|
std::unordered_map<std::string, std::shared_ptr<OptionDetails>> m_options;
|
||||||
std::vector<std::string> m_positional;
|
std::vector<std::string> m_positional;
|
||||||
std::vector<std::string>::iterator m_next_positional;
|
std::vector<std::string>::iterator m_next_positional;
|
||||||
std::unordered_set<std::string> m_positional_set;
|
std::unordered_set<std::string> m_positional_set;
|
||||||
@ -1234,22 +1290,17 @@ namespace cxxopts
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename Iterator>
|
inline
|
||||||
ParseResult::ParseResult(Iterator begin, Iterator end,
|
ParseResult::ParseResult
|
||||||
|
(
|
||||||
|
const std::unordered_map<std::string, std::shared_ptr<OptionDetails>>& options,
|
||||||
std::vector<std::string> positional,
|
std::vector<std::string> positional,
|
||||||
int& argc, char**& argv
|
int& argc, char**& argv
|
||||||
)
|
)
|
||||||
: m_positional(std::move(positional))
|
: m_options(options)
|
||||||
|
, m_positional(std::move(positional))
|
||||||
, m_next_positional(m_positional.begin())
|
, m_next_positional(m_positional.begin())
|
||||||
{
|
{
|
||||||
for (auto current = begin; current != end; ++current)
|
|
||||||
{
|
|
||||||
m_options.insert({
|
|
||||||
current->first,
|
|
||||||
std::make_shared<OptionDetails>(*current->second)
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
parse(argc, argv);
|
parse(argc, argv);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1318,6 +1369,13 @@ OptionAdder::operator()
|
|||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline
|
||||||
|
void
|
||||||
|
ParseResult::parse_default(std::shared_ptr<OptionDetails> details)
|
||||||
|
{
|
||||||
|
m_results[details].parse_default(details);
|
||||||
|
}
|
||||||
|
|
||||||
inline
|
inline
|
||||||
void
|
void
|
||||||
ParseResult::parse_option
|
ParseResult::parse_option
|
||||||
@ -1327,7 +1385,8 @@ ParseResult::parse_option
|
|||||||
const std::string& arg
|
const std::string& arg
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
value->parse(arg);
|
auto& result = m_results[value];
|
||||||
|
result.parse(value, arg);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline
|
inline
|
||||||
@ -1436,7 +1495,7 @@ inline
|
|||||||
ParseResult
|
ParseResult
|
||||||
Options::parse(int& argc, char**& argv)
|
Options::parse(int& argc, char**& argv)
|
||||||
{
|
{
|
||||||
ParseResult result(m_options.begin(), m_options.end(), m_positional, argc, argv);
|
ParseResult result(m_options, m_positional, argc, argv);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1573,7 +1632,7 @@ ParseResult::parse(int& argc, char**& argv)
|
|||||||
auto& value = detail->value();
|
auto& value = detail->value();
|
||||||
|
|
||||||
if(!detail->count() && value.has_default()){
|
if(!detail->count() && value.has_default()){
|
||||||
detail->parse_default();
|
parse_default(detail);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user