@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,140 @@
|
|
|
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_ENCODED_S2POINT_VECTOR_H_
|
|
19
|
+
#define S2_ENCODED_S2POINT_VECTOR_H_
|
|
20
|
+
|
|
21
|
+
#include <atomic>
|
|
22
|
+
#include "s2/third_party/absl/types/span.h"
|
|
23
|
+
#include "s2/encoded_string_vector.h"
|
|
24
|
+
#include "s2/encoded_uint_vector.h"
|
|
25
|
+
#include "s2/s2point.h"
|
|
26
|
+
|
|
27
|
+
namespace s2coding {
|
|
28
|
+
|
|
29
|
+
// Controls whether to optimize for speed or size when encoding points. (Note
|
|
30
|
+
// that encoding is always lossless, and that currently compact encodings are
|
|
31
|
+
// only possible when points have been snapped to S2CellId centers.)
|
|
32
|
+
enum class CodingHint : uint8 { FAST, COMPACT };
|
|
33
|
+
|
|
34
|
+
// Encodes a vector of S2Points in a format that can later be decoded as an
|
|
35
|
+
// EncodedS2PointVector.
|
|
36
|
+
//
|
|
37
|
+
// REQUIRES: "encoder" uses the default constructor, so that its buffer
|
|
38
|
+
// can be enlarged as necessary by calling Ensure(int).
|
|
39
|
+
void EncodeS2PointVector(absl::Span<const S2Point> points, CodingHint hint,
|
|
40
|
+
Encoder* encoder);
|
|
41
|
+
|
|
42
|
+
// This class represents an encoded vector of S2Points. Values are decoded
|
|
43
|
+
// only when they are accessed. This allows for very fast initialization and
|
|
44
|
+
// no additional memory use beyond the encoded data. The encoded data is not
|
|
45
|
+
// owned by this class; typically it points into a large contiguous buffer
|
|
46
|
+
// that contains other encoded data as well.
|
|
47
|
+
//
|
|
48
|
+
// This is one of several helper classes that allow complex data structures to
|
|
49
|
+
// be initialized from an encoded format in constant time and then decoded on
|
|
50
|
+
// demand. This can be a big performance advantage when only a small part of
|
|
51
|
+
// the data structure is actually used.
|
|
52
|
+
class EncodedS2PointVector {
|
|
53
|
+
public:
|
|
54
|
+
// Constructs an uninitialized object; requires Init() to be called.
|
|
55
|
+
EncodedS2PointVector() {}
|
|
56
|
+
|
|
57
|
+
// Initializes the EncodedS2PointVector.
|
|
58
|
+
//
|
|
59
|
+
// REQUIRES: The Decoder data buffer must outlive this object.
|
|
60
|
+
bool Init(Decoder* decoder);
|
|
61
|
+
|
|
62
|
+
// Returns the size of the original vector.
|
|
63
|
+
size_t size() const;
|
|
64
|
+
|
|
65
|
+
// Returns the element at the given index.
|
|
66
|
+
S2Point operator[](int i) const;
|
|
67
|
+
|
|
68
|
+
// Decodes and returns the entire original vector.
|
|
69
|
+
std::vector<S2Point> Decode() const;
|
|
70
|
+
|
|
71
|
+
// TODO(ericv): Consider adding a method that returns an adjacent pair of
|
|
72
|
+
// points. This would save some decoding overhead.
|
|
73
|
+
|
|
74
|
+
private:
|
|
75
|
+
friend void EncodeS2PointVector(absl::Span<const S2Point>, CodingHint,
|
|
76
|
+
Encoder*);
|
|
77
|
+
friend void EncodeS2PointVectorFast(absl::Span<const S2Point>, Encoder*);
|
|
78
|
+
friend void EncodeS2PointVectorCompact(absl::Span<const S2Point>, Encoder*);
|
|
79
|
+
|
|
80
|
+
bool InitUncompressedFormat(Decoder* decoder);
|
|
81
|
+
bool InitCellIdsFormat(Decoder* decoder);
|
|
82
|
+
S2Point DecodeCellIdsFormat(int i) const;
|
|
83
|
+
|
|
84
|
+
// We use a tagged union to represent multiple formats, as opposed to an
|
|
85
|
+
// abstract base class or templating. This represents the best compromise
|
|
86
|
+
// between performance, space, and convenience. Note that the overhead of
|
|
87
|
+
// checking the tag is trivial and will typically be branch-predicted
|
|
88
|
+
// perfectly.
|
|
89
|
+
//
|
|
90
|
+
// TODO(ericv): Once additional formats have been implemented, consider
|
|
91
|
+
// using std::variant<> instead. It's unclear whether this would have
|
|
92
|
+
// better or worse performance than the current approach.
|
|
93
|
+
enum Format : uint8 {
|
|
94
|
+
UNCOMPRESSED = 0,
|
|
95
|
+
CELL_IDS = 1,
|
|
96
|
+
};
|
|
97
|
+
Format format_;
|
|
98
|
+
uint32 size_;
|
|
99
|
+
union {
|
|
100
|
+
struct {
|
|
101
|
+
const S2Point* points;
|
|
102
|
+
} uncompressed_;
|
|
103
|
+
struct {
|
|
104
|
+
EncodedStringVector blocks;
|
|
105
|
+
uint64 base;
|
|
106
|
+
uint8 level;
|
|
107
|
+
bool have_exceptions;
|
|
108
|
+
|
|
109
|
+
// TODO(ericv): Use std::atomic_flag to cache the last point decoded in
|
|
110
|
+
// a thread-safe way. This reduces benchmark times for actual polygon
|
|
111
|
+
// operations (e.g. S2ClosestEdgeQuery) by about 15%.
|
|
112
|
+
} cell_ids_;
|
|
113
|
+
};
|
|
114
|
+
};
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
////////////////// Implementation details follow ////////////////////
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
inline size_t EncodedS2PointVector::size() const {
|
|
121
|
+
return size_;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
inline S2Point EncodedS2PointVector::operator[](int i) const {
|
|
125
|
+
switch (format_) {
|
|
126
|
+
case Format::UNCOMPRESSED:
|
|
127
|
+
return uncompressed_.points[i];
|
|
128
|
+
|
|
129
|
+
case Format::CELL_IDS:
|
|
130
|
+
return DecodeCellIdsFormat(i);
|
|
131
|
+
|
|
132
|
+
default:
|
|
133
|
+
S2_LOG(DFATAL) << "Unrecognized format";
|
|
134
|
+
return S2Point();
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
} // namespace s2coding
|
|
139
|
+
|
|
140
|
+
#endif // S2_ENCODED_S2POINT_VECTOR_H_
|
|
@@ -0,0 +1,344 @@
|
|
|
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
|
+
#include "s2/encoded_s2point_vector.h"
|
|
19
|
+
|
|
20
|
+
#include <vector>
|
|
21
|
+
#include <gtest/gtest.h>
|
|
22
|
+
#include "s2/third_party/absl/strings/str_cat.h"
|
|
23
|
+
#include "s2/util/bits/bit-interleave.h"
|
|
24
|
+
#include "s2/s2loop.h"
|
|
25
|
+
#include "s2/s2polygon.h"
|
|
26
|
+
#include "s2/s2testing.h"
|
|
27
|
+
#include "s2/s2text_format.h"
|
|
28
|
+
|
|
29
|
+
using absl::make_unique;
|
|
30
|
+
using s2textformat::MakeCellIdOrDie;
|
|
31
|
+
using s2textformat::MakePointOrDie;
|
|
32
|
+
using std::vector;
|
|
33
|
+
|
|
34
|
+
namespace s2coding {
|
|
35
|
+
|
|
36
|
+
static int kBlockSize = 16; // Number of deltas per block in implementation.
|
|
37
|
+
|
|
38
|
+
size_t TestEncodedS2PointVector(const vector<S2Point>& expected,
|
|
39
|
+
CodingHint hint, int64 expected_bytes) {
|
|
40
|
+
Encoder encoder;
|
|
41
|
+
EncodeS2PointVector(expected, hint, &encoder);
|
|
42
|
+
if (expected_bytes >= 0) {
|
|
43
|
+
EXPECT_EQ(expected_bytes, encoder.length());
|
|
44
|
+
}
|
|
45
|
+
Decoder decoder(encoder.base(), encoder.length());
|
|
46
|
+
EncodedS2PointVector actual;
|
|
47
|
+
EXPECT_TRUE(actual.Init(&decoder));
|
|
48
|
+
EXPECT_EQ(actual.Decode(), expected);
|
|
49
|
+
return encoder.length();
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// In order to make it easier to construct tests that encode particular
|
|
53
|
+
// values, this function duplicates the part of EncodedS2PointVector that
|
|
54
|
+
// converts an encoded 64-bit value back to an S2Point.
|
|
55
|
+
S2Point EncodedValueToPoint(uint64 value, int level) {
|
|
56
|
+
uint32 sj, tj;
|
|
57
|
+
util_bits::DeinterleaveUint32(value, &sj, &tj);
|
|
58
|
+
int shift = S2CellId::kMaxLevel - level;
|
|
59
|
+
int si = (((sj << 1) | 1) << shift) & 0x7fffffff;
|
|
60
|
+
int ti = (((tj << 1) | 1) << shift) & 0x7fffffff;
|
|
61
|
+
int face = ((sj << shift) >> 30) | (((tj << (shift + 1)) >> 29) & 4);
|
|
62
|
+
return S2::FaceUVtoXYZ(face, S2::STtoUV(S2::SiTitoST(si)),
|
|
63
|
+
S2::STtoUV(S2::SiTitoST(ti))).Normalize();
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
TEST(EncodedS2PointVectorTest, Empty) {
|
|
67
|
+
TestEncodedS2PointVector({}, CodingHint::FAST, 1);
|
|
68
|
+
|
|
69
|
+
// Test that an empty vector uses the UNCOMPRESSED encoding.
|
|
70
|
+
TestEncodedS2PointVector({}, CodingHint::COMPACT, 1);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
TEST(EncodedS2PointVectorTest, OnePoint) {
|
|
74
|
+
TestEncodedS2PointVector({S2Point(1, 0, 0)}, CodingHint::FAST, 25);
|
|
75
|
+
|
|
76
|
+
// Encoding: header (2 bytes), block count (1 byte), block lengths (1 byte),
|
|
77
|
+
// block header (1 byte), delta (1 byte).
|
|
78
|
+
TestEncodedS2PointVector({S2Point(1, 0, 0)}, CodingHint::COMPACT, 6);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
TEST(EncodedS2PointVectorTest, CellIdWithException) {
|
|
82
|
+
// Test one point encoded as an S2CellId with one point encoded as an
|
|
83
|
+
// exception.
|
|
84
|
+
//
|
|
85
|
+
// Encoding: header (2 bytes), block count (1 byte), block lengths (1 byte),
|
|
86
|
+
// block header (1 byte), two deltas (2 bytes), exception (24 bytes).
|
|
87
|
+
TestEncodedS2PointVector(
|
|
88
|
+
{MakeCellIdOrDie("1/23").ToPoint(), S2Point(0.1, 0.2, 0.3).Normalize()},
|
|
89
|
+
CodingHint::COMPACT, 31);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
TEST(EncodedS2PointVectorTest, PointsAtMultipleLevels) {
|
|
93
|
+
// Test that when points at multiple levels are present, the level with the
|
|
94
|
+
// most points is chosen (preferring the smallest level in case of ties).
|
|
95
|
+
// (All other points are encoded as exceptions.)
|
|
96
|
+
|
|
97
|
+
// In this example, the two points at level 5 (on face 1) should be encoded.
|
|
98
|
+
// It is possible to tell which points are encoded by the length of the
|
|
99
|
+
// encoding (since different numbers of "base" bytes are encoded).
|
|
100
|
+
//
|
|
101
|
+
// Encoding: header (2 bytes), base (1 byte), block count (1 byte), block
|
|
102
|
+
// lengths (1 byte), block header (1 byte), 5 deltas (5 bytes), S2Point
|
|
103
|
+
// exceptions (72 bytes).
|
|
104
|
+
TestEncodedS2PointVector(
|
|
105
|
+
{MakeCellIdOrDie("2/11001310230102").ToPoint(),
|
|
106
|
+
MakeCellIdOrDie("1/23322").ToPoint(),
|
|
107
|
+
MakeCellIdOrDie("3/3").ToPoint(),
|
|
108
|
+
MakeCellIdOrDie("1/23323").ToPoint(),
|
|
109
|
+
MakeCellIdOrDie("2/12101023022012").ToPoint()},
|
|
110
|
+
CodingHint::COMPACT, 83);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
TEST(EncodedS2PointVectorTest, NoOverlapOrExtraDeltaBitsNeeded) {
|
|
114
|
+
// This function tests the case in GetBlockCodes() where values can be
|
|
115
|
+
// encoded using the minimum number delta bits and no overlap. From the
|
|
116
|
+
// comments there:
|
|
117
|
+
//
|
|
118
|
+
// Example 1: d_min = 0x72, d_max = 0x7e. The range is 0x0c. This can be
|
|
119
|
+
// encoded using delta_bits = 4 and overlap_bits = 0, which allows us to
|
|
120
|
+
// represent an offset of 0x70 and a maximum delta of 0x0f, so that we can
|
|
121
|
+
// encode values up to 0x7f.
|
|
122
|
+
//
|
|
123
|
+
// To set up this test, we need at least two blocks: one to set the global
|
|
124
|
+
// minimum value, and the other to encode a specific range of deltas. To
|
|
125
|
+
// make things easier, the first block has a minimum value of zero.
|
|
126
|
+
//
|
|
127
|
+
// Encoding: header (2 bytes), block count (1 byte), block lengths (2 bytes)
|
|
128
|
+
// Block 0: header (1 byte), 8 deltas (8 bytes)
|
|
129
|
+
// Block 1: header (1 byte), offset (1 byte), 4 deltas (2 bytes)
|
|
130
|
+
const int level = 3;
|
|
131
|
+
vector<S2Point> points(kBlockSize, EncodedValueToPoint(0, level));
|
|
132
|
+
points.push_back(EncodedValueToPoint(0x72, level));
|
|
133
|
+
points.push_back(EncodedValueToPoint(0x74, level));
|
|
134
|
+
points.push_back(EncodedValueToPoint(0x75, level));
|
|
135
|
+
points.push_back(EncodedValueToPoint(0x7e, level));
|
|
136
|
+
TestEncodedS2PointVector(points, CodingHint::COMPACT, 10 + kBlockSize / 2);
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
TEST(EncodedS2PointVectorTest, OverlapNeeded) {
|
|
140
|
+
// Like the above, but tests the following case:
|
|
141
|
+
//
|
|
142
|
+
// Example 2: d_min = 0x78, d_max = 0x84. The range is 0x0c, but in this
|
|
143
|
+
// case it is not sufficient to use delta_bits = 4 and overlap_bits = 0
|
|
144
|
+
// because we can again only represent an offset of 0x70, so the maximum
|
|
145
|
+
// delta of 0x0f only lets us encode values up to 0x7f. However if we
|
|
146
|
+
// increase the overlap to 4 bits then we can represent an offset of 0x78,
|
|
147
|
+
// which lets us encode values up to 0x78 + 0x0f = 0x87.
|
|
148
|
+
//
|
|
149
|
+
// Encoding: header (2 bytes), block count (1 byte), block lengths (2 bytes)
|
|
150
|
+
// Block 0: header (1 byte), 8 deltas (8 bytes)
|
|
151
|
+
// Block 1: header (1 byte), offset (1 byte), 4 deltas (2 bytes)
|
|
152
|
+
const int level = 3;
|
|
153
|
+
vector<S2Point> points(kBlockSize, EncodedValueToPoint(0, level));
|
|
154
|
+
points.push_back(EncodedValueToPoint(0x78, level));
|
|
155
|
+
points.push_back(EncodedValueToPoint(0x7a, level));
|
|
156
|
+
points.push_back(EncodedValueToPoint(0x7c, level));
|
|
157
|
+
points.push_back(EncodedValueToPoint(0x84, level));
|
|
158
|
+
TestEncodedS2PointVector(points, CodingHint::COMPACT, 10 + kBlockSize / 2);
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
TEST(EncodedS2PointVectorTest, ExtraDeltaBitsNeeded) {
|
|
162
|
+
// Like the above, but tests the following case:
|
|
163
|
+
//
|
|
164
|
+
// Example 3: d_min = 0x08, d_max = 0x104. The range is 0xfc, so we should
|
|
165
|
+
// be able to use 8-bit deltas. But even with a 4-bit overlap, we can still
|
|
166
|
+
// only encode offset = 0 and a maximum value of 0xff. (We don't allow
|
|
167
|
+
// bigger overlaps because statistically they are not worthwhile.) Instead
|
|
168
|
+
// we increase the delta size to 12 bits, which handles this case easily.
|
|
169
|
+
//
|
|
170
|
+
// Encoding: header (2 bytes), block count (1 byte), block lengths (2 bytes)
|
|
171
|
+
// Block 0: header (1 byte), 8 deltas (8 bytes)
|
|
172
|
+
// Block 1: header (1 byte), 4 deltas (6 bytes)
|
|
173
|
+
const int level = 3;
|
|
174
|
+
vector<S2Point> points(kBlockSize, EncodedValueToPoint(0, level));
|
|
175
|
+
points.push_back(EncodedValueToPoint(0x08, level));
|
|
176
|
+
points.push_back(EncodedValueToPoint(0x4e, level));
|
|
177
|
+
points.push_back(EncodedValueToPoint(0x82, level));
|
|
178
|
+
points.push_back(EncodedValueToPoint(0x104, level));
|
|
179
|
+
TestEncodedS2PointVector(points, CodingHint::COMPACT, 13 + kBlockSize / 2);
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
TEST(EncodedS2PointVectorTest, ExtraDeltaBitsAndOverlapNeeded) {
|
|
183
|
+
// Like the above, but tests the following case:
|
|
184
|
+
//
|
|
185
|
+
// Example 4: d_min = 0xf08, d_max = 0x1004. The range is 0xfc, so we
|
|
186
|
+
// should be able to use 8-bit deltas. With 8-bit deltas and no overlap, we
|
|
187
|
+
// have offset = 0xf00 and a maximum encodable value of 0xfff. With 8-bit
|
|
188
|
+
// deltas and a 4-bit overlap, we still have offset = 0xf00 and a maximum
|
|
189
|
+
// encodable value of 0xfff. Even with 12-bit deltas, we have offset = 0
|
|
190
|
+
// and we can still only represent 0xfff. However with delta_bits = 12 and
|
|
191
|
+
// overlap_bits = 4, we can represent offset = 0xf00 and a maximum encodable
|
|
192
|
+
// value of 0xf00 + 0xfff = 0x1eff.
|
|
193
|
+
//
|
|
194
|
+
// Encoding: header (2 bytes), block count (1 byte), block lengths (2 bytes)
|
|
195
|
+
// Block 0: header (1 byte), 8 deltas (8 bytes)
|
|
196
|
+
// Block 1: header (1 byte), offset (1 byte), 4 deltas (6 bytes)
|
|
197
|
+
const int level = 5;
|
|
198
|
+
vector<S2Point> points(kBlockSize, EncodedValueToPoint(0, level));
|
|
199
|
+
points.push_back(EncodedValueToPoint(0xf08, level));
|
|
200
|
+
points.push_back(EncodedValueToPoint(0xf4e, level));
|
|
201
|
+
points.push_back(EncodedValueToPoint(0xf82, level));
|
|
202
|
+
points.push_back(EncodedValueToPoint(0x1004, level));
|
|
203
|
+
TestEncodedS2PointVector(points, CodingHint::COMPACT, 14 + kBlockSize / 2);
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
TEST(EncodedS2PointVectorTest, SixtyFourBitOffset) {
|
|
207
|
+
// Tests a case where a 64-bit block offset is needed.
|
|
208
|
+
//
|
|
209
|
+
// Encoding: header (2 bytes), block count (1 byte), block lengths (2 bytes)
|
|
210
|
+
// Block 0: header (1 byte), 8 deltas (8 bytes)
|
|
211
|
+
// Block 1: header (1 byte), offset (8 bytes), 2 deltas (1 byte)
|
|
212
|
+
const int level = S2CellId::kMaxLevel;
|
|
213
|
+
vector<S2Point> points(kBlockSize, S2CellId::Begin(level).ToPoint());
|
|
214
|
+
points.push_back(S2CellId::End(level).prev().ToPoint());
|
|
215
|
+
points.push_back(S2CellId::End(level).prev().prev().ToPoint());
|
|
216
|
+
TestEncodedS2PointVector(points, CodingHint::COMPACT, 16 + kBlockSize / 2);
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
TEST(EncodedS2PointVectorTest, AllExceptionsBlock) {
|
|
220
|
+
// The encoding consists of two blocks; the first contains 16 encodable
|
|
221
|
+
// values, while the second contains two exceptions.
|
|
222
|
+
vector<S2Point> points(kBlockSize,
|
|
223
|
+
EncodedValueToPoint(0, S2CellId::kMaxLevel));
|
|
224
|
+
points.push_back(S2Point(0.1, 0.2, 0.3).Normalize());
|
|
225
|
+
points.push_back(S2Point(0.3, 0.2, 0.1).Normalize());
|
|
226
|
+
// Encoding: header (2 bytes), block count (1 byte), block lengths (2 bytes).
|
|
227
|
+
// 1st block header (1 byte), 16 deltas (16 bytes).
|
|
228
|
+
// 2nd block header (1 byte), 2 deltas (1 byte), 2 exceptions (48 bytes).
|
|
229
|
+
TestEncodedS2PointVector(points, CodingHint::COMPACT, 72);
|
|
230
|
+
|
|
231
|
+
// Encoding: header (2 bytes), 18 S2Points (432 bytes).
|
|
232
|
+
TestEncodedS2PointVector(points, CodingHint::FAST, 434);
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
TEST(EncodedS2PointVectorTest, FirstAtAllLevels) {
|
|
236
|
+
// Test encoding the first S2CellId at each level (which also happens to have
|
|
237
|
+
// the maximum face, si, and ti values). All such S2CellIds can be encoded in
|
|
238
|
+
// 6 bytes because most of the bits are zero.
|
|
239
|
+
for (int level = 0; level <= S2CellId::kMaxLevel; ++level) {
|
|
240
|
+
SCOPED_TRACE(absl::StrCat("Level = ", level));
|
|
241
|
+
TestEncodedS2PointVector({S2CellId::Begin(level).ToPoint()},
|
|
242
|
+
CodingHint::COMPACT, 6);
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
TEST(EncodedS2PointVectorTest, LastAtAllLevels) {
|
|
247
|
+
// Test encoding the last S2CellId at each level. It turns out that such
|
|
248
|
+
// S2CellIds have the largest possible face and ti values, and the minimum
|
|
249
|
+
// possible si value at that level. Such S2CellIds can be encoded in 6 to 13
|
|
250
|
+
// bytes depending on the level.
|
|
251
|
+
for (int level = 0; level <= S2CellId::kMaxLevel; ++level) {
|
|
252
|
+
SCOPED_TRACE(absl::StrCat("Level = ", level));
|
|
253
|
+
// Note that 8 bit deltas are used to encode blocks of size 1, which
|
|
254
|
+
// reduces the size of "base" from ((level + 2) / 4) to (level / 4) bytes.
|
|
255
|
+
int expected_size = 6 + level / 4;
|
|
256
|
+
TestEncodedS2PointVector({S2CellId::End(level).prev().ToPoint()},
|
|
257
|
+
CodingHint::COMPACT, expected_size);
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
TEST(EncodedS2PointVectorTest, MaxFaceSiTiAtAllLevels) {
|
|
262
|
+
// Similar to the test above, but tests encoding the S2CellId at each level
|
|
263
|
+
// whose face, si, and ti values are all maximal. This turns out to be the
|
|
264
|
+
// S2CellId whose human-readable form is 5/222...22 (0xb555555555555555),
|
|
265
|
+
// however for clarity we consruct it using S2CellId::FromFaceIJ.
|
|
266
|
+
for (int level = 0; level <= S2CellId::kMaxLevel; ++level) {
|
|
267
|
+
SCOPED_TRACE(absl::StrCat("Level = ", level));
|
|
268
|
+
S2CellId id = S2CellId::FromFaceIJ(5, S2::kLimitIJ - 1, S2::kLimitIJ - 1)
|
|
269
|
+
.parent(level);
|
|
270
|
+
|
|
271
|
+
// This encoding is one byte bigger than the previous test at levels 7, 11,
|
|
272
|
+
// 15, 19, 23, and 27. This is because in the previous test, the
|
|
273
|
+
// odd-numbered value bits are all zero (except for the face number), which
|
|
274
|
+
// reduces the number of base bits needed by exactly 1. The encoding size
|
|
275
|
+
// at level==3 is unaffected because for singleton blocks, the lowest 8
|
|
276
|
+
// value bits are encoded in the delta.
|
|
277
|
+
int expected_size = (level < 4) ? 6 : 6 + (level + 1) / 4;
|
|
278
|
+
TestEncodedS2PointVector({id.ToPoint()},
|
|
279
|
+
CodingHint::COMPACT, expected_size);
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
TEST(EncodedS2PointVectorTest, LastTwoPointsAtAllLevels) {
|
|
284
|
+
// Test encoding the last two S2CellIds at each level.
|
|
285
|
+
for (int level = 0; level <= S2CellId::kMaxLevel; ++level) {
|
|
286
|
+
SCOPED_TRACE(absl::StrCat("Level = ", level));
|
|
287
|
+
S2CellId id = S2CellId::End(level).prev();
|
|
288
|
+
// Notice that this costs only 4 bits more than encoding the last S2CellId
|
|
289
|
+
// by itself (see LastAtAllLevels). This is because encoding a block of
|
|
290
|
+
// size 1 uses 8-bit deltas (which reduces the size of "base" by 4 bits),
|
|
291
|
+
// while this test uses two 4-bit deltas.
|
|
292
|
+
int expected_size = 6 + (level + 2) / 4;
|
|
293
|
+
TestEncodedS2PointVector({id.ToPoint(), id.prev().ToPoint()},
|
|
294
|
+
CodingHint::COMPACT, expected_size);
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
TEST(EncodedS2PointVectorTest, ManyDuplicatePointsAtAllLevels) {
|
|
299
|
+
// Test encoding 32 copies of the last S2CellId at each level. This uses
|
|
300
|
+
// between 27 and 38 bytes depending on the level. (Note that the encoding
|
|
301
|
+
// can use less than 1 byte per point in this situation.)
|
|
302
|
+
for (int level = 0; level <= S2CellId::kMaxLevel; ++level) {
|
|
303
|
+
SCOPED_TRACE(absl::StrCat("Level = ", level));
|
|
304
|
+
S2CellId id = S2CellId::End(level).prev();
|
|
305
|
+
// Encoding: header (2 bytes), base ((level + 2) / 4 bytes), block count
|
|
306
|
+
// (1 byte), block lengths (2 bytes), block headers (2 bytes), 32 deltas
|
|
307
|
+
// (16 bytes). At level 30 the encoding size goes up by 1 byte because
|
|
308
|
+
// we can't encode an 8 byte "base" value, so instead this case uses a
|
|
309
|
+
// base of 7 bytes plus a one-byte offset in each of the 2 blocks.
|
|
310
|
+
int expected_size = 23 + (level + 2) / 4;
|
|
311
|
+
if (level == 30) expected_size += 1;
|
|
312
|
+
vector<S2Point> points(32, id.ToPoint());
|
|
313
|
+
TestEncodedS2PointVector(points, CodingHint::COMPACT, expected_size);
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
TEST(EncodedS2PointVectorTest, SnappedFractalLoops) {
|
|
318
|
+
S2Testing::rnd.Reset(FLAGS_s2_random_seed);
|
|
319
|
+
int kMaxPoints = 3 << (google::DEBUG_MODE ? 10 : 14);
|
|
320
|
+
for (int num_points = 3; num_points <= kMaxPoints; num_points *= 4) {
|
|
321
|
+
size_t s2polygon_size = 0, lax_polygon_size = 0;
|
|
322
|
+
for (int i = 0; i < 10; ++i) {
|
|
323
|
+
S2Testing::Fractal fractal;
|
|
324
|
+
fractal.SetLevelForApproxMaxEdges(num_points);
|
|
325
|
+
auto frame = S2Testing::GetRandomFrame();
|
|
326
|
+
auto loop = fractal.MakeLoop(frame, S2Testing::KmToAngle(10));
|
|
327
|
+
std::vector<S2Point> points;
|
|
328
|
+
for (int j = 0; j < loop->num_vertices(); ++j) {
|
|
329
|
+
points.push_back(S2CellId(loop->vertex(j)).ToPoint());
|
|
330
|
+
}
|
|
331
|
+
S2Polygon s2polygon(make_unique<S2Loop>(points));
|
|
332
|
+
Encoder encoder;
|
|
333
|
+
s2polygon.Encode(&encoder);
|
|
334
|
+
s2polygon_size += encoder.length();
|
|
335
|
+
// S2LaxPolygonShape has 2 extra bytes of overhead to encode one loop.
|
|
336
|
+
lax_polygon_size +=
|
|
337
|
+
TestEncodedS2PointVector(points, CodingHint::COMPACT, -1) + 2;
|
|
338
|
+
}
|
|
339
|
+
printf("n=%5d s2=%9" PRIuS " lax=%9" PRIuS "\n",
|
|
340
|
+
num_points, s2polygon_size, lax_polygon_size);
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
} // namespace s2coding
|
|
@@ -0,0 +1,181 @@
|
|
|
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
|
+
#include "s2/encoded_s2shape_index.h"
|
|
19
|
+
|
|
20
|
+
#include <memory>
|
|
21
|
+
#include "s2/third_party/absl/memory/memory.h"
|
|
22
|
+
#include "s2/mutable_s2shape_index.h"
|
|
23
|
+
|
|
24
|
+
using absl::make_unique;
|
|
25
|
+
using std::unique_ptr;
|
|
26
|
+
using std::vector;
|
|
27
|
+
|
|
28
|
+
bool EncodedS2ShapeIndex::Iterator::Locate(const S2Point& target) {
|
|
29
|
+
return LocateImpl(target, this);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
EncodedS2ShapeIndex::CellRelation EncodedS2ShapeIndex::Iterator::Locate(
|
|
33
|
+
S2CellId target) {
|
|
34
|
+
return LocateImpl(target, this);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
unique_ptr<EncodedS2ShapeIndex::IteratorBase>
|
|
38
|
+
EncodedS2ShapeIndex::Iterator::Clone() const {
|
|
39
|
+
return make_unique<Iterator>(*this);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
void EncodedS2ShapeIndex::Iterator::Copy(const IteratorBase& other) {
|
|
43
|
+
*this = *down_cast<const Iterator*>(&other);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
S2Shape* EncodedS2ShapeIndex::GetShape(int id) const {
|
|
47
|
+
// This method is called when a shape has not been decoded yet.
|
|
48
|
+
unique_ptr<S2Shape> shape = (*shape_factory_)[id];
|
|
49
|
+
if (shape) shape->id_ = id;
|
|
50
|
+
S2Shape* expected = kUndecodedShape();
|
|
51
|
+
if (shapes_[id].compare_exchange_strong(expected, shape.get(),
|
|
52
|
+
std::memory_order_relaxed)) {
|
|
53
|
+
return shape.release(); // Ownership has been transferred to shapes_.
|
|
54
|
+
}
|
|
55
|
+
return shapes_[id].load(std::memory_order_relaxed);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
inline const S2ShapeIndexCell* EncodedS2ShapeIndex::GetCell(int i) const {
|
|
59
|
+
if (cell_decoded(i)) {
|
|
60
|
+
auto cell = cells_[i].load(std::memory_order_acquire);
|
|
61
|
+
if (cell != nullptr) return cell;
|
|
62
|
+
}
|
|
63
|
+
// We decode the cell before acquiring the spinlock in order to minimize the
|
|
64
|
+
// time that the lock is held.
|
|
65
|
+
auto cell = make_unique<S2ShapeIndexCell>();
|
|
66
|
+
Decoder decoder = encoded_cells_.GetDecoder(i);
|
|
67
|
+
if (!cell->Decode(num_shape_ids(), &decoder)) {
|
|
68
|
+
return nullptr;
|
|
69
|
+
}
|
|
70
|
+
SpinLockHolder l(&cells_lock_);
|
|
71
|
+
if (test_and_set_cell_decoded(i)) {
|
|
72
|
+
// This cell has already been decoded.
|
|
73
|
+
return cells_[i].load(std::memory_order_relaxed);
|
|
74
|
+
}
|
|
75
|
+
if (cell_cache_.size() < max_cell_cache_size()) {
|
|
76
|
+
cell_cache_.push_back(i);
|
|
77
|
+
}
|
|
78
|
+
cells_[i].store(cell.get(), std::memory_order_relaxed);
|
|
79
|
+
return cell.release(); // Ownership has been transferred to cells_.
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
const S2ShapeIndexCell* EncodedS2ShapeIndex::Iterator::GetCell() const {
|
|
83
|
+
return index_->GetCell(cell_pos_);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
EncodedS2ShapeIndex::EncodedS2ShapeIndex() {
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
EncodedS2ShapeIndex::~EncodedS2ShapeIndex() {
|
|
90
|
+
// Although Minimize() does slightly more than required for destruction
|
|
91
|
+
// (i.e., it resets vector elements to their default values), this does not
|
|
92
|
+
// affect benchmark times.
|
|
93
|
+
Minimize();
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
bool EncodedS2ShapeIndex::Init(Decoder* decoder,
|
|
97
|
+
const ShapeFactory& shape_factory) {
|
|
98
|
+
Minimize();
|
|
99
|
+
uint64 max_edges_version;
|
|
100
|
+
if (!decoder->get_varint64(&max_edges_version)) return false;
|
|
101
|
+
int version = max_edges_version & 3;
|
|
102
|
+
if (version != MutableS2ShapeIndex::kCurrentEncodingVersionNumber) {
|
|
103
|
+
return false;
|
|
104
|
+
}
|
|
105
|
+
options_.set_max_edges_per_cell(max_edges_version >> 2);
|
|
106
|
+
|
|
107
|
+
// AtomicShape is a subtype of std::atomic<S2Shape*> that changes the
|
|
108
|
+
// default constructor value to kUndecodedShape(). This saves the effort of
|
|
109
|
+
// initializing all the elements twice.
|
|
110
|
+
shapes_ = std::vector<AtomicShape>(shape_factory.size());
|
|
111
|
+
shape_factory_ = shape_factory.Clone();
|
|
112
|
+
if (!cell_ids_.Init(decoder)) return false;
|
|
113
|
+
|
|
114
|
+
// The cells_ elements are *uninitialized memory*. Instead we have bit
|
|
115
|
+
// vector (cells_decoded_) to indicate which elements of cells_ are valid.
|
|
116
|
+
// This reduces constructor times by more than a factor of 50, since rather
|
|
117
|
+
// than needing to initialize one 64-bit pointer per cell to zero, we only
|
|
118
|
+
// need to initialize one bit per cell to zero.
|
|
119
|
+
//
|
|
120
|
+
// For very large S2ShapeIndexes the internal memset() call to initialize
|
|
121
|
+
// cells_decoded_ still takes about 4 microseconds per million cells, but
|
|
122
|
+
// this seems reasonable relative to other likely costs (I/O, etc).
|
|
123
|
+
//
|
|
124
|
+
// NOTE(ericv): DO NOT use make_unique<> here! make_unique<> allocates memory
|
|
125
|
+
// using "new T[n]()", which initializes all elements of the array. This
|
|
126
|
+
// slows down some benchmarks by over 100x.
|
|
127
|
+
//
|
|
128
|
+
// cells_ = make_unique<std::atomic<S2ShapeIndexCell*>[]>(cell_ids_.size());
|
|
129
|
+
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
130
|
+
// NO NO NO
|
|
131
|
+
cells_.reset(new std::atomic<S2ShapeIndexCell*>[cell_ids_.size()]);
|
|
132
|
+
cells_decoded_ = vector<std::atomic<uint64>>((cell_ids_.size() + 63) >> 6);
|
|
133
|
+
|
|
134
|
+
return encoded_cells_.Init(decoder);
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
void EncodedS2ShapeIndex::Minimize() {
|
|
138
|
+
if (cells_ == nullptr) return; // Not initialized yet.
|
|
139
|
+
|
|
140
|
+
for (auto& atomic_shape : shapes_) {
|
|
141
|
+
S2Shape* shape = atomic_shape.load(std::memory_order_relaxed);
|
|
142
|
+
if (shape != kUndecodedShape() && shape != nullptr) {
|
|
143
|
+
atomic_shape.store(kUndecodedShape(), std::memory_order_relaxed);
|
|
144
|
+
delete shape;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
if (cell_cache_.size() < max_cell_cache_size()) {
|
|
148
|
+
// When only a tiny fraction of the cells are decoded, we keep track of
|
|
149
|
+
// those cells in cell_cache_ to avoid the cost of scanning the
|
|
150
|
+
// cells_decoded_ vector. (The cost is only about 1 cycle per 64 cells,
|
|
151
|
+
// but for a huge polygon with 1 million cells that's still 16000 cycles.)
|
|
152
|
+
for (int pos : cell_cache_) {
|
|
153
|
+
cells_decoded_[pos >> 6].store(0, std::memory_order_relaxed);
|
|
154
|
+
delete cells_[pos].load(std::memory_order_relaxed);
|
|
155
|
+
}
|
|
156
|
+
} else {
|
|
157
|
+
// Scan the cells_decoded_ vector looking for cells that must be deleted.
|
|
158
|
+
for (int i = cells_decoded_.size(), base = 0; --i >= 0; base += 64) {
|
|
159
|
+
uint64 bits = cells_decoded_[i].load(std::memory_order_relaxed);
|
|
160
|
+
if (bits == 0) continue;
|
|
161
|
+
do {
|
|
162
|
+
int offset = Bits::FindLSBSetNonZero64(bits);
|
|
163
|
+
delete cells_[(i << 6) + offset].load(std::memory_order_relaxed);
|
|
164
|
+
bits &= bits - 1;
|
|
165
|
+
} while (bits != 0);
|
|
166
|
+
cells_decoded_[i].store(0, std::memory_order_relaxed);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
cell_cache_.clear();
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
size_t EncodedS2ShapeIndex::SpaceUsed() const {
|
|
173
|
+
// TODO(ericv): Add SpaceUsed() method to S2Shape base class,and Include
|
|
174
|
+
// memory owned by the allocated S2Shapes (here and in S2ShapeIndex).
|
|
175
|
+
size_t size = sizeof(*this);
|
|
176
|
+
size += shapes_.capacity() * sizeof(std::atomic<S2Shape*>);
|
|
177
|
+
size += cell_ids_.size() * sizeof(std::atomic<S2ShapeIndexCell*>); // cells_
|
|
178
|
+
size += cells_decoded_.capacity() * sizeof(std::atomic<uint64>);
|
|
179
|
+
size += cell_cache_.capacity() * sizeof(int);
|
|
180
|
+
return size;
|
|
181
|
+
}
|