Sam Jaffe 4 years ago
parent
commit
9dacec8c4f
2 changed files with 22 additions and 17 deletions
  1. 3 0
      include/program_args/arguments.h
  2. 19 17
      include/program_args/arguments_impl.hpp

+ 3 - 0
include/program_args/arguments.h

@@ -30,6 +30,9 @@ protected:
 
 private:
   void usage() const;
+  void add_options(std::string const & name, char abbrev,
+                   std::string const & description,
+                   std::vector<std::string> aliases = {});
 
 private:
   // Metadata variables

+ 19 - 17
include/program_args/arguments_impl.hpp

@@ -65,15 +65,7 @@ template <typename Impl> auto Arguments<Impl>::Flag::operator=(bool && value) {
 
 template <typename Impl> bool Arguments<Impl>::Flag::primed(bool inv) const {
   if (self->primed_) { return self->flags.count(name); }
-  std::vector<std::string> aliases{"--" + name};
-  if (abbrev) { aliases.emplace_back(std::string{'-', abbrev}); }
-  if (inv) { aliases.emplace_back("--no-" + name); };
-  for (auto & alias : aliases) {
-    if (!self->option_names.emplace(alias, name).second) {
-      throw ArgumentStructureError("Duplicate option string", alias);
-    }
-  }
-  self->option_descriptions.emplace(join("/", aliases), description);
+  self->add_options(name, abbrev, description, std::vector(inv, "no-" + name));
   self->flag_names.emplace(name);
   return false;
 }
@@ -100,14 +92,7 @@ auto Arguments<Impl>::Option::operator=(T && value) {
 
 template <typename Impl> bool Arguments<Impl>::Option::primed() const {
   if (self->primed_) { return true; }
-  std::vector<std::string> aliases{"--" + name};
-  if (abbrev) { aliases.emplace_back(std::string{'-', abbrev}); }
-  for (auto & alias : aliases) {
-    if (!self->option_names.emplace(alias, name).second) {
-      throw ArgumentStructureError("Duplicate option string", alias);
-    }
-  }
-  self->option_descriptions.emplace(join("/", aliases), description);
+  self->add_options(name, abbrev, description);
   return false;
 }
 
@@ -172,6 +157,23 @@ template <typename Impl> void Arguments<Impl>::usage() const {
   }
 }
 
+template <typename Impl>
+void Arguments<Impl>::add_options(std::string const & name, char abbrev,
+                                  std::string const & description,
+                                  std::vector<std::string> aliases) {
+  for (auto & str : aliases) {
+    str = "--" + str;
+  }
+  aliases.push_back("--" + name);
+  if (abbrev) { aliases.push_back(std::string{'-', abbrev}); }
+  for (auto & str : aliases) {
+    if (!option_names.emplace(str, name).second) {
+      throw ArgumentStructureError("Duplicate option string", str);
+    }
+  }
+  option_descriptions.emplace(join(",", aliases), description);
+}
+
 template <typename Impl>
 auto Arguments<Impl>::argument(size_t index, std::string const & name,
                                std::string const & description) {