@sentryware/s2-node 0.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.circleci/config.yml +45 -0
- package/.dockerignore +1 -0
- package/.gitmodules +3 -0
- package/CHANGELOG.md +33 -0
- package/LICENSE +201 -0
- package/README.md +147 -0
- package/binding.gyp +170 -0
- package/docker/Dockerfile.node20.test +8 -0
- package/docker/Dockerfile.node22.test +8 -0
- package/docker/Dockerfile.node24.test +8 -0
- package/index.d.ts +117 -0
- package/index.js +6 -0
- package/jest.config.js +184 -0
- package/package.json +43 -0
- package/publish-linux.sh +18 -0
- package/publish-osx.sh +19 -0
- package/src/builder.cc +84 -0
- package/src/builder.h +29 -0
- package/src/cell.cc +71 -0
- package/src/cell.h +26 -0
- package/src/cell_id.cc +210 -0
- package/src/cell_id.h +44 -0
- package/src/cell_union.cc +237 -0
- package/src/cell_union.h +34 -0
- package/src/earth.cc +185 -0
- package/src/earth.h +33 -0
- package/src/latlng.cc +132 -0
- package/src/latlng.h +28 -0
- package/src/loop.cc +51 -0
- package/src/loop.h +21 -0
- package/src/point.cc +69 -0
- package/src/point.h +23 -0
- package/src/polygon.cc +36 -0
- package/src/polygon.h +20 -0
- package/src/polyline.cc +186 -0
- package/src/polyline.h +34 -0
- package/src/region_coverer.cc +450 -0
- package/src/region_coverer.h +56 -0
- package/src/s2.cc +27 -0
- package/test/Cell.test.js +37 -0
- package/test/CellId.test.js +135 -0
- package/test/CellUnion.test.js +150 -0
- package/test/Earth.test.js +62 -0
- package/test/LatLng.test.js +45 -0
- package/test/Point.test.js +14 -0
- package/test/Polyline.test.js +78 -0
- package/test/RegionCoverer.test.js +301 -0
- package/test.sh +16 -0
- package/third_party/s2geometry/.travis.yml +163 -0
- package/third_party/s2geometry/AUTHORS +13 -0
- package/third_party/s2geometry/CONTRIBUTING.md +65 -0
- package/third_party/s2geometry/CONTRIBUTORS +30 -0
- package/third_party/s2geometry/LICENSE +202 -0
- package/third_party/s2geometry/NOTICE +5 -0
- package/third_party/s2geometry/README.md +127 -0
- package/third_party/s2geometry/doc/examples/point_index.cc +44 -0
- package/third_party/s2geometry/doc/examples/term_index.cc +99 -0
- package/third_party/s2geometry/doc/examples/term_index.py +101 -0
- package/third_party/s2geometry/src/python/coder.i +125 -0
- package/third_party/s2geometry/src/python/pywraps2_test.py +786 -0
- package/third_party/s2geometry/src/python/s2.i +37 -0
- package/third_party/s2geometry/src/python/s2_common.i +756 -0
- package/third_party/s2geometry/src/s2/_fp_contract_off.h +60 -0
- package/third_party/s2geometry/src/s2/base/casts.h +318 -0
- package/third_party/s2geometry/src/s2/base/commandlineflags.h +67 -0
- package/third_party/s2geometry/src/s2/base/integral_types.h +31 -0
- package/third_party/s2geometry/src/s2/base/log_severity.h +40 -0
- package/third_party/s2geometry/src/s2/base/logging.h +173 -0
- package/third_party/s2geometry/src/s2/base/mutex.h +61 -0
- package/third_party/s2geometry/src/s2/base/port.h +999 -0
- package/third_party/s2geometry/src/s2/base/spinlock.h +60 -0
- package/third_party/s2geometry/src/s2/base/stringprintf.cc +107 -0
- package/third_party/s2geometry/src/s2/base/stringprintf.h +53 -0
- package/third_party/s2geometry/src/s2/base/strtoint.cc +65 -0
- package/third_party/s2geometry/src/s2/base/strtoint.h +106 -0
- package/third_party/s2geometry/src/s2/base/timer.h +50 -0
- package/third_party/s2geometry/src/s2/encoded_s2cell_id_vector.cc +164 -0
- package/third_party/s2geometry/src/s2/encoded_s2cell_id_vector.h +110 -0
- package/third_party/s2geometry/src/s2/encoded_s2cell_id_vector_test.cc +232 -0
- package/third_party/s2geometry/src/s2/encoded_s2point_vector.cc +838 -0
- package/third_party/s2geometry/src/s2/encoded_s2point_vector.h +140 -0
- package/third_party/s2geometry/src/s2/encoded_s2point_vector_test.cc +344 -0
- package/third_party/s2geometry/src/s2/encoded_s2shape_index.cc +181 -0
- package/third_party/s2geometry/src/s2/encoded_s2shape_index.h +276 -0
- package/third_party/s2geometry/src/s2/encoded_s2shape_index_test.cc +244 -0
- package/third_party/s2geometry/src/s2/encoded_string_vector.cc +66 -0
- package/third_party/s2geometry/src/s2/encoded_string_vector.h +164 -0
- package/third_party/s2geometry/src/s2/encoded_string_vector_test.cc +69 -0
- package/third_party/s2geometry/src/s2/encoded_uint_vector.h +299 -0
- package/third_party/s2geometry/src/s2/encoded_uint_vector_test.cc +124 -0
- package/third_party/s2geometry/src/s2/id_set_lexicon.cc +81 -0
- package/third_party/s2geometry/src/s2/id_set_lexicon.h +199 -0
- package/third_party/s2geometry/src/s2/id_set_lexicon_test.cc +70 -0
- package/third_party/s2geometry/src/s2/mutable_s2shape_index.cc +1585 -0
- package/third_party/s2geometry/src/s2/mutable_s2shape_index.h +600 -0
- package/third_party/s2geometry/src/s2/mutable_s2shape_index_test.cc +589 -0
- package/third_party/s2geometry/src/s2/r1interval.h +220 -0
- package/third_party/s2geometry/src/s2/r1interval_test.cc +185 -0
- package/third_party/s2geometry/src/s2/r2.h +26 -0
- package/third_party/s2geometry/src/s2/r2rect.cc +93 -0
- package/third_party/s2geometry/src/s2/r2rect.h +234 -0
- package/third_party/s2geometry/src/s2/r2rect_test.cc +228 -0
- package/third_party/s2geometry/src/s2/s1angle.cc +54 -0
- package/third_party/s2geometry/src/s2/s1angle.h +336 -0
- package/third_party/s2geometry/src/s2/s1angle_test.cc +185 -0
- package/third_party/s2geometry/src/s2/s1chord_angle.cc +159 -0
- package/third_party/s2geometry/src/s2/s1chord_angle.h +369 -0
- package/third_party/s2geometry/src/s2/s1chord_angle_test.cc +207 -0
- package/third_party/s2geometry/src/s2/s1interval.cc +296 -0
- package/third_party/s2geometry/src/s2/s1interval.h +266 -0
- package/third_party/s2geometry/src/s2/s1interval_test.cc +469 -0
- package/third_party/s2geometry/src/s2/s2boolean_operation.cc +2391 -0
- package/third_party/s2geometry/src/s2/s2boolean_operation.h +501 -0
- package/third_party/s2geometry/src/s2/s2boolean_operation_test.cc +1400 -0
- package/third_party/s2geometry/src/s2/s2builder.cc +1828 -0
- package/third_party/s2geometry/src/s2/s2builder.h +1057 -0
- package/third_party/s2geometry/src/s2/s2builder_graph.cc +1084 -0
- package/third_party/s2geometry/src/s2/s2builder_graph.h +799 -0
- package/third_party/s2geometry/src/s2/s2builder_graph_test.cc +462 -0
- package/third_party/s2geometry/src/s2/s2builder_layer.h +50 -0
- package/third_party/s2geometry/src/s2/s2builder_test.cc +1329 -0
- package/third_party/s2geometry/src/s2/s2builderutil_closed_set_normalizer.cc +313 -0
- package/third_party/s2geometry/src/s2/s2builderutil_closed_set_normalizer.h +221 -0
- package/third_party/s2geometry/src/s2/s2builderutil_closed_set_normalizer_test.cc +261 -0
- package/third_party/s2geometry/src/s2/s2builderutil_find_polygon_degeneracies.cc +392 -0
- package/third_party/s2geometry/src/s2/s2builderutil_find_polygon_degeneracies.h +86 -0
- package/third_party/s2geometry/src/s2/s2builderutil_find_polygon_degeneracies_test.cc +182 -0
- package/third_party/s2geometry/src/s2/s2builderutil_graph_shape.h +57 -0
- package/third_party/s2geometry/src/s2/s2builderutil_lax_polygon_layer.cc +212 -0
- package/third_party/s2geometry/src/s2/s2builderutil_lax_polygon_layer.h +218 -0
- package/third_party/s2geometry/src/s2/s2builderutil_lax_polygon_layer_test.cc +367 -0
- package/third_party/s2geometry/src/s2/s2builderutil_s2point_vector_layer.cc +74 -0
- package/third_party/s2geometry/src/s2/s2builderutil_s2point_vector_layer.h +122 -0
- package/third_party/s2geometry/src/s2/s2builderutil_s2point_vector_layer_test.cc +167 -0
- package/third_party/s2geometry/src/s2/s2builderutil_s2polygon_layer.cc +191 -0
- package/third_party/s2geometry/src/s2/s2builderutil_s2polygon_layer.h +211 -0
- package/third_party/s2geometry/src/s2/s2builderutil_s2polygon_layer_test.cc +312 -0
- package/third_party/s2geometry/src/s2/s2builderutil_s2polyline_layer.cc +105 -0
- package/third_party/s2geometry/src/s2/s2builderutil_s2polyline_layer.h +174 -0
- package/third_party/s2geometry/src/s2/s2builderutil_s2polyline_layer_test.cc +220 -0
- package/third_party/s2geometry/src/s2/s2builderutil_s2polyline_vector_layer.cc +98 -0
- package/third_party/s2geometry/src/s2/s2builderutil_s2polyline_vector_layer.h +292 -0
- package/third_party/s2geometry/src/s2/s2builderutil_s2polyline_vector_layer_test.cc +233 -0
- package/third_party/s2geometry/src/s2/s2builderutil_snap_functions.cc +354 -0
- package/third_party/s2geometry/src/s2/s2builderutil_snap_functions.h +239 -0
- package/third_party/s2geometry/src/s2/s2builderutil_snap_functions_test.cc +716 -0
- package/third_party/s2geometry/src/s2/s2builderutil_testing.cc +37 -0
- package/third_party/s2geometry/src/s2/s2builderutil_testing.h +100 -0
- package/third_party/s2geometry/src/s2/s2builderutil_testing_test.cc +85 -0
- package/third_party/s2geometry/src/s2/s2cap.cc +347 -0
- package/third_party/s2geometry/src/s2/s2cap.h +286 -0
- package/third_party/s2geometry/src/s2/s2cap_test.cc +379 -0
- package/third_party/s2geometry/src/s2/s2cell.cc +552 -0
- package/third_party/s2geometry/src/s2/s2cell.h +249 -0
- package/third_party/s2geometry/src/s2/s2cell_id.cc +619 -0
- package/third_party/s2geometry/src/s2/s2cell_id.h +705 -0
- package/third_party/s2geometry/src/s2/s2cell_id_test.cc +633 -0
- package/third_party/s2geometry/src/s2/s2cell_index.cc +149 -0
- package/third_party/s2geometry/src/s2/s2cell_index.h +660 -0
- package/third_party/s2geometry/src/s2/s2cell_index_test.cc +411 -0
- package/third_party/s2geometry/src/s2/s2cell_test.cc +687 -0
- package/third_party/s2geometry/src/s2/s2cell_union.cc +515 -0
- package/third_party/s2geometry/src/s2/s2cell_union.h +399 -0
- package/third_party/s2geometry/src/s2/s2cell_union_test.cc +598 -0
- package/third_party/s2geometry/src/s2/s2centroids.cc +84 -0
- package/third_party/s2geometry/src/s2/s2centroids.h +87 -0
- package/third_party/s2geometry/src/s2/s2centroids_test.cc +82 -0
- package/third_party/s2geometry/src/s2/s2closest_cell_query.cc +123 -0
- package/third_party/s2geometry/src/s2/s2closest_cell_query.h +385 -0
- package/third_party/s2geometry/src/s2/s2closest_cell_query_base.h +841 -0
- package/third_party/s2geometry/src/s2/s2closest_cell_query_base_test.cc +63 -0
- package/third_party/s2geometry/src/s2/s2closest_cell_query_test.cc +412 -0
- package/third_party/s2geometry/src/s2/s2closest_edge_query.cc +106 -0
- package/third_party/s2geometry/src/s2/s2closest_edge_query.h +421 -0
- package/third_party/s2geometry/src/s2/s2closest_edge_query_base.h +946 -0
- package/third_party/s2geometry/src/s2/s2closest_edge_query_base_test.cc +59 -0
- package/third_party/s2geometry/src/s2/s2closest_edge_query_test.cc +505 -0
- package/third_party/s2geometry/src/s2/s2closest_edge_query_testing.h +91 -0
- package/third_party/s2geometry/src/s2/s2closest_point_query.cc +66 -0
- package/third_party/s2geometry/src/s2/s2closest_point_query.h +465 -0
- package/third_party/s2geometry/src/s2/s2closest_point_query_base.h +767 -0
- package/third_party/s2geometry/src/s2/s2closest_point_query_base_test.cc +63 -0
- package/third_party/s2geometry/src/s2/s2closest_point_query_test.cc +312 -0
- package/third_party/s2geometry/src/s2/s2contains_point_query.h +328 -0
- package/third_party/s2geometry/src/s2/s2contains_point_query_test.cc +159 -0
- package/third_party/s2geometry/src/s2/s2contains_vertex_query.cc +39 -0
- package/third_party/s2geometry/src/s2/s2contains_vertex_query.h +66 -0
- package/third_party/s2geometry/src/s2/s2contains_vertex_query_test.cc +67 -0
- package/third_party/s2geometry/src/s2/s2convex_hull_query.cc +198 -0
- package/third_party/s2geometry/src/s2/s2convex_hull_query.h +110 -0
- package/third_party/s2geometry/src/s2/s2convex_hull_query_test.cc +208 -0
- package/third_party/s2geometry/src/s2/s2coords.cc +146 -0
- package/third_party/s2geometry/src/s2/s2coords.h +459 -0
- package/third_party/s2geometry/src/s2/s2coords_internal.h +71 -0
- package/third_party/s2geometry/src/s2/s2coords_test.cc +218 -0
- package/third_party/s2geometry/src/s2/s2crossing_edge_query.cc +380 -0
- package/third_party/s2geometry/src/s2/s2crossing_edge_query.h +220 -0
- package/third_party/s2geometry/src/s2/s2crossing_edge_query_test.cc +382 -0
- package/third_party/s2geometry/src/s2/s2debug.cc +23 -0
- package/third_party/s2geometry/src/s2/s2debug.h +69 -0
- package/third_party/s2geometry/src/s2/s2distance_target.h +165 -0
- package/third_party/s2geometry/src/s2/s2earth.cc +52 -0
- package/third_party/s2geometry/src/s2/s2earth.h +268 -0
- package/third_party/s2geometry/src/s2/s2earth_test.cc +146 -0
- package/third_party/s2geometry/src/s2/s2edge_clipping.cc +462 -0
- package/third_party/s2geometry/src/s2/s2edge_clipping.h +183 -0
- package/third_party/s2geometry/src/s2/s2edge_clipping_test.cc +335 -0
- package/third_party/s2geometry/src/s2/s2edge_crosser.cc +85 -0
- package/third_party/s2geometry/src/s2/s2edge_crosser.h +343 -0
- package/third_party/s2geometry/src/s2/s2edge_crosser_test.cc +264 -0
- package/third_party/s2geometry/src/s2/s2edge_crossings.cc +515 -0
- package/third_party/s2geometry/src/s2/s2edge_crossings.h +138 -0
- package/third_party/s2geometry/src/s2/s2edge_crossings_internal.h +59 -0
- package/third_party/s2geometry/src/s2/s2edge_crossings_test.cc +246 -0
- package/third_party/s2geometry/src/s2/s2edge_distances.cc +419 -0
- package/third_party/s2geometry/src/s2/s2edge_distances.h +192 -0
- package/third_party/s2geometry/src/s2/s2edge_distances_test.cc +539 -0
- package/third_party/s2geometry/src/s2/s2edge_tessellator.cc +276 -0
- package/third_party/s2geometry/src/s2/s2edge_tessellator.h +101 -0
- package/third_party/s2geometry/src/s2/s2edge_tessellator_test.cc +492 -0
- package/third_party/s2geometry/src/s2/s2edge_vector_shape.h +85 -0
- package/third_party/s2geometry/src/s2/s2edge_vector_shape_test.cc +66 -0
- package/third_party/s2geometry/src/s2/s2error.cc +29 -0
- package/third_party/s2geometry/src/s2/s2error.h +147 -0
- package/third_party/s2geometry/src/s2/s2error_test.cc +31 -0
- package/third_party/s2geometry/src/s2/s2furthest_edge_query.cc +117 -0
- package/third_party/s2geometry/src/s2/s2furthest_edge_query.h +439 -0
- package/third_party/s2geometry/src/s2/s2furthest_edge_query_test.cc +487 -0
- package/third_party/s2geometry/src/s2/s2latlng.cc +90 -0
- package/third_party/s2geometry/src/s2/s2latlng.h +234 -0
- package/third_party/s2geometry/src/s2/s2latlng_rect.cc +727 -0
- package/third_party/s2geometry/src/s2/s2latlng_rect.h +434 -0
- package/third_party/s2geometry/src/s2/s2latlng_rect_bounder.cc +344 -0
- package/third_party/s2geometry/src/s2/s2latlng_rect_bounder.h +89 -0
- package/third_party/s2geometry/src/s2/s2latlng_rect_bounder_test.cc +306 -0
- package/third_party/s2geometry/src/s2/s2latlng_rect_test.cc +1030 -0
- package/third_party/s2geometry/src/s2/s2latlng_test.cc +165 -0
- package/third_party/s2geometry/src/s2/s2lax_loop_shape.cc +104 -0
- package/third_party/s2geometry/src/s2/s2lax_loop_shape.h +153 -0
- package/third_party/s2geometry/src/s2/s2lax_loop_shape_test.cc +101 -0
- package/third_party/s2geometry/src/s2/s2lax_polygon_shape.cc +348 -0
- package/third_party/s2geometry/src/s2/s2lax_polygon_shape.h +183 -0
- package/third_party/s2geometry/src/s2/s2lax_polygon_shape_test.cc +234 -0
- package/third_party/s2geometry/src/s2/s2lax_polyline_shape.cc +118 -0
- package/third_party/s2geometry/src/s2/s2lax_polyline_shape.h +124 -0
- package/third_party/s2geometry/src/s2/s2lax_polyline_shape_test.cc +62 -0
- package/third_party/s2geometry/src/s2/s2loop.cc +1509 -0
- package/third_party/s2geometry/src/s2/s2loop.h +711 -0
- package/third_party/s2geometry/src/s2/s2loop_measures.cc +313 -0
- package/third_party/s2geometry/src/s2/s2loop_measures.h +280 -0
- package/third_party/s2geometry/src/s2/s2loop_measures_test.cc +367 -0
- package/third_party/s2geometry/src/s2/s2loop_test.cc +1371 -0
- package/third_party/s2geometry/src/s2/s2max_distance_targets.cc +265 -0
- package/third_party/s2geometry/src/s2/s2max_distance_targets.h +241 -0
- package/third_party/s2geometry/src/s2/s2max_distance_targets_test.cc +367 -0
- package/third_party/s2geometry/src/s2/s2measures.cc +128 -0
- package/third_party/s2geometry/src/s2/s2measures.h +78 -0
- package/third_party/s2geometry/src/s2/s2measures_test.cc +135 -0
- package/third_party/s2geometry/src/s2/s2metrics.cc +122 -0
- package/third_party/s2geometry/src/s2/s2metrics.h +199 -0
- package/third_party/s2geometry/src/s2/s2metrics_test.cc +127 -0
- package/third_party/s2geometry/src/s2/s2min_distance_targets.cc +295 -0
- package/third_party/s2geometry/src/s2/s2min_distance_targets.h +273 -0
- package/third_party/s2geometry/src/s2/s2min_distance_targets_test.cc +239 -0
- package/third_party/s2geometry/src/s2/s2padded_cell.cc +162 -0
- package/third_party/s2geometry/src/s2/s2padded_cell.h +108 -0
- package/third_party/s2geometry/src/s2/s2padded_cell_test.cc +138 -0
- package/third_party/s2geometry/src/s2/s2point.h +38 -0
- package/third_party/s2geometry/src/s2/s2point_compression.cc +388 -0
- package/third_party/s2geometry/src/s2/s2point_compression.h +78 -0
- package/third_party/s2geometry/src/s2/s2point_compression_test.cc +305 -0
- package/third_party/s2geometry/src/s2/s2point_index.h +345 -0
- package/third_party/s2geometry/src/s2/s2point_index_test.cc +147 -0
- package/third_party/s2geometry/src/s2/s2point_region.cc +72 -0
- package/third_party/s2geometry/src/s2/s2point_region.h +76 -0
- package/third_party/s2geometry/src/s2/s2point_region_test.cc +100 -0
- package/third_party/s2geometry/src/s2/s2point_span.h +57 -0
- package/third_party/s2geometry/src/s2/s2point_test.cc +47 -0
- package/third_party/s2geometry/src/s2/s2point_vector_shape.h +127 -0
- package/third_party/s2geometry/src/s2/s2point_vector_shape_test.cc +59 -0
- package/third_party/s2geometry/src/s2/s2pointutil.cc +131 -0
- package/third_party/s2geometry/src/s2/s2pointutil.h +138 -0
- package/third_party/s2geometry/src/s2/s2pointutil_test.cc +157 -0
- package/third_party/s2geometry/src/s2/s2polygon.cc +1569 -0
- package/third_party/s2geometry/src/s2/s2polygon.h +934 -0
- package/third_party/s2geometry/src/s2/s2polygon_test.cc +3025 -0
- package/third_party/s2geometry/src/s2/s2polyline.cc +645 -0
- package/third_party/s2geometry/src/s2/s2polyline.h +379 -0
- package/third_party/s2geometry/src/s2/s2polyline_alignment.cc +414 -0
- package/third_party/s2geometry/src/s2/s2polyline_alignment.h +245 -0
- package/third_party/s2geometry/src/s2/s2polyline_alignment_internal.h +158 -0
- package/third_party/s2geometry/src/s2/s2polyline_alignment_test.cc +610 -0
- package/third_party/s2geometry/src/s2/s2polyline_measures.cc +42 -0
- package/third_party/s2geometry/src/s2/s2polyline_measures.h +53 -0
- package/third_party/s2geometry/src/s2/s2polyline_measures_test.cc +57 -0
- package/third_party/s2geometry/src/s2/s2polyline_simplifier.cc +187 -0
- package/third_party/s2geometry/src/s2/s2polyline_simplifier.h +109 -0
- package/third_party/s2geometry/src/s2/s2polyline_simplifier_test.cc +165 -0
- package/third_party/s2geometry/src/s2/s2polyline_test.cc +554 -0
- package/third_party/s2geometry/src/s2/s2predicates.cc +1486 -0
- package/third_party/s2geometry/src/s2/s2predicates.h +282 -0
- package/third_party/s2geometry/src/s2/s2predicates_internal.h +135 -0
- package/third_party/s2geometry/src/s2/s2predicates_test.cc +1427 -0
- package/third_party/s2geometry/src/s2/s2projections.cc +109 -0
- package/third_party/s2geometry/src/s2/s2projections.h +161 -0
- package/third_party/s2geometry/src/s2/s2projections_test.cc +78 -0
- package/third_party/s2geometry/src/s2/s2r2rect.cc +88 -0
- package/third_party/s2geometry/src/s2/s2r2rect.h +292 -0
- package/third_party/s2geometry/src/s2/s2r2rect_test.cc +312 -0
- package/third_party/s2geometry/src/s2/s2region.cc +26 -0
- package/third_party/s2geometry/src/s2/s2region.h +142 -0
- package/third_party/s2geometry/src/s2/s2region_coverer.cc +514 -0
- package/third_party/s2geometry/src/s2/s2region_coverer.h +356 -0
- package/third_party/s2geometry/src/s2/s2region_coverer_test.cc +509 -0
- package/third_party/s2geometry/src/s2/s2region_intersection.cc +84 -0
- package/third_party/s2geometry/src/s2/s2region_intersection.h +79 -0
- package/third_party/s2geometry/src/s2/s2region_term_indexer.cc +270 -0
- package/third_party/s2geometry/src/s2/s2region_term_indexer.h +299 -0
- package/third_party/s2geometry/src/s2/s2region_term_indexer_test.cc +209 -0
- package/third_party/s2geometry/src/s2/s2region_test.cc +370 -0
- package/third_party/s2geometry/src/s2/s2region_union.cc +90 -0
- package/third_party/s2geometry/src/s2/s2region_union.h +83 -0
- package/third_party/s2geometry/src/s2/s2region_union_test.cc +89 -0
- package/third_party/s2geometry/src/s2/s2shape.h +283 -0
- package/third_party/s2geometry/src/s2/s2shape_index.cc +321 -0
- package/third_party/s2geometry/src/s2/s2shape_index.h +781 -0
- package/third_party/s2geometry/src/s2/s2shape_index_buffered_region.cc +113 -0
- package/third_party/s2geometry/src/s2/s2shape_index_buffered_region.h +135 -0
- package/third_party/s2geometry/src/s2/s2shape_index_buffered_region_test.cc +162 -0
- package/third_party/s2geometry/src/s2/s2shape_index_measures.cc +92 -0
- package/third_party/s2geometry/src/s2/s2shape_index_measures.h +100 -0
- package/third_party/s2geometry/src/s2/s2shape_index_measures_test.cc +136 -0
- package/third_party/s2geometry/src/s2/s2shape_index_region.h +350 -0
- package/third_party/s2geometry/src/s2/s2shape_index_region_test.cc +161 -0
- package/third_party/s2geometry/src/s2/s2shape_index_test.cc +24 -0
- package/third_party/s2geometry/src/s2/s2shape_measures.cc +138 -0
- package/third_party/s2geometry/src/s2/s2shape_measures.h +95 -0
- package/third_party/s2geometry/src/s2/s2shape_measures_test.cc +139 -0
- package/third_party/s2geometry/src/s2/s2shapeutil_build_polygon_boundaries.cc +120 -0
- package/third_party/s2geometry/src/s2/s2shapeutil_build_polygon_boundaries.h +66 -0
- package/third_party/s2geometry/src/s2/s2shapeutil_build_polygon_boundaries_test.cc +170 -0
- package/third_party/s2geometry/src/s2/s2shapeutil_coding.cc +253 -0
- package/third_party/s2geometry/src/s2/s2shapeutil_coding.h +283 -0
- package/third_party/s2geometry/src/s2/s2shapeutil_coding_test.cc +54 -0
- package/third_party/s2geometry/src/s2/s2shapeutil_contains_brute_force.cc +40 -0
- package/third_party/s2geometry/src/s2/s2shapeutil_contains_brute_force.h +41 -0
- package/third_party/s2geometry/src/s2/s2shapeutil_contains_brute_force_test.cc +55 -0
- package/third_party/s2geometry/src/s2/s2shapeutil_count_edges.h +57 -0
- package/third_party/s2geometry/src/s2/s2shapeutil_count_edges_test.cc +43 -0
- package/third_party/s2geometry/src/s2/s2shapeutil_edge_iterator.cc +45 -0
- package/third_party/s2geometry/src/s2/s2shapeutil_edge_iterator.h +72 -0
- package/third_party/s2geometry/src/s2/s2shapeutil_edge_iterator_test.cc +116 -0
- package/third_party/s2geometry/src/s2/s2shapeutil_get_reference_point.cc +107 -0
- package/third_party/s2geometry/src/s2/s2shapeutil_get_reference_point.h +48 -0
- package/third_party/s2geometry/src/s2/s2shapeutil_get_reference_point_test.cc +104 -0
- package/third_party/s2geometry/src/s2/s2shapeutil_range_iterator.cc +58 -0
- package/third_party/s2geometry/src/s2/s2shapeutil_range_iterator.h +65 -0
- package/third_party/s2geometry/src/s2/s2shapeutil_range_iterator_test.cc +61 -0
- package/third_party/s2geometry/src/s2/s2shapeutil_shape_edge.h +58 -0
- package/third_party/s2geometry/src/s2/s2shapeutil_shape_edge_id.h +97 -0
- package/third_party/s2geometry/src/s2/s2shapeutil_testing.cc +104 -0
- package/third_party/s2geometry/src/s2/s2shapeutil_testing.h +36 -0
- package/third_party/s2geometry/src/s2/s2shapeutil_visit_crossing_edge_pairs.cc +440 -0
- package/third_party/s2geometry/src/s2/s2shapeutil_visit_crossing_edge_pairs.h +72 -0
- package/third_party/s2geometry/src/s2/s2shapeutil_visit_crossing_edge_pairs_test.cc +184 -0
- package/third_party/s2geometry/src/s2/s2testing.cc +464 -0
- package/third_party/s2geometry/src/s2/s2testing.h +385 -0
- package/third_party/s2geometry/src/s2/s2testing_test.cc +166 -0
- package/third_party/s2geometry/src/s2/s2text_format.cc +506 -0
- package/third_party/s2geometry/src/s2/s2text_format.h +289 -0
- package/third_party/s2geometry/src/s2/s2text_format_test.cc +417 -0
- package/third_party/s2geometry/src/s2/s2wedge_relations.cc +80 -0
- package/third_party/s2geometry/src/s2/s2wedge_relations.h +64 -0
- package/third_party/s2geometry/src/s2/s2wedge_relations_test.cc +89 -0
- package/third_party/s2geometry/src/s2/sequence_lexicon.h +296 -0
- package/third_party/s2geometry/src/s2/sequence_lexicon_test.cc +113 -0
- package/third_party/s2geometry/src/s2/strings/ostringstream.cc +35 -0
- package/third_party/s2geometry/src/s2/strings/ostringstream.h +105 -0
- package/third_party/s2geometry/src/s2/strings/serialize.cc +46 -0
- package/third_party/s2geometry/src/s2/strings/serialize.h +40 -0
- package/third_party/s2geometry/src/s2/third_party/absl/algorithm/algorithm.h +187 -0
- package/third_party/s2geometry/src/s2/third_party/absl/base/attributes.h +666 -0
- package/third_party/s2geometry/src/s2/third_party/absl/base/casts.h +189 -0
- package/third_party/s2geometry/src/s2/third_party/absl/base/config.h +462 -0
- package/third_party/s2geometry/src/s2/third_party/absl/base/dynamic_annotations.cc +129 -0
- package/third_party/s2geometry/src/s2/third_party/absl/base/dynamic_annotations.h +394 -0
- package/third_party/s2geometry/src/s2/third_party/absl/base/internal/atomic_hook.h +168 -0
- package/third_party/s2geometry/src/s2/third_party/absl/base/internal/identity.h +33 -0
- package/third_party/s2geometry/src/s2/third_party/absl/base/internal/inline_variable.h +117 -0
- package/third_party/s2geometry/src/s2/third_party/absl/base/internal/invoke.h +188 -0
- package/third_party/s2geometry/src/s2/third_party/absl/base/internal/raw_logging.cc +254 -0
- package/third_party/s2geometry/src/s2/third_party/absl/base/internal/raw_logging.h +205 -0
- package/third_party/s2geometry/src/s2/third_party/absl/base/internal/throw_delegate.cc +106 -0
- package/third_party/s2geometry/src/s2/third_party/absl/base/internal/throw_delegate.h +71 -0
- package/third_party/s2geometry/src/s2/third_party/absl/base/internal/unaligned_access.h +322 -0
- package/third_party/s2geometry/src/s2/third_party/absl/base/log_severity.h +77 -0
- package/third_party/s2geometry/src/s2/third_party/absl/base/macros.h +236 -0
- package/third_party/s2geometry/src/s2/third_party/absl/base/optimization.h +177 -0
- package/third_party/s2geometry/src/s2/third_party/absl/base/policy_checks.h +124 -0
- package/third_party/s2geometry/src/s2/third_party/absl/base/port.h +97 -0
- package/third_party/s2geometry/src/s2/third_party/absl/base/thread_annotations.h +277 -0
- package/third_party/s2geometry/src/s2/third_party/absl/container/fixed_array.h +523 -0
- package/third_party/s2geometry/src/s2/third_party/absl/container/inlined_vector.h +1453 -0
- package/third_party/s2geometry/src/s2/third_party/absl/container/internal/compressed_tuple.h +191 -0
- package/third_party/s2geometry/src/s2/third_party/absl/container/internal/container_memory.h +424 -0
- package/third_party/s2geometry/src/s2/third_party/absl/container/internal/layout.h +739 -0
- package/third_party/s2geometry/src/s2/third_party/absl/memory/memory.h +755 -0
- package/third_party/s2geometry/src/s2/third_party/absl/meta/type_traits.h +436 -0
- package/third_party/s2geometry/src/s2/third_party/absl/numeric/int128.cc +232 -0
- package/third_party/s2geometry/src/s2/third_party/absl/numeric/int128.h +656 -0
- package/third_party/s2geometry/src/s2/third_party/absl/numeric/int128_have_intrinsic.inc +3 -0
- package/third_party/s2geometry/src/s2/third_party/absl/numeric/int128_no_intrinsic.inc +3 -0
- package/third_party/s2geometry/src/s2/third_party/absl/strings/ascii.cc +198 -0
- package/third_party/s2geometry/src/s2/third_party/absl/strings/ascii.h +239 -0
- package/third_party/s2geometry/src/s2/third_party/absl/strings/ascii_ctype.h +66 -0
- package/third_party/s2geometry/src/s2/third_party/absl/strings/internal/bits.h +53 -0
- package/third_party/s2geometry/src/s2/third_party/absl/strings/internal/memutil.cc +110 -0
- package/third_party/s2geometry/src/s2/third_party/absl/strings/internal/memutil.h +146 -0
- package/third_party/s2geometry/src/s2/third_party/absl/strings/internal/resize_uninitialized.h +72 -0
- package/third_party/s2geometry/src/s2/third_party/absl/strings/match.cc +38 -0
- package/third_party/s2geometry/src/s2/third_party/absl/strings/match.h +89 -0
- package/third_party/s2geometry/src/s2/third_party/absl/strings/numbers.cc +909 -0
- package/third_party/s2geometry/src/s2/third_party/absl/strings/numbers.h +187 -0
- package/third_party/s2geometry/src/s2/third_party/absl/strings/str_cat.cc +240 -0
- package/third_party/s2geometry/src/s2/third_party/absl/strings/str_cat.h +398 -0
- package/third_party/s2geometry/src/s2/third_party/absl/strings/str_join.h +22 -0
- package/third_party/s2geometry/src/s2/third_party/absl/strings/str_split.cc +47 -0
- package/third_party/s2geometry/src/s2/third_party/absl/strings/str_split.h +43 -0
- package/third_party/s2geometry/src/s2/third_party/absl/strings/string_view.cc +245 -0
- package/third_party/s2geometry/src/s2/third_party/absl/strings/string_view.h +602 -0
- package/third_party/s2geometry/src/s2/third_party/absl/strings/strip.cc +42 -0
- package/third_party/s2geometry/src/s2/third_party/absl/strings/strip.h +130 -0
- package/third_party/s2geometry/src/s2/third_party/absl/types/span.h +793 -0
- package/third_party/s2geometry/src/s2/third_party/absl/utility/utility.h +299 -0
- package/third_party/s2geometry/src/s2/util/bits/bit-interleave.cc +274 -0
- package/third_party/s2geometry/src/s2/util/bits/bit-interleave.h +53 -0
- package/third_party/s2geometry/src/s2/util/bits/bits.cc +155 -0
- package/third_party/s2geometry/src/s2/util/bits/bits.h +745 -0
- package/third_party/s2geometry/src/s2/util/coding/coder.cc +83 -0
- package/third_party/s2geometry/src/s2/util/coding/coder.h +553 -0
- package/third_party/s2geometry/src/s2/util/coding/nth-derivative.h +134 -0
- package/third_party/s2geometry/src/s2/util/coding/transforms.h +62 -0
- package/third_party/s2geometry/src/s2/util/coding/varint.cc +289 -0
- package/third_party/s2geometry/src/s2/util/coding/varint.h +476 -0
- package/third_party/s2geometry/src/s2/util/endian/endian.h +859 -0
- package/third_party/s2geometry/src/s2/util/gtl/btree.h +2471 -0
- package/third_party/s2geometry/src/s2/util/gtl/btree_container.h +411 -0
- package/third_party/s2geometry/src/s2/util/gtl/btree_map.h +79 -0
- package/third_party/s2geometry/src/s2/util/gtl/btree_set.h +73 -0
- package/third_party/s2geometry/src/s2/util/gtl/compact_array.h +653 -0
- package/third_party/s2geometry/src/s2/util/gtl/container_logging.h +291 -0
- package/third_party/s2geometry/src/s2/util/gtl/dense_hash_set.h +358 -0
- package/third_party/s2geometry/src/s2/util/gtl/densehashtable.h +1493 -0
- package/third_party/s2geometry/src/s2/util/gtl/hashtable_common.h +253 -0
- package/third_party/s2geometry/src/s2/util/gtl/layout.h +28 -0
- package/third_party/s2geometry/src/s2/util/gtl/legacy_random_shuffle.h +77 -0
- package/third_party/s2geometry/src/s2/util/hash/mix.h +76 -0
- package/third_party/s2geometry/src/s2/util/math/exactfloat/exactfloat.cc +832 -0
- package/third_party/s2geometry/src/s2/util/math/exactfloat/exactfloat.h +646 -0
- package/third_party/s2geometry/src/s2/util/math/mathutil.cc +75 -0
- package/third_party/s2geometry/src/s2/util/math/mathutil.h +189 -0
- package/third_party/s2geometry/src/s2/util/math/matrix3x3.h +574 -0
- package/third_party/s2geometry/src/s2/util/math/vector.h +569 -0
- package/third_party/s2geometry/src/s2/util/math/vector3_hash.h +54 -0
- package/third_party/s2geometry/src/s2/util/units/length-units.cc +21 -0
- package/third_party/s2geometry/src/s2/util/units/length-units.h +135 -0
- package/third_party/s2geometry/src/s2/util/units/physical-units.h +313 -0
- package/third_party/s2geometry/src/s2/value_lexicon.h +234 -0
- package/third_party/s2geometry/src/s2/value_lexicon_test.cc +121 -0
- package/third_party/s2geometry/third_party/cmake/FindGFlags.cmake +48 -0
- package/third_party/s2geometry/third_party/cmake/FindGlog.cmake +48 -0
|
@@ -0,0 +1,660 @@
|
|
|
1
|
+
// Copyright 2018 Google Inc. All Rights Reserved.
|
|
2
|
+
//
|
|
3
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
// you may not use this file except in compliance with the License.
|
|
5
|
+
// You may obtain a copy of the License at
|
|
6
|
+
//
|
|
7
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
//
|
|
9
|
+
// Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
// distributed under the License is distributed on an "AS-IS" BASIS,
|
|
11
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
// See the License for the specific language governing permissions and
|
|
13
|
+
// limitations under the License.
|
|
14
|
+
//
|
|
15
|
+
|
|
16
|
+
// Author: ericv@google.com (Eric Veach)
|
|
17
|
+
|
|
18
|
+
#ifndef S2_S2CELL_INDEX_H_
|
|
19
|
+
#define S2_S2CELL_INDEX_H_
|
|
20
|
+
|
|
21
|
+
#include <vector>
|
|
22
|
+
#include "s2/base/integral_types.h"
|
|
23
|
+
#include "s2/base/logging.h"
|
|
24
|
+
#include "s2/s2cell_id.h"
|
|
25
|
+
#include "s2/s2cell_union.h"
|
|
26
|
+
|
|
27
|
+
// S2CellIndex stores a collection of (cell_id, label) pairs. The S2CellIds
|
|
28
|
+
// may be overlapping or contain duplicate values. For example, an
|
|
29
|
+
// S2CellIndex could store a collection of S2CellUnions, where each
|
|
30
|
+
// S2CellUnion has its own label.
|
|
31
|
+
//
|
|
32
|
+
// Labels are 32-bit non-negative integers, and are typically used to map the
|
|
33
|
+
// results of queries back to client data structures. Labels other than
|
|
34
|
+
// integers can be supported by using a ValueLexicon, which maintains a set of
|
|
35
|
+
// distinct labels and maps them to sequentially numbered integers. For
|
|
36
|
+
// example, the following code uses strings as labels:
|
|
37
|
+
//
|
|
38
|
+
// ValueLexicon<string> my_label_lexicon;
|
|
39
|
+
// string label_str = ...;
|
|
40
|
+
// cell_index.Add(cell_id, my_label_lexicon.Add(label_str));
|
|
41
|
+
// ...
|
|
42
|
+
// int32 label = ...;
|
|
43
|
+
// string label_str = my_label_lexicon.value(label);
|
|
44
|
+
//
|
|
45
|
+
// To build an S2CellIndex, call Add() for each (cell_id, label) pair, and
|
|
46
|
+
// then call the Build() method. For example:
|
|
47
|
+
//
|
|
48
|
+
// vector<S2CellId> contents = ...;
|
|
49
|
+
// for (int i = 0; i < contents.size(); ++i) {
|
|
50
|
+
// index.Add(contents[i], i /*label*/);
|
|
51
|
+
// }
|
|
52
|
+
// index.Build();
|
|
53
|
+
//
|
|
54
|
+
// There is also a convenience method that adds an S2CellUnion:
|
|
55
|
+
//
|
|
56
|
+
// index.Add(cell_union, label);
|
|
57
|
+
//
|
|
58
|
+
// Note that the index is not dynamic; the contents of the index cannot be
|
|
59
|
+
// changed once it has been built.
|
|
60
|
+
//
|
|
61
|
+
// There are several options for retrieving data from the index. The simplest
|
|
62
|
+
// is to use a built-in method such as GetIntersectingLabels (which returns
|
|
63
|
+
// the labels of all cells that intersect a given target S2CellUnion):
|
|
64
|
+
//
|
|
65
|
+
// vector<Label> labels = index.GetIntersectingLabels(target_union);
|
|
66
|
+
//
|
|
67
|
+
// Alternatively, you can use an external class such as S2ClosestCellQuery,
|
|
68
|
+
// which computes the cell(s) that are closest to a given target geometry.
|
|
69
|
+
// For example, here is how to find all cells that are closer than
|
|
70
|
+
// "distance_limit" to a given target point:
|
|
71
|
+
//
|
|
72
|
+
// S2ClosestCellQuery query(&index);
|
|
73
|
+
// query.mutable_options()->set_max_distance(distance_limit);
|
|
74
|
+
// S2ClosestCellQuery::PointTarget target(target_point);
|
|
75
|
+
// for (const auto& result : query.FindClosestCells(&target)) {
|
|
76
|
+
// // result.distance() is the distance to the target.
|
|
77
|
+
// // result.cell_id() is the indexed S2CellId.
|
|
78
|
+
// // result.label() is the integer label associated with the S2CellId.
|
|
79
|
+
// DoSomething(target_point, result);
|
|
80
|
+
// }
|
|
81
|
+
//
|
|
82
|
+
// Finally, you can access the index contents directly. Internally, the index
|
|
83
|
+
// consists of a set of non-overlapping leaf cell ranges that subdivide the
|
|
84
|
+
// sphere and such that each range intersects a particular set of (cell_id,
|
|
85
|
+
// label) pairs. Data is accessed using the following iterator types:
|
|
86
|
+
//
|
|
87
|
+
// RangeIterator:
|
|
88
|
+
// - used to seek and iterate over the non-overlapping leaf cell ranges.
|
|
89
|
+
// NonEmptyRangeIterator:
|
|
90
|
+
// - like RangeIterator, but skips ranges whose contents are empty.
|
|
91
|
+
// ContentsIterator:
|
|
92
|
+
// - iterates over the (cell_id, label) pairs that intersect a given range.
|
|
93
|
+
// CellIterator:
|
|
94
|
+
// - iterates over the entire set of (cell_id, label) pairs.
|
|
95
|
+
//
|
|
96
|
+
// Note that these are low-level, efficient types intended mainly for
|
|
97
|
+
// implementing new query classes. Most clients should use either the
|
|
98
|
+
// built-in methods such as VisitIntersectingCells and GetIntersectingLabels,
|
|
99
|
+
// or a helper such as S2ClosestCellQuery or S2Closest*Query::CellUnionTarget.
|
|
100
|
+
class S2CellIndex {
|
|
101
|
+
public:
|
|
102
|
+
// Labels are 32-bit non-negative integers. To support other label types,
|
|
103
|
+
// you can use ValueLexicon to map label values to integers:
|
|
104
|
+
//
|
|
105
|
+
// ValueLexicon<MyLabel> my_label_lexicon;
|
|
106
|
+
// index.Add(cell_id, my_label_lexicon.Add(label));
|
|
107
|
+
using Label = int32;
|
|
108
|
+
|
|
109
|
+
// Convenience class that represents a (cell_id, label) pair.
|
|
110
|
+
struct LabelledCell {
|
|
111
|
+
S2CellId cell_id;
|
|
112
|
+
Label label;
|
|
113
|
+
|
|
114
|
+
LabelledCell() : cell_id(S2CellId::None()), label(-1) {}
|
|
115
|
+
|
|
116
|
+
LabelledCell(S2CellId _cell_id, Label _label)
|
|
117
|
+
: cell_id(_cell_id), label(_label) {}
|
|
118
|
+
|
|
119
|
+
bool operator==(LabelledCell y) const {
|
|
120
|
+
return cell_id == y.cell_id && label == y.label;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
bool operator<(LabelledCell y) const {
|
|
124
|
+
if (cell_id < y.cell_id) return true;
|
|
125
|
+
if (y.cell_id < cell_id) return false;
|
|
126
|
+
return label < y.label;
|
|
127
|
+
}
|
|
128
|
+
};
|
|
129
|
+
|
|
130
|
+
// Default constructor.
|
|
131
|
+
S2CellIndex();
|
|
132
|
+
|
|
133
|
+
// Returns the number of (cell_id, label) pairs in the index.
|
|
134
|
+
int num_cells() const;
|
|
135
|
+
|
|
136
|
+
// Adds the given (cell_id, label) pair to the index. Note that the index
|
|
137
|
+
// is not valid until Build() is called.
|
|
138
|
+
//
|
|
139
|
+
// The S2CellIds in the index may overlap (including duplicate values).
|
|
140
|
+
// Duplicate (cell_id, label) pairs are also allowed, although be aware that
|
|
141
|
+
// S2ClosestCellQuery will eliminate such duplicates anyway.
|
|
142
|
+
//
|
|
143
|
+
// REQUIRES: cell_id.is_valid()
|
|
144
|
+
void Add(S2CellId cell_id, Label label);
|
|
145
|
+
|
|
146
|
+
// Convenience function that adds a collection of cells with the same label.
|
|
147
|
+
void Add(const S2CellUnion& cell_ids, Label label);
|
|
148
|
+
|
|
149
|
+
// Constructs the index. This method may only be called once. No iterators
|
|
150
|
+
// may be used until the index is built.
|
|
151
|
+
void Build();
|
|
152
|
+
|
|
153
|
+
// Clears the index so that it can be re-used.
|
|
154
|
+
void Clear();
|
|
155
|
+
|
|
156
|
+
// A function that is called with each (cell_id, label) pair to be visited.
|
|
157
|
+
// The function may return false in order to indicate that no further
|
|
158
|
+
// (cell_id, label) pairs are needed.
|
|
159
|
+
using CellVisitor = std::function<bool (S2CellId cell_id, Label label)>;
|
|
160
|
+
|
|
161
|
+
// Visits all (cell_id, label) pairs in the given index that intersect the
|
|
162
|
+
// given S2CellUnion "target", terminating early if the given CellVisitor
|
|
163
|
+
// function returns false (in which case VisitIntersectingCells returns false
|
|
164
|
+
// as well). Each (cell_id, label) pair in the index is visited at most
|
|
165
|
+
// once. (If the index contains duplicates, then each copy is visited.)
|
|
166
|
+
bool VisitIntersectingCells(const S2CellUnion& target,
|
|
167
|
+
const CellVisitor& visitor) const;
|
|
168
|
+
|
|
169
|
+
// Convenience function that returns the labels of all indexed cells that
|
|
170
|
+
// intersect the given S2CellUnion "target". The output contains each label
|
|
171
|
+
// at most once, but is not sorted.
|
|
172
|
+
std::vector<Label> GetIntersectingLabels(const S2CellUnion& target) const;
|
|
173
|
+
|
|
174
|
+
// This version can be more efficient when it is called many times, since it
|
|
175
|
+
// does not require allocating a new vector on each call.
|
|
176
|
+
void GetIntersectingLabels(const S2CellUnion& target,
|
|
177
|
+
std::vector<Label>* labels) const;
|
|
178
|
+
|
|
179
|
+
private:
|
|
180
|
+
// Represents a node in the set of non-overlapping leaf cell ranges.
|
|
181
|
+
struct RangeNode;
|
|
182
|
+
|
|
183
|
+
// A special label indicating that ContentsIterator::done() is true.
|
|
184
|
+
static Label constexpr kDoneContents = -1;
|
|
185
|
+
|
|
186
|
+
// Represents a node in the (cell_id, label) tree. Cells are organized in a
|
|
187
|
+
// tree such that the ancestors of a given node contain that node.
|
|
188
|
+
struct CellNode {
|
|
189
|
+
S2CellId cell_id;
|
|
190
|
+
Label label;
|
|
191
|
+
int32 parent;
|
|
192
|
+
|
|
193
|
+
CellNode(S2CellId _cell_id, Label _label, int32 _parent)
|
|
194
|
+
: cell_id(_cell_id), label(_label), parent(_parent) {
|
|
195
|
+
}
|
|
196
|
+
CellNode() : cell_id(S2CellId::None()), label(kDoneContents), parent(-1) {}
|
|
197
|
+
};
|
|
198
|
+
|
|
199
|
+
public:
|
|
200
|
+
class ContentsIterator;
|
|
201
|
+
|
|
202
|
+
// An iterator that visits the entire set of indexed (cell_id, label) pairs
|
|
203
|
+
// in an unspecified order.
|
|
204
|
+
class CellIterator {
|
|
205
|
+
public:
|
|
206
|
+
// Initializes a CellIterator for the given S2CellIndex, positioned at the
|
|
207
|
+
// first cell (if any).
|
|
208
|
+
explicit CellIterator(const S2CellIndex* index);
|
|
209
|
+
|
|
210
|
+
// The S2CellId of the current (cell_id, label) pair.
|
|
211
|
+
// REQUIRES: !done()
|
|
212
|
+
S2CellId cell_id() const;
|
|
213
|
+
|
|
214
|
+
// The Label of the current (cell_id, label) pair.
|
|
215
|
+
// REQUIRES: !done()
|
|
216
|
+
Label label() const;
|
|
217
|
+
|
|
218
|
+
// Returns the current (cell_id, label) pair.
|
|
219
|
+
LabelledCell labelled_cell() const;
|
|
220
|
+
|
|
221
|
+
// Returns true if all (cell_id, label) pairs have been visited.
|
|
222
|
+
bool done() const;
|
|
223
|
+
|
|
224
|
+
// Advances the iterator to the next (cell_id, label) pair.
|
|
225
|
+
// REQUIRES: !done()
|
|
226
|
+
void Next();
|
|
227
|
+
|
|
228
|
+
private:
|
|
229
|
+
// NOTE(ericv): There is a potential optimization that would require this
|
|
230
|
+
// class to iterate over both cell_tree_ *and* range_nodes_.
|
|
231
|
+
std::vector<CellNode>::const_iterator cell_it_, cell_end_;
|
|
232
|
+
};
|
|
233
|
+
|
|
234
|
+
// An iterator that seeks and iterates over a set of non-overlapping leaf
|
|
235
|
+
// cell ranges that cover the entire sphere. The indexed (s2cell_id, label)
|
|
236
|
+
// pairs that intersect the current leaf cell range can be visited using
|
|
237
|
+
// ContentsIterator (see below).
|
|
238
|
+
class RangeIterator {
|
|
239
|
+
public:
|
|
240
|
+
// Initializes a RangeIterator for the given S2CellIndex. The iterator is
|
|
241
|
+
// initially *unpositioned*; you must call a positioning method such as
|
|
242
|
+
// Begin() or Seek() before accessing its contents.
|
|
243
|
+
explicit RangeIterator(const S2CellIndex* index);
|
|
244
|
+
|
|
245
|
+
// The start of the current range of leaf S2CellIds.
|
|
246
|
+
//
|
|
247
|
+
// If done() is true, returns S2CellId::End(S2CellId::kMaxLevel). This
|
|
248
|
+
// property means that most loops do not need to test done() explicitly.
|
|
249
|
+
S2CellId start_id() const;
|
|
250
|
+
|
|
251
|
+
// The (non-inclusive) end of the current range of leaf S2CellIds.
|
|
252
|
+
// REQUIRES: !done()
|
|
253
|
+
S2CellId limit_id() const;
|
|
254
|
+
|
|
255
|
+
// Returns true if the iterator is positioned beyond the last valid range.
|
|
256
|
+
bool done() const;
|
|
257
|
+
|
|
258
|
+
// Positions the iterator at the first range of leaf cells (if any).
|
|
259
|
+
void Begin();
|
|
260
|
+
|
|
261
|
+
// Positions the iterator so that done() is true.
|
|
262
|
+
void Finish();
|
|
263
|
+
|
|
264
|
+
// Advances the iterator to the next range of leaf cells.
|
|
265
|
+
// REQUIRES: !done()
|
|
266
|
+
void Next();
|
|
267
|
+
|
|
268
|
+
// If the iterator is already positioned at the beginning, returns false.
|
|
269
|
+
// Otherwise positions the iterator at the previous entry and returns true.
|
|
270
|
+
bool Prev();
|
|
271
|
+
|
|
272
|
+
// Positions the iterator at the first range with start_id() >= target.
|
|
273
|
+
// (Such an entry always exists as long as "target" is a valid leaf cell.
|
|
274
|
+
// Note that it is valid to access start_id() even when done() is true.)
|
|
275
|
+
//
|
|
276
|
+
// REQUIRES: target.is_leaf()
|
|
277
|
+
void Seek(S2CellId target);
|
|
278
|
+
|
|
279
|
+
// Returns true if no (s2cell_id, label) pairs intersect this range.
|
|
280
|
+
// Also returns true if done() is true.
|
|
281
|
+
bool is_empty() const;
|
|
282
|
+
|
|
283
|
+
// If advancing the iterator "n" times would leave it positioned on a
|
|
284
|
+
// valid range, does so and returns true. Otherwise leaves the iterator
|
|
285
|
+
// unmodified and returns false.
|
|
286
|
+
bool Advance(int n);
|
|
287
|
+
|
|
288
|
+
private:
|
|
289
|
+
// A special value used to indicate that the RangeIterator has not yet
|
|
290
|
+
// been initialized by calling Begin() or Seek().
|
|
291
|
+
std::vector<RangeNode>::const_iterator kUninitialized() const {
|
|
292
|
+
// Note that since the last element of range_nodes_ is a sentinel value,
|
|
293
|
+
// it_ will never legitimately be positioned at range_nodes_->end().
|
|
294
|
+
return range_nodes_->end();
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
friend class ContentsIterator;
|
|
298
|
+
const std::vector<RangeNode>* range_nodes_;
|
|
299
|
+
std::vector<RangeNode>::const_iterator it_;
|
|
300
|
+
};
|
|
301
|
+
|
|
302
|
+
// Like RangeIterator, but only visits leaf cell ranges that overlap at
|
|
303
|
+
// least one (cell_id, label) pair.
|
|
304
|
+
class NonEmptyRangeIterator : public RangeIterator {
|
|
305
|
+
public:
|
|
306
|
+
// Initializes a NonEmptyRangeIterator for the given S2CellIndex.
|
|
307
|
+
// The iterator is initially *unpositioned*; you must call a positioning
|
|
308
|
+
// method such as Begin() or Seek() before accessing its contents.
|
|
309
|
+
explicit NonEmptyRangeIterator(const S2CellIndex* index);
|
|
310
|
+
|
|
311
|
+
// Positions the iterator at the first non-empty range of leaf cells.
|
|
312
|
+
void Begin();
|
|
313
|
+
|
|
314
|
+
// Advances the iterator to the next non-empty range of leaf cells.
|
|
315
|
+
// REQUIRES: !done()
|
|
316
|
+
void Next();
|
|
317
|
+
|
|
318
|
+
// If the iterator is already positioned at the beginning, returns false.
|
|
319
|
+
// Otherwise positions the iterator at the previous entry and returns true.
|
|
320
|
+
bool Prev();
|
|
321
|
+
|
|
322
|
+
// Positions the iterator at the first non-empty range with
|
|
323
|
+
// start_id() >= target.
|
|
324
|
+
//
|
|
325
|
+
// REQUIRES: target.is_leaf()
|
|
326
|
+
void Seek(S2CellId target);
|
|
327
|
+
};
|
|
328
|
+
|
|
329
|
+
// An iterator that visits the (cell_id, label) pairs that cover a set of
|
|
330
|
+
// leaf cell ranges (see RangeIterator). Note that when multiple leaf cell
|
|
331
|
+
// ranges are visited, this class only guarantees that each result will be
|
|
332
|
+
// reported at least once, i.e. duplicate values may be suppressed. If you
|
|
333
|
+
// want duplicate values to be reported again, be sure to call Clear() first.
|
|
334
|
+
//
|
|
335
|
+
// [In particular, the implementation guarantees that when multiple leaf
|
|
336
|
+
// cell ranges are visited in monotonically increasing order, then each
|
|
337
|
+
// (cell_id, label) pair is reported exactly once.]
|
|
338
|
+
class ContentsIterator {
|
|
339
|
+
public:
|
|
340
|
+
// Default constructor; must be followed by a call to Init().
|
|
341
|
+
ContentsIterator();
|
|
342
|
+
|
|
343
|
+
// Convenience constructor that calls Init().
|
|
344
|
+
explicit ContentsIterator(const S2CellIndex* index);
|
|
345
|
+
|
|
346
|
+
// Initializes the iterator. Should be followed by a call to UnionWith()
|
|
347
|
+
// to visit the contents of each desired leaf cell range.
|
|
348
|
+
void Init(const S2CellIndex* index);
|
|
349
|
+
|
|
350
|
+
// Clears all state with respect to which range(s) have been visited.
|
|
351
|
+
void Clear();
|
|
352
|
+
|
|
353
|
+
// Positions the ContentsIterator at the first (cell_id, label) pair that
|
|
354
|
+
// covers the given leaf cell range. Note that when multiple leaf cell
|
|
355
|
+
// ranges are visited using the same ContentsIterator, duplicate values
|
|
356
|
+
// may be suppressed. If you don't want this behavior, call Clear() first.
|
|
357
|
+
void StartUnion(const RangeIterator& range);
|
|
358
|
+
|
|
359
|
+
// The S2CellId of the current (cell_id, label) pair.
|
|
360
|
+
// REQUIRES: !done()
|
|
361
|
+
S2CellId cell_id() const;
|
|
362
|
+
|
|
363
|
+
// The Label of the current (cell_id, label) pair.
|
|
364
|
+
// REQUIRES: !done()
|
|
365
|
+
Label label() const;
|
|
366
|
+
|
|
367
|
+
// Returns the current (cell_id, label) pair.
|
|
368
|
+
// REQUIRES: !done()
|
|
369
|
+
LabelledCell labelled_cell() const;
|
|
370
|
+
|
|
371
|
+
// Returns true if all (cell_id, label) pairs have been visited.
|
|
372
|
+
bool done() const;
|
|
373
|
+
|
|
374
|
+
// Advances the iterator to the next (cell_id, label) pair covered by the
|
|
375
|
+
// current leaf cell range.
|
|
376
|
+
// REQUIRES: !done()
|
|
377
|
+
void Next();
|
|
378
|
+
|
|
379
|
+
private:
|
|
380
|
+
// node_.label == kDoneContents indicates that done() is true.
|
|
381
|
+
void set_done() { node_.label = kDoneContents; }
|
|
382
|
+
|
|
383
|
+
// A pointer to the cell tree itself (owned by the S2CellIndex).
|
|
384
|
+
const std::vector<CellNode>* cell_tree_;
|
|
385
|
+
|
|
386
|
+
// The value of it.start_id() from the previous call to StartUnion().
|
|
387
|
+
// This is used to check whether these values are monotonically
|
|
388
|
+
// increasing.
|
|
389
|
+
S2CellId prev_start_id_;
|
|
390
|
+
|
|
391
|
+
// The maximum index within the cell_tree_ vector visited during the
|
|
392
|
+
// previous call to StartUnion(). This is used to eliminate duplicate
|
|
393
|
+
// values when StartUnion() is called multiple times.
|
|
394
|
+
int32 node_cutoff_;
|
|
395
|
+
|
|
396
|
+
// The maximum index within the cell_tree_ vector visited during the
|
|
397
|
+
// current call to StartUnion(). This is used to update node_cutoff_.
|
|
398
|
+
int32 next_node_cutoff_;
|
|
399
|
+
|
|
400
|
+
// A copy of the current node in the cell tree.
|
|
401
|
+
CellNode node_;
|
|
402
|
+
};
|
|
403
|
+
|
|
404
|
+
private:
|
|
405
|
+
friend class CellIterator;
|
|
406
|
+
friend class RangeIterator;
|
|
407
|
+
friend class ContentsIterator;
|
|
408
|
+
|
|
409
|
+
// A tree of (cell_id, label) pairs such that if X is an ancestor of Y, then
|
|
410
|
+
// X.cell_id contains Y.cell_id. The contents of a given range of leaf
|
|
411
|
+
// cells can be represented by pointing to a node of this tree.
|
|
412
|
+
std::vector<CellNode> cell_tree_;
|
|
413
|
+
|
|
414
|
+
// A RangeNode represents a range of leaf S2CellIds. The range starts at
|
|
415
|
+
// "start_id" (a leaf cell) and ends at the "start_id" field of the next
|
|
416
|
+
// RangeNode. "contents" points to the node of cell_tree_ representing the
|
|
417
|
+
// cells that overlap this range.
|
|
418
|
+
struct RangeNode {
|
|
419
|
+
S2CellId start_id; // First leaf cell contained by this range.
|
|
420
|
+
int32 contents; // Contents of this node (an index within cell_tree_).
|
|
421
|
+
|
|
422
|
+
RangeNode(S2CellId _start_id, int32 _contents)
|
|
423
|
+
: start_id(_start_id), contents(_contents) {
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
// Comparison operator needed for std::upper_bound().
|
|
427
|
+
friend bool operator<(S2CellId x, const RangeNode& y) {
|
|
428
|
+
return x < y.start_id;
|
|
429
|
+
}
|
|
430
|
+
};
|
|
431
|
+
// The last element of range_nodes_ is a sentinel value, which is necessary
|
|
432
|
+
// in order to represent the range covered by the previous element.
|
|
433
|
+
std::vector<RangeNode> range_nodes_;
|
|
434
|
+
|
|
435
|
+
S2CellIndex(const S2CellIndex&) = delete;
|
|
436
|
+
void operator=(const S2CellIndex&) = delete;
|
|
437
|
+
};
|
|
438
|
+
std::ostream& operator<<(std::ostream& os, S2CellIndex::LabelledCell x);
|
|
439
|
+
|
|
440
|
+
////////////////// Implementation details follow ////////////////////
|
|
441
|
+
|
|
442
|
+
|
|
443
|
+
inline S2CellIndex::CellIterator::CellIterator(const S2CellIndex* index)
|
|
444
|
+
: cell_it_(index->cell_tree_.begin()),
|
|
445
|
+
cell_end_(index->cell_tree_.end()) {
|
|
446
|
+
S2_DCHECK(!index->range_nodes_.empty()) << "Call Build() first.";
|
|
447
|
+
}
|
|
448
|
+
|
|
449
|
+
inline S2CellId S2CellIndex::CellIterator::cell_id() const {
|
|
450
|
+
S2_DCHECK(!done());
|
|
451
|
+
return cell_it_->cell_id;
|
|
452
|
+
}
|
|
453
|
+
|
|
454
|
+
inline S2CellIndex::Label S2CellIndex::CellIterator::label() const {
|
|
455
|
+
S2_DCHECK(!done());
|
|
456
|
+
return cell_it_->label;
|
|
457
|
+
}
|
|
458
|
+
|
|
459
|
+
inline S2CellIndex::LabelledCell S2CellIndex::CellIterator::labelled_cell()
|
|
460
|
+
const {
|
|
461
|
+
S2_DCHECK(!done());
|
|
462
|
+
return LabelledCell(cell_it_->cell_id, cell_it_->label);
|
|
463
|
+
}
|
|
464
|
+
|
|
465
|
+
inline bool S2CellIndex::CellIterator::done() const {
|
|
466
|
+
return cell_it_ == cell_end_;
|
|
467
|
+
}
|
|
468
|
+
|
|
469
|
+
inline void S2CellIndex::CellIterator::Next() {
|
|
470
|
+
S2_DCHECK(!done());
|
|
471
|
+
++cell_it_;
|
|
472
|
+
}
|
|
473
|
+
|
|
474
|
+
inline S2CellIndex::RangeIterator::RangeIterator(const S2CellIndex* index)
|
|
475
|
+
: range_nodes_(&index->range_nodes_), it_() {
|
|
476
|
+
S2_DCHECK(!range_nodes_->empty()) << "Call Build() first.";
|
|
477
|
+
if (google::DEBUG_MODE) it_ = kUninitialized(); // See done().
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
inline S2CellId S2CellIndex::RangeIterator::start_id() const {
|
|
481
|
+
return it_->start_id;
|
|
482
|
+
}
|
|
483
|
+
|
|
484
|
+
inline S2CellId S2CellIndex::RangeIterator::limit_id() const {
|
|
485
|
+
S2_DCHECK(!done());
|
|
486
|
+
return (it_ + 1)->start_id;
|
|
487
|
+
}
|
|
488
|
+
|
|
489
|
+
inline bool S2CellIndex::RangeIterator::done() const {
|
|
490
|
+
S2_DCHECK(it_ != kUninitialized()) << "Call Begin() or Seek() first.";
|
|
491
|
+
|
|
492
|
+
// Note that the last element of range_nodes_ is a sentinel value.
|
|
493
|
+
return it_ >= range_nodes_->end() - 1;
|
|
494
|
+
}
|
|
495
|
+
|
|
496
|
+
inline void S2CellIndex::RangeIterator::Begin() {
|
|
497
|
+
it_ = range_nodes_->begin();
|
|
498
|
+
}
|
|
499
|
+
|
|
500
|
+
inline void S2CellIndex::RangeIterator::Finish() {
|
|
501
|
+
// Note that the last element of range_nodes_ is a sentinel value.
|
|
502
|
+
it_ = range_nodes_->end() - 1;
|
|
503
|
+
}
|
|
504
|
+
|
|
505
|
+
inline void S2CellIndex::RangeIterator::Next() {
|
|
506
|
+
S2_DCHECK(!done());
|
|
507
|
+
++it_;
|
|
508
|
+
}
|
|
509
|
+
|
|
510
|
+
inline bool S2CellIndex::RangeIterator::is_empty() const {
|
|
511
|
+
return it_->contents == kDoneContents;
|
|
512
|
+
}
|
|
513
|
+
|
|
514
|
+
inline bool S2CellIndex::RangeIterator::Advance(int n) {
|
|
515
|
+
// Note that the last element of range_nodes_ is a sentinel value.
|
|
516
|
+
if (n >= range_nodes_->end() - 1 - it_) return false;
|
|
517
|
+
it_ += n;
|
|
518
|
+
return true;
|
|
519
|
+
}
|
|
520
|
+
|
|
521
|
+
inline S2CellIndex::NonEmptyRangeIterator::NonEmptyRangeIterator(
|
|
522
|
+
const S2CellIndex* index)
|
|
523
|
+
: RangeIterator(index) {
|
|
524
|
+
}
|
|
525
|
+
|
|
526
|
+
inline void S2CellIndex::NonEmptyRangeIterator::Begin() {
|
|
527
|
+
RangeIterator::Begin();
|
|
528
|
+
while (is_empty() && !done()) RangeIterator::Next();
|
|
529
|
+
}
|
|
530
|
+
|
|
531
|
+
inline void S2CellIndex::NonEmptyRangeIterator::Next() {
|
|
532
|
+
do {
|
|
533
|
+
RangeIterator::Next();
|
|
534
|
+
} while (is_empty() && !done());
|
|
535
|
+
}
|
|
536
|
+
|
|
537
|
+
inline bool S2CellIndex::NonEmptyRangeIterator::Prev() {
|
|
538
|
+
while (RangeIterator::Prev()) {
|
|
539
|
+
if (!is_empty()) return true;
|
|
540
|
+
}
|
|
541
|
+
// Return the iterator to its original position.
|
|
542
|
+
if (is_empty() && !done()) Next();
|
|
543
|
+
return false;
|
|
544
|
+
}
|
|
545
|
+
|
|
546
|
+
inline void S2CellIndex::NonEmptyRangeIterator::Seek(S2CellId target) {
|
|
547
|
+
RangeIterator::Seek(target);
|
|
548
|
+
while (is_empty() && !done()) RangeIterator::Next();
|
|
549
|
+
}
|
|
550
|
+
|
|
551
|
+
inline bool S2CellIndex::RangeIterator::Prev() {
|
|
552
|
+
if (it_ == range_nodes_->begin()) return false;
|
|
553
|
+
--it_;
|
|
554
|
+
return true;
|
|
555
|
+
}
|
|
556
|
+
|
|
557
|
+
inline S2CellIndex::ContentsIterator::ContentsIterator()
|
|
558
|
+
: cell_tree_(nullptr) {
|
|
559
|
+
}
|
|
560
|
+
|
|
561
|
+
inline S2CellIndex::ContentsIterator::ContentsIterator(
|
|
562
|
+
const S2CellIndex* index) {
|
|
563
|
+
Init(index);
|
|
564
|
+
}
|
|
565
|
+
|
|
566
|
+
inline void S2CellIndex::ContentsIterator::Init(const S2CellIndex* index) {
|
|
567
|
+
cell_tree_ = &index->cell_tree_;
|
|
568
|
+
Clear();
|
|
569
|
+
}
|
|
570
|
+
|
|
571
|
+
inline void S2CellIndex::ContentsIterator::Clear() {
|
|
572
|
+
prev_start_id_ = S2CellId::None();
|
|
573
|
+
node_cutoff_ = -1;
|
|
574
|
+
next_node_cutoff_ = -1;
|
|
575
|
+
set_done();
|
|
576
|
+
}
|
|
577
|
+
|
|
578
|
+
inline S2CellId S2CellIndex::ContentsIterator::cell_id() const {
|
|
579
|
+
S2_DCHECK(!done());
|
|
580
|
+
return node_.cell_id;
|
|
581
|
+
}
|
|
582
|
+
|
|
583
|
+
inline S2CellIndex::Label S2CellIndex::ContentsIterator::label() const {
|
|
584
|
+
S2_DCHECK(!done());
|
|
585
|
+
return node_.label;
|
|
586
|
+
}
|
|
587
|
+
|
|
588
|
+
inline S2CellIndex::LabelledCell S2CellIndex::ContentsIterator::labelled_cell()
|
|
589
|
+
const {
|
|
590
|
+
S2_DCHECK(!done());
|
|
591
|
+
return LabelledCell(node_.cell_id, node_.label);
|
|
592
|
+
}
|
|
593
|
+
|
|
594
|
+
inline bool S2CellIndex::ContentsIterator::done() const {
|
|
595
|
+
return node_.label == kDoneContents;
|
|
596
|
+
}
|
|
597
|
+
|
|
598
|
+
inline void S2CellIndex::ContentsIterator::Next() {
|
|
599
|
+
S2_DCHECK(!done());
|
|
600
|
+
if (node_.parent <= node_cutoff_) {
|
|
601
|
+
// We have already processed this node and its ancestors.
|
|
602
|
+
node_cutoff_ = next_node_cutoff_;
|
|
603
|
+
set_done();
|
|
604
|
+
} else {
|
|
605
|
+
node_ = (*cell_tree_)[node_.parent];
|
|
606
|
+
}
|
|
607
|
+
}
|
|
608
|
+
|
|
609
|
+
inline int S2CellIndex::num_cells() const {
|
|
610
|
+
return cell_tree_.size();
|
|
611
|
+
}
|
|
612
|
+
|
|
613
|
+
inline void S2CellIndex::Add(S2CellId cell_id, Label label) {
|
|
614
|
+
S2_DCHECK(cell_id.is_valid());
|
|
615
|
+
S2_DCHECK_GE(label, 0);
|
|
616
|
+
cell_tree_.push_back(CellNode(cell_id, label, -1));
|
|
617
|
+
}
|
|
618
|
+
|
|
619
|
+
inline void S2CellIndex::Clear() {
|
|
620
|
+
cell_tree_.clear();
|
|
621
|
+
range_nodes_.clear();
|
|
622
|
+
}
|
|
623
|
+
|
|
624
|
+
inline bool S2CellIndex::VisitIntersectingCells(
|
|
625
|
+
const S2CellUnion& target, const CellVisitor& visitor) const {
|
|
626
|
+
if (target.empty()) return true;
|
|
627
|
+
auto it = target.begin();
|
|
628
|
+
ContentsIterator contents(this);
|
|
629
|
+
RangeIterator range(this);
|
|
630
|
+
range.Begin();
|
|
631
|
+
do {
|
|
632
|
+
if (range.limit_id() <= it->range_min()) {
|
|
633
|
+
range.Seek(it->range_min()); // Only seek when necessary.
|
|
634
|
+
}
|
|
635
|
+
for (; range.start_id() <= it->range_max(); range.Next()) {
|
|
636
|
+
for (contents.StartUnion(range); !contents.done(); contents.Next()) {
|
|
637
|
+
if (!visitor(contents.cell_id(), contents.label())) {
|
|
638
|
+
return false;
|
|
639
|
+
}
|
|
640
|
+
}
|
|
641
|
+
}
|
|
642
|
+
// Check whether the next target cell is also contained by the leaf cell
|
|
643
|
+
// range that we just processed. If so, we can skip over all such cells
|
|
644
|
+
// using binary search. This speeds up benchmarks by between 2x and 10x
|
|
645
|
+
// when the average number of intersecting cells is small (< 1).
|
|
646
|
+
if (++it != target.end() && it->range_max() < range.start_id()) {
|
|
647
|
+
// Skip to the first target cell that extends past the previous range.
|
|
648
|
+
it = std::lower_bound(it + 1, target.end(), range.start_id());
|
|
649
|
+
if ((it - 1)->range_max() >= range.start_id()) --it;
|
|
650
|
+
}
|
|
651
|
+
} while (it != target.end());
|
|
652
|
+
return true;
|
|
653
|
+
}
|
|
654
|
+
|
|
655
|
+
inline std::ostream& operator<<(std::ostream& os,
|
|
656
|
+
S2CellIndex::LabelledCell x) {
|
|
657
|
+
return os << "(" << x.cell_id << ", " << x.label << ")";
|
|
658
|
+
}
|
|
659
|
+
|
|
660
|
+
#endif // S2_S2CELL_INDEX_H_
|