From 75d0a97db3615514f579df9ddaea7a0e0fe00563 Mon Sep 17 00:00:00 2001 From: Andrew Bell Date: Fri, 29 Jan 2016 14:00:01 -0600 Subject: [PATCH] Handle positional vector-based arguments. --- include/pdal/util/ProgramArgs.hpp | 66 ++++++++++++++++++++----------- kernels/merge/MergeKernel.cpp | 2 +- 2 files changed, 44 insertions(+), 24 deletions(-) diff --git a/include/pdal/util/ProgramArgs.hpp b/include/pdal/util/ProgramArgs.hpp index 8bdffee938..8860c108ef 100644 --- a/include/pdal/util/ProgramArgs.hpp +++ b/include/pdal/util/ProgramArgs.hpp @@ -22,8 +22,8 @@ #pragma once +#include #include -#include #include @@ -61,16 +61,14 @@ class Arg } bool set() const { return m_set; } - bool positional() const - { return m_positional; } - std::string name() const - { return m_longname; } public: virtual bool needsValue() const { return true; } virtual void setValue(const std::string& s) = 0; virtual void reset() = 0; + virtual size_t assignPositional(const std::deque posList) + { return 0; } protected: std::string m_longname; @@ -118,6 +116,23 @@ class TArg : public Arg m_hidden = false; } + virtual size_t assignPositional(const std::deque posList) + { + if (!m_positional || m_set) + return 0; + + if (posList.empty()) + { + std::ostringstream oss; + + oss << "Missing value for positional argument '" << + m_longname << "'."; + throw arg_error(oss.str()); + } + setValue(posList.front()); + return 1; + } + private: T& m_var; T m_defaultVal; @@ -160,6 +175,24 @@ class VArg : public Arg m_hidden = false; } + virtual size_t assignPositional(const std::deque posList) + { + if (!m_positional || m_set) + return 0; + + size_t cnt; + for (cnt = 0; cnt < posList.size(); ++cnt) + try + { + setValue(posList[cnt]); + } + catch (arg_error&) + { + break; + } + return cnt; + } + private: std::vector& m_var; }; @@ -278,21 +311,9 @@ class ProgramArgs for (auto ai = m_args.begin(); ai != m_args.end(); ++ai) { Arg *arg = ai->get(); - if (arg->positional() && !arg->set()) - { -std::cerr << "Found Positional arg = " << arg->name() << "!\n"; - if (m_positional.empty()) - { - std::ostringstream oss; - - oss << "Missing value for positional argument '" << - arg->name() << "'."; - throw arg_error(oss.str()); - } -std::cerr << "Setting value!\n"; - arg->setValue(m_positional.front()); - m_positional.pop(); - } + size_t cnt = arg->assignPositional(m_positional); + while (cnt--) + m_positional.pop_front(); } } @@ -344,8 +365,7 @@ std::cerr << "Setting value!\n"; return parseLongArg(arg, value); else if (arg.size() && arg[0] == '-') return parseShortArg(arg, value); -std::cerr << "Pushing positional = " << arg << "!\n"; - m_positional.push(arg); + m_positional.push_back(arg); return 1; } @@ -440,7 +460,7 @@ std::cerr << "Pushing positional = " << arg << "!\n"; // Contains remaining arguments after positional argument have been // processed. - std::queue m_positional; + std::deque m_positional; }; } // namespace pdal diff --git a/kernels/merge/MergeKernel.cpp b/kernels/merge/MergeKernel.cpp index 6a098ccc3a..2db15dbc15 100644 --- a/kernels/merge/MergeKernel.cpp +++ b/kernels/merge/MergeKernel.cpp @@ -58,7 +58,7 @@ std::string MergeKernel::getName() const void MergeKernel::addSwitches(ProgramArgs& args) { - args.add("files,f", "input/output files", m_files); + args.add("files,f", "input/output files", m_files).setPositional(); }