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