| 135 | | shared_ptr<expression<FeatureT> > right = exprs_.top(); |
| 136 | | exprs_.pop(); |
| 137 | | shared_ptr<expression<FeatureT> > left = exprs_.top(); |
| 138 | | exprs_.pop(); |
| 139 | | if (left && right) |
| 140 | | { |
| 141 | | exprs_.push(shared_ptr<expression<FeatureT> > |
| 142 | | (new mapnik::math_expr_b<FeatureT,Op>(*left,*right))); |
| 143 | | } |
| 144 | | } |
| 145 | | } |
| 146 | | stack<shared_ptr<expression<FeatureT> > >& exprs_; |
| 147 | | }; |
| 148 | | |
| 149 | | template <typename FeatureT> |
| 150 | | struct compose_regex |
| 151 | | { |
| 152 | | compose_regex(stack<shared_ptr<filter<FeatureT> > >& filters, |
| 153 | | stack<shared_ptr<expression<FeatureT> > >& exprs) |
| 154 | | : filters_(filters),exprs_(exprs) {} |
| 155 | | |
| 156 | | template <typename Iter> |
| 157 | | void operator() (Iter start,Iter end) const |
| 158 | | { |
| 159 | | if (exprs_.size()>=1) |
| 160 | | { |
| 161 | | shared_ptr<expression<FeatureT> > exp = exprs_.top(); |
| 162 | | exprs_.pop(); |
| 163 | | if (exp) |
| 164 | | { |
| 165 | | std::string pattern(start,end); |
| 166 | | try |
| 167 | | { |
| 168 | | filters_.push(shared_ptr<filter<FeatureT> > |
| 169 | | (new regex_filter<FeatureT>(*exp,pattern))); |
| 170 | | } |
| 171 | | catch (...)//boost::regex_error& ex) |
| 172 | | { |
| 173 | | clog<<"error\n";//ex.what()<<"\n"; |
| 174 | | } |
| 175 | | |
| 176 | | } |
| 177 | | } |
| 178 | | } |
| 179 | | stack<shared_ptr<filter<FeatureT> > >& filters_; |
| 180 | | stack<shared_ptr<expression<FeatureT> > >& exprs_; |
| 181 | | }; |
| 182 | | |
| 183 | | |
| 184 | | template <typename FeatureT,typename Op> |
| 185 | | struct compose_filter |
| 186 | | { |
| 187 | | compose_filter(stack<shared_ptr<filter<FeatureT> > >& filters, |
| | 132 | shared_ptr<expression<FeatureT> > right = exprs_.top(); |
| | 133 | exprs_.pop(); |
| | 134 | shared_ptr<expression<FeatureT> > left = exprs_.top(); |
| | 135 | exprs_.pop(); |
| | 136 | if (left && right) |
| | 137 | { |
| | 138 | exprs_.push(shared_ptr<expression<FeatureT> > |
| | 139 | (new mapnik::math_expr_b<FeatureT,Op>(*left,*right))); |
| | 140 | } |
| | 141 | } |
| | 142 | } |
| | 143 | stack<shared_ptr<expression<FeatureT> > >& exprs_; |
| | 144 | }; |
| | 145 | |
| | 146 | template <typename FeatureT> |
| | 147 | struct compose_regex |
| | 148 | { |
| | 149 | compose_regex(stack<shared_ptr<filter<FeatureT> > >& filters, |
| 191 | | template <typename Iter> |
| 192 | | void operator() (Iter,Iter) const |
| 193 | | { |
| | 153 | template <typename Iter> |
| | 154 | void operator() (Iter start,Iter end) const |
| | 155 | { |
| | 156 | if (exprs_.size()>=1) |
| | 157 | { |
| | 158 | shared_ptr<expression<FeatureT> > exp = exprs_.top(); |
| | 159 | exprs_.pop(); |
| | 160 | if (exp) |
| | 161 | { |
| | 162 | std::string pattern(start,end); |
| | 163 | try |
| | 164 | { |
| | 165 | filters_.push(shared_ptr<filter<FeatureT> > |
| | 166 | (new regex_filter<FeatureT>(*exp,pattern))); |
| | 167 | } |
| | 168 | catch (...)//boost::regex_error& ex) |
| | 169 | { |
| | 170 | clog<<"error\n";//ex.what()<<"\n"; |
| | 171 | } |
| | 172 | |
| | 173 | } |
| | 174 | } |
| | 175 | } |
| | 176 | stack<shared_ptr<filter<FeatureT> > >& filters_; |
| | 177 | stack<shared_ptr<expression<FeatureT> > >& exprs_; |
| | 178 | }; |
| | 179 | |
| | 180 | |
| | 181 | template <typename FeatureT,typename Op> |
| | 182 | struct compose_filter |
| | 183 | { |
| | 184 | compose_filter(stack<shared_ptr<filter<FeatureT> > >& filters, |
| | 185 | stack<shared_ptr<expression<FeatureT> > >& exprs) |
| | 186 | : filters_(filters),exprs_(exprs) {} |
| | 187 | |
| | 188 | template <typename Iter> |
| | 189 | void operator() (Iter,Iter) const |
| | 190 | { |
| 196 | | shared_ptr<expression<FeatureT> > right = exprs_.top(); |
| 197 | | exprs_.pop(); |
| 198 | | shared_ptr<expression<FeatureT> > left = exprs_.top(); |
| 199 | | exprs_.pop(); |
| 200 | | if (left && right) |
| 201 | | { |
| 202 | | filters_.push(shared_ptr<filter<FeatureT> >(new compare_filter<FeatureT,Op>(*left,*right))); |
| 203 | | } |
| 204 | | } |
| 205 | | } |
| 206 | | stack<shared_ptr<filter<FeatureT> > >& filters_; |
| 207 | | stack<shared_ptr<expression<FeatureT> > >& exprs_; |
| 208 | | }; |
| 209 | | |
| 210 | | template <typename FeatureT> |
| 211 | | struct compose_and_filter |
| 212 | | { |
| 213 | | compose_and_filter(stack<shared_ptr<filter<FeatureT> > >& filters) |
| | 193 | shared_ptr<expression<FeatureT> > right = exprs_.top(); |
| | 194 | exprs_.pop(); |
| | 195 | shared_ptr<expression<FeatureT> > left = exprs_.top(); |
| | 196 | exprs_.pop(); |
| | 197 | if (left && right) |
| | 198 | { |
| | 199 | filters_.push(shared_ptr<filter<FeatureT> >(new compare_filter<FeatureT,Op>(*left,*right))); |
| | 200 | } |
| | 201 | } |
| | 202 | } |
| | 203 | stack<shared_ptr<filter<FeatureT> > >& filters_; |
| | 204 | stack<shared_ptr<expression<FeatureT> > >& exprs_; |
| | 205 | }; |
| | 206 | |
| | 207 | template <typename FeatureT> |
| | 208 | struct compose_and_filter |
| | 209 | { |
| | 210 | compose_and_filter(stack<shared_ptr<filter<FeatureT> > >& filters) |
| 246 | | shared_ptr<filter<FeatureT> > right = filters_.top(); |
| 247 | | filters_.pop(); |
| 248 | | shared_ptr<filter<FeatureT> > left = filters_.top(); |
| 249 | | filters_.pop(); |
| 250 | | if (left && right) |
| 251 | | { |
| 252 | | filters_.push(shared_ptr<filter<FeatureT> > |
| 253 | | (new logical_or<FeatureT>(*left,*right))); |
| 254 | | } |
| 255 | | } |
| 256 | | } |
| 257 | | stack<shared_ptr<filter<FeatureT> > >& filters_; |
| 258 | | }; |
| 259 | | |
| 260 | | template <typename FeatureT> |
| 261 | | struct compose_not_filter |
| 262 | | { |
| 263 | | compose_not_filter(stack<shared_ptr<filter<FeatureT> > >& filters) |
| | 243 | shared_ptr<filter<FeatureT> > right = filters_.top(); |
| | 244 | filters_.pop(); |
| | 245 | shared_ptr<filter<FeatureT> > left = filters_.top(); |
| | 246 | filters_.pop(); |
| | 247 | if (left && right) |
| | 248 | { |
| | 249 | filters_.push(shared_ptr<filter<FeatureT> > |
| | 250 | (new logical_or<FeatureT>(*left,*right))); |
| | 251 | } |
| | 252 | } |
| | 253 | } |
| | 254 | stack<shared_ptr<filter<FeatureT> > >& filters_; |
| | 255 | }; |
| | 256 | |
| | 257 | template <typename FeatureT> |
| | 258 | struct compose_not_filter |
| | 259 | { |
| | 260 | compose_not_filter(stack<shared_ptr<filter<FeatureT> > >& filters) |
| 271 | | shared_ptr<filter<FeatureT> > filter_ = filters_.top(); |
| 272 | | filters_.pop(); |
| 273 | | if (filter_) |
| 274 | | { |
| 275 | | filters_.push(shared_ptr<filter<FeatureT> >(new logical_not<FeatureT>(*filter_))); |
| 276 | | } |
| 277 | | } |
| 278 | | } |
| 279 | | stack<shared_ptr<filter<FeatureT> > >& filters_; |
| 280 | | }; |
| 281 | | |
| 282 | | template <typename FeatureT> |
| 283 | | struct filter_grammar : public grammar<filter_grammar<FeatureT> > |
| 284 | | { |
| 285 | | filter_grammar(stack<shared_ptr<filter<FeatureT> > >& filters_, |
| 286 | | stack<shared_ptr<expression<FeatureT> > >& exprs_) |
| 287 | | : filters(filters_),exprs(exprs_) {} |
| 288 | | |
| 289 | | template <typename ScannerT> |
| 290 | | struct definition |
| 291 | | { |
| 292 | | definition(filter_grammar const& self) |
| 293 | | { |
| 294 | | typedef boost::spirit::chset<wchar_t> chset_t; |
| 295 | | |
| 296 | | func1_op = "sqrt","sin","cos"; |
| 297 | | func2_op = "min","max"; |
| 298 | | spatial_op = "Equals","Disjoint","Touches","Within","Overlaps", |
| 299 | | "Crosses","Intersects","Contains","DWithin","Beyond","BBOX"; |
| 300 | | |
| 301 | | chset_t BaseChar (L"\x41-\x5A\x61-\x7A\xC0-\xD6\xD8-\xF6\xF8-\xFF\x100-\x131\x134-\x13E" |
| 302 | | L"\x141-\x148\x14A-\x17E\x180-\x1C3\x1CD-\x1F0\x1F4-\x1F5\x1FA-\x217" |
| 303 | | L"\x250-\x2A8\x2BB-\x2C1\x386\x388-\x38A\x38C\x38E-\x3A1\x3A3-\x3CE" |
| 304 | | L"\x3D0-\x3D6\x3DA\x3DC\x3DE\x3E0\x3E2-\x3F3\x401-\x40C\x40E-\x44F" |
| 305 | | L"\x451-\x45C\x45E-\x481\x490-\x4C4\x4C7-\x4C8\x4CB-\x4CC\x4D0-\x4EB" |
| 306 | | L"\x4EE-\x4F5\x4F8-\x4F9\x531-\x556\x559\x561-\x586\x5D0-\x5EA" |
| 307 | | L"\x5F0-\x5F2\x621-\x63A\x641-\x64A\x671-\x6B7\x6BA-\x6BE\x6C0-\x6CE" |
| 308 | | L"\x6D0-\x6D3\x6D5\x6E5-\x6E6\x905-\x939\x93D\x958-\x961\x985-\x98C" |
| 309 | | L"\x98F-\x990\x993-\x9A8\x9AA-\x9B0\x9B2\x9B6-\x9B9\x9DC-\x9DD" |
| 310 | | L"\x9DF-\x9E1\x9F0-\x9F1\xA05-\xA0A\xA0F-\xA10\xA13-\xA28\xA2A-\xA30" |
| 311 | | L"\xA32-\xA33\xA35-\xA36\xA38-\xA39\xA59-\xA5C\xA5E\xA72-\xA74" |
| 312 | | L"\xA85-\xA8B\xA8D\xA8F-\xA91\xA93-\xAA8\xAAA-\xAB0\xAB2-\xAB3" |
| 313 | | L"\xAB5-\xAB9\xABD\xAE0\xB05-\xB0C\xB0F-\xB10\xB13-\xB28\xB2A-\xB30" |
| 314 | | L"\xB32-\xB33\xB36-\xB39\xB3D\xB5C-\xB5D\xB5F-\xB61\xB85-\xB8A" |
| 315 | | L"\xB8E-\xB90\xB92-\xB95\xB99-\xB9A\xB9C\xB9E-\xB9F\xBA3-\xBA4" |
| 316 | | L"\xBA8-\xBAA\xBAE-\xBB5\xBB7-\xBB9\xC05-\xC0C\xC0E-\xC10\xC12-\xC28" |
| 317 | | L"\xC2A-\xC33\xC35-\xC39\xC60-\xC61\xC85-\xC8C\xC8E-\xC90\xC92-\xCA8" |
| 318 | | L"\xCAA-\xCB3\xCB5-\xCB9\xCDE\xCE0-\xCE1\xD05-\xD0C\xD0E-\xD10" |
| 319 | | L"\xD12-\xD28\xD2A-\xD39\xD60-\xD61\xE01-\xE2E\xE30\xE32-\xE33" |
| 320 | | L"\xE40-\xE45\xE81-\xE82\xE84\xE87-\xE88\xE8A\xE8D\xE94-\xE97" |
| 321 | | L"\xE99-\xE9F\xEA1-\xEA3\xEA5\xEA7\xEAA-\xEAB\xEAD-\xEAE\xEB0" |
| 322 | | L"\xEB2-\xEB3\xEBD\xEC0-\xEC4\xF40-\xF47\xF49-\xF69\x10A0-\x10C5" |
| 323 | | L"\x10D0-\x10F6\x1100\x1102-\x1103\x1105-\x1107\x1109\x110B-\x110C" |
| 324 | | L"\x110E-\x1112\x113C\x113E\x1140\x114C\x114E\x1150\x1154-\x1155" |
| 325 | | L"\x1159\x115F-\x1161\x1163\x1165\x1167\x1169\x116D-\x116E" |
| 326 | | L"\x1172-\x1173\x1175\x119E\x11A8\x11AB\x11AE-\x11AF\x11B7-\x11B8" |
| 327 | | L"\x11BA\x11BC-\x11C2\x11EB\x11F0\x11F9\x1E00-\x1E9B\x1EA0-\x1EF9" |
| 328 | | L"\x1F00-\x1F15\x1F18-\x1F1D\x1F20-\x1F45\x1F48-\x1F4D\x1F50-\x1F57" |
| 329 | | L"\x1F59\x1F5B\x1F5D\x1F5F-\x1F7D\x1F80-\x1FB4\x1FB6-\x1FBC\x1FBE" |
| 330 | | L"\x1FC2-\x1FC4\x1FC6-\x1FCC\x1FD0-\x1FD3\x1FD6-\x1FDB\x1FE0-\x1FEC" |
| 331 | | L"\x1FF2-\x1FF4\x1FF6-\x1FFC\x2126\x212A-\x212B\x212E\x2180-\x2182" |
| 332 | | L"\x3041-\x3094\x30A1-\x30FA\x3105-\x312C\xAC00-\xD7A3"); |
| | 268 | shared_ptr<filter<FeatureT> > filter_ = filters_.top(); |
| | 269 | filters_.pop(); |
| | 270 | if (filter_) |
| | 271 | { |
| | 272 | filters_.push(shared_ptr<filter<FeatureT> >(new logical_not<FeatureT>(*filter_))); |
| | 273 | } |
| | 274 | } |
| | 275 | } |
| | 276 | stack<shared_ptr<filter<FeatureT> > >& filters_; |
| | 277 | }; |
| | 278 | |
| | 279 | template <typename FeatureT> |
| | 280 | struct filter_grammar : public grammar<filter_grammar<FeatureT> > |
| | 281 | { |
| | 282 | filter_grammar(stack<shared_ptr<filter<FeatureT> > >& filters_, |
| | 283 | stack<shared_ptr<expression<FeatureT> > >& exprs_, |
| | 284 | transcoder const& tr_) |
| | 285 | : filters(filters_), |
| | 286 | exprs(exprs_), |
| | 287 | tr(tr_) {} |
| | 288 | |
| | 289 | template <typename ScannerT> |
| | 290 | struct definition |
| | 291 | { |
| | 292 | definition(filter_grammar const& self) |
| | 293 | { |
| | 294 | typedef boost::spirit::chset<wchar_t> chset_t; |
| | 295 | |
| | 296 | func1_op = "sqrt","sin","cos"; |
| | 297 | func2_op = "min","max"; |
| | 298 | spatial_op = "Equals","Disjoint","Touches","Within","Overlaps", |
| | 299 | "Crosses","Intersects","Contains","DWithin","Beyond","BBOX"; |
| | 300 | |
| | 301 | chset_t BaseChar (L"\x41-\x5A\x61-\x7A\xC0-\xD6\xD8-\xF6\xF8-\xFF\x100-\x131\x134-\x13E" |
| | 302 | L"\x141-\x148\x14A-\x17E\x180-\x1C3\x1CD-\x1F0\x1F4-\x1F5\x1FA-\x217" |
| | 303 | L"\x250-\x2A8\x2BB-\x2C1\x386\x388-\x38A\x38C\x38E-\x3A1\x3A3-\x3CE" |
| | 304 | L"\x3D0-\x3D6\x3DA\x3DC\x3DE\x3E0\x3E2-\x3F3\x401-\x40C\x40E-\x44F" |
| | 305 | L"\x451-\x45C\x45E-\x481\x490-\x4C4\x4C7-\x4C8\x4CB-\x4CC\x4D0-\x4EB" |
| | 306 | L"\x4EE-\x4F5\x4F8-\x4F9\x531-\x556\x559\x561-\x586\x5D0-\x5EA" |
| | 307 | L"\x5F0-\x5F2\x621-\x63A\x641-\x64A\x671-\x6B7\x6BA-\x6BE\x6C0-\x6CE" |
| | 308 | L"\x6D0-\x6D3\x6D5\x6E5-\x6E6\x905-\x939\x93D\x958-\x961\x985-\x98C" |
| | 309 | L"\x98F-\x990\x993-\x9A8\x9AA-\x9B0\x9B2\x9B6-\x9B9\x9DC-\x9DD" |
| | 310 | &n |