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_AutoPointer_hpp
10 #define anna_core_AutoPointer_hpp
12 #include <anna/core/util/String.hpp>
17 * Clase de la que deben heredar todas las clases con capacidades de liberación automática.
18 * Respector a \em auto_ptr tiene la ventaja de que puede actuar sobre objetos creados en
21 * La clase que implemente este interface debe declara como \em friend a esta clase.
26 * Óperación a realizar cuando se termine de tratar con esta instancia y se invoque a anna::AutoPointer::release.
31 Ignore /** << La invocación al método anna::AutoPointer::release no tendrá ningún efecto. */,
32 Delete /** << La invocación al método anna::AutoPointer::release originará la llamada al operador \em delete de la instancia. */
39 virtual ~AutoPointer() {;}
42 * Devuelve la operación que se realizará cuando se termine con esta instancia y se invoque a anna::AutoPointer::release.
43 * \return la operación que se realizará cuando se termine con esta instancia y se invoque a anna::AutoPointer::release.
45 WhenFinished::_v getWhenFinished() const throw() { return a_whenFinished; }
48 * Establece la operación a realizar cuando se invoca al método anna::AutoPointer::release.
49 * \param whenFinished Indica que operación a realizar cuando se invoque a anna::AutoPointer::release.
51 void setWhenFinished(const WhenFinished::_v whenFinished) throw() { a_whenFinished = whenFinished; }
54 Devuelve una cadena con la informacion relevante de este objeto.
55 \return Una cadena con la informacion relevante de este objeto.
57 virtual String asString() const throw();
60 * Si fuera necesario libera de la instancia recibida.
61 * \param instance Instancia a liberar si fuera necesario. Puede ser NULL.
62 * \return Devolverá \em NULL si la instancia ha sido liberada o la misma instancia recibida en caso de que no haya sido liberada.
64 template <typename T> static T* release(T& instance)
66 return release(&instance);
70 * Si fuera necesario libera de la instancia recibida.
71 * \param instance Instancia a liberar si fuera necesario. Puede ser NULL.
72 * \return Devolverá \em NULL si la instancia ha sido liberada o la misma instancia recibida en caso de que no haya sido liberada.
74 template <typename T> static T* release(T* instance)
79 if(instance->getWhenFinished() == WhenFinished::Delete) {
88 * Devuelve el nombre lógico de esta clase.
89 * \return el nombre lógico de esta clase.
91 static const char* className() throw() { return "AutoPointer"; }
96 * \param whenFinished Indica que operación a realizar cuando se invoque a anna::AutoPointer::release.
98 AutoPointer(const WhenFinished::_v whenFinished) : a_whenFinished(whenFinished) {;}
101 WhenFinished::_v a_whenFinished;