String routines to complement <string> && <cstring>:
psz_string.h
Go to the documentation of this file.
1 // psz_string.h (C) 2012 adolfo@di-mare.com
2 
3 /** \file psz_string.h
4  \brief Empaque \c (char*) para usar hileras C de forma segura en C++.
5 
6  Esta clase permite crear hileras C [ vectores \c (char) que terminan en \c (0) ]
7  de manera segura, pues el \c (char*) está empacado dentro de una clase para que
8  el destructor C++ de la clase se encargue de retornar la memoria dinámica de la
9  hilera aún si se produce una excepción.
10 
11  Facilita mucho la programación cuando es obligatorio usar hileras C en el programa,
12  como ocurre si se usan las biblitecas para leer los nombres de archivos de un
13  directorio (carpeta).
14 
15  \author Adolfo Di Mare <adolfo@di-mare.com>
16  \date 2012
17 */
18 
19 #ifndef psz_string_h
20 #define psz_string_h
21 
22 #include <cstring> // strlen() && memcpy()
23 
24 /** Clase pequeñita para que no se me olvide \c delete[] para \c (char*).
25  También incluye el operador de copia \c operator=() para cuando no
26  es cómodo usar \c strcpy().
27 
28  \dontinclude string_tool_test.cpp
29  \skipline test::psz_string()
30  \until }}
31 */
32 class psz_string {
33  char * ptr; ///< Vector manejado por la clase
34  // cuando ptr==0 se supone que la hilera es nula
35 public:
36  operator char*() const { return ptr; }
37  void operator=( const char* str ) {
38  if ( ptr == str ) { return; } // evita auto-copia
39  clear(); // assert( ptr==0 );
40  if ( str!=0 ) if ( *str!=0 ) {
41  unsigned N=1+strlen(str);
42  ptr = new char[N];
43  memcpy( ptr, str, N );
44  }
45  }
46  void alloc( unsigned sz ) { clear(); if (sz>0) { ptr = new char[sz]; } }
47  void clear() { if (ptr!=0) { delete [] ptr; } ptr=0; }
48 public:
49  psz_string() : ptr(0) {} ///< Constructor
50  psz_string( unsigned sz ) : ptr(0) { alloc(sz); }
51  psz_string( const psz_string& o ) : ptr(0) { this->operator=(o.ptr); }
52  psz_string( const char* str ) : ptr(0) { *this=str; }
53  ~psz_string() { if (ptr!=0) { delete [] ptr; } }
54  void swap( psz_string& o ) { char* tmp=o.ptr; o.ptr=ptr; ptr=tmp; }
55  const char* c_str() const { return ptr; }
56 };
57 
58 /**
59 \fn psz_string::psz_string( unsigned sz )
60 \brief Constructor que obtiene exactamente \c sz letras.
61  Le cabe una hilera de hasta <code>(sz-1)</code> letras.
62 
63 \fn psz_string::psz_string( const psz_string& o )
64 \brief Constructor de copia.
65 
66 \fn psz_string::psz_string( const char* str )
67 \brief Constructor a partir de una hilera.
68 
69 \fn psz_string::clear()
70 \brief Borra la hilera. Libera la memoria.
71 
72 \fn psz_string::~psz_string()|
73 \brief Destructor: libera memoria si hace falta.
74 
75 \fn psz_string::alloc( unsigned sz )
76 \brief Obtiene exactamente \c sz letras.
77  Le cabe una hilera de hasta <code>(sz-1)</code> letras.
78  Si <code>(sz==0)</code> libera la memoria.
79 
80 \fn psz_string::swap( psz_string& str )
81 \brief Intercambia los valores \c this <==> \c str.
82 
83 \fn psz_string::operator=( const char* str )
84 \brief Copia el valor de \c str.
85 
86 \fn psz_string::operator char*() const
87 \brief [IMPORTANTE] Convertidor para que funcione como \c (char*).
88 
89 \fn psz_string::c_str() const
90 \brief Sinónimo de <code>psz_string::operator char*() const</code>
91 */
92 
93 #endif // psz_string_h
94 
95 // EOF: psz_string.h
psz_string
Clase pequeñita para que no se me olvide delete[] para (char*).
Definition: psz_string.h:32
psz_string::psz_string
psz_string(const psz_string &o)
Constructor de copia.
Definition: psz_string.h:51
psz_string::c_str
const char * c_str() const
Sinónimo de psz_string::operator char*() const
Definition: psz_string.h:55
psz_string::swap
void swap(psz_string &o)
Intercambia los valores this <==> str.
Definition: psz_string.h:54
psz_string::alloc
void alloc(unsigned sz)
Obtiene exactamente sz letras. Le cabe una hilera de hasta (sz-1) letras. Si (sz==0) libera la memori...
Definition: psz_string.h:46
psz_string::psz_string
psz_string()
Constructor.
Definition: psz_string.h:49
psz_string::clear
void clear()
Borra la hilera. Libera la memoria.
Definition: psz_string.h:47
psz_string::psz_string
psz_string(const char *str)
Constructor a partir de una hilera.
Definition: psz_string.h:52
psz_string::ptr
char * ptr
Vector manejado por la clase.
Definition: psz_string.h:33
psz_string::operator=
void operator=(const char *str)
Copia el valor de str.
Definition: psz_string.h:37
psz_string::~psz_string
~psz_string()
Destructor: libera memoria si hace falta.
Definition: psz_string.h:53
psz_string::psz_string
psz_string(unsigned sz)
Constructor que obtiene exactamente sz letras. Le cabe una hilera de hasta (sz-1) letras.
Definition: psz_string.h:50