1 // ANNA - Anna is Not Nothingness Anymore
3 // (c) Copyright 2005-2014 Eduardo Ramos Testillano & Francisco Ruiz Rayo
5 // http://redmine.teslayout.com/projects/anna-suite
7 // Redistribution and use in source and binary forms, with or without
8 // modification, are permitted provided that the following conditions
11 // * Redistributions of source code must retain the above copyright
12 // notice, this list of conditions and the following disclaimer.
13 // * Redistributions in binary form must reproduce the above
14 // copyright notice, this list of conditions and the following disclaimer
15 // in the documentation and/or other materials provided with the
17 // * Neither the name of the copyright holder nor the names of its
18 // contributors may be used to endorse or promote products derived from
19 // this software without specific prior written permission.
21 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
24 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
25 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
26 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
27 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
31 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33 // Authors: eduardo.ramos.testillano@gmail.com
34 // cisco.tierra@gmail.com
37 #ifndef anna_core_util_Variable_hpp
38 #define anna_core_util_Variable_hpp
40 #include <anna/core/util/defines.hpp>
41 #include <anna/core/RuntimeException.hpp>
42 #include <anna/core/define.autoenum.hpp>
43 #include <anna/core/util/String.hpp>
44 #include <anna/core/DataBlock.hpp>
49 Recubrimiento de variables de usuario.
51 Establece un recubrimiento sobre los tipos de variables soportados por el nucleo
56 Enumeracion con los tipos de datos que podemos asociar a un mensaje interno.
62 String, /**< Cadena de type std::string. */
63 Integer, /**< Numero entero de type int. */
65 Integer64, /**< Numero entero de tipo enterno de 64 bits */
66 Boolean = 5, /**< Dato de tipo bool. */
67 Block = 6, /**< Objeto de tipo DataBlock. */
68 Float, /**< Número en coma flotante de 32 bits */
69 Double, /**< Número en coma flotante de 64 bits */
70 Custom /** Tipo particular definido por el usuario */
72 anna_declare_enum(Type)
77 Constructor para inicializar una instancia de tipo cadena.
79 @param name Nombre logico que recibe este variable.
80 @param value Referencia a la variable que estamos recubriendo con esta instancia.
82 Variable(const char* name, std::string& value) :
87 a_value.a_string = &value;
92 * Constructor para inicializar una instancia de type entero.
94 * @param name Nombre logico que recibe este variable.
95 * @param value Referencia a la variable que estamos recubriendo con esta instancia.
97 Variable(const char* name, int& value) :
100 a_type(Type::Integer),
103 a_value.a_integer = &value;
107 * Constructor para inicializar una instancia de type long.
109 * @param name Nombre logico que recibe este variable.
110 * @param value Referencia a la variable que estamos recubriendo con esta instancia.
112 Variable(const char* name, S64& value) :
115 a_type(Type::Integer64),
118 a_value.a_longInteger = &value;
122 * Constructor para inicializar una instancia de type BOOLEAN.
124 * @param name Nombre logico que recibe este variable.
125 * @param value Referencia a la variable que estamos recubriendo con esta instancia.
127 Variable(const char* name, bool& value) :
130 a_type(Type::Boolean),
133 a_value.a_boolean = &value;
137 * Constructor para inicializar una instancia de type BLOQUE_MEMORIA.
139 * @param name Nombre logico que recibe este variable.
140 * @param value Referencia a la variable que estamos recubriendo con esta instancia.
142 Variable(const char* name, DataBlock& value) :
147 a_value.a_dataBlock = &value;
151 * Constructor para inicializar una instancia de type float.
153 * @param name Nombre logico que recibe este variable.
154 * @param value Referencia a la variable que estamos recubriendo con esta instancia.
156 Variable(const char* name, float& value) :
162 a_value.a_float = &value;
166 * Constructor para inicializar una instancia de type double.
168 * @param name Nombre logico que recibe este variable.
169 * @param value Referencia a la variable que estamos recubriendo con esta instancia.
171 Variable(const char* name, double& value) :
174 a_type(Type::Double),
177 a_value.a_double = &value;
181 * Constructor para inicializar una instancia de un tipo definido por el usuario.
183 * @param name Nombre logico que recibe este variable.
184 * @param value Referencia a la variable que estamos recubriendo con esta instancia.
186 Variable(const char* name, void* value) :
189 a_type(Type::Custom),
191 a_value.a_custom = value;
196 @param name Nombre logico que recibe esta variable.
197 @param type Tipo de dato de esta variable.
199 Variable(const char* name, const Type::_v type);
208 Devuelve el tipo del dato al que recubre esta variable.
209 @return El tipo del dato al que recubre esta variable.
211 Type::_v getType() const throw() { return a_type; }
214 Devuelve el nombre logico asociado a esta variable.
215 \return Nombre logico asociado a esta variable.
217 const char* getName() const throw() { return a_name.c_str(); }
220 Devuelve \em false si esta marcado como nulo o \em true en otro caso.
221 @return \em false si esta marcado como nulo o \em true en otro caso.
223 bool isNull() const throw() { return a_isNull; }
226 Devuelve el valor alfabetico asociado a esta variable.
227 @return Si la variable indicada en el contructor de esta instancia puede interpretarse como
228 una string devolvera su contenido, en otro caso lanzara una excepcion para indicar el error.
230 const char* getStringValue() const throw(RuntimeException);
233 Devuelve el valor numerico asociado a esta variable.
234 @return Si la variable indicada en el contructor de esta instancia puede interpretarse como
235 un entero de 32 bits devolvera su contenido, en otro caso lanzara una excepcion para indicar el error.
237 int getIntegerValue() const throw(RuntimeException);
240 Devuelve el valor numerico asociado a esta variable.
241 @return Si la variable indicada en el contructor de esta instancia puede interpretarse como
242 un entero de 64 bits devolvera su contenido, en otro caso lanzara una excepcion para indicar el error.
244 S64 getInteger64Value() const throw(RuntimeException);
247 Devuelve el valor booleano asociado a esta variable.
248 @return Si la variable indicada en el contructor de esta instancia puede interpretarse como
249 un booleano y este es distinto de cero devolvera true en otro caso devolvera false.
252 bool getBooleanValue() const throw(RuntimeException) ;
255 Devuelve el bloque de memoria asociado a esta variable.
256 @return Si la variable indicada en el contructor de esta instancia era de type DataBlock
257 devolvera el contenido de esta, en otro caso lanzara una excepcion.
259 const DataBlock& getDataBlockValue() const throw(RuntimeException) ;
262 Devuelve el valor numerico asociado a esta variable.
263 @return Si la variable indicada en el contructor de esta instancia puede interpretarse como
264 un entero en coma flotante devolvera su contenido, en otro caso lanzara una excepcion para indicar el error.
266 float getFloatValue() const throw(RuntimeException);
269 Devuelve el valor numerico asociado a esta variable.
270 @return Si la variable indicada en el contructor de esta instancia puede interpretarse como
271 un entero en coma flotante devolvera su contenido, en otro caso lanzara una excepcion para indicar el error.
273 double getDoubleValue() const throw(RuntimeException);
276 * Devuelve el valor de un elemento definido por el usuario.
278 void* getCustom() throw(RuntimeException) {
279 verifyMatchType(Type::Custom, ANNA_FILE_LOCATION);
280 return a_value.a_custom;
284 * Devuelve el valor de un elemento definido por el usuario.
286 const void* getCustom() const throw(RuntimeException) {
287 verifyMatchType(Type::Custom, ANNA_FILE_LOCATION);
288 return a_value.a_custom;
292 * Devuelve el valor de un elemento definido por el usuario.
294 void setCustom(void* value) throw(RuntimeException) {
295 verifyMatchType(Type::Custom, ANNA_FILE_LOCATION);
296 a_isNull = (value == NULL);
297 a_value.a_custom = value;
301 Interpreta el valor asociado a esta variable como un valor entero.
302 \warning No se realiza ninguna comprobacion semantica.
304 int getInteger() const throw() { return *a_value.a_integer; }
307 Interpreta el valor asociado a esta variable como un valor entero largo.
308 \warning No se realiza ninguna comprobacion semantica.
310 S64 getInteger64() const throw() { return *a_value.a_longInteger; }
313 Interpreta el valor asociado a esta variable como un valor booleano.
314 \warning No se realiza ninguna comprobacion semantica.
316 bool getBoolean() const throw() { return *a_value.a_boolean; }
319 Interpreta el valor asociado a esta variable como un valor bloque de datos.
320 \warning No se realiza ninguna comprobacion semantica.
322 const DataBlock& getDataBlock() const throw() { return *a_value.a_dataBlock; }
325 Interpreta el valor asociado a esta variable como un valor en coma flotante de 32 bits
326 \warning No se realiza ninguna comprobacion semantica.
328 float getFloat() const throw() { return *a_value.a_float; }
331 Interpreta el valor asociado a esta variable como un valor en coma flotante de 64 bits
332 \warning No se realiza ninguna comprobacion semantica.
334 double getDouble() const throw() { return *a_value.a_double; }
338 * Establece el valor de la variable a la que recubre. Si la variable estaba marcada como nula la desmarca.
339 * Si el type de dato que deseamos establecer no coincide con el type de dato indicado al crear esta
340 * variable devolvera una excepcion de ejecucion indicado la anomalia.
342 * @param value Valor que tomara la variable a la que recubre este variable.
344 void setValue(const char* value) throw(RuntimeException);
347 * Establece el valor de la variable a la que recubre. Si la variable estaba marcada como nula la desmarca.
348 * Si el type de dato que deseamos establecer no coincide con el type de dato indicado al crear esta
349 * variable devolvera una excepcion de ejecucion indicado la anomalia.
351 * @param value Valor que tomara la variable a la que recubre este variable.
353 void setCharPointer(const char* value) throw(RuntimeException);
356 * Establece el valor de la variable a la que recubre. Si la variable estaba marcada como nula la desmarca.
357 * Si el type de dato que deseamos establecer no coincide con el type de dato indicado al crear esta
358 * variable devolvera una excepcion de ejecucion indicado la anomalia.
360 * @param value Valor que tomara la variable a la que recubre este variable.
362 void setValue(const int value) throw(RuntimeException);
365 * Establece el valor de la variable a la que recubre. Si la variable estaba marcada como nula la desmarca.
366 * Si el type de dato que deseamos establecer no coincide con el type de dato indicado al crear esta
367 * variable devolvera una excepcion de ejecucion indicado la anomalia.
369 * @param value Valor que tomara la variable a la que recubre este variable.
371 void setValue(const S64 value) throw(RuntimeException) ;
374 * Establece el valor de la variable a la que recubre. Si la variable estaba marcada como nula la desmarca.
375 * Si el type de dato que deseamos establecer no coincide con el type de dato indicado al crear esta
376 * variable devolvera una excepcion de ejecucion indicado la anomalia.
378 * @param value Valor que tomara la variable a la que recubre este variable.
380 void setValue(const bool value) throw(RuntimeException);
383 * Establece el valor de la variable a la que recubre. Si la variable estaba marcada como nula la desmarca.
384 * Si el type de dato que deseamos establecer no coincide con el type de dato indicado al crear esta
385 * variable devolvera una excepcion de ejecucion indicado la anomalia.
387 * @param value Valor que tomara la variable a la que recubre este variable.
389 void setValue(const DataBlock& value) throw(RuntimeException) ;
392 * Establece el valor de la variable a la que recubre. Si la variable estaba marcada como nula la desmarca.
393 * Si el type de dato que deseamos establecer no coincide con el type de dato indicado al crear esta
394 * variable devolvera una excepcion de ejecucion indicado la anomalia.
396 * @param value Valor que tomara la variable a la que recubre este variable.
398 void setValue(const float value) throw(RuntimeException) ;
401 * Establece el valor de la variable a la que recubre. Si la variable estaba marcada como nula la desmarca.
402 * Si el type de dato que deseamos establecer no coincide con el type de dato indicado al crear esta
403 * variable devolvera una excepcion de ejecucion indicado la anomalia.
405 * @param value Valor que tomara la variable a la que recubre este variable.
407 void setValue(const double value) throw(RuntimeException) ;
410 Marca/Desmarca la variable como nula.
411 @param isNull Indica la nueva marca de la variable.
413 void setNull(const bool isNull = true) throw() { a_isNull = isNull; }
416 Establece el valor asociado a esta variable como un valor entero.
417 \warning No se realiza ninguna comprobacion semantica.
419 void setInteger(const int value) throw() { *a_value.a_integer = value; a_isNull = false; }
422 Establece el valor asociado a esta variable como un valor entero largo.
423 \warning No se realiza ninguna comprobacion semantica.
425 void setLong(const S64 value) throw() { *a_value.a_longInteger = value; a_isNull = false; }
428 Establece el valor asociado a esta variable como un valor booleano.
429 \warning No se realiza ninguna comprobacion semantica.
431 void setBoolean(const bool value) throw() { *a_value.a_boolean = value; a_isNull = false; }
434 Interpreta el valor asociado a esta variable como un valor bloque de datos.
435 \warning No se realiza ninguna comprobacion semantica.
437 void setDataBlock(const DataBlock& value) throw() { *a_value.a_dataBlock = value; a_isNull = false; }
440 Interpreta el valor asociado a esta variable como número en coma flotante.
441 \warning No se realiza ninguna comprobacion semantica.
443 void setFloat(const float value) throw() { *a_value.a_float = value; a_isNull = false; }
446 Interpreta el valor asociado a esta variable como número en coma flotante.
447 \warning No se realiza ninguna comprobacion semantica.
449 void setDouble(const double value) throw() { *a_value.a_double = value; a_isNull = false; }
452 @return \em true si la variable recibida tiene el mismo nombre que esta instancia o \em false
455 bool isEqual(const Variable& right) const throw() { return a_name == right.a_name; }
458 Devuelve una cadena con informacion relevante de esta instancia.
459 \return Una cadena con informacion relevante de esta instancia.
461 virtual String asString() const throw();
465 Devuelve la direccion de memoria de la variable C++ a sociada a esta variable logica.
466 \return La direccion de memoria de la variable C++ a sociada a esta variable logica.
467 \warning La forma de interpretar este valor dependera del tipo de dato (ver #Type) asociado
468 Devuelve la referencia a memoria de esta variable.
471 void* getReference() const throw();
474 Devuelve el area de memoria de la variable C++ a sociada a esta variable logica.
475 \return La area de memoria de la variable C++ a sociada a esta variable logica.
476 \warning La forma de interpretar este valor dependera del tipo de dato (ver #Type) asociado
479 void* buffer() const throw();
482 Devuelve la referencia a la variable que controla el indicador de nulo de esta variable.
483 \return La referencia a la variable que controla el indicador de nulo de esta variable.
485 bool* getNullIndicator() throw() { return &a_isNull; }
490 std::string* a_string;
494 DataBlock* a_dataBlock;
506 const Type::_v a_type;
507 const bool a_isOwner;
510 Variable(const Variable&);
511 Variable& operator = (const Variable&);
512 void verifyIsNotNull(const char* file, const int lineno) const throw(RuntimeException);
513 void verifyMatchSomeType(const Type::_v firstType, const Type::_v secondType, const char* file, const int lineno) const throw(RuntimeException);
514 void verifyMatchType(const Type::_v, const char* file, const int lineno) const throw(RuntimeException);