]> git.tdb.fi Git - libs/core.git/blobdiff - source/core/getopt.h
Prefer more cache-efficient containers
[libs/core.git] / source / core / getopt.h
index 407d3459984fce67c42ffd92f1c9ffe7faae4b23..405864bb27bfdda1668537a35630550465963482 100644 (file)
@@ -6,6 +6,7 @@
 #include <string>
 #include <vector>
 #include <msp/strings/lexicalcast.h>
+#include "noncopyable.h"
 
 namespace Msp {
 
@@ -58,7 +59,7 @@ A built-in --help option is provided and will output a list of options,
 arguments and their associated help texts.  An application may override this by
 providing its own option with the same name.
 */
-class GetOpt
+class GetOpt: private NonCopyable
 {
 public:
        enum ArgType
@@ -202,22 +203,15 @@ private:
                { data.push_back(lexical_cast<typename T::value_type>(a)); }
        };
 
-       typedef std::list<OptionImpl *> OptionList;
-       typedef std::list<ArgumentImpl *> ArgumentList;
-
        bool help;
-       OptionList opts;
-       ArgumentList args;
+       std::vector<OptionImpl *> opts;
+       std::vector<ArgumentImpl *> args;
        std::vector<std::string> args_raw;
 
 public:
        GetOpt();
        ~GetOpt();
 
-       /** Returns any non-option arguments encountered during processing.
-       Deprecated. */
-       const std::vector<std::string> &get_args() const { return args_raw; }
-
        /** Adds an option with both short and long forms.  Processing depends on
        the type of the destination variable and whether an argument is taken or
        not.  With an argument, the value is lexical_cast to the appropriate type
@@ -227,6 +221,13 @@ public:
        Option &add_option(char s, const std::string &l, T &d, ArgType a = NO_ARG)
        { return add_option(s, l, SimpleStore<T>(d), a); }
 
+       /** Adds an option with both short and long forms.  The option may be
+       specified multiple times, and the argument from each occurrence is stored in
+       the list.  The argument type must be REQUIRED_ARG. */
+       template<typename T>
+       Option &add_option(char s, const std::string &l, std::vector<T> &d, ArgType a = REQUIRED_ARG)
+       { return add_option(s, l, ListStore<std::vector<T> >(d), a); }
+
        /** Adds an option with both short and long forms.  The option may be
        specified multiple times, and the argument from each occurrence is stored in
        the list.  The argument type must be REQUIRED_ARG. */
@@ -245,6 +246,13 @@ public:
        Argument &add_argument(const std::string &n, T &d, ArgType a = REQUIRED_ARG)
        { return add_argument(n, SimpleStore<T>(d), a); }
 
+       /** Adds a positional argument list.  If the list is declared as required,
+       at least one element must be given; an optional list may be empty.  Only one
+       list may be added, and optional fixed arguments can't be used with it. */
+       template<typename T>
+       Argument &add_argument(const std::string &n, std::vector<T> &d, ArgType a = REQUIRED_ARG)
+       { return add_argument(n, ListStore<std::vector<T> >(d), a); }
+
        /** Adds a positional argument list.  If the list is declared as required,
        at least one element must be given; an optional list may be empty.  Only one
        list may be added, and optional fixed arguments can't be used with it. */
@@ -291,6 +299,9 @@ template<> inline void GetOpt::SimpleStore<unsigned>::store()
 template<> inline void GetOpt::SimpleStore<std::string>::store(const std::string &a)
 { data = a; }
 
+template<> inline void GetOpt::ListStore<std::vector<std::string> >::store(const std::string &a)
+{ data.push_back(a); }
+
 template<> inline void GetOpt::ListStore<std::list<std::string> >::store(const std::string &a)
 { data.push_back(a); }