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_DataBlock_hpp
38 #define anna_core_DataBlock_hpp
40 #include <anna/core/RuntimeException.hpp>
41 #include <anna/config/defines.hpp>
46 Optimizacion de acceso a la memoria dinamica.
48 Incrementa el rendimiento al acceder y reservar de memoria dinamica mediante la reutilizacion controlada.
50 Para optimizar el acceso no se ha establecido ningun tipo de proteccion para ejecucion MT.
57 @param deepCopy Modo de copia de esta instancia. Si activamos el modo de copia profunda al asignar
58 cualquier otro bloque de memoria a este, se reserva (si fuese necesario) la memoria para ubicar el
59 buffer y despues realizara una copia byte a byte.
61 explicit DataBlock(const bool deepCopy = false) throw() :
70 @param buffer Bloque de memoria con el que inicializar el buffer de esta instancia.
71 @param size Numero de bytes del bloque de memoria recibido.
72 @param deepCopy Modo de copia de esta instancia. Si activamos el modo de copia profunda al asignar
73 cualquier otro bloque de memoria a este, se reserva la memoria para ubicar el buffer y despues
74 realizara una copia byte a byte.
76 DataBlock(const char* buffer, const int size, const bool deepCopy = false) throw(RuntimeException);
80 El modo de copia sera el mismo que el establecido por la instancia de la que copiar.
82 @param other Bloque de memoria con el que instanciar esta instancia.
84 DataBlock(const DataBlock& other) throw(RuntimeException);
93 Éste metodo solo debe usarse en aplicaciones mono-thread o en situaciones en las que estemos seguros
94 que esta bloque de datos no puede verse afectado por otro thread.
96 @return Tamaño de la memoria reservada por esta instancia.
98 int getMaxSize() const throw() { return a_maxSize; }
101 Éste metodo solo debe usarse en aplicaciones mono-thread o en situaciones en las que estemos seguros
102 que esta bloque de datos no puede verse afectado por otro thread.
104 @return Tamaño del bloque de memoria contenido actualmente.
106 int getSize() const throw() { return a_size; }
109 Éste metodo solo debe usarse en aplicaciones mono-thread o en situaciones en las que estemos seguros
110 que esta bloque de datos no puede verse afectado por otro thread.
112 @return El contenido del bloque de memoria.
114 const char* getData() const throw() { return a_buffer; }
117 Devuelve informacion acerca del estado de ocupacion de este bloque de memoria.
119 @return \em true si el bloque de memoria esta vacio o \em false en otro caso.
121 bool isEmpty() const throw() { return (a_size == 0) ? true : false; }
124 Devuelve informacion acerca de la configuracion de reserva de memoria de este bloque.
126 @return @em true si el bloque de memoria tiene activado el sistema de copia profunda o @em false en otro caso.
128 bool deepCopy() const throw() { return a_deepCopy; }
131 Establece el numero de bytes que tiene asociado a este bloque de datos.
132 \param size numero de bytes que tiene asociado a este bloque de datos.
133 \warning El DataBlock delega la gestion de la memoria a la clase heredada.
135 void setSize(const int size) throw(RuntimeException);
138 Anade el caracter recibido al bloque de memoria. Para poder usar este operador el bloque de
139 memoria destino debe tener activado el modo de copia profunda. Si la memoria reservada no es
140 suficiente reservara automaticamente la cantidad de memoria necesaria.
142 @param c Caracter a añadir a este bloque de memoria.
144 @returns Una referencia a si mismo.
146 DataBlock& operator += (const char c) throw(RuntimeException) {
147 append(&c, sizeof(c));
152 Anhade el bloque de memoria recibido. Para poder usar este operador el bloque de memoria
153 destino debe tener activado el modo de copia profunda. Si la memoria reservada no es
154 suficiente reservara automaticamente la cantidad de memoria necesaria.
156 @param right Bloque de memoria a añadir a este bloque de memoria.
158 @returns Una referencia a si mismo.
160 DataBlock& operator += (const DataBlock& right) throw(RuntimeException) {
162 append(right.a_buffer, right.a_size);
168 Anade la cadena recibida al bloque de memoria. Para poder usar este operador el bloque de
169 memoria destino debe tener activado el modo de copia profunda. Si la memoria reservada no es
170 suficiente reservara automaticamente la cantidad de memoria necesaria.
172 \param str Cadena a añadir a este bloque de memoria.
174 @returns Una referencia a si mismo.
176 DataBlock& operator += (const std::string& str) throw(RuntimeException) {
177 append(str.c_str(), str.length());
182 Devuelve la posicion i-esima del bloque de datos.
183 \param pos Posicion a la que acceder.
184 \return La posicion i-esima del bloque de datos.
186 const char operator [](const int pos) const throw(RuntimeException);
189 Devuelve la posicion i-esima del bloque de datos.
190 \param pos Posicion a la que acceder.
191 \return La posicion i-esima del bloque de datos.
193 char& operator [](const int pos) throw(RuntimeException);
196 Anade el bloque de memoria recibido. Para poder usar este operador el bloque de memoria
197 destino debe tener activado el modo de copia profunda. Si la memoria reservada no es
198 suficiente reservara automaticamente la cantidad de memoria necesaria.
200 \param data Direccion donde comienza el bloque de datos.
201 \param len Longitud del bloque de datos.
203 void append(const char* data, const int len) throw(RuntimeException);
206 Anade el bloque de memoria recibido. Para poder usar este operador el bloque de memoria
207 destino debe tener activado el modo de copia profunda. Si la memoria reservada no es
208 suficiente reservara automaticamente la cantidad de memoria necesaria.
210 \param other Bloque de memoria a añadir.
212 void append(const DataBlock& other) throw(RuntimeException) { append(other.a_buffer, other.a_size); }
215 Copia el contenido del bloque recibido como parámetro.
216 @param right Bloque de memoria del que copiar.
217 @returns Una referencia a si mismo.
219 void assign(const DataBlock& right) throw(RuntimeException) { *this = right; }
222 Copia o direcciona el contenido del bloque recibido como parámetro.
223 \param buffer Dirección de memoria a direcionar.
224 \param size Tamaño de la memoria.
225 @returns Una referencia a si mismo.
227 void assign(const char* buffer, const int size) throw(RuntimeException);
230 operador copia. El modo de copiar vendra definido por el modo copia con el que hayamos
231 iniciado la instancia destino.
232 @param right Bloque de memoria del que copiar.
233 @returns Una referencia a si mismo.
235 DataBlock& operator = (const DataBlock& right) throw(RuntimeException);
238 Operador de inicializacion. El bloque destino debera tener activado el sistema de
240 @param c Caracter con el que vamos a inicializar el contenido del bloque.
241 @returns Una referencia a si mismo.
243 DataBlock& operator = (const char c) throw(RuntimeException) { clear(); (*this) += c; return *this; }
246 Operador de inicializacion. El bloque destino debera tener activado el sistema de
248 @param str Cadena con el que vamos a inicializar el contenido del bloque.
249 @returns Una referencia a si mismo.
251 DataBlock& operator = (const std::string& str) throw(RuntimeException) { clear(); (*this) += str; return *this; }
255 Reserva el numero de bytes indicado por el parametro recibido. Si la cantidad de memoria preasignada es mayor
256 que la solicitada no se realiza ninguna llamada al sistema operativo.
258 @param nbytes Numero de bytes a reservar.
260 void allocate(const int nbytes) throw(RuntimeException);
263 La reserva de memoria actual pasa a ser memoria pre-asignada, asi libera el bloque
264 de memoria reservado hasta el momento, pero de forma que si posteriormente vuelve a
265 ser necesario puede reutilizarlo sin tener que volver a realizar una llamada al
266 sistema para obtener memoria dinamica.
268 void clear() throw(RuntimeException) { a_size = 0; }
271 Elimina del bloque de memoria unos determinados bytes.
273 @param pos Posicion del bloque donde empezar a eliminar.
274 @param nbytes Numero de bytes a descartar a partir de la posicion indicada.
276 void remove(const int pos, const int nbytes) throw(RuntimeException);
279 Elimina del bloque de memoria los n primeros bytes.
280 @param nbytes Numero de bytes a descartar a partir de la posicion indicada.
282 void remove(const int nbytes) throw(RuntimeException);
285 * Muestra el contenido de este buffer en forma de buffer hexadecimal vs bytes.
287 std::string asString(const int characterByLine = 24) const throw();
291 Inicializa el contenido de este bloque de datos. Si fue instancia con copia
292 profunda copia el contenido del buffer, en otro caso solo se queda con el
293 valor de la referencia de memoria a la que apunta.
295 @param buffer Bloque de memoria con el que inicializar el buffer de esta instancia.
296 @param size Numero de bytes del bloque de memoria recibido.
298 void initialize(const char* buffer, const int size) throw(RuntimeException);
301 Establece el espacio de memoria asociado a este bloque de datos.
302 \param buffer Nuevo buffer de datos asociado a este bloque.
303 \warning El DataBlock delega la gestion de la memoria a la clase heredada.
305 void setBuffer(const char* buffer) throw() { a_buffer = (char*) buffer; }
308 Establece el numero de bytes que tiene reservados este bloque de datos.
309 \param maxSize numero de bytes que tiene reservados este bloque de datos.
310 \warning El DataBlock delega la gestion de la memoria a la clase heredada.
312 void setMaxSize(const int maxSize) throw() { a_maxSize = maxSize; }
320 void extend(const int nbytes) throw(RuntimeException);