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_Tokenizer_hpp
10 #define anna_core_util_Tokenizer_hpp
14 #include <anna/core//DataBlock.hpp>
18 class RuntimeException;
21 Tokenize the input string into several elements
25 int _apply(const char* str, const char* separator) throw(RuntimeException);
28 typedef char* const* const_iterator;
38 @param str Cadena sobre la que aplicar la separacion.
39 @param separator Caracteres que van a actuar como separador de las subcadenas contenidas en el
42 Tokenizer(const char* str, const char* separator);
47 @param str Cadena sobre la que aplicar la separacion.
48 @param separator Caracteres que van a actuar como separador de las subcadenas contenidas en el
51 Tokenizer(const std::string& str, const char* separator);
60 Devuelve el estado del indicador de activacion de eliminacion de espacios de los extremos.
61 \return El estado del indicador de activacion de eliminacion de espacios de los extremos.
63 bool activateStrip() const throw() { return a_activateStrip; }
68 Activa y/o desactiva que activa el sistema que permite recoger los elementos retornadodos
69 por esta clase sin espacios por delante y por detras.
70 \param _activateStrip Parametro que indica el estado de activacion o desactivacion.
72 void activateStrip(const bool _activateStrip) throw() { a_activateStrip = _activateStrip; }
75 @return El elemento que ocupa la posicion i-esima.
76 \warning Este método tiene una eficiencia de O(1), mejor usar iteradores.
78 const char* at(const int i) throw(RuntimeException);
81 @return El elemento que ocupa la posicion i-esima.
82 \warning Este método tiene una eficiencia de O(1), mejor usar iteradores.
84 const char* at(const int i) const throw(RuntimeException);
87 @return El elemento que ocupa la posicion i-esima.
88 \warning Este método tiene una eficiencia de O(1), mejor usar iteradores.
90 const char* operator [](const int i) throw(RuntimeException) { return at(i); }
93 @return El elemento que ocupa la posicion i-esima.
94 \warning Este método tiene una eficiencia de O(1), mejor usar iteradores.
96 const char* operator [](const int i) const throw(RuntimeException) { return at(i); }
99 Process the separation over the string str with the separator provided.
101 Internally used strtok_r has these imitations: sequence of two or more contiguous delimiter
102 bytes in the parsed string is considered to be a single delimiter. Delimiter bytes at the start
103 or end of the string are ignored. Put another way: the tokens returned by strtok() are always
104 nonempty strings. To override these limitations, the string provided can be internally modified
105 inserting a artificial token in order to cheat on strtok_r. For this feature, you may provide
106 '<null>' or whatever string (non-empty) you prefer.
108 @param str String to apply the separation.
109 @param separator Characters used as separator within the string tokenized
110 @param tokenizeContiguous If provided, it will be the artificial token used internally. The
111 resulting tokens shall store this string in case of contiguous separators. NULL by
112 default (original strtok_r behaviour).
114 @return Number of tokens
116 int apply(const char* str, const char* separator, const char *tokenizeContiguous = NULL) throw(RuntimeException);
117 int apply(const std::string& str, const char* separator, const char *tokenizeContiguous = NULL) throw(RuntimeException) {
118 return apply(str.c_str(), separator, tokenizeContiguous);
124 @return El ultimo elemento obtenido la aplicar la separacion.
126 const char* last() const throw(RuntimeException);
129 * Devuelve el número de elementos obtenidos en la separación.
130 * \return el número de elementos obtenidos en la separación.
132 int size() const throw() { return a_maxItem; }
135 * Devuelve el iterador el comiento de los elementos obtenidos por #apply
136 * \return el iterador el comiento de los elementos obtenidos por #apply
138 const_iterator begin() const throw() { return a_items; }
141 * Devuelve el iterador al final de los elementos obtenidos por #apply
142 * \return el iterador al final de los elementos obtenidos por #apply
144 const_iterator end() const throw() { return a_items + a_maxItem; }
147 Devuelve la cadena referenciada por el iterator recibido como parametro.
148 \return la cadena referenciada por el iterator recibido como parametro.
150 static const char* data(const_iterator ii) throw() { return *ii; }
153 static const int MaxItem;
155 anna::DataBlock a_dataBlock;
156 bool a_activateStrip;
160 static char* strip(char* str) throw();
162 void indexException(const int index, const char* fromFile, const int fromLine) const throw(RuntimeException);