Remove dynamic exceptions
[anna.git] / include / anna / core / util / CommaSeparatedList.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_CommaSeparatedList_hpp
10 #define anna_core_util_CommaSeparatedList_hpp
11
12 namespace anna {
13
14 /**
15    Obtiene una lista de objetos a partir de la lista expresada con el operador ','.
16    Lo mas normal es que sea usada para pasar un numero indeterminado de parametros del mismo tipo a un metodo
17    o funcion.
18
19    Por ejemplo el modo de uso seria el siguiente:
20
21    \code
22       CommaSeparatedList <Objeto> params;
23       Objeto a, b, c;
24
25       params = a, b, c;
26
27       for (CommaSeparatedList<Objeto>::const_iterator ii = params.begin (), maxii = params.end (); ii != maxii; ii ++) {
28          Objecto* obj = CommaSeparatedList<Objeto>::data (ii);
29
30          .... usa el objeto de la lista ...
31       }
32
33    \endcode
34
35    Un ejemplo mas realista. Suponed que tenemos una funcion que tiene que recibir un numero indeterminado
36    de instancia de tipo Objeto. Se definira de la forma:
37
38    \code
39    void cualquierFuncion (const anna::CommaSeparatedList <Objeto>& csl) {
40       for (CommaSeparatedList<Objeto>::const_iterator ii = params.begin (), maxii = params.end (); ii != maxii; ii ++) {
41          Objecto* obj = CommaSeparatedList<Objeto>::data (ii);
42
43          .... usa el objeto de la lista ...
44       }
45    }
46    \endcode
47
48    La invocacion a la funcion sera:
49
50    \code
51    Objeto aaa, bbb, ccc;
52
53    cualquierFunction (aaa, bbb, ccc);
54    cualquierFunction (bbb, ccc);
55
56    \endcode
57
58    En el primer caso la lista de objetos terminara conteniendo los elementos aaa, bbb y ccc..
59    En el segundo caso la lista de objetos terminara conteniendo los elementos bbb y ccc.
60 */
61 template <typename T> class CommaSeparatedList {
62 public:
63   typedef typename std::vector <T*>::iterator iterator; /**< Definicion para recorrer los elementos. */
64   typedef typename std::vector <T*>::const_iterator const_iterator; /**< Definicion para recorrer los elementos */
65
66   /**
67      Constructor vacio.
68   */
69   CommaSeparatedList() {;}
70
71   /**
72      Destructor.
73   */
74   ~CommaSeparatedList() { a_parameters.clear(); }
75
76   /**
77      Operador coma re-escrito para recorrer los objetos de la expresion basada en ','.
78      Cada uno de los elementos de la expresion es convertido a un elemento de la lista.
79      \param t Parametro con el que ampliar la lista.
80      \return La instancia de la lista destino.
81   */
82   CommaSeparatedList<T>& operator, (T& t) { a_parameters.push_back(&t); return *this; }
83
84   /**
85      Operador de asignacion.
86      Amplia la lista con el elemento recibido.
87      \param t Parametro con el que ampliar la lista.
88      \return La instancia de la lista destino.
89   */
90   CommaSeparatedList<T>& operator= (T& t) { a_parameters.push_back(&t); return *this; }
91
92   /**
93      Operador de copia.
94      \param rsh Lista de parametros a copiar.
95      \return La instancia de la lista destino.
96   */
97   CommaSeparatedList<T>& operator= (CommaSeparatedList<T>& rsh) {
98     if(this != &rsh)
99       a_parameters = rsh.parameters;
100
101     return *this;
102   }
103
104   /**
105      Elimina el contenido actual de la lista de parametros.
106   */
107   void clear() { a_parameters.clear(); }
108
109   /**
110      Devuelve un iterator al primer parametro de la lista.
111      \return Un iterator al primer parametro de la lista.
112   */
113   iterator begin() { return a_parameters.begin(); }
114
115   /**
116      Devuelve un iterator al primer parametro de la lista.
117      \return Un iterator al primer parametro de la lista.
118   */
119   const_iterator begin() const { return a_parameters.begin(); }
120
121   /**
122      Devuelve un iterator al ultimo parametro de la lista.
123      \return Un iterator al ultimo parametro de la lista.
124   */
125   iterator end() { return a_parameters.end(); }
126
127   /**
128      Devuelve un iterator al ultimo parametro de la lista.
129      \return Un iterator al ultimo parametro de la lista.
130   */
131   const_iterator end() const { return a_parameters.end(); }
132
133   /**
134      Devuelve el puntero sobre el que esta posicionado el iterador recibido como parametro.
135      \return El puntero sobre el que esta posicionado el iterador recibido como parametro.
136   */
137   static T* data(iterator& ii) { return *ii; }
138
139   /**
140      Devuelve el puntero sobre el que esta posicionado el iterador recibido como parametro.
141      \return El puntero sobre el que esta posicionado el iterador recibido como parametro.
142   */
143   static const T* data(const_iterator& ii) { return *ii; }
144
145 private:
146   std::vector <T*> a_parameters;
147 };
148
149 }
150
151 #endif
152