Remove dynamic exceptions
[anna.git] / include / anna / core / util / SortedVector.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_util_SortedVector_hpp
10 #define anna_core_util_SortedVector_hpp
11
12 #include <map>
13
14 #include <anna/core/RuntimeException.hpp>
15 #include <anna/config/defines.hpp>
16
17 namespace anna {
18
19 /**
20    Patron para ordenar instancias de objetos en base de una clave.
21
22    \param T Clase del patron.
23    \param SortBy Clase que ofrece el valor por el que ordenar. Debe implementar un metodo constante con la
24     signatura: TKey value (const T*)
25    \param TKey Tipo de clave usado para calcular la ordenacion. Debe implementar los operadores '=', '<' y '==' y el
26    contructor copia.
27
28    \warning no actua como clase segura en MT, ver #anna::SafeSortedVector.
29 */
30 template < typename T, typename SortBy, typename TKey = int > class SortedVector : public std::map <TKey, T*> {
31 public:
32   typedef typename std::map <TKey, T*> container;
33   typedef typename container::iterator iterator;
34   typedef typename container::const_iterator const_iterator;
35   typedef typename container::value_type value_type;
36
37   /**
38      Constructor.
39   */
40   SortedVector() {;}
41
42   /**
43      Constructor copia.
44      \param other Instancia de la que copiar.
45   */
46   explicit SortedVector(const SortedVector& other) :
47     container(other) {}
48
49   /**
50      Destructor.
51   */
52   virtual ~SortedVector() { container::clear(); }
53
54   /**
55      Devolvera \em true si la instancia recibida como parametro esta contenido en el
56      map o \em en otro caso. Si la instancia recibida es NULL siempre devolvera \em false.
57      \param t Instancia a comprobar.
58      \return \em true si la instancia recibida como parametro esta contenido en el
59      map o \em en otro caso.
60   */
61   bool contains(const T* t) const
62   {
63     if(t == NULL)
64       return false;
65
66     TKey key(SortBy::value(t));
67     return find(key) != NULL;
68   }
69
70   /**
71      Incorpora la instancia recibida como parametro en la lista ordenada de objetos.
72      \param t Instancia a guardar en el map. Si es NULL la operacion no tendra ningun efecto.
73      \return \em true si ha registrado la nueva instancia o \em false en otro caso.
74   */
75   bool add(T* t)
76   noexcept(false) {
77     if(t == NULL)
78       return false;
79
80     TKey key(SortBy::value(t));
81     value_type v(key, t);
82     std::pair <iterator, bool> result = container::insert(v);
83     return result.second;
84   }
85
86   /**
87      Elimina la instancia recibida como parametro de la lista ordenada de objetos.
88      \param t Instancia a guardar en el map. Si es NULL la operacion no tendra ningun efecto.
89      \return \em true si ha eliminado la instancia o \em false en otro caso.
90   */
91   bool erase(T* t)
92   noexcept(false) {
93     if(t == NULL)
94       return false;
95
96     bool result = false;
97     TKey key(SortBy::value(t));
98     iterator ii = container::find(key);
99
100     if(ii != container::end()) {
101       container::erase(ii);
102       result = true;
103     }
104
105     return result;
106   }
107
108   /**
109      Devuelve la instancia asociada a la clave recibida como parametro o NULL si no existe.
110      \param key Clave a buscar en el map.
111      \return la instancia asociada a la clave recibida como parametro o NULL si no existe.
112   */
113   T* find(const TKey key)
114   {
115     iterator ii = container::find(key);
116     return (ii == container::end()) ? NULL : ii->second;
117   }
118
119   /**
120      Devuelve la instancia asociada a la clave recibida como parametro o NULL si no existe.
121      \param key Clave a buscar en el map.
122      \return la instancia asociada a la clave recibida como parametro o NULL si no existe.
123   */
124   const T* find(const TKey key) const {
125     return const_cast <SortedVector <T, SortBy, TKey>*>(this)->find(key);
126   }
127
128   /**
129      Devuelve el objeto referenciado por el iterador.
130      \return El objeto referenciado por el iterador.
131   */
132   static T* data(iterator ii) { return ii->second; }
133
134   /**
135      Devuelve el objeto referenciado por el iterador.
136      \return El objeto referenciado por el iterador.
137   */
138   static const T* data(const_iterator ii) { return ii->second; }
139 };
140
141 }
142
143 #endif