add clone to options
This is broken at the moment; it needs a complete rewrite. The problem is that multiple options point to the same `OptionDetails`. I really need to separate parsing results from describing options.
This commit is contained in:
parent
1d6d1c97f0
commit
e31c9af607
@ -256,6 +256,10 @@ namespace cxxopts
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
virtual
|
||||||
|
std::shared_ptr<Value>
|
||||||
|
clone() const = 0;
|
||||||
|
|
||||||
virtual void
|
virtual void
|
||||||
parse(const std::string& text) const = 0;
|
parse(const std::string& text) const = 0;
|
||||||
|
|
||||||
@ -694,6 +698,8 @@ namespace cxxopts
|
|||||||
template <typename T>
|
template <typename T>
|
||||||
class standard_value : public Value
|
class standard_value : public Value
|
||||||
{
|
{
|
||||||
|
using Self = standard_value<T>;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
standard_value()
|
standard_value()
|
||||||
: m_result(std::make_shared<T>())
|
: m_result(std::make_shared<T>())
|
||||||
@ -706,6 +712,28 @@ namespace cxxopts
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::shared_ptr<Value>
|
||||||
|
clone() const
|
||||||
|
{
|
||||||
|
std::shared_ptr<Self> copy;
|
||||||
|
|
||||||
|
if (m_result)
|
||||||
|
{
|
||||||
|
copy = std::make_shared<Self>(m_store);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
copy = std::make_shared<Self>();
|
||||||
|
}
|
||||||
|
|
||||||
|
copy->m_default = m_default;
|
||||||
|
copy->m_implicit = m_implicit;
|
||||||
|
copy->m_default_value = m_default_value;
|
||||||
|
copy->m_implicit_value = m_implicit_value;
|
||||||
|
|
||||||
|
return copy;
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
parse(const std::string& text) const
|
parse(const std::string& text) const
|
||||||
{
|
{
|
||||||
@ -825,6 +853,15 @@ namespace cxxopts
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
OptionDetails(const OptionDetails& rhs)
|
||||||
|
: m_desc(rhs.m_desc)
|
||||||
|
, m_count(rhs.m_count)
|
||||||
|
{
|
||||||
|
m_value = rhs.m_value->clone();
|
||||||
|
}
|
||||||
|
|
||||||
|
OptionDetails(OptionDetails&& rhs) = default;
|
||||||
|
|
||||||
const String&
|
const String&
|
||||||
description() const
|
description() const
|
||||||
{
|
{
|
||||||
@ -1202,10 +1239,17 @@ ParseResult::ParseResult(Iterator begin, Iterator end,
|
|||||||
std::vector<std::string> positional,
|
std::vector<std::string> positional,
|
||||||
int& argc, char**& argv
|
int& argc, char**& argv
|
||||||
)
|
)
|
||||||
: m_options(begin, end)
|
: m_positional(std::move(positional))
|
||||||
, 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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user