much closer to working

This commit is contained in:
Jarryd Beck 2017-10-27 07:57:54 +11:00
parent e31c9af607
commit 3fed557cf2

View File

@ -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);
} }
} }