| /* 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 */ |