| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151 |
- ///////////////////////////////////////////////////////////////////////////////
- // Name: wx/cmdargs.h
- // Purpose: declaration of wxCmdLineArgsArray helper class
- // Author: Vadim Zeitlin
- // Created: 2007-11-12
- // Copyright: (c) 2007 Vadim Zeitlin <vadim@wxwindows.org>
- // Licence: wxWindows licence
- ///////////////////////////////////////////////////////////////////////////////
- #ifndef _WX_CMDARGS_H_
- #define _WX_CMDARGS_H_
- #include "wx/arrstr.h"
- // ----------------------------------------------------------------------------
- // wxCmdLineArgsArray: helper class used by wxApp::argv
- // ----------------------------------------------------------------------------
- #if wxUSE_UNICODE
- // this class is used instead of either "char **" or "wchar_t **" (neither of
- // which would be backwards compatible with all the existing code) for argv
- // field of wxApp
- //
- // as it's used for compatibility, it tries to look as much as traditional
- // (char **) argv as possible, in particular it provides implicit conversions
- // to "char **" and also array-like operator[]
- class WXDLLIMPEXP_BASE wxCmdLineArgsArray
- {
- public:
- wxCmdLineArgsArray() { m_argsA = NULL; m_argsW = NULL; }
- template <typename T>
- wxCmdLineArgsArray& operator=(T **argv)
- {
- FreeArgs();
- m_args.clear();
- if ( argv )
- {
- while ( *argv )
- m_args.push_back(*argv++);
- }
- return *this;
- }
- operator char**() const
- {
- if ( !m_argsA )
- {
- const size_t count = m_args.size();
- m_argsA = new char *[count];
- for ( size_t n = 0; n < count; n++ )
- m_argsA[n] = wxStrdup(m_args[n].ToAscii());
- }
- return m_argsA;
- }
- operator wchar_t**() const
- {
- if ( !m_argsW )
- {
- const size_t count = m_args.size();
- m_argsW = new wchar_t *[count];
- for ( size_t n = 0; n < count; n++ )
- m_argsW[n] = wxStrdup(m_args[n].wc_str());
- }
- return m_argsW;
- }
- // existing code does checks like "if ( argv )" and we want it to continue
- // to compile, so provide this conversion even if it is pretty dangerous
- operator bool() const
- {
- return !m_args.empty();
- }
- // and the same for "if ( !argv )" checks
- bool operator!() const
- {
- return m_args.empty();
- }
- wxString operator[](size_t n) const
- {
- return m_args[n];
- }
- // we must provide this overload for g++ 3.4 which can't choose between
- // our operator[](size_t) and ::operator[](char**, int) otherwise
- wxString operator[](int n) const
- {
- return m_args[n];
- }
- // convenience methods, i.e. not existing only for backwards compatibility
- // do we have any arguments at all?
- bool IsEmpty() const { return m_args.empty(); }
- // access the arguments as a convenient array of wxStrings
- const wxArrayString& GetArguments() const { return m_args; }
- ~wxCmdLineArgsArray()
- {
- FreeArgs();
- }
- private:
- template <typename T>
- void Free(T **args)
- {
- if ( !args )
- return;
- const size_t count = m_args.size();
- for ( size_t n = 0; n < count; n++ )
- free(args[n]);
- delete [] args;
- }
- void FreeArgs()
- {
- Free(m_argsA);
- Free(m_argsW);
- }
- wxArrayString m_args;
- mutable char **m_argsA;
- mutable wchar_t **m_argsW;
- wxDECLARE_NO_COPY_CLASS(wxCmdLineArgsArray);
- };
- // provide global operator overload for compatibility with the existing code
- // doing things like "if ( condition && argv )"
- inline bool operator&&(bool cond, const wxCmdLineArgsArray& array)
- {
- return cond && !array.IsEmpty();
- }
- #endif // wxUSE_UNICODE
- #endif // _WX_CMDARGS_H_
|