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_mt_SafeRecycler_hpp
10 #define anna_core_mt_SafeRecycler_hpp
17 #include <anna/core/RuntimeException.hpp>
18 #include <anna/core/mt/Mutex.hpp>
19 #include <anna/core/Allocator.hpp>
20 #include <anna/core/mt/Guard.hpp>
21 #include <anna/core/util/Recycler.hpp>
26 Mantiene una lista de punteros que puede crecer dinamicamente, no obstante, siempre que sea posible
27 intenta reusar punteros creados previamente.
29 Establece secciones critidas para acceder a los datos.
31 @param T Clase de la que mantener la lista de punteros pre-asignados.
32 @param Allocator Clase encargada de reservar la memoria para los objetos T en el momento en que sea necesaria
35 template < typename T, typename _Allocator = Allocator <T> >
36 class SafeRecycler : public Recycler <T, _Allocator>, public Mutex {
38 typedef typename Recycler <T, _Allocator>::iterator iterator;
39 typedef typename Recycler <T, _Allocator>::const_iterator const_iterator;
43 \param randomAccess Indicador que permite activar el uso de estructuras de datos adicionales
44 Se ha comprobado que si necesitamos tratar en torno a un centenar de instancias
45 es más eficiente no activar las estructuras para acceso directo, para más objetos resulta
48 SafeRecycler(const bool randomAccess = false) : Recycler <T, _Allocator> (randomAccess) {;}
53 virtual ~SafeRecycler() { ; }
56 Devuelve un puntero de tipo T. Solo crearia una nueva instancia de la clase T si al invocar a este
57 metoodo no existe ninguna otra instancia que se pueda reutilizar, en cuyo caso haria una nueva reserva.
59 Cada una de las llamadas a este metodo debe tener su correspondiente llamada al metodo #release cuando
60 el puntero deje de ser util.
62 @return Un puntero a una instancia de tipo T.
65 throw(RuntimeException) {
66 std::string name(typeid(*this).name());
68 Guard guard(this, name.c_str());
69 return Recycler <T, _Allocator>::create();
73 Devuelve el iterador que apunta al objeto recibido como parametro.
74 \return el iterador que apunta al objeto recibido como parametro.
77 throw(RuntimeException) {
78 std::string name(typeid(*this).name());
80 Guard guard(this, name.c_str());
81 return Recycler <T, _Allocator>::find(t);
85 Libera el puntero recibido como parametro. No se libera fisicamente sino que se deja marcado como
88 Si el puntero pasado como parametro no ha sido obtenido mediante el metodo #create los resultados
91 @param t Instancia de un puntero de tipo T obtenido a partir del metodo #create.
99 std::string name(typeid(*this).name());
100 name += "::release (T*)";
101 Guard guard(this, name.c_str());
102 Recycler <T, _Allocator>::release(t);
103 } catch(Exception& ex) {
109 Libera el puntero asociado al iterador recibido como parametro.
110 \param ii Instancia a liberar.
112 void release(iterator& ii) throw() {
114 std::string name(typeid(*this).name());
115 name += "::release (iterator)";
116 Guard guard(this, name.c_str());
117 Recycler <T, _Allocator>::release(ii);
118 } catch(Exception& ex) {
124 Libera el puntero recibido como parametro. No se libera fisicamente sino que se deja marcado como
127 Si el puntero pasado como parametro no ha sido obtenido mediante el metodo #create los resultados
130 @param t Instancia de un puntero de tipo T obtenido a partir del metodo #create.
132 void release(const T* t) throw() { release(const_cast <T*>(t)); }
135 Marca como disponibles todos los objetos contenidos en memoria.
139 std::string name(typeid(*this).name());
141 Guard guard(this, name.c_str());
142 Recycler <T, _Allocator>::clear();