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_CommaSeparatedList_hpp
10 #define anna_core_util_CommaSeparatedList_hpp
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
19 Por ejemplo el modo de uso seria el siguiente:
22 CommaSeparatedList <Objeto> params;
27 for (CommaSeparatedList<Objeto>::const_iterator ii = params.begin (), maxii = params.end (); ii != maxii; ii ++) {
28 Objecto* obj = CommaSeparatedList<Objeto>::data (ii);
30 .... usa el objeto de la lista ...
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:
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);
43 .... usa el objeto de la lista ...
48 La invocacion a la funcion sera:
53 cualquierFunction (aaa, bbb, ccc);
54 cualquierFunction (bbb, ccc);
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.
61 template <typename T> class CommaSeparatedList {
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 */
69 CommaSeparatedList() {;}
74 ~CommaSeparatedList() { a_parameters.clear(); }
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.
82 CommaSeparatedList<T>& operator, (T& t) throw() { a_parameters.push_back(&t); return *this; }
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.
90 CommaSeparatedList<T>& operator= (T& t) throw() { a_parameters.push_back(&t); return *this; }
94 \param rsh Lista de parametros a copiar.
95 \return La instancia de la lista destino.
97 CommaSeparatedList<T>& operator= (CommaSeparatedList<T>& rsh) throw() {
99 a_parameters = rsh.parameters;
105 Elimina el contenido actual de la lista de parametros.
107 void clear() throw() { a_parameters.clear(); }
110 Devuelve un iterator al primer parametro de la lista.
111 \return Un iterator al primer parametro de la lista.
113 iterator begin() throw() { return a_parameters.begin(); }
116 Devuelve un iterator al primer parametro de la lista.
117 \return Un iterator al primer parametro de la lista.
119 const_iterator begin() const throw() { return a_parameters.begin(); }
122 Devuelve un iterator al ultimo parametro de la lista.
123 \return Un iterator al ultimo parametro de la lista.
125 iterator end() throw() { return a_parameters.end(); }
128 Devuelve un iterator al ultimo parametro de la lista.
129 \return Un iterator al ultimo parametro de la lista.
131 const_iterator end() const throw() { return a_parameters.end(); }
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.
137 static T* data(iterator& ii) throw() { return *ii; }
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.
143 static const T* data(const_iterator& ii) throw() { return *ii; }
146 std::vector <T*> a_parameters;