summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorBent Bisballe Nyeng <deva@aasimon.org>2025-01-25 12:57:24 +0100
committerBent Bisballe Nyeng <deva@aasimon.org>2025-01-25 12:57:24 +0100
commit5d268488b2861ce73db233d71bdb527f89001a4e (patch)
treedd7ebe2a9a4f9e66d7e8d869a13187211aa93a84 /src
parent6628a2d8b18030dd3ebc714f65e7af90bd0b711a (diff)
Add PointerList class for working with, and propagating, argc/argvpointerlist
Diffstat (limited to 'src')
-rw-r--r--src/pointerlist.cc28
-rw-r--r--src/pointerlist.h26
2 files changed, 54 insertions, 0 deletions
diff --git a/src/pointerlist.cc b/src/pointerlist.cc
new file mode 100644
index 0000000..e642075
--- /dev/null
+++ b/src/pointerlist.cc
@@ -0,0 +1,28 @@
+// -*- c++ -*-
+// Distributed under the BSD 2-Clause License.
+// See accompanying file LICENSE for details.
+#include "pointerlist.h"
+
+PointerList::PointerList(int argc, const char* argv[])
+{
+ for(int i = 0; i < argc; ++i)
+ {
+ push_back(argv[i]);
+ }
+}
+
+std::pair<int, const char**> PointerList::get()
+{
+ argptrs.clear();
+ for(const auto& arg : *this)
+ {
+ argptrs.push_back(arg.data());
+ }
+
+ if(argptrs.size() == 0)
+ {
+ return {0, nullptr};
+ }
+
+ return {argptrs.size(), argptrs.data()};
+}
diff --git a/src/pointerlist.h b/src/pointerlist.h
new file mode 100644
index 0000000..7c51ca6
--- /dev/null
+++ b/src/pointerlist.h
@@ -0,0 +1,26 @@
+// -*- c++ -*-
+// Distributed under the BSD 2-Clause License.
+// See accompanying file LICENSE for details.
+
+#include <string>
+#include <vector>
+#include <deque>
+#include <utility>
+
+// Maintains an (owning) list of string args and converts them to argc/argv
+// compatible arguments on request.
+// The returned pointers are guaranteed to be valid as long as the PointerList
+// object lifetime is not exceeded.
+class PointerList :
+ public std::deque<std::string>
+{
+public:
+ PointerList() = default;
+ PointerList(int argc, const char* argv[]);
+
+ //! Returns argc/argv pair from the current list of args
+ std::pair<int, const char**> get();
+
+private:
+ std::vector<const char*> argptrs;
+};