Remove dynamic exceptions
[anna.git] / include / anna / core / AutoPointer.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_core_AutoPointer_hpp
10 #define anna_core_AutoPointer_hpp
11
12 #include <anna/core/util/String.hpp>
13
14 namespace anna {
15
16 /**
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
19  * la pila.
20  *
21  * La clase que implemente este interface debe declara como \em friend a esta clase.
22  */
23 class AutoPointer {
24 public:
25   /**
26    * Óperación a realizar cuando se termine de tratar con esta instancia y se invoque a anna::AutoPointer::release.
27    * \see AutoPointer.
28    */
29   struct WhenFinished  {
30     enum _v {
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. */
33     };
34   };
35
36   /**
37    * Destructor.
38    */
39   virtual ~AutoPointer() {;}
40
41   /**
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.
44    */
45   WhenFinished::_v getWhenFinished() const { return a_whenFinished; }
46
47   /**
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.
50    */
51   void setWhenFinished(const  WhenFinished::_v whenFinished) { a_whenFinished = whenFinished; }
52
53   /**
54      Devuelve una cadena con la informacion relevante de este objeto.
55      \return Una cadena con la informacion relevante de este objeto.
56   */
57   virtual String asString() const ;
58
59   /**
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.
63    */
64   template <typename T> static T* release(T& instance)
65   {
66     return release(&instance);
67   }
68
69   /**
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.
73    */
74   template <typename T> static T* release(T* instance)
75   {
76     if(instance == NULL)
77       return NULL;
78
79     if(instance->getWhenFinished() == WhenFinished::Delete) {
80       delete instance;
81       instance = NULL;
82     }
83
84     return instance;
85   }
86
87   /**
88    * Devuelve el nombre lógico de esta clase.
89    * \return el nombre lógico de esta clase.
90    */
91   static const char* className() { return "AutoPointer"; }
92
93 protected:
94   /**
95    * Constructor
96    * \param whenFinished Indica que operación a realizar cuando se invoque a anna::AutoPointer::release.
97    */
98   AutoPointer(const WhenFinished::_v whenFinished) : a_whenFinished(whenFinished) {;}
99
100 private:
101   WhenFinished::_v a_whenFinished;
102 };
103
104 }
105
106 #endif
107
108