00001
00002
00003
00004
00005
00006
00008 #ifndef CPPCMS_FILTERS_H
00009 #define CPPCMS_FILTERS_H
00010
00011 #include <locale>
00012 #include <typeinfo>
00013 #include <sstream>
00014 #include <vector>
00015 #include <iostream>
00016 #include <cppcms/defs.h>
00017 #include <booster/copy_ptr.h>
00018 #include <cppcms/localization.h>
00019
00020 namespace cppcms {
00025 namespace filters {
00026
00034 class CPPCMS_API streamable {
00035 public:
00037 typedef void (*to_stream_type)(std::ostream &,void const *ptr);
00038 typedef std::string (*to_string_type)(std::ios &,void const *ptr);
00040
00041 streamable();
00042 ~streamable();
00043 streamable(streamable const &other);
00044 streamable const &operator=(streamable const &other);
00045
00049 template<typename S>
00050 streamable(S const &ptr)
00051 {
00052 void const *p=&ptr;
00053 to_stream_type s1=&to_stream<S>;
00054 to_string_type s2=&to_string<S>;
00055 std::type_info const *info=&typeid(S);
00056
00057 set(p,s1,s2,info);
00058 }
00059
00063 template<typename T>
00064 T const &get() const
00065 {
00066 if(typeid(T) != type())
00067 throw std::bad_cast();
00068 T const *object=reinterpret_cast<T const *>(ptr_);
00069 return *object;
00070 }
00071
00075 streamable(char const *ptr);
00076
00080
00081 void operator()(std::ostream &output) const;
00082
00086 std::string get(std::ios &ios) const;
00087 private:
00088 void set(void const *ptr,to_stream_type f1,to_string_type f2,std::type_info const *type);
00089
00090 template<typename T>
00091 static void to_stream(std::ostream &out,void const *ptr)
00092 {
00093 T const *object=reinterpret_cast<T const *>(ptr);
00094 out << *object;
00095 }
00096
00097
00098 template<typename T>
00099 static std::string to_string(std::ios &out,void const *ptr)
00100 {
00101 T const *object=reinterpret_cast<T const *>(ptr);
00102 std::ostringstream oss;
00103 oss.copyfmt(out);
00104 oss << *object;
00105 return oss.str();
00106 }
00107
00108 std::type_info const &type() const;
00109 private:
00110
00111 void const *ptr_;
00112 to_stream_type to_stream_;
00113 to_string_type to_string_;
00114 std::type_info const *type_;
00115
00116 };
00117
00122 template<>
00123 CPPCMS_API streamable::streamable(std::string const &str);
00124
00130
00131 class CPPCMS_API to_upper {
00132 public:
00133 to_upper();
00134 ~to_upper();
00135 to_upper(to_upper const &);
00136 to_upper const &operator=(to_upper const &other);
00137 void operator()(std::ostream &out) const;
00138 to_upper(streamable const &obj);
00139
00140 private:
00141 streamable obj_;
00142 struct _data;
00143 booster::copy_ptr<_data> d;
00144 };
00145
00146 inline std::ostream &operator<<(std::ostream &out,to_upper const &obj)
00147 {
00148 obj(out);
00149 return out;
00150 }
00151
00157
00158 class CPPCMS_API to_lower {
00159 public:
00160 to_lower();
00161 ~to_lower();
00162 to_lower(to_lower const &);
00163 to_lower const &operator=(to_lower const &other);
00164 void operator()(std::ostream &out) const;
00165 to_lower(streamable const &obj);
00166
00167 private:
00168 streamable obj_;
00169 struct _data;
00170 booster::copy_ptr<_data> d;
00171 };
00172
00173 inline std::ostream &operator<<(std::ostream &out,to_lower const &obj)
00174 {
00175 obj(out);
00176 return out;
00177 }
00178
00184
00185 class CPPCMS_API to_title {
00186 public:
00187 to_title();
00188 ~to_title();
00189 to_title(to_title const &);
00190 to_title const &operator=(to_title const &other);
00191 void operator()(std::ostream &out) const;
00192 to_title(streamable const &obj);
00193
00194 private:
00195 streamable obj_;
00196 struct _data;
00197 booster::copy_ptr<_data> d;
00198 };
00199
00200 inline std::ostream &operator<<(std::ostream &out,to_title const &obj)
00201 {
00202 obj(out);
00203 return out;
00204 }
00205
00211
00212 class CPPCMS_API escape {
00213 public:
00214 escape();
00215 ~escape();
00216 escape(escape const &);
00217 escape const &operator=(escape const &other);
00218 void operator()(std::ostream &out) const;
00219 escape(streamable const &obj);
00220
00221 private:
00222 streamable obj_;
00223 struct _data;
00224 booster::copy_ptr<_data> d;
00225 };
00226
00227 inline std::ostream &operator<<(std::ostream &out,escape const &obj)
00228 {
00229 obj(out);
00230 return out;
00231 }
00232
00233
00239
00240 class CPPCMS_API urlencode {
00241 public:
00242 urlencode();
00243 ~urlencode();
00244 urlencode(urlencode const &);
00245 urlencode const &operator=(urlencode const &other);
00246 void operator()(std::ostream &out) const;
00247 urlencode(streamable const &obj);
00248
00249 private:
00250 streamable obj_;
00251 struct _data;
00252 booster::copy_ptr<_data> d;
00253 };
00254
00255 inline std::ostream &operator<<(std::ostream &out,urlencode const &obj)
00256 {
00257 obj(out);
00258 return out;
00259 }
00260
00266
00267 class CPPCMS_API base64_urlencode {
00268 public:
00269 base64_urlencode();
00270 ~base64_urlencode();
00271 base64_urlencode(base64_urlencode const &);
00272 base64_urlencode const &operator=(base64_urlencode const &other);
00273 void operator()(std::ostream &out) const;
00274 base64_urlencode(streamable const &obj);
00275
00276 private:
00277 streamable obj_;
00278 struct _data;
00279 booster::copy_ptr<_data> d;
00280 };
00281
00282 inline std::ostream &operator<<(std::ostream &out,base64_urlencode const &obj)
00283 {
00284 obj(out);
00285 return out;
00286 }
00287
00293
00294 class CPPCMS_API raw {
00295 public:
00296 raw();
00297 ~raw();
00298 raw(raw const &);
00299 raw const &operator=(raw const &other);
00300 void operator()(std::ostream &out) const;
00301 raw(streamable const &obj);
00302
00303 private:
00304 streamable obj_;
00305 struct _data;
00306 booster::copy_ptr<_data> d;
00307
00308
00309
00310 };
00311
00312 inline std::ostream &operator<<(std::ostream &out,raw const &obj)
00313 {
00314 obj(out);
00315 return out;
00316 }
00317
00321 class CPPCMS_API date {
00322 public:
00323 date();
00324 date(date const &other);
00325 date const &operator=(date const &other);
00326 ~date();
00327
00331 date(streamable const &time);
00336 date(streamable const &time,std::string const &timezone);
00337 void operator()(std::ostream &out) const;
00338 private:
00339 struct _data;
00340 streamable time_;
00341 std::string tz_;
00342 booster::copy_ptr<_data> d;
00343 };
00344
00345 inline std::ostream &operator<<(std::ostream &out,date const &obj)
00346 {
00347 obj(out);
00348 return out;
00349 }
00350
00356 class CPPCMS_API time {
00357 public:
00358 time();
00359 time(time const &other);
00360 time const &operator=(time const &other);
00361 ~time();
00362
00366 time(streamable const &t);
00371 time(streamable const &time,std::string const &timezone);
00372 void operator()(std::ostream &out) const;
00373 private:
00374 struct _data;
00375 streamable time_;
00376 std::string tz_;
00377 booster::copy_ptr<_data> d;
00378 };
00379
00380 inline std::ostream &operator<<(std::ostream &out,time const &obj)
00381 {
00382 obj(out);
00383 return out;
00384 }
00390 class CPPCMS_API datetime {
00391 public:
00392 datetime();
00393 datetime(datetime const &other);
00394 datetime const &operator=(datetime const &other);
00395 ~datetime();
00396
00400 datetime(streamable const &t);
00405 datetime(streamable const &time,std::string const &timezone);
00406 void operator()(std::ostream &out) const;
00407 private:
00408 struct _data;
00409 streamable time_;
00410 std::string tz_;
00411 booster::copy_ptr<_data> d;
00412 };
00413
00414 inline std::ostream &operator<<(std::ostream &out,datetime const &obj)
00415 {
00416 obj(out);
00417 return out;
00418 }
00424 class CPPCMS_API strftime {
00425 public:
00426 strftime();
00427 strftime(strftime const &other);
00428 strftime const &operator=(strftime const &other);
00429 ~strftime();
00430
00436 strftime(streamable const &t,std::string const &fmt);
00443 strftime(streamable const &time,std::string const &timezone,std::string const &fmt);
00444
00445 void operator()(std::ostream &out) const;
00446 private:
00447 struct _data;
00448 streamable time_;
00449 std::string tz_;
00450 std::string format_;
00451 booster::copy_ptr<_data> d;
00452 };
00453
00454 inline std::ostream &operator<<(std::ostream &out,strftime const &obj)
00455 {
00456 obj(out);
00457 return out;
00458 }
00459
00460 using locale::translate;
00461 using locale::format;
00462
00463 }
00464
00466
00467 }
00468
00469
00470 #endif