bug in RC
[anna.git] / include / anna / core / util / String.hpp
1 // ANNA - Anna is Not Nothingness Anymore                                                         //
2 //                                                                                                //
3 // (c) Copyright 2005-2015 Eduardo Ramos Testillano & Francisco Ruiz Rayo                         //
4 //                                                                                                //
5 // See project site at http://redmine.teslayout.com/projects/anna-suite                           //
6 // See accompanying file LICENSE or copy at http://www.teslayout.com/projects/public/anna.LICENSE //
7
8
9 #ifndef anna_core_util_String_hpp
10 #define anna_core_util_String_hpp
11
12 #include <string>
13
14 #include <stdio.h>
15
16 #include <anna/core/util/defines.hpp>
17
18 namespace anna {
19
20 class DataBlock;
21
22 /**
23  * Clase String que optimiza el uso y la conversi�n de tipos usados habitualmente.
24  */
25 class String : public std::string {
26 public:
27   /**
28    * Indicadores que permiten ajustar el funcionamiento de la clase anna::String.
29    *
30    * \see anna::String
31    */
32   struct Flag { enum _v { None, ShowNull }; };
33
34   /**
35    * Constructor.
36    * \param flag Indicadores que permiten ajustar el funcionamiento de la clase anna::String.
37    */
38   String(const Flag::_v flag = Flag::None) : a_flags(flag) {;}
39
40   /**
41    * Constructor.
42    * \param str Cadena con la que iniciar el contenido de esta instancia. Puede ser NULL.
43    * \param flag Indicadores que permiten ajustar el funcionamiento de la clase anna::String.
44    */
45   explicit String(const char* str, const Flag::_v flag = Flag::None) :
46     std::string((str == NULL) ? ((flag & Flag::ShowNull) ? "<null>" : "") : str),
47     a_flags(flag)
48   {;}
49
50   /**
51    * Constructor copia.
52    * \param other Instancia con la iniciar el contenido de esta instancia.
53    */
54   String(const String &other) : std::string(other), a_flags(other.a_flags) {;}
55
56
57   /**
58    * Constructor copia.
59    * \param other Instancia con la iniciar el contenido de esta instancia.
60    * \param flag Indicadores que permiten ajustar el funcionamiento de la clase anna::String.
61    */
62   explicit String(const std::string& other, const Flag::_v flag = Flag::None) : std::string(other), a_flags(flag) {;}
63
64   /**
65    * Convierte a may�sculas el contenido de esta instancia.
66    */
67   void toUpper() throw();
68
69   /**
70    * Convierte a min�sculas el contenido de esta instancia.
71    */
72   void toLower() throw();
73
74   String& operator = (const char* vv) throw() { std::string::clear(); return operator<< (vv); }
75   String& operator = (const int vv) throw() { std::string::clear(); return operator<< (vv); }
76   String& operator = (const unsigned int vv) throw() { std::string::clear(); return operator<< (vv); }
77   String& operator = (const bool vv) throw() { std::string::clear(); return operator<< (vv); }
78   String& operator = (const S64 vv) throw() { std::string::clear(); return operator<< (vv); }
79   String& operator = (const U64 vv) throw() { std::string::clear(); return operator<< (vv); }
80   String& operator = (const float vv) throw() { std::string::clear(); return operator<< (vv); }
81   String& operator = (const double vv) throw() { std::string::clear(); return operator<< (vv); }
82   String& operator = (const std::string& vv) throw() { std::string::operator= (vv); return *this; }
83   String& operator = (const DataBlock& vv) throw() { std::string::clear(); return operator<< (vv); }
84
85   String& operator += (const char* vv) throw() { return operator<< (vv); }
86   String& operator += (const int vv) throw() { return operator<< (vv); }
87   String& operator += (const unsigned int vv) throw() { return operator<< (vv); }
88   String& operator += (const bool vv) throw() { return operator<< (vv); }
89   String& operator += (const S64 vv) throw() { return operator<< (vv); }
90   String& operator += (const U64 vv) throw() { return operator<< (vv); }
91   String& operator += (const float vv) throw() { return operator<< (vv); }
92   String& operator += (const double vv) throw() { return operator<< (vv); }
93   String& operator += (const std::string& vv) throw() { return *this << vv; }
94   String& operator += (const DataBlock& vv) throw() { return *this << vv; }
95
96   String& operator << (const char* vv) throw();
97   String& operator << (const int vv) throw();
98   String& operator << (const unsigned int vv) throw();
99   String& operator << (const bool vv) throw() { std::string::operator+= ((vv == true) ? "true" : "false"); return *this; }
100   String& operator << (const S64 vv) throw();
101   String& operator << (const U64 vv) throw();
102   String& operator << (const float vv) throw();
103   String& operator << (const double vv) throw();
104   String& operator << (const std::string& vv) throw() { std::string::operator+= (vv); return *this; }
105   String& operator << (const DataBlock& vv) throw();
106
107   /**
108    * Formatea el contenido del \em float con la cadena recibida como par�metro.
109    * La cadena de forma se interpreta de la misma forma que en el m�todo \em 'sprintf'
110    * \param vv Valor a interpretar.
111    * \param format Cadena usada para interpretar el valor (ver sprintf).
112    * \return La cadena con el contenido interpretado.
113    */
114   static String format(const float vv, const char* format) throw() { return __format(vv, format); }
115
116   /**
117    * Formatea el contenido del \em double con la cadena recibida como par�metro.
118    * La cadena de forma se interpreta de la misma forma que en el m�todo \em 'sprintf'
119    * \param vv Valor a interpretar.
120    * \param format Cadena usada para interpretar el valor (ver sprintf).
121    * \return La cadena con el contenido interpretado.
122    */
123   static String format(const double vv, const char* format) throw() { return __format(vv, format); }
124
125   /**
126    * Formatea el contenido del DataBlock con el n�mero de caracteres por l�nea recibida como par�metro.
127    * \param vv Valor a interpretar.
128    * \param characterByLine N�mero de caracters por l�nea.
129    * \return La cadena con el contenido interpretado.
130    */
131   static String format(const DataBlock& vv, const int characterByLine) throw();
132
133   /**
134    * Formatea el valor del par�metro como un n�mero en hexadecimal.
135    * \param vv Valor a interpretar.
136    * \return La cadena con el contenido interpretado.
137    */
138   static String hex(const int vv) { return __format(vv, "0x%x"); }
139
140   /**
141    * Formatea el valor del par�metro como un n�mero en hexadecimal.
142    * \param vv Valor a interpretar.
143    * \return La cadena con el contenido interpretado.
144    */
145   static String hex(const unsigned int vv) { return __format(vv, "0x%x"); }
146
147   /**
148    * Formatea el valor del par�metro como un n�mero en hexadecimal.
149    * \param vv Valor a interpretar.
150    * \return La cadena con el contenido interpretado.
151    */
152   static String hex(const S64 vv) {
153     return __format(vv, "0x%llx");
154     /*#ifdef __anna64__
155        return __format (vv, "0x%lx");
156     #else
157        return __format (vv, "0x%llx");
158     #endif
159     */
160   }
161
162 private:
163   Flag::_v a_flags;
164
165   template <typename T> static String __format(const T vv, const char* format) {
166     char aux [64];
167     sprintf(aux, format, vv);
168     return String(aux);
169   }
170 };
171
172 }
173
174 #endif