1 // ANNA - Anna is Not Nothingness Anymore //
3 // (c) Copyright 2005-2015 Eduardo Ramos Testillano & Francisco Ruiz Rayo //
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 //
9 #ifndef anna_core_util_Variable_hpp
10 #define anna_core_util_Variable_hpp
12 #include <anna/core/util/defines.hpp>
13 #include <anna/core/RuntimeException.hpp>
14 #include <anna/core/define.autoenum.hpp>
15 #include <anna/core/util/String.hpp>
16 #include <anna/core/DataBlock.hpp>
21 Recubrimiento de variables de usuario.
23 Establece un recubrimiento sobre los tipos de variables soportados por el nucleo
28 Enumeracion con los tipos de datos que podemos asociar a un mensaje interno.
34 String, /**< Cadena de type std::string. */
35 Integer, /**< Numero entero de type int. */
37 Integer64, /**< Numero entero de tipo enterno de 64 bits */
38 Boolean = 5, /**< Dato de tipo bool. */
39 Block = 6, /**< Objeto de tipo DataBlock. */
40 Float, /**< Número en coma flotante de 32 bits */
41 Double, /**< Número en coma flotante de 64 bits */
42 Custom /** Tipo particular definido por el usuario */
44 anna_declare_enum(Type)
49 Constructor para inicializar una instancia de tipo cadena.
51 @param name Nombre logico que recibe este variable.
52 @param value Referencia a la variable que estamos recubriendo con esta instancia.
54 Variable(const char* name, std::string& value) :
59 a_value.a_string = &value;
64 * Constructor para inicializar una instancia de type entero.
66 * @param name Nombre logico que recibe este variable.
67 * @param value Referencia a la variable que estamos recubriendo con esta instancia.
69 Variable(const char* name, int& value) :
72 a_type(Type::Integer),
75 a_value.a_integer = &value;
79 * Constructor para inicializar una instancia de type long.
81 * @param name Nombre logico que recibe este variable.
82 * @param value Referencia a la variable que estamos recubriendo con esta instancia.
84 Variable(const char* name, S64& value) :
87 a_type(Type::Integer64),
90 a_value.a_longInteger = &value;
94 * Constructor para inicializar una instancia de type BOOLEAN.
96 * @param name Nombre logico que recibe este variable.
97 * @param value Referencia a la variable que estamos recubriendo con esta instancia.
99 Variable(const char* name, bool& value) :
102 a_type(Type::Boolean),
105 a_value.a_boolean = &value;
109 * Constructor para inicializar una instancia de type BLOQUE_MEMORIA.
111 * @param name Nombre logico que recibe este variable.
112 * @param value Referencia a la variable que estamos recubriendo con esta instancia.
114 Variable(const char* name, DataBlock& value) :
119 a_value.a_dataBlock = &value;
123 * Constructor para inicializar una instancia de type float.
125 * @param name Nombre logico que recibe este variable.
126 * @param value Referencia a la variable que estamos recubriendo con esta instancia.
128 Variable(const char* name, float& value) :
134 a_value.a_float = &value;
138 * Constructor para inicializar una instancia de type double.
140 * @param name Nombre logico que recibe este variable.
141 * @param value Referencia a la variable que estamos recubriendo con esta instancia.
143 Variable(const char* name, double& value) :
146 a_type(Type::Double),
149 a_value.a_double = &value;
153 * Constructor para inicializar una instancia de un tipo definido por el usuario.
155 * @param name Nombre logico que recibe este variable.
156 * @param value Referencia a la variable que estamos recubriendo con esta instancia.
158 Variable(const char* name, void* value) :
161 a_type(Type::Custom),
163 a_value.a_custom = value;
168 @param name Nombre logico que recibe esta variable.
169 @param type Tipo de dato de esta variable.
171 Variable(const char* name, const Type::_v type);
180 Devuelve el tipo del dato al que recubre esta variable.
181 @return El tipo del dato al que recubre esta variable.
183 Type::_v getType() const throw() { return a_type; }
186 Devuelve el nombre logico asociado a esta variable.
187 \return Nombre logico asociado a esta variable.
189 const char* getName() const throw() { return a_name.c_str(); }
192 Devuelve \em false si esta marcado como nulo o \em true en otro caso.
193 @return \em false si esta marcado como nulo o \em true en otro caso.
195 bool isNull() const throw() { return a_isNull; }
198 Devuelve el valor alfabetico asociado a esta variable.
199 @return Si la variable indicada en el contructor de esta instancia puede interpretarse como
200 una string devolvera su contenido, en otro caso lanzara una excepcion para indicar el error.
202 const char* getStringValue() const throw(RuntimeException);
205 Devuelve el valor numerico asociado a esta variable.
206 @return Si la variable indicada en el contructor de esta instancia puede interpretarse como
207 un entero de 32 bits devolvera su contenido, en otro caso lanzara una excepcion para indicar el error.
209 int getIntegerValue() const throw(RuntimeException);
212 Devuelve el valor numerico asociado a esta variable.
213 @return Si la variable indicada en el contructor de esta instancia puede interpretarse como
214 un entero de 64 bits devolvera su contenido, en otro caso lanzara una excepcion para indicar el error.
216 S64 getInteger64Value() const throw(RuntimeException);
219 Devuelve el valor booleano asociado a esta variable.
220 @return Si la variable indicada en el contructor de esta instancia puede interpretarse como
221 un booleano y este es distinto de cero devolvera true en otro caso devolvera false.
224 bool getBooleanValue() const throw(RuntimeException) ;
227 Devuelve el bloque de memoria asociado a esta variable.
228 @return Si la variable indicada en el contructor de esta instancia era de type DataBlock
229 devolvera el contenido de esta, en otro caso lanzara una excepcion.
231 const DataBlock& getDataBlockValue() const throw(RuntimeException) ;
234 Devuelve el valor numerico asociado a esta variable.
235 @return Si la variable indicada en el contructor de esta instancia puede interpretarse como
236 un entero en coma flotante devolvera su contenido, en otro caso lanzara una excepcion para indicar el error.
238 float getFloatValue() const throw(RuntimeException);
241 Devuelve el valor numerico asociado a esta variable.
242 @return Si la variable indicada en el contructor de esta instancia puede interpretarse como
243 un entero en coma flotante devolvera su contenido, en otro caso lanzara una excepcion para indicar el error.
245 double getDoubleValue() const throw(RuntimeException);
248 * Devuelve el valor de un elemento definido por el usuario.
250 void* getCustom() throw(RuntimeException) {
251 verifyMatchType(Type::Custom, ANNA_FILE_LOCATION);
252 return a_value.a_custom;
256 * Devuelve el valor de un elemento definido por el usuario.
258 const void* getCustom() const throw(RuntimeException) {
259 verifyMatchType(Type::Custom, ANNA_FILE_LOCATION);
260 return a_value.a_custom;
264 * Devuelve el valor de un elemento definido por el usuario.
266 void setCustom(void* value) throw(RuntimeException) {
267 verifyMatchType(Type::Custom, ANNA_FILE_LOCATION);
268 a_isNull = (value == NULL);
269 a_value.a_custom = value;
273 Interpreta el valor asociado a esta variable como un valor entero.
274 \warning No se realiza ninguna comprobacion semantica.
276 int getInteger() const throw() { return *a_value.a_integer; }
279 Interpreta el valor asociado a esta variable como un valor entero largo.
280 \warning No se realiza ninguna comprobacion semantica.
282 S64 getInteger64() const throw() { return *a_value.a_longInteger; }
285 Interpreta el valor asociado a esta variable como un valor booleano.
286 \warning No se realiza ninguna comprobacion semantica.
288 bool getBoolean() const throw() { return *a_value.a_boolean; }
291 Interpreta el valor asociado a esta variable como un valor bloque de datos.
292 \warning No se realiza ninguna comprobacion semantica.
294 const DataBlock& getDataBlock() const throw() { return *a_value.a_dataBlock; }
297 Interpreta el valor asociado a esta variable como un valor en coma flotante de 32 bits
298 \warning No se realiza ninguna comprobacion semantica.
300 float getFloat() const throw() { return *a_value.a_float; }
303 Interpreta el valor asociado a esta variable como un valor en coma flotante de 64 bits
304 \warning No se realiza ninguna comprobacion semantica.
306 double getDouble() const throw() { return *a_value.a_double; }
310 * Establece el valor de la variable a la que recubre. Si la variable estaba marcada como nula la desmarca.
311 * Si el type de dato que deseamos establecer no coincide con el type de dato indicado al crear esta
312 * variable devolvera una excepcion de ejecucion indicado la anomalia.
314 * @param value Valor que tomara la variable a la que recubre este variable.
316 void setValue(const char* value) throw(RuntimeException);
319 * Establece el valor de la variable a la que recubre. Si la variable estaba marcada como nula la desmarca.
320 * Si el type de dato que deseamos establecer no coincide con el type de dato indicado al crear esta
321 * variable devolvera una excepcion de ejecucion indicado la anomalia.
323 * @param value Valor que tomara la variable a la que recubre este variable.
325 void setCharPointer(const char* value) throw(RuntimeException);
328 * Establece el valor de la variable a la que recubre. Si la variable estaba marcada como nula la desmarca.
329 * Si el type de dato que deseamos establecer no coincide con el type de dato indicado al crear esta
330 * variable devolvera una excepcion de ejecucion indicado la anomalia.
332 * @param value Valor que tomara la variable a la que recubre este variable.
334 void setValue(const int value) throw(RuntimeException);
337 * Establece el valor de la variable a la que recubre. Si la variable estaba marcada como nula la desmarca.
338 * Si el type de dato que deseamos establecer no coincide con el type de dato indicado al crear esta
339 * variable devolvera una excepcion de ejecucion indicado la anomalia.
341 * @param value Valor que tomara la variable a la que recubre este variable.
343 void setValue(const S64 value) throw(RuntimeException) ;
346 * Establece el valor de la variable a la que recubre. Si la variable estaba marcada como nula la desmarca.
347 * Si el type de dato que deseamos establecer no coincide con el type de dato indicado al crear esta
348 * variable devolvera una excepcion de ejecucion indicado la anomalia.
350 * @param value Valor que tomara la variable a la que recubre este variable.
352 void setValue(const bool value) throw(RuntimeException);
355 * Establece el valor de la variable a la que recubre. Si la variable estaba marcada como nula la desmarca.
356 * Si el type de dato que deseamos establecer no coincide con el type de dato indicado al crear esta
357 * variable devolvera una excepcion de ejecucion indicado la anomalia.
359 * @param value Valor que tomara la variable a la que recubre este variable.
361 void setValue(const DataBlock& value) throw(RuntimeException) ;
364 * Establece el valor de la variable a la que recubre. Si la variable estaba marcada como nula la desmarca.
365 * Si el type de dato que deseamos establecer no coincide con el type de dato indicado al crear esta
366 * variable devolvera una excepcion de ejecucion indicado la anomalia.
368 * @param value Valor que tomara la variable a la que recubre este variable.
370 void setValue(const float value) throw(RuntimeException) ;
373 * Establece el valor de la variable a la que recubre. Si la variable estaba marcada como nula la desmarca.
374 * Si el type de dato que deseamos establecer no coincide con el type de dato indicado al crear esta
375 * variable devolvera una excepcion de ejecucion indicado la anomalia.
377 * @param value Valor que tomara la variable a la que recubre este variable.
379 void setValue(const double value) throw(RuntimeException) ;
382 Marca/Desmarca la variable como nula.
383 @param isNull Indica la nueva marca de la variable.
385 void setNull(const bool isNull = true) throw() { a_isNull = isNull; }
388 Establece el valor asociado a esta variable como un valor entero.
389 \warning No se realiza ninguna comprobacion semantica.
391 void setInteger(const int value) throw() { *a_value.a_integer = value; a_isNull = false; }
394 Establece el valor asociado a esta variable como un valor entero largo.
395 \warning No se realiza ninguna comprobacion semantica.
397 void setLong(const S64 value) throw() { *a_value.a_longInteger = value; a_isNull = false; }
400 Establece el valor asociado a esta variable como un valor booleano.
401 \warning No se realiza ninguna comprobacion semantica.
403 void setBoolean(const bool value) throw() { *a_value.a_boolean = value; a_isNull = false; }
406 Interpreta el valor asociado a esta variable como un valor bloque de datos.
407 \warning No se realiza ninguna comprobacion semantica.
409 void setDataBlock(const DataBlock& value) throw() { *a_value.a_dataBlock = value; a_isNull = false; }
412 Interpreta el valor asociado a esta variable como número en coma flotante.
413 \warning No se realiza ninguna comprobacion semantica.
415 void setFloat(const float value) throw() { *a_value.a_float = value; a_isNull = false; }
418 Interpreta el valor asociado a esta variable como número en coma flotante.
419 \warning No se realiza ninguna comprobacion semantica.
421 void setDouble(const double value) throw() { *a_value.a_double = value; a_isNull = false; }
424 @return \em true si la variable recibida tiene el mismo nombre que esta instancia o \em false
427 bool isEqual(const Variable& right) const throw() { return a_name == right.a_name; }
430 Devuelve una cadena con informacion relevante de esta instancia.
431 \return Una cadena con informacion relevante de esta instancia.
433 virtual String asString() const throw();
437 Devuelve la direccion de memoria de la variable C++ a sociada a esta variable logica.
438 \return La direccion de memoria de la variable C++ a sociada a esta variable logica.
439 \warning La forma de interpretar este valor dependera del tipo de dato (ver #Type) asociado
440 Devuelve la referencia a memoria de esta variable.
443 void* getReference() const throw();
446 Devuelve el area de memoria de la variable C++ a sociada a esta variable logica.
447 \return La area de memoria de la variable C++ a sociada a esta variable logica.
448 \warning La forma de interpretar este valor dependera del tipo de dato (ver #Type) asociado
451 void* buffer() const throw();
454 Devuelve la referencia a la variable que controla el indicador de nulo de esta variable.
455 \return La referencia a la variable que controla el indicador de nulo de esta variable.
457 bool* getNullIndicator() throw() { return &a_isNull; }
462 std::string* a_string;
466 DataBlock* a_dataBlock;
478 const Type::_v a_type;
479 const bool a_isOwner;
482 Variable(const Variable&);
483 Variable& operator = (const Variable&);
484 void verifyIsNotNull(const char* file, const int lineno) const throw(RuntimeException);
485 void verifyMatchSomeType(const Type::_v firstType, const Type::_v secondType, const char* file, const int lineno) const throw(RuntimeException);
486 void verifyMatchType(const Type::_v, const char* file, const int lineno) const throw(RuntimeException);