Remove dynamic exceptions
[anna.git] / include / anna / core / mt / SafeSortedVector.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_mt_SafeSortedVector_hpp
10 #define anna_core_mt_SafeSortedVector_hpp
11
12 #include <vector>
13
14 #include <anna/core/mt/Mutex.hpp>
15 #include <anna/core/mt/Guard.hpp>
16 #include <anna/core/util/SortedVector.hpp>
17
18 namespace anna {
19
20 /**
21    Patron para ordenar instancias de objetos en base de una clave. El acceso a la lista de
22    datos se realiza desde secciones criticas.
23
24    \param T Clase del patron.
25    \param SortBy Clase que ofrece el valor por el que ordenar. Debe implementar un metodo constante con la
26     signatura: TKey value (const T*)
27    \param TKey Tipo de clave usado para calcular la ordenacion. Debe implementar los operadores '=', '<' y '==' y el
28    contructor copia.
29 */
30 template < typename T, typename SortBy, typename TKey = int >
31 class SafeSortedVector : public SortedVector <T, SortBy, TKey>, public Mutex {
32 public:
33   /**
34      Constructor.
35   */
36   SafeSortedVector() : SortedVector <T, SortBy, TKey> () {;}
37
38   /**
39      Constructor copia.
40      \param other Instancia de la que copiar.
41   */
42   explicit SafeSortedVector(const SafeSortedVector& other) : SortedVector <T, SortBy, TKey> (other) {}
43
44   /**
45      Devolvera \em true si la instancia recibida como parametro esta contenido en el
46      vector o \em en otro caso. Si la instancia recibida es NULL siempre devolvera \em false.
47      \param t Instancia a comprobar.
48      \return \em true si la instancia recibida como parametro esta contenido en el
49      vector o \em en otro caso.
50   */
51   bool contains(const T* t) const
52   {
53     if(t == NULL)
54       return false;
55
56     Guard guard(this, "SafeSortedVector <T, SortBy, TKey>::contains");
57     return  SortedVector <T, SortBy, TKey>::contains(t);
58   }
59
60   /**
61      Incorpora la instancia recibida como parametro en la lista ordenada de objetos.
62      \param t Instancia a guardar en el vector. Si es NULL la operacion no tendra ningun efecto.
63      \return \em true si ha registrado la nueva instancia o \em false en otro caso.
64   */
65   bool add(T* t)
66   noexcept(false) {
67     if(t == NULL)
68       return false;
69
70     Guard guard(this, "SafeSortedVector <T, SortBy, TKey>::add");
71     return SortedVector <T, SortBy, TKey>::add(t);
72   }
73
74   /**
75      Elimina la instancia recibida como parametro de la lista ordenada de objetos.
76      \param t Instancia a guardar en el vector. Si es NULL la operacion no tendra ningun efecto.
77      \return \em true si ha eliminado la instancia o \em false en otro caso.
78   */
79   bool erase(T* t)
80   noexcept(false) {
81     if(t == NULL)
82       return false;
83
84     Guard guard(this, "SafeSortedVector <T, SortBy, TKey>::erase");
85     return SortedVector <T, SortBy, TKey>::erase(t);
86   }
87
88   /**
89      Devuelve la instancia asociada a la clave recibida como parametro o NULL si no existe.
90      \param key Clave a buscar en el vector.
91      \return la instancia asociada a la clave recibida como parametro o NULL si no existe.
92   */
93   T* find(const TKey key)
94   {
95     Guard guard(this, "SafeSortedVector <T, SortBy, TKey>::find");
96     return SortedVector <T, SortBy, TKey>::find(key);
97   }
98
99   /**
100      Devuelve la instancia asociada a la clave recibida como parametro o NULL si no existe.
101      \param key Clave a buscar en el vector.
102      \return la instancia asociada a la clave recibida como parametro o NULL si no existe.
103   */
104   const T* find(const TKey key) const {
105     return const_cast <SafeSortedVector <T, SortBy, TKey>*>(this)->find(key);
106   }
107 };
108
109 }
110
111 #endif