@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,164 @@
|
|
|
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_STRING_VECTOR_H_
|
|
19
|
+
#define S2_ENCODED_STRING_VECTOR_H_
|
|
20
|
+
|
|
21
|
+
#include <memory>
|
|
22
|
+
#include <string>
|
|
23
|
+
#include "s2/third_party/absl/strings/string_view.h"
|
|
24
|
+
#include "s2/third_party/absl/types/span.h"
|
|
25
|
+
#include "s2/encoded_uint_vector.h"
|
|
26
|
+
|
|
27
|
+
namespace s2coding {
|
|
28
|
+
|
|
29
|
+
// This class allows an EncodedStringVector to be created by adding strings
|
|
30
|
+
// incrementally. It also supports adding strings that are the output of
|
|
31
|
+
// another Encoder. For example, to create a vector of encoded S2Polygons,
|
|
32
|
+
// you can do this:
|
|
33
|
+
//
|
|
34
|
+
// void EncodePolygons(const vector<S2Polygon*>& polygons, Encoder* encoder) {
|
|
35
|
+
// StringVectorEncoder encoded_polygons;
|
|
36
|
+
// for (auto polygon : polygons) {
|
|
37
|
+
// polygon->Encode(encoded_polygons.AddViaEncoder());
|
|
38
|
+
// }
|
|
39
|
+
// encoded_polygons.Encode(encoder);
|
|
40
|
+
// }
|
|
41
|
+
class StringVectorEncoder {
|
|
42
|
+
public:
|
|
43
|
+
StringVectorEncoder();
|
|
44
|
+
|
|
45
|
+
// Adds a string to the encoded vector.
|
|
46
|
+
void Add(const string& str);
|
|
47
|
+
|
|
48
|
+
// Adds a string to the encoded vector by means of the given Encoder. The
|
|
49
|
+
// string consists of all output added to the encoder before the next call
|
|
50
|
+
// to any method of this class (after which the encoder is no longer valid).
|
|
51
|
+
Encoder* AddViaEncoder();
|
|
52
|
+
|
|
53
|
+
// Appends the EncodedStringVector representation to the given Encoder.
|
|
54
|
+
//
|
|
55
|
+
// REQUIRES: "encoder" uses the default constructor, so that its buffer
|
|
56
|
+
// can be enlarged as necessary by calling Ensure(int).
|
|
57
|
+
void Encode(Encoder* encoder);
|
|
58
|
+
|
|
59
|
+
// Encodes a vector of strings in a format that can later be decoded as an
|
|
60
|
+
// EncodedStringVector.
|
|
61
|
+
//
|
|
62
|
+
// REQUIRES: "encoder" uses the default constructor, so that its buffer
|
|
63
|
+
// can be enlarged as necessary by calling Ensure(int).
|
|
64
|
+
static void Encode(absl::Span<const string> v, Encoder* encoder);
|
|
65
|
+
|
|
66
|
+
private:
|
|
67
|
+
// A vector consisting of the starting offset of each string in the
|
|
68
|
+
// encoder's data buffer, plus a final entry pointing just past the end of
|
|
69
|
+
// the last string.
|
|
70
|
+
std::vector<uint64> offsets_;
|
|
71
|
+
Encoder data_;
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
// This class represents an encoded vector of strings. Values are decoded
|
|
75
|
+
// only when they are accessed. This allows for very fast initialization and
|
|
76
|
+
// no additional memory use beyond the encoded data. The encoded data is not
|
|
77
|
+
// owned by this class; typically it points into a large contiguous buffer
|
|
78
|
+
// that contains other encoded data as well.
|
|
79
|
+
//
|
|
80
|
+
// This is one of several helper classes that allow complex data structures to
|
|
81
|
+
// be initialized from an encoded format in constant time and then decoded on
|
|
82
|
+
// demand. This can be a big performance advantage when only a small part of
|
|
83
|
+
// the data structure is actually used.
|
|
84
|
+
class EncodedStringVector {
|
|
85
|
+
public:
|
|
86
|
+
// Constructs an uninitialized object; requires Init() to be called.
|
|
87
|
+
EncodedStringVector() {}
|
|
88
|
+
|
|
89
|
+
// Initializes the EncodedStringVector. Returns false on errors, leaving
|
|
90
|
+
// the vector in an unspecified state.
|
|
91
|
+
//
|
|
92
|
+
// REQUIRES: The Decoder data buffer must outlive this object.
|
|
93
|
+
bool Init(Decoder* decoder);
|
|
94
|
+
|
|
95
|
+
// Resets the vector to be empty.
|
|
96
|
+
void Clear();
|
|
97
|
+
|
|
98
|
+
// Returns the size of the original vector.
|
|
99
|
+
size_t size() const;
|
|
100
|
+
|
|
101
|
+
// Returns the string at the given index.
|
|
102
|
+
absl::string_view operator[](int i) const;
|
|
103
|
+
|
|
104
|
+
// Returns a Decoder initialized with the string at the given index.
|
|
105
|
+
Decoder GetDecoder(int i) const;
|
|
106
|
+
|
|
107
|
+
// Returns a pointer to the start of the string at the given index. This is
|
|
108
|
+
// faster than operator[] but returns an unbounded string.
|
|
109
|
+
const char* GetStart(int i) const;
|
|
110
|
+
|
|
111
|
+
// Returns the entire vector of original strings. Requires that the
|
|
112
|
+
// data buffer passed to the constructor persists until the result vector is
|
|
113
|
+
// no longer needed.
|
|
114
|
+
std::vector<absl::string_view> Decode() const;
|
|
115
|
+
|
|
116
|
+
private:
|
|
117
|
+
EncodedUintVector<uint64> offsets_;
|
|
118
|
+
const char* data_;
|
|
119
|
+
};
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
////////////////// Implementation details follow ////////////////////
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
inline void StringVectorEncoder::Add(const string& str) {
|
|
126
|
+
offsets_.push_back(data_.length());
|
|
127
|
+
data_.Ensure(str.size());
|
|
128
|
+
data_.putn(str.data(), str.size());
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
inline Encoder* StringVectorEncoder::AddViaEncoder() {
|
|
132
|
+
offsets_.push_back(data_.length());
|
|
133
|
+
return &data_;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
inline void EncodedStringVector::Clear() {
|
|
137
|
+
offsets_.Clear();
|
|
138
|
+
data_ = nullptr;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
inline size_t EncodedStringVector::size() const {
|
|
142
|
+
return offsets_.size();
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
inline absl::string_view EncodedStringVector::operator[](int i) const {
|
|
146
|
+
uint64 start = (i == 0) ? 0 : offsets_[i - 1];
|
|
147
|
+
uint64 limit = offsets_[i];
|
|
148
|
+
return absl::string_view(data_ + start, limit - start);
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
inline Decoder EncodedStringVector::GetDecoder(int i) const {
|
|
152
|
+
uint64 start = (i == 0) ? 0 : offsets_[i - 1];
|
|
153
|
+
uint64 limit = offsets_[i];
|
|
154
|
+
return Decoder(data_ + start, limit - start);
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
inline const char* EncodedStringVector::GetStart(int i) const {
|
|
158
|
+
uint64 start = (i == 0) ? 0 : offsets_[i - 1];
|
|
159
|
+
return data_ + start;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
} // namespace s2coding
|
|
163
|
+
|
|
164
|
+
#endif // S2_ENCODED_STRING_VECTOR_H_
|
|
@@ -0,0 +1,69 @@
|
|
|
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
|
+
#include <vector>
|
|
21
|
+
#include <gtest/gtest.h>
|
|
22
|
+
#include "s2/third_party/absl/strings/string_view.h"
|
|
23
|
+
|
|
24
|
+
using absl::string_view;
|
|
25
|
+
using std::vector;
|
|
26
|
+
|
|
27
|
+
namespace s2coding {
|
|
28
|
+
|
|
29
|
+
void TestEncodedStringVector(const vector<string>& input,
|
|
30
|
+
size_t expected_bytes) {
|
|
31
|
+
Encoder encoder;
|
|
32
|
+
StringVectorEncoder::Encode(input, &encoder);
|
|
33
|
+
EXPECT_EQ(expected_bytes, encoder.length());
|
|
34
|
+
Decoder decoder(encoder.base(), encoder.length());
|
|
35
|
+
EncodedStringVector actual;
|
|
36
|
+
ASSERT_TRUE(actual.Init(&decoder));
|
|
37
|
+
vector<string_view> expected;
|
|
38
|
+
for (const auto& str : input) {
|
|
39
|
+
expected.push_back(string_view(str));
|
|
40
|
+
}
|
|
41
|
+
EXPECT_EQ(actual.Decode(), expected);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
TEST(EncodedStringVectorTest, Empty) {
|
|
45
|
+
TestEncodedStringVector({}, 1);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
TEST(EncodedStringVectorTest, EmptyString) {
|
|
49
|
+
TestEncodedStringVector({""}, 2);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
TEST(EncodedStringVectorTest, RepeatedEmptyStrings) {
|
|
53
|
+
TestEncodedStringVector({"", "", ""}, 4);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
TEST(EncodedStringVectorTest, OneString) {
|
|
57
|
+
TestEncodedStringVector({"apples"}, 8);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
TEST(EncodedStringVectorTest, TwoStrings) {
|
|
61
|
+
TestEncodedStringVector({"fuji", "mutsu"}, 12);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
TEST(EncodedStringVectorTest, TwoBigStrings) {
|
|
65
|
+
TestEncodedStringVector({string(10000, 'x'), string(100000, 'y')},
|
|
66
|
+
110007);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
} // namespace s2coding
|
|
@@ -0,0 +1,299 @@
|
|
|
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_UINT_VECTOR_H_
|
|
19
|
+
#define S2_ENCODED_UINT_VECTOR_H_
|
|
20
|
+
|
|
21
|
+
#include <type_traits>
|
|
22
|
+
#include <vector>
|
|
23
|
+
#include "s2/third_party/absl/base/internal/unaligned_access.h"
|
|
24
|
+
#include "s2/third_party/absl/types/span.h"
|
|
25
|
+
#include "s2/util/coding/coder.h"
|
|
26
|
+
|
|
27
|
+
namespace s2coding {
|
|
28
|
+
|
|
29
|
+
// Encodes a vector of unsigned integers in a format that can later be
|
|
30
|
+
// decoded as an EncodedUintVector.
|
|
31
|
+
//
|
|
32
|
+
// REQUIRES: T is an unsigned integer type.
|
|
33
|
+
// REQUIRES: 2 <= sizeof(T) <= 8
|
|
34
|
+
// REQUIRES: "encoder" uses the default constructor, so that its buffer
|
|
35
|
+
// can be enlarged as necessary by calling Ensure(int).
|
|
36
|
+
template <class T>
|
|
37
|
+
void EncodeUintVector(absl::Span<const T> v, Encoder* encoder);
|
|
38
|
+
|
|
39
|
+
// This class represents an encoded vector of unsigned integers of type T.
|
|
40
|
+
// Values are decoded only when they are accessed. This allows for very fast
|
|
41
|
+
// initialization and no additional memory use beyond the encoded data.
|
|
42
|
+
// The encoded data is not owned by this class; typically it points into a
|
|
43
|
+
// large contiguous buffer that contains other encoded data as well.
|
|
44
|
+
//
|
|
45
|
+
// This is one of several helper classes that allow complex data structures to
|
|
46
|
+
// be initialized from an encoded format in constant time and then decoded on
|
|
47
|
+
// demand. This can be a big performance advantage when only a small part of
|
|
48
|
+
// the data structure is actually used.
|
|
49
|
+
//
|
|
50
|
+
// Values are encoded using a fixed number of bytes per value, where the
|
|
51
|
+
// number of bytes depends on the largest value present.
|
|
52
|
+
//
|
|
53
|
+
// REQUIRES: T is an unsigned integer type.
|
|
54
|
+
// REQUIRES: 2 <= sizeof(T) <= 8
|
|
55
|
+
template <class T>
|
|
56
|
+
class EncodedUintVector {
|
|
57
|
+
public:
|
|
58
|
+
static_assert(std::is_unsigned<T>::value, "Unsupported signed integer");
|
|
59
|
+
static_assert(sizeof(T) & 0xe, "Unsupported integer length");
|
|
60
|
+
|
|
61
|
+
// Constructs an uninitialized object; requires Init() to be called.
|
|
62
|
+
EncodedUintVector() {}
|
|
63
|
+
|
|
64
|
+
// Initializes the EncodedUintVector. Returns false on errors, leaving the
|
|
65
|
+
// vector in an unspecified state.
|
|
66
|
+
//
|
|
67
|
+
// REQUIRES: The Decoder data buffer must outlive this object.
|
|
68
|
+
bool Init(Decoder* decoder);
|
|
69
|
+
|
|
70
|
+
// Resets the vector to be empty.
|
|
71
|
+
void Clear();
|
|
72
|
+
|
|
73
|
+
// Returns the size of the original vector.
|
|
74
|
+
size_t size() const;
|
|
75
|
+
|
|
76
|
+
// Returns the element at the given index.
|
|
77
|
+
T operator[](int i) const;
|
|
78
|
+
|
|
79
|
+
// Returns the index of the first element x such that (x >= target), or
|
|
80
|
+
// size() if no such element exists.
|
|
81
|
+
//
|
|
82
|
+
// REQUIRES: The vector elements are sorted in non-decreasing order.
|
|
83
|
+
size_t lower_bound(T target) const;
|
|
84
|
+
|
|
85
|
+
// Decodes and returns the entire original vector.
|
|
86
|
+
std::vector<T> Decode() const;
|
|
87
|
+
|
|
88
|
+
private:
|
|
89
|
+
template <int length> size_t lower_bound(T target) const;
|
|
90
|
+
|
|
91
|
+
const char* data_;
|
|
92
|
+
uint32 size_;
|
|
93
|
+
uint8 len_;
|
|
94
|
+
};
|
|
95
|
+
|
|
96
|
+
// Encodes an unsigned integer in little-endian format using "length" bytes.
|
|
97
|
+
// (The client must ensure that the encoder's buffer is large enough.)
|
|
98
|
+
//
|
|
99
|
+
// REQUIRES: T is an unsigned integer type.
|
|
100
|
+
// REQUIRES: 2 <= sizeof(T) <= 8
|
|
101
|
+
// REQUIRES: 0 <= length <= sizeof(T)
|
|
102
|
+
// REQUIRES: value < 256 ** length
|
|
103
|
+
// REQUIRES: encoder->avail() >= length
|
|
104
|
+
template <class T>
|
|
105
|
+
void EncodeUintWithLength(T value, int length, Encoder* encoder);
|
|
106
|
+
|
|
107
|
+
// Decodes a variable-length integer consisting of "length" bytes starting at
|
|
108
|
+
// "ptr" in little-endian format.
|
|
109
|
+
//
|
|
110
|
+
// REQUIRES: T is an unsigned integer type.
|
|
111
|
+
// REQUIRES: 2 <= sizeof(T) <= 8
|
|
112
|
+
// REQUIRES: 0 <= length <= sizeof(T)
|
|
113
|
+
template <class T>
|
|
114
|
+
T GetUintWithLength(const void* ptr, int length);
|
|
115
|
+
|
|
116
|
+
// Decodes and consumes a variable-length integer consisting of "length" bytes
|
|
117
|
+
// in little-endian format. Returns false if not enough bytes are available.
|
|
118
|
+
//
|
|
119
|
+
// REQUIRES: T is an unsigned integer type.
|
|
120
|
+
// REQUIRES: 2 <= sizeof(T) <= 8
|
|
121
|
+
// REQUIRES: 0 <= length <= sizeof(T)
|
|
122
|
+
template <class T>
|
|
123
|
+
bool DecodeUintWithLength(int length, Decoder* decoder, T* result);
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
////////////////// Implementation details follow ////////////////////
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
template <class T>
|
|
130
|
+
inline void EncodeUintWithLength(T value, int length, Encoder* encoder) {
|
|
131
|
+
static_assert(std::is_unsigned<T>::value, "Unsupported signed integer");
|
|
132
|
+
static_assert(sizeof(T) & 0xe, "Unsupported integer length");
|
|
133
|
+
S2_DCHECK(length >= 0 && length <= sizeof(T));
|
|
134
|
+
S2_DCHECK_GE(encoder->avail(), length);
|
|
135
|
+
|
|
136
|
+
while (--length >= 0) {
|
|
137
|
+
encoder->put8(value);
|
|
138
|
+
value >>= 8;
|
|
139
|
+
}
|
|
140
|
+
S2_DCHECK_EQ(value, 0);
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
template <class T>
|
|
144
|
+
inline T GetUintWithLength(const char* ptr, int length) {
|
|
145
|
+
static_assert(std::is_unsigned<T>::value, "Unsupported signed integer");
|
|
146
|
+
static_assert(sizeof(T) & 0xe, "Unsupported integer length");
|
|
147
|
+
S2_DCHECK(length >= 0 && length <= sizeof(T));
|
|
148
|
+
|
|
149
|
+
// Note that the following code is faster than any of the following:
|
|
150
|
+
//
|
|
151
|
+
// - A loop that repeatedly loads and shifts one byte.
|
|
152
|
+
// - memcpying "length" bytes to a local variable of type T.
|
|
153
|
+
// - A switch statement that handles each length optimally.
|
|
154
|
+
//
|
|
155
|
+
// The following code is slightly faster:
|
|
156
|
+
//
|
|
157
|
+
// T mask = (length == 0) ? 0 : ~T{0} >> 8 * (sizeof(T) - length);
|
|
158
|
+
// return *reinterpret_cast<const T*>(ptr) & mask;
|
|
159
|
+
//
|
|
160
|
+
// However this technique is unsafe because in extremely rare cases it might
|
|
161
|
+
// access out-of-bounds heap memory. (This can only happen if "ptr" is
|
|
162
|
+
// within (sizeof(T) - length) bytes of the end of a memory page and the
|
|
163
|
+
// following page in the address space is unmapped.)
|
|
164
|
+
|
|
165
|
+
if (length & sizeof(T)) {
|
|
166
|
+
if (sizeof(T) == 8) return ABSL_INTERNAL_UNALIGNED_LOAD64(ptr);
|
|
167
|
+
if (sizeof(T) == 4) return ABSL_INTERNAL_UNALIGNED_LOAD32(ptr);
|
|
168
|
+
if (sizeof(T) == 2) return ABSL_INTERNAL_UNALIGNED_LOAD16(ptr);
|
|
169
|
+
S2_DCHECK_EQ(sizeof(T), 1);
|
|
170
|
+
return *ptr;
|
|
171
|
+
}
|
|
172
|
+
T x = 0;
|
|
173
|
+
ptr += length;
|
|
174
|
+
if (sizeof(T) > 4 && (length & 4)) {
|
|
175
|
+
x = ABSL_INTERNAL_UNALIGNED_LOAD32(ptr -= sizeof(uint32));
|
|
176
|
+
}
|
|
177
|
+
if (sizeof(T) > 2 && (length & 2)) {
|
|
178
|
+
x = (x << 16) + ABSL_INTERNAL_UNALIGNED_LOAD16(ptr -= sizeof(uint16));
|
|
179
|
+
}
|
|
180
|
+
if (sizeof(T) > 1 && (length & 1)) {
|
|
181
|
+
x = (x << 8) + static_cast<uint8>(*--ptr);
|
|
182
|
+
}
|
|
183
|
+
return x;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
template <class T>
|
|
187
|
+
bool DecodeUintWithLength(int length, Decoder* decoder, T* result) {
|
|
188
|
+
if (decoder->avail() < length) return false;
|
|
189
|
+
const char* ptr = reinterpret_cast<const char*>(decoder->ptr());
|
|
190
|
+
*result = GetUintWithLength<T>(ptr, length);
|
|
191
|
+
decoder->skip(length);
|
|
192
|
+
return true;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
template <class T>
|
|
196
|
+
void EncodeUintVector(absl::Span<const T> v, Encoder* encoder) {
|
|
197
|
+
// The encoding is as follows:
|
|
198
|
+
//
|
|
199
|
+
// varint64: (v.size() * sizeof(T)) | (len - 1)
|
|
200
|
+
// array of v.size() elements ["len" bytes each]
|
|
201
|
+
//
|
|
202
|
+
// Note that we don't allow (len == 0) since this would require an extra bit
|
|
203
|
+
// to encode the length.
|
|
204
|
+
|
|
205
|
+
T one_bits = 1; // Ensures len >= 1.
|
|
206
|
+
for (auto x : v) one_bits |= x;
|
|
207
|
+
int len = (Bits::FindMSBSetNonZero64(one_bits) >> 3) + 1;
|
|
208
|
+
S2_DCHECK(len >= 1 && len <= 8);
|
|
209
|
+
|
|
210
|
+
// Note that the multiplication is optimized into a bit shift.
|
|
211
|
+
encoder->Ensure(Varint::kMax64 + v.size() * len);
|
|
212
|
+
uint64 size_len = (uint64{v.size()} * sizeof(T)) | (len - 1);
|
|
213
|
+
encoder->put_varint64(size_len);
|
|
214
|
+
for (auto x : v) {
|
|
215
|
+
EncodeUintWithLength(x, len, encoder);
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
template <class T>
|
|
220
|
+
bool EncodedUintVector<T>::Init(Decoder* decoder) {
|
|
221
|
+
uint64 size_len;
|
|
222
|
+
if (!decoder->get_varint64(&size_len)) return false;
|
|
223
|
+
size_ = size_len / sizeof(T); // Optimized into bit shift.
|
|
224
|
+
len_ = (size_len & (sizeof(T) - 1)) + 1;
|
|
225
|
+
if (size_ > std::numeric_limits<size_t>::max() / sizeof(T)) return false;
|
|
226
|
+
size_t bytes = size_ * len_;
|
|
227
|
+
if (decoder->avail() < bytes) return false;
|
|
228
|
+
data_ = reinterpret_cast<const char*>(decoder->ptr());
|
|
229
|
+
decoder->skip(bytes);
|
|
230
|
+
return true;
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
template <class T>
|
|
234
|
+
void EncodedUintVector<T>::Clear() {
|
|
235
|
+
size_ = 0;
|
|
236
|
+
data_ = nullptr;
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
template <class T>
|
|
240
|
+
inline size_t EncodedUintVector<T>::size() const {
|
|
241
|
+
return size_;
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
template <class T>
|
|
245
|
+
inline T EncodedUintVector<T>::operator[](int i) const {
|
|
246
|
+
S2_DCHECK(i >= 0 && i < size_);
|
|
247
|
+
return GetUintWithLength<T>(data_ + i * len_, len_);
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
template <class T>
|
|
251
|
+
size_t EncodedUintVector<T>::lower_bound(T target) const {
|
|
252
|
+
static_assert(sizeof(T) & 0xe, "Unsupported integer length");
|
|
253
|
+
S2_DCHECK(len_ >= 1 && len_ <= sizeof(T));
|
|
254
|
+
|
|
255
|
+
// TODO(ericv): Consider using the unused 28 bits of "len_" to store the
|
|
256
|
+
// last result of lower_bound() to be used as a hint. This should help in
|
|
257
|
+
// common situation where the same element is looked up repeatedly. This
|
|
258
|
+
// would require declaring the new field (length_lower_bound_hint_) as
|
|
259
|
+
// mutable std::atomic<uint32> (accessed using std::memory_order_relaxed)
|
|
260
|
+
// with a custom copy constructor that resets the hint component to zero.
|
|
261
|
+
switch (len_) {
|
|
262
|
+
case 1: return lower_bound<1>(target);
|
|
263
|
+
case 2: return lower_bound<2>(target);
|
|
264
|
+
case 3: return lower_bound<3>(target);
|
|
265
|
+
case 4: return lower_bound<4>(target);
|
|
266
|
+
case 5: return lower_bound<5>(target);
|
|
267
|
+
case 6: return lower_bound<6>(target);
|
|
268
|
+
case 7: return lower_bound<7>(target);
|
|
269
|
+
default: return lower_bound<8>(target);
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
template <class T> template <int length>
|
|
274
|
+
inline size_t EncodedUintVector<T>::lower_bound(T target) const {
|
|
275
|
+
size_t lo = 0, hi = size_;
|
|
276
|
+
while (lo < hi) {
|
|
277
|
+
size_t mid = (lo + hi) >> 1;
|
|
278
|
+
T value = GetUintWithLength<T>(data_ + mid * length, length);
|
|
279
|
+
if (value < target) {
|
|
280
|
+
lo = mid + 1;
|
|
281
|
+
} else {
|
|
282
|
+
hi = mid;
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
return lo;
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
template <class T>
|
|
289
|
+
std::vector<T> EncodedUintVector<T>::Decode() const {
|
|
290
|
+
std::vector<T> result(size_);
|
|
291
|
+
for (int i = 0; i < size_; ++i) {
|
|
292
|
+
result[i] = (*this)[i];
|
|
293
|
+
}
|
|
294
|
+
return result;
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
} // namespace s2coding
|
|
298
|
+
|
|
299
|
+
#endif // S2_ENCODED_UINT_VECTOR_H_
|
|
@@ -0,0 +1,124 @@
|
|
|
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_uint_vector.h"
|
|
19
|
+
|
|
20
|
+
#include <vector>
|
|
21
|
+
#include <gtest/gtest.h>
|
|
22
|
+
|
|
23
|
+
using std::vector;
|
|
24
|
+
|
|
25
|
+
namespace s2coding {
|
|
26
|
+
|
|
27
|
+
static_assert(sizeof(EncodedUintVector<uint64>) == 16, "too big");
|
|
28
|
+
|
|
29
|
+
template <class T>
|
|
30
|
+
void TestEncodedUintVector(const vector<T>& expected, size_t expected_bytes) {
|
|
31
|
+
Encoder encoder;
|
|
32
|
+
EncodeUintVector<T>(expected, &encoder);
|
|
33
|
+
EXPECT_EQ(expected_bytes, encoder.length());
|
|
34
|
+
Decoder decoder(encoder.base(), encoder.length());
|
|
35
|
+
EncodedUintVector<T> actual;
|
|
36
|
+
ASSERT_TRUE(actual.Init(&decoder));
|
|
37
|
+
EXPECT_EQ(actual.Decode(), expected);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
TEST(EncodedUintVectorTest, Empty) {
|
|
41
|
+
TestEncodedUintVector(vector<uint32>{}, 1);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
TEST(EncodedUintVectorTest, Zero) {
|
|
45
|
+
TestEncodedUintVector(vector<uint64>{0}, 2);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
TEST(EncodedUintVectorTest, RepeatedZeros) {
|
|
49
|
+
TestEncodedUintVector(vector<uint16>{0, 0, 0}, 4);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
TEST(EncodedUintVectorTest, MaxInt) {
|
|
53
|
+
TestEncodedUintVector(vector<uint64>{~0ULL}, 9);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
TEST(EncodedUintVectorTest, OneByte) {
|
|
57
|
+
TestEncodedUintVector(vector<uint64>{0, 255, 1, 254}, 5);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
TEST(EncodedUintVectorTest, TwoBytes) {
|
|
61
|
+
TestEncodedUintVector(vector<uint64>{0, 255, 256, 254}, 9);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
TEST(EncodedUintVectorTest, ThreeBytes) {
|
|
65
|
+
TestEncodedUintVector(vector<uint64>{0xffffff, 0x0102, 0, 0x050403}, 13);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
TEST(EncodedUintVectorTest, EightBytes) {
|
|
69
|
+
TestEncodedUintVector(vector<uint64>{~0ULL, 0, 0x0102030405060708}, 25);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
template <class T>
|
|
73
|
+
vector<T> MakeSortedTestVector(int bytes_per_value, int num_values) {
|
|
74
|
+
S2_DCHECK_LE(bytes_per_value, sizeof(T));
|
|
75
|
+
T limit_value = ~T{0} >> (8 * (sizeof(T) - bytes_per_value));
|
|
76
|
+
vector<T> values;
|
|
77
|
+
for (int i = 0; i + 1 < num_values; ++i) {
|
|
78
|
+
values.push_back(limit_value * (static_cast<double>(i) / (num_values - 1)));
|
|
79
|
+
}
|
|
80
|
+
// The last value needs special handling since casting it to "double" loses
|
|
81
|
+
// precision when T == uint64.
|
|
82
|
+
values.push_back(limit_value);
|
|
83
|
+
S2_CHECK(std::is_sorted(values.begin(), values.end()));
|
|
84
|
+
return values;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
template <class T>
|
|
88
|
+
EncodedUintVector<T> MakeEncodedVector(const vector<T>& values,
|
|
89
|
+
Encoder* encoder) {
|
|
90
|
+
EncodeUintVector<T>(values, encoder);
|
|
91
|
+
Decoder decoder(encoder->base(), encoder->length());
|
|
92
|
+
EncodedUintVector<T> actual;
|
|
93
|
+
S2_CHECK(actual.Init(&decoder));
|
|
94
|
+
return actual;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
template <class T>
|
|
98
|
+
void TestLowerBound(int bytes_per_value, int num_values) {
|
|
99
|
+
auto v = MakeSortedTestVector<T>(bytes_per_value, num_values);
|
|
100
|
+
Encoder encoder;
|
|
101
|
+
auto actual = MakeEncodedVector(v, &encoder);
|
|
102
|
+
for (T x : v) {
|
|
103
|
+
EXPECT_EQ(std::lower_bound(v.begin(), v.end(), x) - v.begin(),
|
|
104
|
+
actual.lower_bound(x));
|
|
105
|
+
if (x > 0) {
|
|
106
|
+
EXPECT_EQ(std::lower_bound(v.begin(), v.end(), x - 1) - v.begin(),
|
|
107
|
+
actual.lower_bound(x - 1));
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
TEST(EncodedUintVector, LowerBound) {
|
|
113
|
+
for (int bytes_per_value = 8; bytes_per_value <= 8; ++bytes_per_value) {
|
|
114
|
+
TestLowerBound<uint64>(bytes_per_value, 10);
|
|
115
|
+
if (bytes_per_value <= 4) {
|
|
116
|
+
TestLowerBound<uint32>(bytes_per_value, 500);
|
|
117
|
+
if (bytes_per_value <= 2) {
|
|
118
|
+
TestLowerBound<uint16>(bytes_per_value, 100);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
} // namespace s2coding
|