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_TextComposer_hpp
10 #define anna_core_util_TextComposer_hpp
14 #include <anna/core/RuntimeException.hpp>
15 #include <anna/core/mt/Mutex.hpp>
16 #include <anna/core/mt/Guard.hpp>
17 #include <anna/core//DataBlock.hpp>
19 #include <anna/core/util/TextVariable.hpp>
27 Compositor de textos dinamicos.
29 Antes de invocar al metodo TextComposer::apply para obtener la cadena resultante de
30 sustituir los enginees dinamicos habra que establecer el valor de cada uno de
33 La indicacion de forma es igual a la usada en los metodos printf, sprintf, etc ...
35 Por ejemplo para establecer los valores de un compositor con la expresion:
36 "Error en el circuito ${circuit:%d} de la central ${central:%05d} procesando mensaje ${messageid:%s}", deberiamos tener
37 un codigo similar al que presentamos a continuacion:
40 util::TextComposer& ttcc = textManager.find (N);
42 util::TextComposer::Protector textComposer (ttcc);
43 textComposer ["circuit"] = a;
44 textComposer ["central"] = b;
45 textComposer ["messageid"] = c;
47 // Una vez hecho esto podemos obtener el texto
48 std::cout << textComposer.apply () << std::endl;
51 Donde hemos hecho las siguientes suposiciones:
52 \li \em textManager es un gestor de texto definido dentro del ambito del ejemplo.
53 \li \em N es el numero del compositor que deberia ser creado previamente indicando
54 la expresion usada en el ejemplo.
55 \li \em a Es una variable de tipo entero.
56 \li \em b Es una variable de tipo entero.
57 \li \em c Es una variable de tipo cadena.
59 class TextComposer : std::vector <TextVariable*> {
60 typedef std::vector <TextVariable*> container;
61 typedef container::iterator variable_iterator;
62 typedef container::const_iterator const_variable_iterator;
71 TextVariable& operator[](const char* varName) throw(RuntimeException) {
72 return *(find(varName, Exception::Mode::Throw));
76 * Método que realiza la interpretación del texto de esta instancia.
77 * Si la instancia se crea mediante un #util::TextManager no es necesario invocar a este método.
79 void initialize() throw(RuntimeException);
82 Devuelve el identificador del compositor, que coincidira con el indicado a la hora
83 de crear el compositor mediante el metodo TextManager::create.
84 \return El identificador del compositor.
86 const int getId() const throw() { return a_id; }
89 Devuelve el nº de variables asociadas al texto.
90 \return el nº de variables asociadas al texto.
92 int getNumberOfVariables() const throw() { return container::size(); }
95 Devuelve una cadena con la informacion relevante de este objeto.
96 \return Una cadena con la informacion relevante de este objeto.
98 String asString() const throw();
103 \param id Identificador del compositor de texto.
104 \param expression Expression asociada al compositor. El numero de variables que hay que
105 establecer antes de invocar a apply dependera de este texto.
107 TextComposer(const int id, const char* expression) : a_id(id), a_expression(expression), a_prefix(NULL), a_buffer(true) {;}
110 Crea el texto teniendo en cuenta la expression y el contenido de las variables asociadas.
111 \return El texto teniendo en cuenta la expression y el contenido de las variables asociadas.
113 String apply() const throw(RuntimeException);
116 * Devuelve la instancia de la variable a la que apunta el iterador.
117 * return la instancia de la variable a la que apunta el iterador.
119 static TextVariable* textVariable(variable_iterator ii) throw() { return *ii; }
122 * Devuelve la instancia de la variable a la que apunta el iterador.
123 * return la instancia de la variable a la que apunta el iterador.
125 static const TextVariable* textVariable(const_variable_iterator ii) throw() { return *ii; }
129 const String a_expression;
132 mutable DataBlock a_buffer;
134 TextComposer(const TextComposer&);
136 TextVariable* find(const char* name, const Exception::Mode::_v) throw(RuntimeException);
137 void lock() throw(RuntimeException) { a_mutex.lock(); }
138 void unlock() throw() { a_mutex.unlock(); }
140 static TextVariable::Type::_v calculeType(const char* format) throw(RuntimeException);
142 friend class TextManager;
143 // friend class Guard <TextComposer>;
144 // friend class Protector;