]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
ceph_argparse: refactor env_to_vec()
authorKefu Chai <kchai@redhat.com>
Wed, 12 Feb 2020 12:39:54 +0000 (20:39 +0800)
committerNathan Cutler <ncutler@suse.com>
Tue, 18 Feb 2020 09:07:02 +0000 (10:07 +0100)
* no need to return dashdash for indicating if arguments after "--" is
  empty. the `arguments` itself would suffice.
* return value by `return` not by passing input parameters

Signed-off-by: Kefu Chai <kchai@redhat.com>
(cherry picked from commit be7fedf8748970fc81dbca00ff43c79746d993af)

src/common/ceph_argparse.cc

index 818f8d0767514cda62744fe1091a43ec33be8b0f..d7dda71034ba5fc8b8363e07179b056b96a2a660 100644 (file)
@@ -64,23 +64,18 @@ void string_to_vec(std::vector<std::string>& args, std::string argstr)
   }
 }
 
-bool split_dashdash(const std::vector<const char*>& args,
-                   std::vector<const char*>& options,
-                   std::vector<const char*>& arguments) {
-  bool dashdash = false;
-  for (std::vector<const char*>::const_iterator i = args.begin();
-       i != args.end();
-       ++i) {
-    if (dashdash) {
-      arguments.push_back(*i);
-    } else {
-      if (strcmp(*i, "--") == 0)
-       dashdash = true;
-      else
-       options.push_back(*i);
-    }
+std::pair<std::vector<const char*>, std::vector<const char*>>
+split_dashdash(const std::vector<const char*>& args) {
+  auto dashdash = std::find_if(args.begin(), args.end(),
+                              [](const char* arg) {
+                                return strcmp(arg, "--") == 0;
+                              });
+  std::vector<const char*> options{args.begin(), dashdash};
+  if (dashdash != args.end()) {
+    ++dashdash;
   }
-  return dashdash;
+  std::vector<const char*> arguments{dashdash, args.end()};
+  return {std::move(options), std::move(arguments)};
 }
 
 static std::mutex g_str_vec_lock;
@@ -98,15 +93,7 @@ void env_to_vec(std::vector<const char*>& args, const char *name)
   if (!name)
     name = "CEPH_ARGS";
 
-  bool dashdash = false;
-  std::vector<const char*> options;
-  std::vector<const char*> arguments;
-  if (split_dashdash(args, options, arguments))
-    dashdash = true;
-
-  std::vector<const char*> env_options;
-  std::vector<const char*> env_arguments;
-  std::vector<const char*> env;
+  auto [options, arguments] = split_dashdash(args);
 
   /*
    * We can only populate str_vec once. Other threads could hold pointers into
@@ -123,17 +110,19 @@ void env_to_vec(std::vector<const char*>& args, const char *name)
   }
   g_str_vec_lock.unlock();
 
-  vector<string>::iterator i;
-  for (i = g_str_vec.begin(); i != g_str_vec.end(); ++i)
-    env.push_back(i->c_str());
-  if (split_dashdash(env, env_options, env_arguments))
-    dashdash = true;
+  std::vector<const char*> env;
+  for (const auto& s : g_str_vec) {
+    env.push_back(s.c_str());
+  }
+  auto [env_options, env_arguments] = split_dashdash(env);
 
   args.clear();
   args.insert(args.end(), options.begin(), options.end());
   args.insert(args.end(), env_options.begin(), env_options.end());
-  if (dashdash)
-    args.push_back("--");
+  if (arguments.empty() && env_arguments.empty()) {
+    return;
+  }
+  args.push_back("--");
   args.insert(args.end(), arguments.begin(), arguments.end());
   args.insert(args.end(), env_arguments.begin(), env_arguments.end());
 }