28
28
#include <mapnik/unicode.hpp>
29
#include <mapnik/config_error.hpp>
30
31
#include <boost/variant.hpp>
32
#include <boost/scoped_array.hpp>
33
#include <boost/concept_check.hpp>
32
35
#include <iostream>
41
#include <unicode/unistr.h>
42
#include <unicode/ustring.h>
39
typedef boost::variant<int,double,std::wstring> value_base;
47
inline void to_utf8(UnicodeString const& input, std::string & target)
49
if (input.length() == 0) return;
51
const int BUF_SIZE = 256;
55
UErrorCode err = U_ZERO_ERROR;
56
u_strToUTF8(buf, BUF_SIZE, &len, input.getBuffer(), input.length(), &err);
57
if (err == U_BUFFER_OVERFLOW_ERROR || err == U_STRING_NOT_TERMINATED_WARNING )
59
boost::scoped_array<char> buf_ptr(new char [len+1]);
61
u_strToUTF8(buf_ptr.get() , len + 1, &len, input.getBuffer(), input.length(), &err);
62
target.assign(buf_ptr.get() , len);
66
target.assign(buf, len);
74
typedef boost::variant<value_null,bool,int,double,UnicodeString> value_base;
43
78
: public boost::static_visitor<bool>
45
80
template <typename T, typename U>
46
bool operator() (const T &, const U & ) const
81
bool operator() (const T &, const U &) const
62
97
bool operator() (double lhs, int rhs) const
99
return (lhs == rhs)? true : false ;
67
bool operator() (std::wstring const& lhs,
68
std::wstring const& rhs) const
102
bool operator() (UnicodeString const& lhs,
103
UnicodeString const& rhs) const
105
return (lhs == rhs) ? true: false;
108
bool operator() (value_null, value_null) const
115
: public boost::static_visitor<bool>
117
template <typename T, typename U>
118
bool operator() (const T &, const U &) const
123
template <typename T>
124
bool operator() (T lhs, T rhs) const
129
bool operator() (int lhs, double rhs) const
134
bool operator() (double lhs, int rhs) const
139
bool operator() (UnicodeString const& lhs,
140
UnicodeString const& rhs) const
142
return (lhs != rhs)? true : false;
145
bool operator() (value_null, value_null) const
150
template <typename T>
151
bool operator() (value_null, const T &) const
156
template <typename T>
157
bool operator() (const T &, value_null) const
74
163
struct greater_than
75
164
: public boost::static_visitor<bool>
77
166
template <typename T, typename U>
78
bool operator()( const T &, const U & ) const
167
bool operator()(const T &, const U &) const
83
172
template <typename T>
84
bool operator()( T lhs, T rhs ) const
173
bool operator()(T lhs, T rhs) const
99
bool operator() (std::wstring const& lhs, std::wstring const& rhs) const
188
bool operator() (UnicodeString const& lhs, UnicodeString const& rhs) const
190
return (lhs > rhs) ? true : false ;
193
bool operator() (value_null, value_null) const
106
200
: public boost::static_visitor<bool>
108
202
template <typename T, typename U>
109
bool operator()( const T &, const U & ) const
203
bool operator()(const T &, const U &) const
127
221
return lhs >= rhs;
130
bool operator() (std::wstring const& lhs, std::wstring const& rhs ) const
224
bool operator() (UnicodeString const& lhs, UnicodeString const& rhs) const
226
return ( lhs >= rhs ) ? true : false ;
229
bool operator() (value_null, value_null) const
137
236
: public boost::static_visitor<bool>
139
238
template <typename T, typename U>
140
bool operator()( const T &, const U & ) const
239
bool operator()(const T &, const U &) const
145
244
template <typename T>
146
bool operator()( T lhs,T rhs) const
245
bool operator()(T lhs, T rhs) const
148
247
return lhs < rhs;
158
257
return lhs < rhs;
161
bool operator()( std::wstring const& lhs,
162
std::wstring const& rhs ) const
260
bool operator()(UnicodeString const& lhs,
261
UnicodeString const& rhs ) const
263
return (lhs < rhs) ? true : false ;
266
bool operator() (value_null, value_null) const
169
273
: public boost::static_visitor<bool>
171
275
template <typename T, typename U>
172
bool operator()( const T &, const U & ) const
276
bool operator()(const T &, const U &) const
177
281
template <typename T>
178
bool operator()(T lhs, T rhs ) const
282
bool operator()(T lhs, T rhs) const
180
284
return lhs <= rhs;
190
294
return lhs <= rhs;
193
template <typename T>
194
bool operator()( std::wstring const& lhs,
195
std::wstring const& rhs ) const
297
bool operator()(UnicodeString const& lhs,
298
UnicodeString const& rhs ) const
300
return (lhs <= rhs) ? true : false ;
303
bool operator() (value_null, value_null) const
213
321
return lhs + rhs ;
216
value_type operator() (std::wstring const& lhs ,
217
std::wstring const& rhs ) const
324
value_type operator() (UnicodeString const& lhs ,
325
UnicodeString const& rhs ) const
219
327
return lhs + rhs;
245
353
return lhs - rhs ;
248
value_type operator() (std::wstring const& lhs,
249
std::wstring const& ) const
356
value_type operator() (UnicodeString const& lhs,
357
UnicodeString const& ) const
277
385
return lhs * rhs;
280
value_type operator() (std::wstring const& lhs,
281
std::wstring const& ) const
388
value_type operator() (UnicodeString const& lhs,
389
UnicodeString const& ) const
310
418
return lhs / rhs;
313
value_type operator() (std::wstring const& lhs,
314
std::wstring const&) const
319
value_type operator() (double lhs, int rhs) const
324
value_type operator() (int lhs, double rhs) const
421
value_type operator() (bool lhs, bool rhs ) const
423
boost::ignore_unused_variable_warning(lhs);
424
boost::ignore_unused_variable_warning(rhs);
428
value_type operator() (UnicodeString const& lhs,
429
UnicodeString const&) const
434
value_type operator() (double lhs, int rhs) const
439
value_type operator() (int lhs, double rhs) const
445
template <typename V>
446
struct mod: public boost::static_visitor<V>
448
typedef V value_type;
449
template <typename T1, typename T2>
450
value_type operator() (T1 const& lhs, T2 const&) const
455
template <typename T>
456
value_type operator() (T lhs, T rhs) const
461
value_type operator() (UnicodeString const& lhs,
462
UnicodeString const&) const
467
value_type operator() (bool lhs,
470
boost::ignore_unused_variable_warning(lhs);
471
boost::ignore_unused_variable_warning(rhs);
475
value_type operator() (double lhs, int rhs) const
477
return fmod(lhs, rhs);
480
value_type operator() (int lhs, double rhs) const
482
return fmod(lhs, rhs);
485
value_type operator() (double lhs, double rhs) const
487
return fmod(lhs, rhs);
491
struct to_bool : public boost::static_visitor<bool>
494
template <typename T>
495
bool operator() (T val) const
497
boost::ignore_unused_variable_warning(val);
498
throw config_error("Boolean value expected");
501
bool operator() (bool val) const
330
507
struct to_string : public boost::static_visitor<std::string>
340
517
// specializations
341
std::string operator() (std::wstring const& val) const
518
std::string operator() (UnicodeString const& val) const
343
std::stringstream ss;
344
std::wstring::const_iterator pos = val.begin();
346
for (;pos!=val.end();++pos)
356
unsigned c0 = (c >> 8) & 0xff;
364
525
std::string operator() (double val) const
367
528
ss << std::setprecision(16) << val;
532
std::string operator() (value_null const& val) const
534
boost::ignore_unused_variable_warning(val);
372
struct to_unicode : public boost::static_visitor<std::wstring>
539
struct to_unicode : public boost::static_visitor<UnicodeString>
375
542
template <typename T>
376
std::wstring operator() (T val) const
543
UnicodeString operator() (T val) const
378
std::basic_ostringstream<wchar_t> out;
545
std::basic_ostringstream<char> out;
547
return UnicodeString(out.str().c_str());
383
550
// specializations
384
std::wstring const& operator() (std::wstring const& val) const
551
UnicodeString const& operator() (UnicodeString const& val) const
389
std::wstring operator() (double val) const
556
UnicodeString operator() (double val) const
391
std::basic_ostringstream<wchar_t> out;
558
std::basic_ostringstream<char> out;
392
559
out << std::setprecision(16) << val;
560
return UnicodeString(out.str().c_str());
563
UnicodeString operator() (value_null const& val) const
565
boost::ignore_unused_variable_warning(val);
566
return UnicodeString("");
397
570
struct to_expression_string : public boost::static_visitor<std::string>
399
std::string operator() (std::wstring const& val) const
572
std::string operator() (UnicodeString const& val) const
401
std::stringstream ss;
402
std::wstring::const_iterator pos = val.begin();
404
for (;pos!=val.end();++pos)
414
unsigned c0 = (c >> 8) & 0xff;
419
return "\'" + ss.str() + "\'";
576
return "'" + utf8 + "'";
422
579
template <typename T>
443
606
friend const value operator-(value const&,value const&);
444
607
friend const value operator*(value const&,value const&);
445
608
friend const value operator/(value const&,value const&);
609
friend const value operator%(value const&,value const&);
613
: base_(value_null()) {}
451
615
template <typename T> value(T _val_)
452
616
: base_(_val_) {}
459
623
bool operator!=(value const& other) const
461
return !(boost::apply_visitor(impl::equals(),base_,other.base_));
625
return boost::apply_visitor(impl::not_equals(),base_,other.base_);
464
628
bool operator>(value const& other) const
496
665
return boost::apply_visitor(impl::to_string(),base_);
499
std::wstring to_unicode() const
668
UnicodeString to_unicode() const
501
670
return boost::apply_visitor(impl::to_unicode(),base_);
526
695
return value(boost::apply_visitor(impl::div<value>(),p1.base_, p2.base_));
698
inline const value operator%(value const& p1,value const& p2)
701
return value(boost::apply_visitor(impl::mod<value>(),p1.base_, p2.base_));
529
704
template <typename charT, typename traits>
530
705
inline std::basic_ostream<charT,traits>&
531
706
operator << (std::basic_ostream<charT,traits>& out,