ANNA Suite  2020b
Multipurpose development suite for Telco applications
Public Types | Public Member Functions | Static Public Member Functions | List of all members
anna::Recycler< T, _Allocator > Class Template Reference

#include <Recycler.hpp>

Inheritance diagram for anna::Recycler< T, _Allocator >:
Inheritance graph
[legend]

Public Types

typedef std::list< T * > container
 
typedef container::iterator iterator
 
typedef container::const_iterator const_iterator
 
typedef std::map< T *, iteratorrandom_container
 
typedef random_container::iterator random_iterator
 
typedef random_container::value_type random_item
 

Public Member Functions

 Recycler (const bool randomAccess=false)
 
virtual ~Recycler ()
 
int getSize () const
 
int size () const
 
T * create () noexcept(false)
 
iterator find (T *t) noexcept(false)
 
void release (T *t)
 
void release (iterator ii)
 
void release (const T *t)
 
void clear ()
 
iterator begin ()
 
const_iterator begin () const
 
iterator end ()
 
const_iterator end () const
 

Static Public Member Functions

static T * data (iterator ii)
 
static const T * data (const_iterator ii)
 

Detailed Description

template<typename T, typename _Allocator = Allocator <T>>
class anna::Recycler< T, _Allocator >

Mantiene una lista de punteros que puede crecer dinamicamente, no obstante, siempre que sea posible intenta reusar punteros creados previamente.

Parameters
TClase de la que mantener la lista de punteros pre-asignados.
AllocatorClase encargada de reservar la memoria para los objetos T en el momento en que sea necesaria una nueva instancia.
Warning
no actua como clase segura en MT, ver anna::SafeRecycler

Member Typedef Documentation

◆ const_iterator

template<typename T, typename _Allocator = Allocator <T>>
typedef container::const_iterator anna::Recycler< T, _Allocator >::const_iterator

◆ container

template<typename T, typename _Allocator = Allocator <T>>
typedef std::list<T*> anna::Recycler< T, _Allocator >::container

◆ iterator

template<typename T, typename _Allocator = Allocator <T>>
typedef container::iterator anna::Recycler< T, _Allocator >::iterator

◆ random_container

template<typename T, typename _Allocator = Allocator <T>>
typedef std::map<T*, iterator> anna::Recycler< T, _Allocator >::random_container

◆ random_item

template<typename T, typename _Allocator = Allocator <T>>
typedef random_container::value_type anna::Recycler< T, _Allocator >::random_item

◆ random_iterator

template<typename T, typename _Allocator = Allocator <T>>
typedef random_container::iterator anna::Recycler< T, _Allocator >::random_iterator

Constructor & Destructor Documentation

◆ Recycler()

template<typename T, typename _Allocator = Allocator <T>>
anna::Recycler< T, _Allocator >::Recycler ( const bool  randomAccess = false)
inline

Constructor.

Parameters
randomAccessIndicador que permite activar el uso de estructuras de datos adicionales que permite que los métodos find y release realicen la búsqueda del objeto de forma optimizada. Se ha comprobado que si necesitamos tratar en torno a un centenar de instancias es más eficiente no activar las estructuras para acceso directo, para más objetos resulta imprescinble.
48  {
49  a_size = 0;
50  a_randomContainer = (randomAccess == true) ? new random_container : NULL;
51  }
std::map< T *, iterator > random_container
Definition: Recycler.hpp:36

◆ ~Recycler()

template<typename T, typename _Allocator = Allocator <T>>
virtual anna::Recycler< T, _Allocator >::~Recycler ( )
inlinevirtual

Destructor.

56  {
57  clear(); // Pasa todos los punteros a_holes
58 
59  for(iterator ii = a_holes.begin(), maxii = a_holes.end(); ii != maxii; ii ++) {
60  _Allocator::destroy(data(ii));
61  }
62 
63  a_holes.clear();
64  delete a_randomContainer;
65  }
static T * data(iterator ii)
Definition: Recycler.hpp:233
container::iterator iterator
Definition: Recycler.hpp:33
void clear()
Definition: Recycler.hpp:196

Member Function Documentation

◆ begin() [1/2]

template<typename T, typename _Allocator = Allocator <T>>
iterator anna::Recycler< T, _Allocator >::begin ( )
inline

Devuelve un iterator al primer elemento, activo, contenido en el reciclador.

Returns
Un iterator al primer elemento, activo, contenido en el reciclador.
209 { return a_objects.begin(); }

◆ begin() [2/2]

template<typename T, typename _Allocator = Allocator <T>>
const_iterator anna::Recycler< T, _Allocator >::begin ( ) const
inline

Devuelve un iterator al primer elemento, activo, contenido en el reciclador.

Returns
Un iterator al primer elemento, activo, contenido en el reciclador.
215 { return a_objects.begin(); }

◆ clear()

template<typename T, typename _Allocator = Allocator <T>>
void anna::Recycler< T, _Allocator >::clear ( )
inline

Marca como disponibles todos los objetos contenidos en memoria.

197  {
198  a_holes.splice(a_holes.end(), a_objects);
199  a_size = 0;
200 
201  if(a_randomContainer)
202  a_randomContainer->clear();
203  }

◆ create()

template<typename T, typename _Allocator = Allocator <T>>
T* anna::Recycler< T, _Allocator >::create ( )
inlinenoexcept

Devuelve un puntero de tipo T. Solo crearia una nueva instancia de la clase T si al invocar a este metoodo no existe ninguna otra instancia que se pueda reutilizar, en cuyo caso haria una nueva reserva.

Cada una de las llamadas a este metodo debe tener su correspondiente llamada al metodo release cuando el puntero deje de ser util.

Returns
Un puntero a una instancia de tipo T.
89  {
90  T* result = NULL;
91 
92  if(a_holes.empty() == false) {
93  iterator top = a_holes.begin();
94  result = data(top);
95  a_objects.splice(a_objects.end(), a_holes, top);
96  } else
97  a_objects.push_back(result = _Allocator::create());
98 
99  if(a_randomContainer != NULL) {
100  iterator ii = a_objects.end();
101  ii --;
102  a_randomContainer->insert(random_item(result, ii));
103  }
104 
105  a_size ++;
106  return result;
107  }
static T * data(iterator ii)
Definition: Recycler.hpp:233
random_container::value_type random_item
Definition: Recycler.hpp:38
container::iterator iterator
Definition: Recycler.hpp:33

◆ data() [1/2]

template<typename T, typename _Allocator = Allocator <T>>
static T* anna::Recycler< T, _Allocator >::data ( iterator  ii)
inlinestatic

Devuelve el objeto referenciado por el iterator recibido como parametro.

Returns
El objeto referenciado por el iterator recibido como parametro.
233 { return *ii; }

◆ data() [2/2]

template<typename T, typename _Allocator = Allocator <T>>
static const T* anna::Recycler< T, _Allocator >::data ( const_iterator  ii)
inlinestatic

Devuelve el objeto referenciado por el iterator recibido como parametro.

Returns
El objeto referenciado por el iterator recibido como parametro.
239 { return *ii; }

◆ end() [1/2]

template<typename T, typename _Allocator = Allocator <T>>
iterator anna::Recycler< T, _Allocator >::end ( )
inline

Devuelve un iterator al final de la lista de elementos activos en el reciclador.

Returns
Un iterator al final de la lista de elementos activos en el reciclador.
221 { return a_objects.end(); }

◆ end() [2/2]

template<typename T, typename _Allocator = Allocator <T>>
const_iterator anna::Recycler< T, _Allocator >::end ( ) const
inline

Devuelve un iterator al final de la lista de elementos activos en el reciclador.

Returns
Un iterator al final de la lista de elementos activos en el reciclador.
227 { return a_objects.end(); }

◆ find()

template<typename T, typename _Allocator = Allocator <T>>
iterator anna::Recycler< T, _Allocator >::find ( T *  t)
inlinenoexcept

Devuelve el iterador que apunta al objeto recibido como parametro. Si el objeto no se encuentra dentro de la lista devolverá end ()

Returns
el iterador que apunta al objeto recibido como parametro.
115  {
116  iterator result = end();
117 
118  if(a_randomContainer != NULL) {
119  random_iterator jj = a_randomContainer->find(t);
120 
121  if(jj != a_randomContainer->end())
122  result = the_iterator(jj);
123  } else {
124  for(iterator ii = begin(), maxii = end(); ii != maxii; ii ++) {
125  if(data(ii) == t) {
126  result = ii;
127  break;
128  }
129  }
130  }
131 
132  return result;
133  }
static T * data(iterator ii)
Definition: Recycler.hpp:233
random_container::iterator random_iterator
Definition: Recycler.hpp:37
iterator end()
Definition: Recycler.hpp:221
container::iterator iterator
Definition: Recycler.hpp:33
iterator begin()
Definition: Recycler.hpp:209

◆ getSize()

template<typename T, typename _Allocator = Allocator <T>>
int anna::Recycler< T, _Allocator >::getSize ( ) const
inline

Devuelve el número de elementos realmente utilizados hasta ahora.

Returns
El número de elementos realmente utilizados hasta ahora.
71 { return a_size; }

◆ release() [1/3]

template<typename T, typename _Allocator = Allocator <T>>
void anna::Recycler< T, _Allocator >::release ( T *  t)
inline

Libera el puntero recibido como parametro. No se libera fisicamente sino que se deja marcado como reusable.

Si el puntero pasado como parametro no ha sido obtenido mediante el metodo create los resultados no estan definidos.

Parameters
tInstancia de un puntero de tipo T obtenido a partir del metodo create.
145  {
146  if(t == NULL)
147  return;
148 
149  iterator result = end();
150 
151  if(a_randomContainer != NULL) {
152  random_iterator jj = a_randomContainer->find(t);
153 
154  if(jj != a_randomContainer->end()) {
155  result = the_iterator(jj);
156  a_randomContainer->erase(jj);
157  }
158  } else {
159  for(iterator ii = begin(), maxii = end(); ii != maxii; ii ++) {
160  if(data(ii) == t) {
161  result = ii;
162  break;
163  }
164  }
165  }
166 
167  if(result == end())
168  return;
169 
170  a_holes.splice(a_holes.end(), a_objects, result);
171 
172  if(a_size > 0)
173  a_size --;
174  }
static T * data(iterator ii)
Definition: Recycler.hpp:233
random_container::iterator random_iterator
Definition: Recycler.hpp:37
iterator end()
Definition: Recycler.hpp:221
container::iterator iterator
Definition: Recycler.hpp:33
iterator begin()
Definition: Recycler.hpp:209

◆ release() [2/3]

template<typename T, typename _Allocator = Allocator <T>>
void anna::Recycler< T, _Allocator >::release ( iterator  ii)
inline

Libera el puntero asociado al iterador recibido como parametro.

Parameters
iiInstancia a liberar.
180 { release(data(ii)); }
static T * data(iterator ii)
Definition: Recycler.hpp:233
void release(T *t)
Definition: Recycler.hpp:144

◆ release() [3/3]

template<typename T, typename _Allocator = Allocator <T>>
void anna::Recycler< T, _Allocator >::release ( const T *  t)
inline

Libera el puntero recibido como parametro. No se libera fisicamente sino que se deja marcado como reusable.

Si el puntero pasado como parametro no ha sido obtenido mediante el metodo create los resultados no estan definidos.

Parameters
tInstancia de un puntero de tipo T obtenido a partir del metodo create.
191 { release(const_cast <T*>(t)); }
void release(T *t)
Definition: Recycler.hpp:144

◆ size()

template<typename T, typename _Allocator = Allocator <T>>
int anna::Recycler< T, _Allocator >::size ( ) const
inline

Devuelve el número de elementos realmente utilizados hasta ahora.

Returns
El número de elementos realmente utilizados hasta ahora.
77 { return a_size; }

The documentation for this class was generated from the following file: