diff options
Diffstat (limited to 'gdbsupport/gdb_argv_vec.h')
-rw-r--r-- | gdbsupport/gdb_argv_vec.h | 139 |
1 files changed, 139 insertions, 0 deletions
diff --git a/gdbsupport/gdb_argv_vec.h b/gdbsupport/gdb_argv_vec.h new file mode 100644 index 0000000..1f3b6db --- /dev/null +++ b/gdbsupport/gdb_argv_vec.h @@ -0,0 +1,139 @@ +/* Wrap std::vector<char *> that owns the 'char *' strings. + + Copyright (C) 2025 Free Software Foundation, Inc. + + This file is part of GDB. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. */ + +#ifndef GDBSUPPORT_GDB_ARGV_VEC_H +#define GDBSUPPORT_GDB_ARGV_VEC_H + +#include "gdbsupport/common-utils.h" +#include <vector> + +namespace gdb +{ + +/* A class that wraps around a vector of 'char *' strings. The class owns + the strings within the vector and will release them by calling xfree() + on each string when this classes destructor is called. */ +class argv_vec final +{ + /* Vector of strings. This class owns the strings within the vector. + This is at the start of the class so we can use decltype(). */ + std::vector<char *> m_args; + +public: + + using value_type = decltype (m_args)::value_type; + using iterator = decltype (m_args)::iterator; + using const_iterator = decltype (m_args)::const_iterator; + using reference = decltype (m_args)::reference; + using const_reference = decltype (m_args)::const_reference; + + argv_vec () + { + /* Nothing. */ + } + + /* Move the owned strings from OTHER. */ + argv_vec (argv_vec &&other) + { + this->m_args = std::move (other.m_args); + } + + /* Don't currently support copying the strings from OTHER. */ + argv_vec (const argv_vec &other) = delete; + + /* Move elements from OTHER. Free currently owned strings. */ + argv_vec &operator= (argv_vec &&other) + { + free_vector_argv (m_args); + this->m_args = std::move (other.m_args); + return *this; + } + + /* Don't currently support copying the strings from OTHER. */ + argv_vec &operator= (const argv_vec &other) = delete; + + /* Release the owned strings. */ + ~argv_vec () + { + free_vector_argv (m_args); + } + + /* Append VALUE to the end of m_args. This class takes ownership of + VALUE, and will release VALUE by calling xfree() on it when this + object is destroyed. */ + void push_back (const value_type &value) + { + m_args.push_back (value); + } + + /* Append VALUE to the end of m_args. This class takes ownership of + VALUE, and will release VALUE by calling xfree() on it when this + object is destroyed. */ + void push_back (value_type &&value) + { + m_args.push_back (value); + } + + /* Non constant iterator to start of m_args. */ + iterator begin () + { + return m_args.begin (); + } + + /* Non constant iterator to end of m_args. */ + iterator end () + { + return m_args.end (); + } + + /* Constant iterator to start of m_args. */ + const_iterator begin () const + { + return m_args.begin (); + } + + /* Constant iterator to end of m_args. */ + const_iterator end () const + { + return m_args.end (); + } + + /* Return contiguous block of 'char *' pointers. Ideally this would be + const, but the execve interface to which this data is passed doesn't + accept 'const char **'. */ + char **argv () + { + return m_args.data (); + } + + /* Return a constant reference to the underlying vector. */ + const decltype (m_args) &get () const + { + return m_args; + } + + /* Return true when m_args is empty. */ + bool empty () const + { + return m_args.empty (); + } +}; +} /* namespac gdb */ + +#endif /* GDBSUPPORT_GDB_ARGV_VEC_H */ |