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_util_SortedVector_hpp
10 #define anna_core_util_SortedVector_hpp
14 #include <anna/core/RuntimeException.hpp>
15 #include <anna/config/defines.hpp>
20 Patron para ordenar instancias de objetos en base de una clave.
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
28 \warning no actua como clase segura en MT, ver #anna::SafeSortedVector.
30 template < typename T, typename SortBy, typename TKey = int > class SortedVector : public std::map <TKey, T*> {
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;
44 \param other Instancia de la que copiar.
46 explicit SortedVector(const SortedVector& other) :
52 virtual ~SortedVector() { container::clear(); }
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.
61 bool contains(const T* t) const
66 TKey key(SortBy::value(t));
67 return find(key) != NULL;
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.
76 throw(RuntimeException) {
80 TKey key(SortBy::value(t));
82 std::pair <iterator, bool> result = container::insert(v);
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.
92 throw(RuntimeException) {
97 TKey key(SortBy::value(t));
98 iterator ii = container::find(key);
100 if(ii != container::end()) {
101 container::erase(ii);
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.
113 T* find(const TKey key)
115 iterator ii = container::find(key);
116 return (ii == container::end()) ? NULL : ii->second;
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.
124 const T* find(const TKey key) const throw() {
125 return const_cast <SortedVector <T, SortBy, TKey>*>(this)->find(key);
129 Devuelve el objeto referenciado por el iterador.
130 \return El objeto referenciado por el iterador.
132 static T* data(iterator ii) throw() { return ii->second; }
135 Devuelve el objeto referenciado por el iterador.
136 \return El objeto referenciado por el iterador.
138 static const T* data(const_iterator ii) throw() { return ii->second; }