annotate DEPENDENCIES/generic/include/boost/geometry/index/detail/predicates.hpp @ 46:d572322e2efe

Fix to .cat file check (was susceptible to DOS line-endings) and subrepo update
author Chris Cannam
date Thu, 07 Aug 2014 14:39:38 +0100
parents 2665513ce2d3
children c530137014c0
rev   line source
Chris@16 1 // Boost.Geometry Index
Chris@16 2 //
Chris@16 3 // Spatial query predicates definition and checks.
Chris@16 4 //
Chris@16 5 // Copyright (c) 2011-2013 Adam Wulkiewicz, Lodz, Poland.
Chris@16 6 //
Chris@16 7 // Use, modification and distribution is subject to the Boost Software License,
Chris@16 8 // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
Chris@16 9 // http://www.boost.org/LICENSE_1_0.txt)
Chris@16 10
Chris@16 11 #ifndef BOOST_GEOMETRY_INDEX_DETAIL_PREDICATES_HPP
Chris@16 12 #define BOOST_GEOMETRY_INDEX_DETAIL_PREDICATES_HPP
Chris@16 13
Chris@16 14 #include <boost/geometry/index/predicates.hpp>
Chris@16 15 #include <boost/geometry/index/detail/tags.hpp>
Chris@16 16
Chris@16 17 namespace boost { namespace geometry { namespace index { namespace detail {
Chris@16 18
Chris@16 19 // ------------------------------------------------------------------ //
Chris@16 20 // predicates
Chris@16 21 // ------------------------------------------------------------------ //
Chris@16 22
Chris@16 23 template <typename Fun, bool IsFunction>
Chris@16 24 struct satisfies_impl
Chris@16 25 {
Chris@16 26 satisfies_impl(Fun f) : fun(f) {}
Chris@16 27 Fun * fun;
Chris@16 28 };
Chris@16 29
Chris@16 30 template <typename Fun>
Chris@16 31 struct satisfies_impl<Fun, false>
Chris@16 32 {
Chris@16 33 satisfies_impl(Fun const& f) : fun(f) {}
Chris@16 34 Fun fun;
Chris@16 35 };
Chris@16 36
Chris@16 37 template <typename Fun, bool Negated>
Chris@16 38 struct satisfies
Chris@16 39 : satisfies_impl<Fun, ::boost::is_function<Fun>::value>
Chris@16 40 {
Chris@16 41 typedef satisfies_impl<Fun, ::boost::is_function<Fun>::value> base;
Chris@16 42
Chris@16 43 satisfies(Fun const& f) : base(f) {}
Chris@16 44 satisfies(base const& b) : base(b) {}
Chris@16 45 };
Chris@16 46
Chris@16 47 // ------------------------------------------------------------------ //
Chris@16 48
Chris@16 49 struct contains_tag {};
Chris@16 50 struct covered_by_tag {};
Chris@16 51 struct covers_tag {};
Chris@16 52 struct disjoint_tag {};
Chris@16 53 struct intersects_tag {};
Chris@16 54 struct overlaps_tag {};
Chris@16 55 struct touches_tag {};
Chris@16 56 struct within_tag {};
Chris@16 57
Chris@16 58 template <typename Geometry, typename Tag, bool Negated>
Chris@16 59 struct spatial_predicate
Chris@16 60 {
Chris@16 61 spatial_predicate(Geometry const& g) : geometry(g) {}
Chris@16 62 Geometry geometry;
Chris@16 63 };
Chris@16 64
Chris@16 65 // ------------------------------------------------------------------ //
Chris@16 66
Chris@16 67 // TODO
Chris@16 68 // may be replaced by
Chris@16 69 // nearest_predicate<Geometry>
Chris@16 70 // Geometry geometry
Chris@16 71 // unsigned count
Chris@16 72 // + point_tag, path_tag
Chris@16 73
Chris@16 74 template <typename PointOrRelation>
Chris@16 75 struct nearest
Chris@16 76 {
Chris@16 77 nearest(PointOrRelation const& por, unsigned k)
Chris@16 78 : point_or_relation(por)
Chris@16 79 , count(k)
Chris@16 80 {}
Chris@16 81 PointOrRelation point_or_relation;
Chris@16 82 unsigned count;
Chris@16 83 };
Chris@16 84
Chris@16 85 template <typename SegmentOrLinestring>
Chris@16 86 struct path
Chris@16 87 {
Chris@16 88 path(SegmentOrLinestring const& g, unsigned k)
Chris@16 89 : geometry(g)
Chris@16 90 , count(k)
Chris@16 91 {}
Chris@16 92 SegmentOrLinestring geometry;
Chris@16 93 unsigned count;
Chris@16 94 };
Chris@16 95
Chris@16 96 // ------------------------------------------------------------------ //
Chris@16 97 // predicate_check
Chris@16 98 // ------------------------------------------------------------------ //
Chris@16 99
Chris@16 100 template <typename Predicate, typename Tag>
Chris@16 101 struct predicate_check
Chris@16 102 {
Chris@16 103 BOOST_MPL_ASSERT_MSG(
Chris@16 104 (false),
Chris@16 105 NOT_IMPLEMENTED_FOR_THIS_PREDICATE_OR_TAG,
Chris@16 106 (predicate_check));
Chris@16 107 };
Chris@16 108
Chris@16 109 // ------------------------------------------------------------------ //
Chris@16 110
Chris@16 111 template <typename Fun>
Chris@16 112 struct predicate_check<satisfies<Fun, false>, value_tag>
Chris@16 113 {
Chris@16 114 template <typename Value, typename Indexable>
Chris@16 115 static inline bool apply(satisfies<Fun, false> const& p, Value const& v, Indexable const&)
Chris@16 116 {
Chris@16 117 return p.fun(v);
Chris@16 118 }
Chris@16 119 };
Chris@16 120
Chris@16 121 template <typename Fun>
Chris@16 122 struct predicate_check<satisfies<Fun, true>, value_tag>
Chris@16 123 {
Chris@16 124 template <typename Value, typename Indexable>
Chris@16 125 static inline bool apply(satisfies<Fun, true> const& p, Value const& v, Indexable const&)
Chris@16 126 {
Chris@16 127 return !p.fun(v);
Chris@16 128 }
Chris@16 129 };
Chris@16 130
Chris@16 131 // ------------------------------------------------------------------ //
Chris@16 132
Chris@16 133 template <typename Tag>
Chris@16 134 struct spatial_predicate_call
Chris@16 135 {
Chris@16 136 BOOST_MPL_ASSERT_MSG(false, NOT_IMPLEMENTED_FOR_THIS_TAG, (Tag));
Chris@16 137 };
Chris@16 138
Chris@16 139 template <>
Chris@16 140 struct spatial_predicate_call<contains_tag>
Chris@16 141 {
Chris@16 142 template <typename G1, typename G2>
Chris@16 143 static inline bool apply(G1 const& g1, G2 const& g2)
Chris@16 144 {
Chris@16 145 return geometry::within(g2, g1);
Chris@16 146 }
Chris@16 147 };
Chris@16 148
Chris@16 149 template <>
Chris@16 150 struct spatial_predicate_call<covered_by_tag>
Chris@16 151 {
Chris@16 152 template <typename G1, typename G2>
Chris@16 153 static inline bool apply(G1 const& g1, G2 const& g2)
Chris@16 154 {
Chris@16 155 return geometry::covered_by(g1, g2);
Chris@16 156 }
Chris@16 157 };
Chris@16 158
Chris@16 159 template <>
Chris@16 160 struct spatial_predicate_call<covers_tag>
Chris@16 161 {
Chris@16 162 template <typename G1, typename G2>
Chris@16 163 static inline bool apply(G1 const& g1, G2 const& g2)
Chris@16 164 {
Chris@16 165 return geometry::covered_by(g2, g1);
Chris@16 166 }
Chris@16 167 };
Chris@16 168
Chris@16 169 template <>
Chris@16 170 struct spatial_predicate_call<disjoint_tag>
Chris@16 171 {
Chris@16 172 template <typename G1, typename G2>
Chris@16 173 static inline bool apply(G1 const& g1, G2 const& g2)
Chris@16 174 {
Chris@16 175 return geometry::disjoint(g1, g2);
Chris@16 176 }
Chris@16 177 };
Chris@16 178
Chris@16 179 template <>
Chris@16 180 struct spatial_predicate_call<intersects_tag>
Chris@16 181 {
Chris@16 182 template <typename G1, typename G2>
Chris@16 183 static inline bool apply(G1 const& g1, G2 const& g2)
Chris@16 184 {
Chris@16 185 return geometry::intersects(g1, g2);
Chris@16 186 }
Chris@16 187 };
Chris@16 188
Chris@16 189 template <>
Chris@16 190 struct spatial_predicate_call<overlaps_tag>
Chris@16 191 {
Chris@16 192 template <typename G1, typename G2>
Chris@16 193 static inline bool apply(G1 const& g1, G2 const& g2)
Chris@16 194 {
Chris@16 195 return geometry::overlaps(g1, g2);
Chris@16 196 }
Chris@16 197 };
Chris@16 198
Chris@16 199 template <>
Chris@16 200 struct spatial_predicate_call<touches_tag>
Chris@16 201 {
Chris@16 202 template <typename G1, typename G2>
Chris@16 203 static inline bool apply(G1 const& g1, G2 const& g2)
Chris@16 204 {
Chris@16 205 return geometry::touches(g1, g2);
Chris@16 206 }
Chris@16 207 };
Chris@16 208
Chris@16 209 template <>
Chris@16 210 struct spatial_predicate_call<within_tag>
Chris@16 211 {
Chris@16 212 template <typename G1, typename G2>
Chris@16 213 static inline bool apply(G1 const& g1, G2 const& g2)
Chris@16 214 {
Chris@16 215 return geometry::within(g1, g2);
Chris@16 216 }
Chris@16 217 };
Chris@16 218
Chris@16 219 // ------------------------------------------------------------------ //
Chris@16 220
Chris@16 221 // spatial predicate
Chris@16 222 template <typename Geometry, typename Tag>
Chris@16 223 struct predicate_check<spatial_predicate<Geometry, Tag, false>, value_tag>
Chris@16 224 {
Chris@16 225 typedef spatial_predicate<Geometry, Tag, false> Pred;
Chris@16 226
Chris@16 227 template <typename Value, typename Indexable>
Chris@16 228 static inline bool apply(Pred const& p, Value const&, Indexable const& i)
Chris@16 229 {
Chris@16 230 return spatial_predicate_call<Tag>::apply(i, p.geometry);
Chris@16 231 }
Chris@16 232 };
Chris@16 233
Chris@16 234 // negated spatial predicate
Chris@16 235 template <typename Geometry, typename Tag>
Chris@16 236 struct predicate_check<spatial_predicate<Geometry, Tag, true>, value_tag>
Chris@16 237 {
Chris@16 238 typedef spatial_predicate<Geometry, Tag, true> Pred;
Chris@16 239
Chris@16 240 template <typename Value, typename Indexable>
Chris@16 241 static inline bool apply(Pred const& p, Value const&, Indexable const& i)
Chris@16 242 {
Chris@16 243 return !spatial_predicate_call<Tag>::apply(i, p.geometry);
Chris@16 244 }
Chris@16 245 };
Chris@16 246
Chris@16 247 // ------------------------------------------------------------------ //
Chris@16 248
Chris@16 249 template <typename DistancePredicates>
Chris@16 250 struct predicate_check<nearest<DistancePredicates>, value_tag>
Chris@16 251 {
Chris@16 252 template <typename Value, typename Box>
Chris@16 253 static inline bool apply(nearest<DistancePredicates> const&, Value const&, Box const&)
Chris@16 254 {
Chris@16 255 return true;
Chris@16 256 }
Chris@16 257 };
Chris@16 258
Chris@16 259 template <typename Linestring>
Chris@16 260 struct predicate_check<path<Linestring>, value_tag>
Chris@16 261 {
Chris@16 262 template <typename Value, typename Box>
Chris@16 263 static inline bool apply(path<Linestring> const&, Value const&, Box const&)
Chris@16 264 {
Chris@16 265 return true;
Chris@16 266 }
Chris@16 267 };
Chris@16 268
Chris@16 269 // ------------------------------------------------------------------ //
Chris@16 270 // predicates_check for bounds
Chris@16 271 // ------------------------------------------------------------------ //
Chris@16 272
Chris@16 273 template <typename Fun, bool Negated>
Chris@16 274 struct predicate_check<satisfies<Fun, Negated>, bounds_tag>
Chris@16 275 {
Chris@16 276 template <typename Value, typename Box>
Chris@16 277 static bool apply(satisfies<Fun, Negated> const&, Value const&, Box const&)
Chris@16 278 {
Chris@16 279 return true;
Chris@16 280 }
Chris@16 281 };
Chris@16 282
Chris@16 283 // ------------------------------------------------------------------ //
Chris@16 284
Chris@16 285 // NOT NEGATED
Chris@16 286 // value_tag bounds_tag
Chris@16 287 // ---------------------------
Chris@16 288 // contains(I,G) contains(I,G)
Chris@16 289 // covered_by(I,G) intersects(I,G)
Chris@16 290 // covers(I,G) covers(I,G)
Chris@16 291 // disjoint(I,G) !covered_by(I,G)
Chris@16 292 // intersects(I,G) intersects(I,G)
Chris@16 293 // overlaps(I,G) intersects(I,G) - possibly change to the version without border case, e.g. intersects_without_border(0,0x1,1, 1,1x2,2) should give false
Chris@16 294 // touches(I,G) intersects(I,G)
Chris@16 295 // within(I,G) intersects(I,G) - possibly change to the version without border case, e.g. intersects_without_border(0,0x1,1, 1,1x2,2) should give false
Chris@16 296
Chris@16 297 // spatial predicate - default
Chris@16 298 template <typename Geometry, typename Tag>
Chris@16 299 struct predicate_check<spatial_predicate<Geometry, Tag, false>, bounds_tag>
Chris@16 300 {
Chris@16 301 typedef spatial_predicate<Geometry, Tag, false> Pred;
Chris@16 302
Chris@16 303 template <typename Value, typename Indexable>
Chris@16 304 static inline bool apply(Pred const& p, Value const&, Indexable const& i)
Chris@16 305 {
Chris@16 306 return spatial_predicate_call<intersects_tag>::apply(i, p.geometry);
Chris@16 307 }
Chris@16 308 };
Chris@16 309
Chris@16 310 // spatial predicate - contains
Chris@16 311 template <typename Geometry>
Chris@16 312 struct predicate_check<spatial_predicate<Geometry, contains_tag, false>, bounds_tag>
Chris@16 313 {
Chris@16 314 typedef spatial_predicate<Geometry, contains_tag, false> Pred;
Chris@16 315
Chris@16 316 template <typename Value, typename Indexable>
Chris@16 317 static inline bool apply(Pred const& p, Value const&, Indexable const& i)
Chris@16 318 {
Chris@16 319 return spatial_predicate_call<contains_tag>::apply(i, p.geometry);
Chris@16 320 }
Chris@16 321 };
Chris@16 322
Chris@16 323 // spatial predicate - covers
Chris@16 324 template <typename Geometry>
Chris@16 325 struct predicate_check<spatial_predicate<Geometry, covers_tag, false>, bounds_tag>
Chris@16 326 {
Chris@16 327 typedef spatial_predicate<Geometry, covers_tag, false> Pred;
Chris@16 328
Chris@16 329 template <typename Value, typename Indexable>
Chris@16 330 static inline bool apply(Pred const& p, Value const&, Indexable const& i)
Chris@16 331 {
Chris@16 332 return spatial_predicate_call<covers_tag>::apply(i, p.geometry);
Chris@16 333 }
Chris@16 334 };
Chris@16 335
Chris@16 336 // spatial predicate - disjoint
Chris@16 337 template <typename Geometry>
Chris@16 338 struct predicate_check<spatial_predicate<Geometry, disjoint_tag, false>, bounds_tag>
Chris@16 339 {
Chris@16 340 typedef spatial_predicate<Geometry, disjoint_tag, false> Pred;
Chris@16 341
Chris@16 342 template <typename Value, typename Indexable>
Chris@16 343 static inline bool apply(Pred const& p, Value const&, Indexable const& i)
Chris@16 344 {
Chris@16 345 return !spatial_predicate_call<covered_by_tag>::apply(i, p.geometry);
Chris@16 346 }
Chris@16 347 };
Chris@16 348
Chris@16 349 // NEGATED
Chris@16 350 // value_tag bounds_tag
Chris@16 351 // ---------------------------
Chris@16 352 // !contains(I,G) TRUE
Chris@16 353 // !covered_by(I,G) !covered_by(I,G)
Chris@16 354 // !covers(I,G) TRUE
Chris@16 355 // !disjoint(I,G) !disjoint(I,G)
Chris@16 356 // !intersects(I,G) !covered_by(I,G)
Chris@16 357 // !overlaps(I,G) TRUE
Chris@16 358 // !touches(I,G) !intersects(I,G)
Chris@16 359 // !within(I,G) !within(I,G)
Chris@16 360
Chris@16 361 // negated spatial predicate - default
Chris@16 362 template <typename Geometry, typename Tag>
Chris@16 363 struct predicate_check<spatial_predicate<Geometry, Tag, true>, bounds_tag>
Chris@16 364 {
Chris@16 365 typedef spatial_predicate<Geometry, Tag, true> Pred;
Chris@16 366
Chris@16 367 template <typename Value, typename Indexable>
Chris@16 368 static inline bool apply(Pred const& p, Value const&, Indexable const& i)
Chris@16 369 {
Chris@16 370 return !spatial_predicate_call<Tag>::apply(i, p.geometry);
Chris@16 371 }
Chris@16 372 };
Chris@16 373
Chris@16 374 // negated spatial predicate - contains
Chris@16 375 template <typename Geometry>
Chris@16 376 struct predicate_check<spatial_predicate<Geometry, contains_tag, true>, bounds_tag>
Chris@16 377 {
Chris@16 378 typedef spatial_predicate<Geometry, contains_tag, true> Pred;
Chris@16 379
Chris@16 380 template <typename Value, typename Indexable>
Chris@16 381 static inline bool apply(Pred const& , Value const&, Indexable const& )
Chris@16 382 {
Chris@16 383 return true;
Chris@16 384 }
Chris@16 385 };
Chris@16 386
Chris@16 387 // negated spatial predicate - covers
Chris@16 388 template <typename Geometry>
Chris@16 389 struct predicate_check<spatial_predicate<Geometry, covers_tag, true>, bounds_tag>
Chris@16 390 {
Chris@16 391 typedef spatial_predicate<Geometry, covers_tag, true> Pred;
Chris@16 392
Chris@16 393 template <typename Value, typename Indexable>
Chris@16 394 static inline bool apply(Pred const& , Value const&, Indexable const& )
Chris@16 395 {
Chris@16 396 return true;
Chris@16 397 }
Chris@16 398 };
Chris@16 399
Chris@16 400 // negated spatial predicate - intersects
Chris@16 401 template <typename Geometry>
Chris@16 402 struct predicate_check<spatial_predicate<Geometry, intersects_tag, true>, bounds_tag>
Chris@16 403 {
Chris@16 404 typedef spatial_predicate<Geometry, intersects_tag, true> Pred;
Chris@16 405
Chris@16 406 template <typename Value, typename Indexable>
Chris@16 407 static inline bool apply(Pred const& p, Value const&, Indexable const& i)
Chris@16 408 {
Chris@16 409 return !spatial_predicate_call<covered_by_tag>::apply(i, p.geometry);
Chris@16 410 }
Chris@16 411 };
Chris@16 412
Chris@16 413 // negated spatial predicate - overlaps
Chris@16 414 template <typename Geometry>
Chris@16 415 struct predicate_check<spatial_predicate<Geometry, overlaps_tag, true>, bounds_tag>
Chris@16 416 {
Chris@16 417 typedef spatial_predicate<Geometry, overlaps_tag, true> Pred;
Chris@16 418
Chris@16 419 template <typename Value, typename Indexable>
Chris@16 420 static inline bool apply(Pred const& , Value const&, Indexable const& )
Chris@16 421 {
Chris@16 422 return true;
Chris@16 423 }
Chris@16 424 };
Chris@16 425
Chris@16 426 // negated spatial predicate - touches
Chris@16 427 template <typename Geometry>
Chris@16 428 struct predicate_check<spatial_predicate<Geometry, touches_tag, true>, bounds_tag>
Chris@16 429 {
Chris@16 430 typedef spatial_predicate<Geometry, touches_tag, true> Pred;
Chris@16 431
Chris@16 432 template <typename Value, typename Indexable>
Chris@16 433 static inline bool apply(Pred const& p, Value const&, Indexable const& i)
Chris@16 434 {
Chris@16 435 return !spatial_predicate_call<intersects_tag>::apply(i, p.geometry);
Chris@16 436 }
Chris@16 437 };
Chris@16 438
Chris@16 439 // ------------------------------------------------------------------ //
Chris@16 440
Chris@16 441 template <typename DistancePredicates>
Chris@16 442 struct predicate_check<nearest<DistancePredicates>, bounds_tag>
Chris@16 443 {
Chris@16 444 template <typename Value, typename Box>
Chris@16 445 static inline bool apply(nearest<DistancePredicates> const&, Value const&, Box const&)
Chris@16 446 {
Chris@16 447 return true;
Chris@16 448 }
Chris@16 449 };
Chris@16 450
Chris@16 451 template <typename Linestring>
Chris@16 452 struct predicate_check<path<Linestring>, bounds_tag>
Chris@16 453 {
Chris@16 454 template <typename Value, typename Box>
Chris@16 455 static inline bool apply(path<Linestring> const&, Value const&, Box const&)
Chris@16 456 {
Chris@16 457 return true;
Chris@16 458 }
Chris@16 459 };
Chris@16 460
Chris@16 461 // ------------------------------------------------------------------ //
Chris@16 462 // predicates_length
Chris@16 463 // ------------------------------------------------------------------ //
Chris@16 464
Chris@16 465 template <typename T>
Chris@16 466 struct predicates_length
Chris@16 467 {
Chris@16 468 static const unsigned value = 1;
Chris@16 469 };
Chris@16 470
Chris@16 471 //template <typename F, typename S>
Chris@16 472 //struct predicates_length< std::pair<F, S> >
Chris@16 473 //{
Chris@16 474 // static const unsigned value = 2;
Chris@16 475 //};
Chris@16 476
Chris@16 477 //template <typename T0, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9>
Chris@16 478 //struct predicates_length< boost::tuple<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9> >
Chris@16 479 //{
Chris@16 480 // static const unsigned value = boost::tuples::length< boost::tuple<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9> >::value;
Chris@16 481 //};
Chris@16 482
Chris@16 483 template <typename Head, typename Tail>
Chris@16 484 struct predicates_length< boost::tuples::cons<Head, Tail> >
Chris@16 485 {
Chris@16 486 static const unsigned value = boost::tuples::length< boost::tuples::cons<Head, Tail> >::value;
Chris@16 487 };
Chris@16 488
Chris@16 489 // ------------------------------------------------------------------ //
Chris@16 490 // predicates_element
Chris@16 491 // ------------------------------------------------------------------ //
Chris@16 492
Chris@16 493 template <unsigned I, typename T>
Chris@16 494 struct predicates_element
Chris@16 495 {
Chris@16 496 BOOST_MPL_ASSERT_MSG((I < 1), INVALID_INDEX, (predicates_element));
Chris@16 497 typedef T type;
Chris@16 498 static type const& get(T const& p) { return p; }
Chris@16 499 };
Chris@16 500
Chris@16 501 //template <unsigned I, typename F, typename S>
Chris@16 502 //struct predicates_element< I, std::pair<F, S> >
Chris@16 503 //{
Chris@16 504 // BOOST_MPL_ASSERT_MSG((I < 2), INVALID_INDEX, (predicates_element));
Chris@16 505 //
Chris@16 506 // typedef F type;
Chris@16 507 // static type const& get(std::pair<F, S> const& p) { return p.first; }
Chris@16 508 //};
Chris@16 509 //
Chris@16 510 //template <typename F, typename S>
Chris@16 511 //struct predicates_element< 1, std::pair<F, S> >
Chris@16 512 //{
Chris@16 513 // typedef S type;
Chris@16 514 // static type const& get(std::pair<F, S> const& p) { return p.second; }
Chris@16 515 //};
Chris@16 516 //
Chris@16 517 //template <unsigned I, typename T0, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9>
Chris@16 518 //struct predicates_element< I, boost::tuple<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9> >
Chris@16 519 //{
Chris@16 520 // typedef boost::tuple<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9> predicate_type;
Chris@16 521 //
Chris@16 522 // typedef typename boost::tuples::element<I, predicate_type>::type type;
Chris@16 523 // static type const& get(predicate_type const& p) { return boost::get<I>(p); }
Chris@16 524 //};
Chris@16 525
Chris@16 526 template <unsigned I, typename Head, typename Tail>
Chris@16 527 struct predicates_element< I, boost::tuples::cons<Head, Tail> >
Chris@16 528 {
Chris@16 529 typedef boost::tuples::cons<Head, Tail> predicate_type;
Chris@16 530
Chris@16 531 typedef typename boost::tuples::element<I, predicate_type>::type type;
Chris@16 532 static type const& get(predicate_type const& p) { return boost::get<I>(p); }
Chris@16 533 };
Chris@16 534
Chris@16 535 // ------------------------------------------------------------------ //
Chris@16 536 // predicates_check
Chris@16 537 // ------------------------------------------------------------------ //
Chris@16 538
Chris@16 539 //template <typename PairPredicates, typename Tag, unsigned First, unsigned Last>
Chris@16 540 //struct predicates_check_pair {};
Chris@16 541 //
Chris@16 542 //template <typename PairPredicates, typename Tag, unsigned I>
Chris@16 543 //struct predicates_check_pair<PairPredicates, Tag, I, I>
Chris@16 544 //{
Chris@16 545 // template <typename Value, typename Indexable>
Chris@16 546 // static inline bool apply(PairPredicates const& , Value const& , Indexable const& )
Chris@16 547 // {
Chris@16 548 // return true;
Chris@16 549 // }
Chris@16 550 //};
Chris@16 551 //
Chris@16 552 //template <typename PairPredicates, typename Tag>
Chris@16 553 //struct predicates_check_pair<PairPredicates, Tag, 0, 1>
Chris@16 554 //{
Chris@16 555 // template <typename Value, typename Indexable>
Chris@16 556 // static inline bool apply(PairPredicates const& p, Value const& v, Indexable const& i)
Chris@16 557 // {
Chris@16 558 // return predicate_check<typename PairPredicates::first_type, Tag>::apply(p.first, v, i);
Chris@16 559 // }
Chris@16 560 //};
Chris@16 561 //
Chris@16 562 //template <typename PairPredicates, typename Tag>
Chris@16 563 //struct predicates_check_pair<PairPredicates, Tag, 1, 2>
Chris@16 564 //{
Chris@16 565 // template <typename Value, typename Indexable>
Chris@16 566 // static inline bool apply(PairPredicates const& p, Value const& v, Indexable const& i)
Chris@16 567 // {
Chris@16 568 // return predicate_check<typename PairPredicates::second_type, Tag>::apply(p.second, v, i);
Chris@16 569 // }
Chris@16 570 //};
Chris@16 571 //
Chris@16 572 //template <typename PairPredicates, typename Tag>
Chris@16 573 //struct predicates_check_pair<PairPredicates, Tag, 0, 2>
Chris@16 574 //{
Chris@16 575 // template <typename Value, typename Indexable>
Chris@16 576 // static inline bool apply(PairPredicates const& p, Value const& v, Indexable const& i)
Chris@16 577 // {
Chris@16 578 // return predicate_check<typename PairPredicates::first_type, Tag>::apply(p.first, v, i)
Chris@16 579 // && predicate_check<typename PairPredicates::second_type, Tag>::apply(p.second, v, i);
Chris@16 580 // }
Chris@16 581 //};
Chris@16 582
Chris@16 583 template <typename TuplePredicates, typename Tag, unsigned First, unsigned Last>
Chris@16 584 struct predicates_check_tuple
Chris@16 585 {
Chris@16 586 template <typename Value, typename Indexable>
Chris@16 587 static inline bool apply(TuplePredicates const& p, Value const& v, Indexable const& i)
Chris@16 588 {
Chris@16 589 return
Chris@16 590 predicate_check<
Chris@16 591 typename boost::tuples::element<First, TuplePredicates>::type,
Chris@16 592 Tag
Chris@16 593 >::apply(boost::get<First>(p), v, i) &&
Chris@16 594 predicates_check_tuple<TuplePredicates, Tag, First+1, Last>::apply(p, v, i);
Chris@16 595 }
Chris@16 596 };
Chris@16 597
Chris@16 598 template <typename TuplePredicates, typename Tag, unsigned First>
Chris@16 599 struct predicates_check_tuple<TuplePredicates, Tag, First, First>
Chris@16 600 {
Chris@16 601 template <typename Value, typename Indexable>
Chris@16 602 static inline bool apply(TuplePredicates const& , Value const& , Indexable const& )
Chris@16 603 {
Chris@16 604 return true;
Chris@16 605 }
Chris@16 606 };
Chris@16 607
Chris@16 608 template <typename Predicate, typename Tag, unsigned First, unsigned Last>
Chris@16 609 struct predicates_check_impl
Chris@16 610 {
Chris@16 611 static const bool check = First < 1 && Last <= 1 && First <= Last;
Chris@16 612 BOOST_MPL_ASSERT_MSG((check), INVALID_INDEXES, (predicates_check_impl));
Chris@16 613
Chris@16 614 template <typename Value, typename Indexable>
Chris@16 615 static inline bool apply(Predicate const& p, Value const& v, Indexable const& i)
Chris@16 616 {
Chris@16 617 return predicate_check<Predicate, Tag>::apply(p, v, i);
Chris@16 618 }
Chris@16 619 };
Chris@16 620
Chris@16 621 //template <typename Predicate1, typename Predicate2, typename Tag, size_t First, size_t Last>
Chris@16 622 //struct predicates_check_impl<std::pair<Predicate1, Predicate2>, Tag, First, Last>
Chris@16 623 //{
Chris@16 624 // BOOST_MPL_ASSERT_MSG((First < 2 && Last <= 2 && First <= Last), INVALID_INDEXES, (predicates_check_impl));
Chris@16 625 //
Chris@16 626 // template <typename Value, typename Indexable>
Chris@16 627 // static inline bool apply(std::pair<Predicate1, Predicate2> const& p, Value const& v, Indexable const& i)
Chris@16 628 // {
Chris@16 629 // return predicate_check<Predicate1, Tag>::apply(p.first, v, i)
Chris@16 630 // && predicate_check<Predicate2, Tag>::apply(p.second, v, i);
Chris@16 631 // }
Chris@16 632 //};
Chris@16 633 //
Chris@16 634 //template <
Chris@16 635 // typename T0, typename T1, typename T2, typename T3, typename T4,
Chris@16 636 // typename T5, typename T6, typename T7, typename T8, typename T9,
Chris@16 637 // typename Tag, unsigned First, unsigned Last
Chris@16 638 //>
Chris@16 639 //struct predicates_check_impl<
Chris@16 640 // boost::tuple<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9>,
Chris@16 641 // Tag, First, Last
Chris@16 642 //>
Chris@16 643 //{
Chris@16 644 // typedef boost::tuple<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9> predicates_type;
Chris@16 645 //
Chris@16 646 // static const unsigned pred_len = boost::tuples::length<predicates_type>::value;
Chris@16 647 // BOOST_MPL_ASSERT_MSG((First < pred_len && Last <= pred_len && First <= Last), INVALID_INDEXES, (predicates_check_impl));
Chris@16 648 //
Chris@16 649 // template <typename Value, typename Indexable>
Chris@16 650 // static inline bool apply(predicates_type const& p, Value const& v, Indexable const& i)
Chris@16 651 // {
Chris@16 652 // return predicates_check_tuple<
Chris@16 653 // predicates_type,
Chris@16 654 // Tag, First, Last
Chris@16 655 // >::apply(p, v, i);
Chris@16 656 // }
Chris@16 657 //};
Chris@16 658
Chris@16 659 template <typename Head, typename Tail, typename Tag, unsigned First, unsigned Last>
Chris@16 660 struct predicates_check_impl<
Chris@16 661 boost::tuples::cons<Head, Tail>,
Chris@16 662 Tag, First, Last
Chris@16 663 >
Chris@16 664 {
Chris@16 665 typedef boost::tuples::cons<Head, Tail> predicates_type;
Chris@16 666
Chris@16 667 static const unsigned pred_len = boost::tuples::length<predicates_type>::value;
Chris@16 668 static const bool check = First < pred_len && Last <= pred_len && First <= Last;
Chris@16 669 BOOST_MPL_ASSERT_MSG((check), INVALID_INDEXES, (predicates_check_impl));
Chris@16 670
Chris@16 671 template <typename Value, typename Indexable>
Chris@16 672 static inline bool apply(predicates_type const& p, Value const& v, Indexable const& i)
Chris@16 673 {
Chris@16 674 return predicates_check_tuple<
Chris@16 675 predicates_type,
Chris@16 676 Tag, First, Last
Chris@16 677 >::apply(p, v, i);
Chris@16 678 }
Chris@16 679 };
Chris@16 680
Chris@16 681 template <typename Tag, unsigned First, unsigned Last, typename Predicates, typename Value, typename Indexable>
Chris@16 682 inline bool predicates_check(Predicates const& p, Value const& v, Indexable const& i)
Chris@16 683 {
Chris@16 684 return detail::predicates_check_impl<Predicates, Tag, First, Last>
Chris@16 685 ::apply(p, v, i);
Chris@16 686 }
Chris@16 687
Chris@16 688 // ------------------------------------------------------------------ //
Chris@16 689 // nearest predicate helpers
Chris@16 690 // ------------------------------------------------------------------ //
Chris@16 691
Chris@16 692 // predicates_is_nearest
Chris@16 693
Chris@16 694 template <typename P>
Chris@16 695 struct predicates_is_distance
Chris@16 696 {
Chris@16 697 static const unsigned value = 0;
Chris@16 698 };
Chris@16 699
Chris@16 700 template <typename DistancePredicates>
Chris@16 701 struct predicates_is_distance< nearest<DistancePredicates> >
Chris@16 702 {
Chris@16 703 static const unsigned value = 1;
Chris@16 704 };
Chris@16 705
Chris@16 706 template <typename Linestring>
Chris@16 707 struct predicates_is_distance< path<Linestring> >
Chris@16 708 {
Chris@16 709 static const unsigned value = 1;
Chris@16 710 };
Chris@16 711
Chris@16 712 // predicates_count_nearest
Chris@16 713
Chris@16 714 template <typename T>
Chris@16 715 struct predicates_count_distance
Chris@16 716 {
Chris@16 717 static const unsigned value = predicates_is_distance<T>::value;
Chris@16 718 };
Chris@16 719
Chris@16 720 //template <typename F, typename S>
Chris@16 721 //struct predicates_count_distance< std::pair<F, S> >
Chris@16 722 //{
Chris@16 723 // static const unsigned value = predicates_is_distance<F>::value
Chris@16 724 // + predicates_is_distance<S>::value;
Chris@16 725 //};
Chris@16 726
Chris@16 727 template <typename Tuple, unsigned N>
Chris@16 728 struct predicates_count_distance_tuple
Chris@16 729 {
Chris@16 730 static const unsigned value =
Chris@16 731 predicates_is_distance<typename boost::tuples::element<N-1, Tuple>::type>::value
Chris@16 732 + predicates_count_distance_tuple<Tuple, N-1>::value;
Chris@16 733 };
Chris@16 734
Chris@16 735 template <typename Tuple>
Chris@16 736 struct predicates_count_distance_tuple<Tuple, 1>
Chris@16 737 {
Chris@16 738 static const unsigned value =
Chris@16 739 predicates_is_distance<typename boost::tuples::element<0, Tuple>::type>::value;
Chris@16 740 };
Chris@16 741
Chris@16 742 //template <typename T0, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9>
Chris@16 743 //struct predicates_count_distance< boost::tuple<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9> >
Chris@16 744 //{
Chris@16 745 // static const unsigned value = predicates_count_distance_tuple<
Chris@16 746 // boost::tuple<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9>,
Chris@16 747 // boost::tuples::length< boost::tuple<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9> >::value
Chris@16 748 // >::value;
Chris@16 749 //};
Chris@16 750
Chris@16 751 template <typename Head, typename Tail>
Chris@16 752 struct predicates_count_distance< boost::tuples::cons<Head, Tail> >
Chris@16 753 {
Chris@16 754 static const unsigned value = predicates_count_distance_tuple<
Chris@16 755 boost::tuples::cons<Head, Tail>,
Chris@16 756 boost::tuples::length< boost::tuples::cons<Head, Tail> >::value
Chris@16 757 >::value;
Chris@16 758 };
Chris@16 759
Chris@16 760 // predicates_find_nearest
Chris@16 761
Chris@16 762 template <typename T>
Chris@16 763 struct predicates_find_distance
Chris@16 764 {
Chris@16 765 static const unsigned value = predicates_is_distance<T>::value ? 0 : 1;
Chris@16 766 };
Chris@16 767
Chris@16 768 //template <typename F, typename S>
Chris@16 769 //struct predicates_find_distance< std::pair<F, S> >
Chris@16 770 //{
Chris@16 771 // static const unsigned value = predicates_is_distance<F>::value ? 0 :
Chris@16 772 // (predicates_is_distance<S>::value ? 1 : 2);
Chris@16 773 //};
Chris@16 774
Chris@16 775 template <typename Tuple, unsigned N>
Chris@16 776 struct predicates_find_distance_tuple
Chris@16 777 {
Chris@16 778 static const bool is_found = predicates_find_distance_tuple<Tuple, N-1>::is_found
Chris@16 779 || predicates_is_distance<typename boost::tuples::element<N-1, Tuple>::type>::value;
Chris@16 780
Chris@16 781 static const unsigned value = predicates_find_distance_tuple<Tuple, N-1>::is_found ?
Chris@16 782 predicates_find_distance_tuple<Tuple, N-1>::value :
Chris@16 783 (predicates_is_distance<typename boost::tuples::element<N-1, Tuple>::type>::value ?
Chris@16 784 N-1 : boost::tuples::length<Tuple>::value);
Chris@16 785 };
Chris@16 786
Chris@16 787 template <typename Tuple>
Chris@16 788 struct predicates_find_distance_tuple<Tuple, 1>
Chris@16 789 {
Chris@16 790 static const bool is_found = predicates_is_distance<typename boost::tuples::element<0, Tuple>::type>::value;
Chris@16 791 static const unsigned value = is_found ? 0 : boost::tuples::length<Tuple>::value;
Chris@16 792 };
Chris@16 793
Chris@16 794 //template <typename T0, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9>
Chris@16 795 //struct predicates_find_distance< boost::tuple<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9> >
Chris@16 796 //{
Chris@16 797 // static const unsigned value = predicates_find_distance_tuple<
Chris@16 798 // boost::tuple<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9>,
Chris@16 799 // boost::tuples::length< boost::tuple<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9> >::value
Chris@16 800 // >::value;
Chris@16 801 //};
Chris@16 802
Chris@16 803 template <typename Head, typename Tail>
Chris@16 804 struct predicates_find_distance< boost::tuples::cons<Head, Tail> >
Chris@16 805 {
Chris@16 806 static const unsigned value = predicates_find_distance_tuple<
Chris@16 807 boost::tuples::cons<Head, Tail>,
Chris@16 808 boost::tuples::length< boost::tuples::cons<Head, Tail> >::value
Chris@16 809 >::value;
Chris@16 810 };
Chris@16 811
Chris@16 812 }}}} // namespace boost::geometry::index::detail
Chris@16 813
Chris@16 814 #endif // BOOST_GEOMETRY_INDEX_DETAIL_PREDICATES_HPP