@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,276 @@
|
|
|
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_S2SHAPE_INDEX_H_
|
|
19
|
+
#define S2_ENCODED_S2SHAPE_INDEX_H_
|
|
20
|
+
|
|
21
|
+
#include "s2/encoded_s2cell_id_vector.h"
|
|
22
|
+
#include "s2/encoded_string_vector.h"
|
|
23
|
+
#include "s2/mutable_s2shape_index.h"
|
|
24
|
+
|
|
25
|
+
class EncodedS2ShapeIndex final : public S2ShapeIndex {
|
|
26
|
+
public:
|
|
27
|
+
using Options = MutableS2ShapeIndex::Options;
|
|
28
|
+
using ShapeFactory = S2ShapeIndex::ShapeFactory;
|
|
29
|
+
|
|
30
|
+
// Creates an index that must be initialized by calling Init().
|
|
31
|
+
EncodedS2ShapeIndex();
|
|
32
|
+
|
|
33
|
+
~EncodedS2ShapeIndex() override;
|
|
34
|
+
|
|
35
|
+
// Initializes the EncodedS2ShapeIndex, returning true on success.
|
|
36
|
+
//
|
|
37
|
+
// This method does not decode the S2Shape objects in the index; this is
|
|
38
|
+
// the responsibility of the client-provided function "shape_factory"
|
|
39
|
+
// (see s2shapeutil_coding.h). Example usage:
|
|
40
|
+
//
|
|
41
|
+
// index.Init(decoder, s2shapeutil::LazyDecodeShapeFactory(decoder));
|
|
42
|
+
//
|
|
43
|
+
// Note that the encoded shape vector must *precede* the encoded S2ShapeIndex
|
|
44
|
+
// in the Decoder's data buffer in this example.
|
|
45
|
+
bool Init(Decoder* decoder, const ShapeFactory& shape_factory);
|
|
46
|
+
|
|
47
|
+
const Options& options() const { return options_; }
|
|
48
|
+
|
|
49
|
+
// The number of distinct shape ids in the index. This equals the number of
|
|
50
|
+
// shapes in the index provided that no shapes have ever been removed.
|
|
51
|
+
// (Shape ids are not reused.)
|
|
52
|
+
int num_shape_ids() const override { return shapes_.size(); }
|
|
53
|
+
|
|
54
|
+
// Return a pointer to the shape with the given id, or nullptr if the shape
|
|
55
|
+
// has been removed from the index.
|
|
56
|
+
S2Shape* shape(int id) const override;
|
|
57
|
+
|
|
58
|
+
// Minimizes memory usage by requesting that any data structures that can be
|
|
59
|
+
// rebuilt should be discarded. This method invalidates all iterators.
|
|
60
|
+
//
|
|
61
|
+
// Like all non-const methods, this method is not thread-safe.
|
|
62
|
+
void Minimize() override;
|
|
63
|
+
|
|
64
|
+
class Iterator final : public IteratorBase {
|
|
65
|
+
public:
|
|
66
|
+
// Default constructor; must be followed by a call to Init().
|
|
67
|
+
Iterator();
|
|
68
|
+
|
|
69
|
+
// Constructs an iterator positioned as specified. By default iterators
|
|
70
|
+
// are unpositioned, since this avoids an extra seek in this situation
|
|
71
|
+
// where one of the seek methods (such as Locate) is immediately called.
|
|
72
|
+
//
|
|
73
|
+
// If you want to position the iterator at the beginning, e.g. in order to
|
|
74
|
+
// loop through the entire index, do this instead:
|
|
75
|
+
//
|
|
76
|
+
// for (EncodedS2ShapeIndex::Iterator it(&index, S2ShapeIndex::BEGIN);
|
|
77
|
+
// !it.done(); it.Next()) { ... }
|
|
78
|
+
explicit Iterator(const EncodedS2ShapeIndex* index,
|
|
79
|
+
InitialPosition pos = UNPOSITIONED);
|
|
80
|
+
|
|
81
|
+
// Initializes an iterator for the given EncodedS2ShapeIndex.
|
|
82
|
+
void Init(const EncodedS2ShapeIndex* index,
|
|
83
|
+
InitialPosition pos = UNPOSITIONED);
|
|
84
|
+
|
|
85
|
+
// Inherited non-virtual methods:
|
|
86
|
+
// S2CellId id() const;
|
|
87
|
+
// const S2ShapeIndexCell& cell() const;
|
|
88
|
+
// bool done() const;
|
|
89
|
+
// S2Point center() const;
|
|
90
|
+
|
|
91
|
+
// IteratorBase API:
|
|
92
|
+
void Begin() override;
|
|
93
|
+
void Finish() override;
|
|
94
|
+
void Next() override;
|
|
95
|
+
bool Prev() override;
|
|
96
|
+
void Seek(S2CellId target) override;
|
|
97
|
+
bool Locate(const S2Point& target) override;
|
|
98
|
+
CellRelation Locate(S2CellId target) override;
|
|
99
|
+
|
|
100
|
+
protected:
|
|
101
|
+
const S2ShapeIndexCell* GetCell() const override;
|
|
102
|
+
std::unique_ptr<IteratorBase> Clone() const override;
|
|
103
|
+
void Copy(const IteratorBase& other) override;
|
|
104
|
+
|
|
105
|
+
private:
|
|
106
|
+
void Refresh(); // Updates the IteratorBase fields.
|
|
107
|
+
const EncodedS2ShapeIndex* index_;
|
|
108
|
+
int32 cell_pos_; // Current position in the vector of index cells.
|
|
109
|
+
int32 num_cells_;
|
|
110
|
+
};
|
|
111
|
+
|
|
112
|
+
// Returns the number of bytes currently occupied by the index (including any
|
|
113
|
+
// unused space at the end of vectors, etc). It has the same thread safety
|
|
114
|
+
// as the other "const" methods (see introduction).
|
|
115
|
+
size_t SpaceUsed() const override;
|
|
116
|
+
|
|
117
|
+
protected:
|
|
118
|
+
std::unique_ptr<IteratorBase> NewIterator(InitialPosition pos) const override;
|
|
119
|
+
|
|
120
|
+
private:
|
|
121
|
+
friend class Iterator;
|
|
122
|
+
|
|
123
|
+
// Returns a value indicating that a shape has not been decoded yet.
|
|
124
|
+
inline static S2Shape* kUndecodedShape() {
|
|
125
|
+
return reinterpret_cast<S2Shape*>(1);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
// Like std::atomic<S2Shape*>, but defaults to kUndecodedShape().
|
|
129
|
+
class AtomicShape : public std::atomic<S2Shape*> {
|
|
130
|
+
public:
|
|
131
|
+
AtomicShape() : std::atomic<S2Shape*>(kUndecodedShape()) {}
|
|
132
|
+
};
|
|
133
|
+
|
|
134
|
+
S2Shape* GetShape(int id) const;
|
|
135
|
+
const S2ShapeIndexCell* GetCell(int i) const;
|
|
136
|
+
bool cell_decoded(int i) const;
|
|
137
|
+
bool test_and_set_cell_decoded(int i) const;
|
|
138
|
+
int max_cell_cache_size() const;
|
|
139
|
+
|
|
140
|
+
std::unique_ptr<ShapeFactory> shape_factory_;
|
|
141
|
+
|
|
142
|
+
// The options specified for this index.
|
|
143
|
+
Options options_;
|
|
144
|
+
|
|
145
|
+
// A vector containing all shapes in the index. Initially all shapes are
|
|
146
|
+
// set to kUndecodedShape(); as shapes are decoded, they are added to the
|
|
147
|
+
// vector using std::atomic::compare_exchange_strong.
|
|
148
|
+
mutable std::vector<AtomicShape> shapes_;
|
|
149
|
+
|
|
150
|
+
// A vector containing the S2CellIds of each cell in the index.
|
|
151
|
+
s2coding::EncodedS2CellIdVector cell_ids_;
|
|
152
|
+
|
|
153
|
+
// A vector containing the encoded contents of each cell in the index.
|
|
154
|
+
s2coding::EncodedStringVector encoded_cells_;
|
|
155
|
+
|
|
156
|
+
// A raw array containing the decoded contents of each cell in the index.
|
|
157
|
+
// Initially all values are *uninitialized memory*. The cells_decoded_
|
|
158
|
+
// field below keeps track of which elements are present.
|
|
159
|
+
mutable std::unique_ptr<std::atomic<S2ShapeIndexCell*>[]> cells_;
|
|
160
|
+
|
|
161
|
+
// A bit vector indicating which elements of cells_ have been decoded.
|
|
162
|
+
// All other elements of cells_ contain uninitialized (random) memory.
|
|
163
|
+
mutable std::vector<std::atomic<uint64>> cells_decoded_;
|
|
164
|
+
|
|
165
|
+
// In order to minimize destructor time when very few cells of a large
|
|
166
|
+
// S2ShapeIndex are needed, we keep track of the indices of the first few
|
|
167
|
+
// cells to be decoded. This lets us avoid scanning the cells_decoded_
|
|
168
|
+
// vector when the number of cells decoded is very small.
|
|
169
|
+
mutable std::vector<int> cell_cache_;
|
|
170
|
+
|
|
171
|
+
// Protects all updates to cells_ and cells_decoded_.
|
|
172
|
+
mutable SpinLock cells_lock_;
|
|
173
|
+
|
|
174
|
+
EncodedS2ShapeIndex(const EncodedS2ShapeIndex&) = delete;
|
|
175
|
+
void operator=(const EncodedS2ShapeIndex&) = delete;
|
|
176
|
+
};
|
|
177
|
+
|
|
178
|
+
|
|
179
|
+
////////////////// Implementation details follow ////////////////////
|
|
180
|
+
|
|
181
|
+
|
|
182
|
+
inline EncodedS2ShapeIndex::Iterator::Iterator() : index_(nullptr) {
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
inline EncodedS2ShapeIndex::Iterator::Iterator(
|
|
186
|
+
const EncodedS2ShapeIndex* index, InitialPosition pos) {
|
|
187
|
+
Init(index, pos);
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
inline void EncodedS2ShapeIndex::Iterator::Init(
|
|
191
|
+
const EncodedS2ShapeIndex* index, InitialPosition pos) {
|
|
192
|
+
index_ = index;
|
|
193
|
+
num_cells_ = index->cell_ids_.size();
|
|
194
|
+
cell_pos_ = (pos == BEGIN) ? 0 : num_cells_;
|
|
195
|
+
Refresh();
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
inline void EncodedS2ShapeIndex::Iterator::Refresh() {
|
|
199
|
+
if (cell_pos_ == num_cells_) {
|
|
200
|
+
set_finished();
|
|
201
|
+
} else {
|
|
202
|
+
// It's faster to initialize the cell to nullptr even if it has already
|
|
203
|
+
// been decoded, since algorithms frequently don't need it (i.e., based on
|
|
204
|
+
// the S2CellId they might not need to look at the cell contents).
|
|
205
|
+
set_state(index_->cell_ids_[cell_pos_], nullptr);
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
inline void EncodedS2ShapeIndex::Iterator::Begin() {
|
|
210
|
+
cell_pos_ = 0;
|
|
211
|
+
Refresh();
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
inline void EncodedS2ShapeIndex::Iterator::Finish() {
|
|
215
|
+
cell_pos_ = num_cells_;
|
|
216
|
+
Refresh();
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
inline void EncodedS2ShapeIndex::Iterator::Next() {
|
|
220
|
+
S2_DCHECK(!done());
|
|
221
|
+
++cell_pos_;
|
|
222
|
+
Refresh();
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
inline bool EncodedS2ShapeIndex::Iterator::Prev() {
|
|
226
|
+
if (cell_pos_ == 0) return false;
|
|
227
|
+
--cell_pos_;
|
|
228
|
+
Refresh();
|
|
229
|
+
return true;
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
inline void EncodedS2ShapeIndex::Iterator::Seek(S2CellId target) {
|
|
233
|
+
cell_pos_ = index_->cell_ids_.lower_bound(target);
|
|
234
|
+
Refresh();
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
inline std::unique_ptr<EncodedS2ShapeIndex::IteratorBase>
|
|
238
|
+
EncodedS2ShapeIndex::NewIterator(InitialPosition pos) const {
|
|
239
|
+
return absl::make_unique<Iterator>(this, pos);
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
inline S2Shape* EncodedS2ShapeIndex::shape(int id) const {
|
|
243
|
+
S2Shape* shape = shapes_[id].load(std::memory_order_relaxed);
|
|
244
|
+
if (shape != kUndecodedShape()) return shape;
|
|
245
|
+
return GetShape(id);
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
// Returns true if the given cell has been decoded yet.
|
|
249
|
+
inline bool EncodedS2ShapeIndex::cell_decoded(int i) const {
|
|
250
|
+
uint64 group_bits = cells_decoded_[i >> 6].load(std::memory_order_relaxed);
|
|
251
|
+
return (group_bits & (1ULL << (i & 63))) != 0;
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
// Marks the given cell as decoded and returns true if it was already marked.
|
|
255
|
+
inline bool EncodedS2ShapeIndex::test_and_set_cell_decoded(int i) const {
|
|
256
|
+
std::atomic<uint64>* group = &cells_decoded_[i >> 6];
|
|
257
|
+
uint64 group_bits = group->load(std::memory_order_relaxed);
|
|
258
|
+
uint64 test_bit = 1ULL << (i & 63);
|
|
259
|
+
group->store(group_bits | test_bit, std::memory_order_relaxed);
|
|
260
|
+
return (group_bits & test_bit) != 0;
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
inline int EncodedS2ShapeIndex::max_cell_cache_size() const {
|
|
264
|
+
// The cell cache is sized so that scanning decoded_cells_ in the destructor
|
|
265
|
+
// costs about 30 cycles per decoded cell in the worst case. (This overhead
|
|
266
|
+
// is acceptable relative to the other costs of decoding each cell.)
|
|
267
|
+
//
|
|
268
|
+
// For example, if there are 65,536 cells then we won't need to scan
|
|
269
|
+
// encoded_cells_ unless we decode at least (65536/2048) == 32 cells. It
|
|
270
|
+
// takes about 1 cycle per 64 cells to scan encoded_cells_, so that works
|
|
271
|
+
// out to (65536/64) == 1024 cycles. However this cost is amortized over
|
|
272
|
+
// the 32 cells decoded, which works out to 32 cycles per cell.
|
|
273
|
+
return cell_ids_.size() >> 11;
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
#endif // S2_ENCODED_S2SHAPE_INDEX_H_
|
|
@@ -0,0 +1,244 @@
|
|
|
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 <map>
|
|
21
|
+
#include <vector>
|
|
22
|
+
#include <gtest/gtest.h>
|
|
23
|
+
#include "s2/third_party/absl/memory/memory.h"
|
|
24
|
+
#include "s2/third_party/absl/strings/str_cat.h"
|
|
25
|
+
#include "s2/mutable_s2shape_index.h"
|
|
26
|
+
#include "s2/s2builder.h"
|
|
27
|
+
#include "s2/s2builderutil_s2polyline_layer.h"
|
|
28
|
+
#include "s2/s2builderutil_snap_functions.h"
|
|
29
|
+
#include "s2/s2cap.h"
|
|
30
|
+
#include "s2/s2closest_edge_query.h"
|
|
31
|
+
#include "s2/s2contains_point_query.h"
|
|
32
|
+
#include "s2/s2edge_distances.h"
|
|
33
|
+
#include "s2/s2latlng.h"
|
|
34
|
+
#include "s2/s2lax_polygon_shape.h"
|
|
35
|
+
#include "s2/s2lax_polyline_shape.h"
|
|
36
|
+
#include "s2/s2loop.h"
|
|
37
|
+
#include "s2/s2point_vector_shape.h"
|
|
38
|
+
#include "s2/s2pointutil.h"
|
|
39
|
+
#include "s2/s2shapeutil_coding.h"
|
|
40
|
+
#include "s2/s2shapeutil_testing.h"
|
|
41
|
+
#include "s2/s2testing.h"
|
|
42
|
+
#include "s2/s2text_format.h"
|
|
43
|
+
|
|
44
|
+
using absl::make_unique;
|
|
45
|
+
using absl::StrCat;
|
|
46
|
+
using s2builderutil::S2CellIdSnapFunction;
|
|
47
|
+
using s2builderutil::S2PolylineLayer;
|
|
48
|
+
using std::max;
|
|
49
|
+
using std::unique_ptr;
|
|
50
|
+
using std::vector;
|
|
51
|
+
|
|
52
|
+
template <class Shape>
|
|
53
|
+
bool DecodeHomegeneousShapeIndex(EncodedS2ShapeIndex* index, Decoder* decoder) {
|
|
54
|
+
return index->Init(decoder,
|
|
55
|
+
s2shapeutil::HomogeneousShapeFactory<Shape>(decoder));
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
template <class InShape, class OutShape>
|
|
59
|
+
void TestEncodedS2ShapeIndex(const MutableS2ShapeIndex& expected,
|
|
60
|
+
size_t expected_bytes) {
|
|
61
|
+
Encoder encoder;
|
|
62
|
+
s2shapeutil::EncodeHomogeneousShapes<InShape>(expected, &encoder);
|
|
63
|
+
size_t shapes_bytes = encoder.length();
|
|
64
|
+
expected.Encode(&encoder);
|
|
65
|
+
EXPECT_EQ(expected_bytes, encoder.length() - shapes_bytes);
|
|
66
|
+
Decoder decoder(encoder.base(), encoder.length());
|
|
67
|
+
EncodedS2ShapeIndex actual;
|
|
68
|
+
ASSERT_TRUE(DecodeHomegeneousShapeIndex<OutShape>(&actual, &decoder));
|
|
69
|
+
EXPECT_EQ(expected.options().max_edges_per_cell(),
|
|
70
|
+
actual.options().max_edges_per_cell());
|
|
71
|
+
s2testing::ExpectEqual(expected, actual);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
TEST(EncodedS2ShapeIndex, Empty) {
|
|
75
|
+
MutableS2ShapeIndex index;
|
|
76
|
+
TestEncodedS2ShapeIndex<S2LaxPolylineShape, S2LaxPolylineShape>(index, 4);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
TEST(EncodedS2ShapeIndex, OneEdge) {
|
|
80
|
+
MutableS2ShapeIndex index;
|
|
81
|
+
index.Add(s2textformat::MakeLaxPolylineOrDie("1:1, 2:2"));
|
|
82
|
+
TestEncodedS2ShapeIndex<S2LaxPolylineShape, S2LaxPolylineShape>(index, 8);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
TEST(EncodedS2ShapeIndex, RegularLoops) {
|
|
86
|
+
struct TestCase {
|
|
87
|
+
int num_edges;
|
|
88
|
+
size_t expected_bytes;
|
|
89
|
+
};
|
|
90
|
+
vector<TestCase> test_cases = {
|
|
91
|
+
{4, 8},
|
|
92
|
+
{8, 8},
|
|
93
|
+
{16, 16},
|
|
94
|
+
{64, 77},
|
|
95
|
+
{256, 327},
|
|
96
|
+
{4096, 8813},
|
|
97
|
+
{65536, 168291},
|
|
98
|
+
};
|
|
99
|
+
for (const auto& test_case : test_cases) {
|
|
100
|
+
MutableS2ShapeIndex index;
|
|
101
|
+
S2Testing::rnd.Reset(test_case.num_edges);
|
|
102
|
+
SCOPED_TRACE(StrCat("num_edges = ", test_case.num_edges));
|
|
103
|
+
S2Polygon polygon(S2Loop::MakeRegularLoop(S2Point(3, 2, 1).Normalize(),
|
|
104
|
+
S1Angle::Degrees(0.1),
|
|
105
|
+
test_case.num_edges));
|
|
106
|
+
index.Add(make_unique<S2LaxPolygonShape>(polygon));
|
|
107
|
+
TestEncodedS2ShapeIndex<S2LaxPolygonShape, EncodedS2LaxPolygonShape>(
|
|
108
|
+
index, test_case.expected_bytes);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
TEST(EncodedS2ShapeIndex, OverlappingPointClouds) {
|
|
113
|
+
struct TestCase {
|
|
114
|
+
int num_shapes, num_points_per_shape;
|
|
115
|
+
size_t expected_bytes;
|
|
116
|
+
};
|
|
117
|
+
vector<TestCase> test_cases = {
|
|
118
|
+
{1, 50, 83},
|
|
119
|
+
{2, 100, 583},
|
|
120
|
+
{4, 100, 1383},
|
|
121
|
+
};
|
|
122
|
+
S2Cap cap(S2Point(0.1, -0.4, 0.3).Normalize(), S1Angle::Degrees(1));
|
|
123
|
+
for (const auto& test_case : test_cases) {
|
|
124
|
+
MutableS2ShapeIndex index;
|
|
125
|
+
S2Testing::rnd.Reset(test_case.num_shapes);
|
|
126
|
+
SCOPED_TRACE(StrCat("num_shapes = ", test_case.num_shapes));
|
|
127
|
+
for (int i = 0; i < test_case.num_shapes; ++i) {
|
|
128
|
+
vector<S2Point> points;
|
|
129
|
+
for (int j = 0; j < test_case.num_points_per_shape; ++j) {
|
|
130
|
+
points.push_back(S2Testing::SamplePoint(cap));
|
|
131
|
+
}
|
|
132
|
+
index.Add(make_unique<S2PointVectorShape>(points));
|
|
133
|
+
}
|
|
134
|
+
TestEncodedS2ShapeIndex<S2PointVectorShape, EncodedS2PointVectorShape>(
|
|
135
|
+
index, test_case.expected_bytes);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
TEST(EncodedS2ShapeIndex, OverlappingPolylines) {
|
|
140
|
+
struct TestCase {
|
|
141
|
+
int num_shapes, num_shape_edges;
|
|
142
|
+
size_t expected_bytes;
|
|
143
|
+
};
|
|
144
|
+
vector<TestCase> test_cases = {
|
|
145
|
+
{2, 50, 139},
|
|
146
|
+
{10, 50, 777},
|
|
147
|
+
{20, 50, 2219},
|
|
148
|
+
};
|
|
149
|
+
S2Cap cap(S2Point(-0.2, -0.3, 0.4).Normalize(), S1Angle::Degrees(0.1));
|
|
150
|
+
for (const auto& test_case : test_cases) {
|
|
151
|
+
S1Angle edge_len = 2 * cap.GetRadius() / test_case.num_shape_edges;
|
|
152
|
+
MutableS2ShapeIndex index;
|
|
153
|
+
S2Testing::rnd.Reset(test_case.num_shapes);
|
|
154
|
+
SCOPED_TRACE(StrCat("num_shapes = ", test_case.num_shapes));
|
|
155
|
+
for (int i = 0; i < test_case.num_shapes; ++i) {
|
|
156
|
+
S2Point a = S2Testing::SamplePoint(cap), b = S2Testing::RandomPoint();
|
|
157
|
+
vector<S2Point> vertices;
|
|
158
|
+
int n = test_case.num_shape_edges;
|
|
159
|
+
for (int j = 0; j <= n; ++j) {
|
|
160
|
+
vertices.push_back(S2::InterpolateAtDistance(j * edge_len, a, b));
|
|
161
|
+
}
|
|
162
|
+
index.Add(make_unique<S2LaxPolylineShape>(vertices));
|
|
163
|
+
}
|
|
164
|
+
TestEncodedS2ShapeIndex<S2LaxPolylineShape, EncodedS2LaxPolylineShape>(
|
|
165
|
+
index, test_case.expected_bytes);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
TEST(EncodedS2ShapeIndex, OverlappingLoops) {
|
|
170
|
+
struct TestCase {
|
|
171
|
+
int num_shapes, max_edges_per_loop;
|
|
172
|
+
size_t expected_bytes;
|
|
173
|
+
};
|
|
174
|
+
vector<TestCase> test_cases = {
|
|
175
|
+
{2, 250, 138},
|
|
176
|
+
{5, 250, 1084},
|
|
177
|
+
{25, 50, 3673},
|
|
178
|
+
};
|
|
179
|
+
S2Cap cap(S2Point(-0.1, 0.25, 0.2).Normalize(), S1Angle::Degrees(3));
|
|
180
|
+
for (const auto& test_case : test_cases) {
|
|
181
|
+
MutableS2ShapeIndex index;
|
|
182
|
+
S2Testing::rnd.Reset(test_case.num_shapes);
|
|
183
|
+
SCOPED_TRACE(StrCat("num_shapes = ", test_case.num_shapes));
|
|
184
|
+
for (int i = 0; i < test_case.num_shapes; ++i) {
|
|
185
|
+
S2Point center = S2Testing::SamplePoint(cap);
|
|
186
|
+
double radius_fraction = S2Testing::rnd.RandDouble();
|
|
187
|
+
// Scale the number of edges so that they are all about the same length
|
|
188
|
+
// (similar to modeling all geometry at a similar resolution).
|
|
189
|
+
int num_edges = max(3.0, test_case.max_edges_per_loop * radius_fraction);
|
|
190
|
+
S2Polygon polygon(S2Loop::MakeRegularLoop(
|
|
191
|
+
center, cap.GetRadius() * radius_fraction, num_edges));
|
|
192
|
+
index.Add(make_unique<S2LaxPolygonShape>(polygon));
|
|
193
|
+
}
|
|
194
|
+
TestEncodedS2ShapeIndex<S2LaxPolygonShape, EncodedS2LaxPolygonShape>(
|
|
195
|
+
index, test_case.expected_bytes);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
// Like S2PolylineLayer, but converts the polyline to an S2LaxPolylineShape
|
|
200
|
+
// and adds it to an S2ShapeIndex (if the polyline is non-empty).
|
|
201
|
+
class IndexedLaxPolylineLayer : public S2Builder::Layer {
|
|
202
|
+
public:
|
|
203
|
+
using Options = S2PolylineLayer::Options;
|
|
204
|
+
explicit IndexedLaxPolylineLayer(MutableS2ShapeIndex* index,
|
|
205
|
+
const Options& options = Options())
|
|
206
|
+
: index_(index), polyline_(make_unique<S2Polyline>()),
|
|
207
|
+
layer_(polyline_.get(), options) {}
|
|
208
|
+
|
|
209
|
+
GraphOptions graph_options() const override {
|
|
210
|
+
return layer_.graph_options();
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
void Build(const Graph& g, S2Error* error) override {
|
|
214
|
+
layer_.Build(g, error);
|
|
215
|
+
if (error->ok() && polyline_->num_vertices() > 0) {
|
|
216
|
+
index_->Add(absl::make_unique<S2LaxPolylineShape>(*polyline_));
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
private:
|
|
221
|
+
MutableS2ShapeIndex* index_;
|
|
222
|
+
std::unique_ptr<S2Polyline> polyline_;
|
|
223
|
+
S2PolylineLayer layer_;
|
|
224
|
+
};
|
|
225
|
+
|
|
226
|
+
TEST(EncodedS2ShapeIndex, SnappedFractalPolylines) {
|
|
227
|
+
MutableS2ShapeIndex index;
|
|
228
|
+
S2Builder builder{S2Builder::Options{S2CellIdSnapFunction()}};
|
|
229
|
+
for (int i = 0; i < 5; ++i) {
|
|
230
|
+
builder.StartLayer(make_unique<IndexedLaxPolylineLayer>(&index));
|
|
231
|
+
S2Testing::Fractal fractal;
|
|
232
|
+
fractal.SetLevelForApproxMaxEdges(3 * 256);
|
|
233
|
+
auto frame = S2::GetFrame(S2LatLng::FromDegrees(10, i).ToPoint());
|
|
234
|
+
auto loop = fractal.MakeLoop(frame, S1Angle::Degrees(0.1));
|
|
235
|
+
std::vector<S2Point> vertices;
|
|
236
|
+
S2Testing::AppendLoopVertices(*loop, &vertices);
|
|
237
|
+
S2Polyline polyline(vertices);
|
|
238
|
+
builder.AddPolyline(polyline);
|
|
239
|
+
}
|
|
240
|
+
S2Error error;
|
|
241
|
+
ASSERT_TRUE(builder.Build(&error)) << error.text();
|
|
242
|
+
TestEncodedS2ShapeIndex<S2LaxPolylineShape, EncodedS2LaxPolylineShape>(
|
|
243
|
+
index, 8698);
|
|
244
|
+
}
|
|
@@ -0,0 +1,66 @@
|
|
|
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_string_vector.h"
|
|
19
|
+
|
|
20
|
+
using absl::MakeSpan;
|
|
21
|
+
using absl::Span;
|
|
22
|
+
using absl::string_view;
|
|
23
|
+
using std::vector;
|
|
24
|
+
|
|
25
|
+
namespace s2coding {
|
|
26
|
+
|
|
27
|
+
StringVectorEncoder::StringVectorEncoder() {
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
void StringVectorEncoder::Encode(Encoder* encoder) {
|
|
31
|
+
offsets_.push_back(data_.length());
|
|
32
|
+
// We don't encode the first element of "offsets_", which is always zero.
|
|
33
|
+
EncodeUintVector<uint64>(
|
|
34
|
+
MakeSpan(offsets_.data() + 1, offsets_.data() + offsets_.size()),
|
|
35
|
+
encoder);
|
|
36
|
+
encoder->Ensure(data_.length());
|
|
37
|
+
encoder->putn(data_.base(), data_.length());
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
void StringVectorEncoder::Encode(Span<const string> v, Encoder* encoder) {
|
|
41
|
+
StringVectorEncoder string_vector;
|
|
42
|
+
for (const auto& str : v) string_vector.Add(str);
|
|
43
|
+
string_vector.Encode(encoder);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
bool EncodedStringVector::Init(Decoder* decoder) {
|
|
47
|
+
if (!offsets_.Init(decoder)) return false;
|
|
48
|
+
data_ = reinterpret_cast<const char*>(decoder->ptr());
|
|
49
|
+
if (offsets_.size() > 0) {
|
|
50
|
+
uint64 length = offsets_[offsets_.size() - 1];
|
|
51
|
+
if (decoder->avail() < length) return false;
|
|
52
|
+
decoder->skip(length);
|
|
53
|
+
}
|
|
54
|
+
return true;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
vector<string_view> EncodedStringVector::Decode() const {
|
|
58
|
+
size_t n = size();
|
|
59
|
+
vector<string_view> result(n);
|
|
60
|
+
for (int i = 0; i < n; ++i) {
|
|
61
|
+
result[i] = (*this)[i];
|
|
62
|
+
}
|
|
63
|
+
return result;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
} // namespace s2coding
|