Changed LICENSE. Now referenced to web site and file on project root directory
[anna.git] / include / anna / core / util / Tokenizer.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_Tokenizer_hpp
10 #define anna_core_util_Tokenizer_hpp
11
12 #include <string>
13
14 #include <anna/core//DataBlock.hpp>
15
16 namespace anna {
17
18 class RuntimeException;
19
20 /**
21    Separa la cadena recibida en distintos elementos.
22 */
23 class Tokenizer {
24 public:
25   typedef char* const* const_iterator;
26
27   /**
28      Constructor.
29   */
30   Tokenizer();
31
32   /**
33      Constructor.
34
35      @param str Cadena sobre la que aplicar la separacion.
36      @param separator Caracteres que van a actuar como separador de las subcadenas contenidas en el
37      primer parametro.
38   */
39   Tokenizer(const char* str, const char* separator);
40
41   /**
42      Constructor.
43
44      @param str Cadena sobre la que aplicar la separacion.
45      @param separator Caracteres que van a actuar como separador de las subcadenas contenidas en el
46      primer parametro.
47   */
48   Tokenizer(const std::string& str, const char* separator);
49
50   /**
51    * Destructor.
52    */
53   virtual ~Tokenizer();
54
55   // Accesores
56   /**
57      Devuelve el estado del indicador de activacion de eliminacion de espacios de los extremos.
58      \return El estado del indicador de activacion de eliminacion de espacios de los extremos.
59   */
60   bool activateStrip() const throw() { return a_activateStrip; }
61
62   // Operadores
63
64   /**
65      Activa y/o desactiva que activa el sistema que permite recoger los elementos retornadodos
66      por esta clase sin espacios por delante y por detras.
67      \param _activateStrip Parametro que indica el estado de activacion o desactivacion.
68   */
69   void activateStrip(const bool _activateStrip) throw() { a_activateStrip = _activateStrip; }
70
71   /**
72     @return El elemento que ocupa la posicion i-esima.
73     \warning Este método tiene una eficiencia de O(1), mejor usar iteradores.
74   */
75   const char* at(const int i) throw(RuntimeException);
76
77   /**
78     @return El elemento que ocupa la posicion i-esima.
79     \warning Este método tiene una eficiencia de O(1), mejor usar iteradores.
80   */
81   const char* at(const int i) const throw(RuntimeException);
82
83   /**
84     @return El elemento que ocupa la posicion i-esima.
85     \warning Este método tiene una eficiencia de O(1), mejor usar iteradores.
86   */
87   const char* operator [](const int i) throw(RuntimeException) { return at(i); }
88
89   /**
90     @return El elemento que ocupa la posicion i-esima.
91     \warning Este método tiene una eficiencia de O(1), mejor usar iteradores.
92   */
93   const char* operator [](const int i) const throw(RuntimeException) { return at(i); }
94
95   /**
96      Aplica la separacion sobre la cadena str con el separador recibido como parametro.
97
98      @param str Cadena sobre la que aplicar la separacion.
99      @param separator Caracteres que van a actuar como separador de las subcadenas contenidas en el
100      primer parametro.
101
102      @return Numero de elementos obtenidos al aplicar la separacion.
103
104   */
105   int apply(const std::string& str, const char* separator) throw(RuntimeException) {
106     return apply(str.c_str(), separator);
107   }
108
109   /**
110      Aplica la separacion sobre la cadena str con el separador recibido como parametro.
111
112      @param str Cadena sobre la que aplicar la separacion.
113      @param separator Caracteres que van a actuar como separador de las subcadenas contenidas en el
114      primer parametro.
115
116      @return Numero de elementos obtenidos al aplicar la separacion.
117
118   */
119   int apply(const char* str, const char* separator) throw(RuntimeException);
120
121   // Metodos
122   /**
123      @return El ultimo elemento obtenido la aplicar la separacion.
124   */
125   const char* last() const throw(RuntimeException);
126
127   /**
128    * Devuelve el número de elementos obtenidos en la separación.
129    * \return el número de elementos obtenidos en la separación.
130    */
131   int size() const throw() { return a_maxItem; }
132
133   /**
134    * Devuelve el iterador el comiento de los elementos obtenidos por #apply
135    * \return el iterador el comiento de los elementos obtenidos por #apply
136    */
137   const_iterator begin() const throw() { return a_items; }
138
139   /**
140    * Devuelve el iterador al final de los elementos obtenidos por #apply
141    * \return el iterador al final de los elementos obtenidos por #apply
142    */
143   const_iterator end() const throw() { return a_items + a_maxItem; }
144
145   /**
146      Devuelve la cadena referenciada por el iterator recibido como parametro.
147      \return la cadena referenciada por el iterator recibido como parametro.
148   */
149   static const char* data(const_iterator ii) throw() { return *ii; }
150
151 private:
152   static const int MaxItem;
153
154   anna::DataBlock a_dataBlock;
155   bool a_activateStrip;
156   char** a_items;
157   int a_maxItem;
158
159   static char* strip(char* str) throw();
160
161   void indexException(const int index, const char* fromFile, const int fromLine) const throw(RuntimeException);
162 };
163
164 }
165
166 #endif