TFCweb  1.0.4 $Rev: 483 $
TFC Primavera 2012: Nucli d'un servidor web
Transformacions.h
Veure la documentació d'aquest fitxer.
1 #if !defined(_TRANSFORMACIONS_H_)
2 #define _TRANSFORMACIONS_H_
3 
21 /*
22  * Copyright (c) 2012 Toni Corvera
23  *
24  * This file is part of TFCWeb.
25  *
26  * TFCWeb is free software: you can redistribute it and/or modify
27  * it under the terms of the GNU General Public License as published by
28  * the Free Software Foundation, either version 3 of the License, or
29  * (at your option) any later version.
30  *
31  * TFCWeb is distributed in the hope that it will be useful,
32  * but WITHOUT ANY WARRANTY; without even the implied warranty of
33  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
34  * GNU General Public License for more details.
35  *
36  * You should have received a copy of the GNU General Public License
37  * along with TFCWeb. If not, see <http://www.gnu.org/licenses/>.
38  */
39 
40 #include "portabilitat.h" // zlib.h, ZLIB_CONST
41 
42 #include <array>
43 #include <iostream>
44 #include <memory>
45 #include <string>
46 #include <vector>
47 #include <boost/function.hpp>
48 
49 namespace tfc {
50 
58 };
59 
64 public:
65  virtual ~Transformacio() {
66  // buit
67  }
68 
72  virtual std::string transforma(const std::string &bloc) const = 0;
73 
77  virtual std::string finalitza() const = 0;
78 
85  virtual std::string destransforma(const std::string & text_transformat,
86  EstatTransformacioInversa & estat) const = 0;
87 };
88 
98 public:
105  typedef boost::function<bool (std::string&)> funcio_extractora;
112  typedef boost::function<bool (const std::string&)> funcio_escriptora;
113 
115  const funcio_extractora& extractora() const { return extractora_; }
117  const funcio_escriptora& escriptora() const { return escriptora_; }
118 
124  void aplica();
125 
126  virtual ~AplicadorTransformacioBase();
127 protected:
130  : extractora_(extractora), escriptora_(escriptora)
131  {
132  // buit
133  }
135  virtual Transformacio* transformacio() = 0;
136 private:
139 };
140 
146 template<typename TTransformacio>
148 public:
151  : AplicadorTransformacioBase(extractora,escriptora), trans_()
152  {
153  // buit
154  }
155 protected:
157  virtual Transformacio* transformacio() { return &trans_; }
158 private:
159  TTransformacio trans_;
160 };
161 
166 public:
167  FuncioExtractoraIstream(std::istream & ist)
168  : ist_(ist)
169  {
170  // buit
171  }
172  bool operator()(std::string &);
173 private:
174  std::istream & ist_;
175  enum {
176  MIDA_BUFFER = 4096
177  };
178  std::array<char, MIDA_BUFFER> buffer_;
179 };
180 
185 public:
186  FuncioEscriptoraOstream(std::ostream & ost)
187  : ost_(ost)
188  {
189  // buit
190  }
191  bool operator()(const std::string &);
192 private:
193  std::ostream & ost_;
194 };
195 
200 public:
201  virtual std::string transforma(const std::string & bloc) const { return bloc; }
202  virtual std::string finalitza() const { return ""; }
203  virtual std::string destransforma(const std::string & text,
204  EstatTransformacioInversa & ok) const {
205  ok = TRANSFORMAT;
206  return text;
207  }
208 };
209 
215 public:
216  virtual std::string transforma(const std::string & bloc) const;
217  virtual std::string finalitza() const;
218  virtual std::string destransforma(const std::string & text_transformat,
219  EstatTransformacioInversa & estat) const;
220 };
221 
223 public:
225  : inicialitzat_(CAP)
226  {
227  // buit
228  }
229 
230  virtual std::string transforma(const std::string & bloc) const;
231  virtual std::string finalitza() const;
232  virtual std::string destransforma(const std::string & text_transformat,
233  EstatTransformacioInversa & estat) const;
234 private:
235  enum Mode {
239  };
240  // http://www.zlib.net/zlib_how.html:
241  // "
242  // Larger buffer sizes [respecte 16384] would be more efficient,
243  // especially for inflate().
244  // If the memory is available, buffers sizes on the order of 128K
245  // or 256K bytes should be used.
246  // "
247  enum {
249  };
250 
257  bool inicialitza(Mode m) const;
261  void desinicialitza() const;
262 
263  mutable z_stream strm_;
265 };
266 
276 protected:
277  typedef std::shared_ptr<Transformacio> transformacio_ptr;
278 public:
280  // buit
281  }
283  : cadena_(ct.cadena_)
284  {
285  // buit
286  }
288  cadena_ = ct.cadena_;
289  return *this;
290  }
291 
292  template<typename TTransformacio>
293  void afegeix() {
294  transformacio_ptr trans(new TTransformacio());
295  cadena_.push_back( trans );
296  }
297  virtual std::string transforma(const std::string & bloc) const;
298  virtual std::string finalitza() const;
299  virtual std::string destransforma(const std::string & text,
300  EstatTransformacioInversa & estat) const;
301  size_t pasos() const { return cadena_.size(); }
302 private:
303  std::vector<transformacio_ptr> cadena_;
304 };
305 
306 } // ns tfc
307 
308 #endif // _TRANSFORMACIONS_H_
309 
310 // vim:set ts=4 et ai: //