bug in RC
[anna.git] / include / anna / comm / Variable.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_comm_Variable_hpp
10 #define anna_comm_Variable_hpp
11
12 #include <anna/core/util/Variable.hpp>
13 #include <anna/core/DataBlock.hpp>
14
15 #include <anna/comm/functions.hpp>
16
17 namespace anna {
18
19 namespace comm {
20
21 class CompatCodec;
22
23 /**
24    Clase para guardar la informacion asociada a un anna::comm::Codec.
25
26    \warning Esta clase no establece proteccion ante accesos concurrentes
27 */
28 class Variable : public anna::Variable {
29 public:
30   /**
31      Constructor para inicializar una instancia de tipo cadena.
32     \param id Identificador logico de esta variable
33     @param name Nombre logico que recibe este variable.
34     @param value Referencia a la variable que estamos recubriendo con esta instancia.
35   */
36   Variable(const short int id, const char* name, std::string& value) :
37     anna::Variable(name, value),
38     a_id(id), a_precode(true) {;}
39
40   /**
41   * Constructor para inicializar una instancia de type ENTERO.
42   *
43     \param id Identificador logico de esta variable
44   * @param name Nombre logico que recibe este variable.
45   * @param value Referencia a la variable que estamos recubriendo con esta instancia.
46   */
47   Variable(const short int id, const char* name, int& value) :
48     anna::Variable(name, value),
49     a_id(id), a_precode(true) {;}
50
51   /**
52   * Constructor para inicializar una instancia de type ENTERO_LARGO.
53   *
54     \param id Identificador logico de esta variable
55   * @param name Nombre logico que recibe este variable.
56   * @param value Referencia a la variable que estamos recubriendo con esta instancia.
57   */
58   Variable(const short int id, const char* name, S64& value) :
59     anna::Variable(name, value),
60     a_id(id), a_precode(true) {;}
61
62   /**
63   * Constructor para inicializar una instancia de type BOOLEAN.
64   *
65     \param id Identificador logico de esta variable
66   * @param name Nombre logico que recibe este variable.
67   * @param value Referencia a la variable que estamos recubriendo con esta instancia.
68   */
69   Variable(const short int id, const char* name, bool& value) :
70     anna::Variable(name, value),
71     a_id(id), a_precode(true) {;}
72
73   /**
74   * Constructor para inicializar una instancia de type BLOQUE_MEMORIA.
75   *
76     \param id Identificador logico de esta variable
77   * @param name Nombre logico que recibe este variable.
78   * @param value Referencia a la variable que estamos recubriendo con esta instancia.
79   */
80   Variable(const short int id, const char* name, DataBlock& value) :
81     anna::Variable(name, value),
82     a_id(id), a_precode(true) {;}
83
84   /**
85   * Constructor para inicializar una instancia de tipo float.
86   *
87     \param id Identificador logico de esta variable
88   * @param name Nombre logico que recibe este variable.
89   * @param value Referencia a la variable que estamos recubriendo con esta instancia.
90   */
91   Variable(const short int id, const char* name, float& value) :
92     anna::Variable(name, value),
93     a_id(id), a_precode(true) {;}
94
95   /**
96   * Constructor para inicializar una instancia de tipo float.
97   *
98     \param id Identificador logico de esta variable
99   * @param name Nombre logico que recibe este variable.
100   * @param value Referencia a la variable que estamos recubriendo con esta instancia.
101   */
102   Variable(const short int id, const char* name, double& value) :
103     anna::Variable(name, value),
104     a_id(id), a_precode(true) {;}
105
106   /**
107   * Constructor para inicializar una instancia de tipo float.
108   *
109     \param id Identificador logico de esta variable
110   * @param name Nombre logico que recibe este variable.
111   * @param value Referencia a la variable que estamos recubriendo con esta instancia.
112   */
113   Variable(const short int id, const char* name, comm::CompatCodec& value) :
114     anna::Variable(name, (void*) &value),
115     a_id(id), a_precode(true) {;}
116
117   /**
118      Devuelve el identificador logico de esta variable.
119      \return el identificador logico de esta variable.
120   */
121   short int getId() const throw() { return a_id; }
122
123 private:
124   const short int a_id;
125   DataBlock a_precode;
126
127   const DataBlock& codec() const throw(RuntimeException) {
128     return (a_precode.isEmpty() == false) ? a_precode : precodec();
129   }
130   const DataBlock& precodec() const throw(RuntimeException) {
131     char aux [sizeof(short int)];
132     const_cast <comm::Variable*>(this)->a_precode.append(comm::functions::codeShort(aux, a_id), sizeof(short int));
133     const_cast <comm::Variable*>(this)->a_precode += (char) getType();
134     return a_precode;
135   }
136
137   friend class CompatCodec;
138 };
139
140 }
141
142 }
143
144 #endif
145