@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,296 @@
|
|
|
1
|
+
// Copyright 2016 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_SEQUENCE_LEXICON_H_
|
|
19
|
+
#define S2_SEQUENCE_LEXICON_H_
|
|
20
|
+
|
|
21
|
+
#include <functional>
|
|
22
|
+
#include <limits>
|
|
23
|
+
#include <vector>
|
|
24
|
+
|
|
25
|
+
#include "s2/base/integral_types.h"
|
|
26
|
+
#include "s2/util/gtl/dense_hash_set.h"
|
|
27
|
+
#include "s2/util/hash/mix.h"
|
|
28
|
+
|
|
29
|
+
// SequenceLexicon is a class for compactly representing sequences of values
|
|
30
|
+
// (e.g., tuples). It automatically eliminates duplicates, and maps the
|
|
31
|
+
// remaining sequences to sequentially increasing integer ids. See also
|
|
32
|
+
// ValueLexicon and IdSetLexicon.
|
|
33
|
+
//
|
|
34
|
+
// Each distinct sequence is mapped to a 32-bit integer. The space used for
|
|
35
|
+
// each sequence is approximately 11 bytes plus the memory needed to represent
|
|
36
|
+
// the sequence elements. For example, a sequence of three "double"s would
|
|
37
|
+
// need about 11 + 3*8 = 35 bytes. Note also that sequences are referred to
|
|
38
|
+
// using 32-bit ids rather than 64-bit pointers.
|
|
39
|
+
//
|
|
40
|
+
// This class has the same thread-safety properties as "string": const methods
|
|
41
|
+
// are thread safe, and non-const methods are not thread safe.
|
|
42
|
+
//
|
|
43
|
+
// Example usage:
|
|
44
|
+
//
|
|
45
|
+
// SequenceLexicon<string> lexicon;
|
|
46
|
+
// vector<string> pets {"cat", "dog", "parrot"};
|
|
47
|
+
// uint32 pets_id = lexicon.Add(pets);
|
|
48
|
+
// S2_CHECK_EQ(pets_id, lexicon.Add(pets));
|
|
49
|
+
// string values;
|
|
50
|
+
// for (const auto& pet : lexicon.sequence(pets_id)) {
|
|
51
|
+
// values += pet;
|
|
52
|
+
// }
|
|
53
|
+
// S2_CHECK_EQ("catdogparrot", values);
|
|
54
|
+
//
|
|
55
|
+
template <class T,
|
|
56
|
+
class Hasher = std::hash<T>,
|
|
57
|
+
class KeyEqual = std::equal_to<T>>
|
|
58
|
+
class SequenceLexicon {
|
|
59
|
+
public:
|
|
60
|
+
explicit SequenceLexicon(const Hasher& hasher = Hasher(),
|
|
61
|
+
const KeyEqual& key_equal = KeyEqual());
|
|
62
|
+
|
|
63
|
+
// SequenceLexicon is movable and copyable.
|
|
64
|
+
SequenceLexicon(const SequenceLexicon&);
|
|
65
|
+
SequenceLexicon& operator=(const SequenceLexicon&);
|
|
66
|
+
SequenceLexicon(SequenceLexicon&&);
|
|
67
|
+
SequenceLexicon& operator=(SequenceLexicon&&);
|
|
68
|
+
|
|
69
|
+
// Clears all data from the lexicon.
|
|
70
|
+
void Clear();
|
|
71
|
+
|
|
72
|
+
// Add the given sequence of values to the lexicon if it is not already
|
|
73
|
+
// present, and return its integer id. Ids are assigned sequentially
|
|
74
|
+
// starting from zero. "begin" and "end" are forward iterators over a
|
|
75
|
+
// sequence of values of type T.
|
|
76
|
+
template <class FwdIterator>
|
|
77
|
+
uint32 Add(FwdIterator begin, FwdIterator end);
|
|
78
|
+
|
|
79
|
+
// Add the given sequence of values to the lexicon if it is not already
|
|
80
|
+
// present, and return its integer id. Ids are assigned sequentially
|
|
81
|
+
// starting from zero. This is a convenience method equivalent to
|
|
82
|
+
// Add(std::begin(container), std::end(container)).
|
|
83
|
+
template <class Container>
|
|
84
|
+
uint32 Add(const Container& container);
|
|
85
|
+
|
|
86
|
+
// Return the number of value sequences in the lexicon.
|
|
87
|
+
uint32 size() const;
|
|
88
|
+
|
|
89
|
+
// Iterator type; please treat this as an opaque forward iterator.
|
|
90
|
+
using Iterator = typename std::vector<T>::const_iterator;
|
|
91
|
+
|
|
92
|
+
// A class representing a sequence of values.
|
|
93
|
+
class Sequence {
|
|
94
|
+
public:
|
|
95
|
+
Iterator begin() const { return begin_; }
|
|
96
|
+
Iterator end() const { return end_; }
|
|
97
|
+
size_t size() const { return end_ - begin_; }
|
|
98
|
+
|
|
99
|
+
private:
|
|
100
|
+
friend class SequenceLexicon;
|
|
101
|
+
Sequence(Iterator begin, Iterator end) : begin_(begin), end_(end) {}
|
|
102
|
+
Iterator begin_, end_;
|
|
103
|
+
};
|
|
104
|
+
// Return the value sequence with the given id. This method can be used
|
|
105
|
+
// with range-based for loops as follows:
|
|
106
|
+
// for (const auto& value : lexicon.sequence(id)) { ... }
|
|
107
|
+
Sequence sequence(uint32 id) const;
|
|
108
|
+
|
|
109
|
+
private:
|
|
110
|
+
friend class IdKeyEqual;
|
|
111
|
+
// Choose kEmptyKey to be the last key that will ever be generated.
|
|
112
|
+
static const uint32 kEmptyKey = std::numeric_limits<uint32>::max();
|
|
113
|
+
|
|
114
|
+
class IdHasher {
|
|
115
|
+
public:
|
|
116
|
+
IdHasher(const Hasher& hasher, const SequenceLexicon* lexicon);
|
|
117
|
+
const Hasher& hasher() const;
|
|
118
|
+
size_t operator()(uint32 id) const;
|
|
119
|
+
private:
|
|
120
|
+
Hasher hasher_;
|
|
121
|
+
const SequenceLexicon* lexicon_;
|
|
122
|
+
};
|
|
123
|
+
|
|
124
|
+
class IdKeyEqual {
|
|
125
|
+
public:
|
|
126
|
+
IdKeyEqual(const KeyEqual& key_equal, const SequenceLexicon* lexicon);
|
|
127
|
+
const KeyEqual& key_equal() const;
|
|
128
|
+
bool operator()(uint32 id1, uint32 id2) const;
|
|
129
|
+
private:
|
|
130
|
+
KeyEqual key_equal_;
|
|
131
|
+
const SequenceLexicon* lexicon_;
|
|
132
|
+
};
|
|
133
|
+
|
|
134
|
+
using IdSet = gtl::dense_hash_set<uint32, IdHasher, IdKeyEqual>;
|
|
135
|
+
|
|
136
|
+
std::vector<T> values_;
|
|
137
|
+
std::vector<uint32> begins_;
|
|
138
|
+
IdSet id_set_;
|
|
139
|
+
};
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
////////////////// Implementation details follow ////////////////////
|
|
143
|
+
|
|
144
|
+
|
|
145
|
+
template <class T, class Hasher, class KeyEqual>
|
|
146
|
+
const uint32 SequenceLexicon<T, Hasher, KeyEqual>::kEmptyKey;
|
|
147
|
+
|
|
148
|
+
template <class T, class Hasher, class KeyEqual>
|
|
149
|
+
SequenceLexicon<T, Hasher, KeyEqual>::IdHasher::IdHasher(
|
|
150
|
+
const Hasher& hasher, const SequenceLexicon* lexicon)
|
|
151
|
+
: hasher_(hasher), lexicon_(lexicon) {
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
template <class T, class Hasher, class KeyEqual>
|
|
155
|
+
const Hasher& SequenceLexicon<T, Hasher, KeyEqual>::IdHasher::hasher() const {
|
|
156
|
+
return hasher_;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
template <class T, class Hasher, class KeyEqual>
|
|
160
|
+
size_t SequenceLexicon<T, Hasher, KeyEqual>::IdHasher::operator()(
|
|
161
|
+
uint32 id) const {
|
|
162
|
+
HashMix mix;
|
|
163
|
+
for (const auto& value : lexicon_->sequence(id)) {
|
|
164
|
+
mix.Mix(hasher_(value));
|
|
165
|
+
}
|
|
166
|
+
return mix.get();
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
template <class T, class Hasher, class KeyEqual>
|
|
170
|
+
SequenceLexicon<T, Hasher, KeyEqual>::IdKeyEqual::IdKeyEqual(
|
|
171
|
+
const KeyEqual& key_equal, const SequenceLexicon* lexicon)
|
|
172
|
+
: key_equal_(key_equal), lexicon_(lexicon) {
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
template <class T, class Hasher, class KeyEqual>
|
|
176
|
+
const KeyEqual& SequenceLexicon<T, Hasher, KeyEqual>::IdKeyEqual::key_equal()
|
|
177
|
+
const {
|
|
178
|
+
return key_equal_;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
template <class T, class Hasher, class KeyEqual>
|
|
182
|
+
bool SequenceLexicon<T, Hasher, KeyEqual>::IdKeyEqual::operator()(
|
|
183
|
+
uint32 id1, uint32 id2) const {
|
|
184
|
+
if (id1 == id2) return true;
|
|
185
|
+
if (id1 == lexicon_->kEmptyKey || id2 == lexicon_->kEmptyKey) {
|
|
186
|
+
return false;
|
|
187
|
+
}
|
|
188
|
+
SequenceLexicon::Sequence seq1 = lexicon_->sequence(id1);
|
|
189
|
+
SequenceLexicon::Sequence seq2 = lexicon_->sequence(id2);
|
|
190
|
+
return (seq1.size() == seq2.size() &&
|
|
191
|
+
std::equal(seq1.begin(), seq1.end(), seq2.begin(), key_equal_));
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
template <class T, class Hasher, class KeyEqual>
|
|
195
|
+
SequenceLexicon<T, Hasher, KeyEqual>::SequenceLexicon(const Hasher& hasher,
|
|
196
|
+
const KeyEqual& key_equal)
|
|
197
|
+
: id_set_(0, IdHasher(hasher, this),
|
|
198
|
+
IdKeyEqual(key_equal, this)) {
|
|
199
|
+
id_set_.set_empty_key(kEmptyKey);
|
|
200
|
+
begins_.push_back(0);
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
template <class T, class Hasher, class KeyEqual>
|
|
204
|
+
SequenceLexicon<T, Hasher, KeyEqual>::SequenceLexicon(const SequenceLexicon& x)
|
|
205
|
+
: values_(x.values_), begins_(x.begins_),
|
|
206
|
+
// Unfortunately we can't copy "id_set_" because we need to change the
|
|
207
|
+
// "this" pointers associated with hasher() and key_equal().
|
|
208
|
+
id_set_(x.id_set_.begin(), x.id_set_.end(), kEmptyKey, 0,
|
|
209
|
+
IdHasher(x.id_set_.hash_funct().hasher(), this),
|
|
210
|
+
IdKeyEqual(x.id_set_.key_eq().key_equal(), this)) {
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
template <class T, class Hasher, class KeyEqual>
|
|
214
|
+
SequenceLexicon<T, Hasher, KeyEqual>::SequenceLexicon(SequenceLexicon&& x)
|
|
215
|
+
: values_(std::move(x.values_)), begins_(std::move(x.begins_)),
|
|
216
|
+
// Unfortunately we can't move "id_set_" because we need to change the
|
|
217
|
+
// "this" pointers associated with hasher() and key_equal().
|
|
218
|
+
id_set_(x.id_set_.begin(), x.id_set_.end(), kEmptyKey, 0,
|
|
219
|
+
IdHasher(x.id_set_.hash_funct().hasher(), this),
|
|
220
|
+
IdKeyEqual(x.id_set_.key_eq().key_equal(), this)) {
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
template <class T, class Hasher, class KeyEqual>
|
|
224
|
+
SequenceLexicon<T, Hasher, KeyEqual>&
|
|
225
|
+
SequenceLexicon<T, Hasher, KeyEqual>::operator=(const SequenceLexicon& x) {
|
|
226
|
+
// Note that self-assignment is handled correctly by this code.
|
|
227
|
+
values_ = x.values_;
|
|
228
|
+
begins_ = x.begins_;
|
|
229
|
+
// Unfortunately we can't copy-assign "id_set_" because we need to change
|
|
230
|
+
// the "this" pointers associated with hasher() and key_equal().
|
|
231
|
+
id_set_ = IdSet(x.id_set_.begin(), x.id_set_.end(), kEmptyKey, 0,
|
|
232
|
+
IdHasher(x.id_set_.hash_funct().hasher(), this),
|
|
233
|
+
IdKeyEqual(x.id_set_.key_eq().key_equal(), this));
|
|
234
|
+
return *this;
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
template <class T, class Hasher, class KeyEqual>
|
|
238
|
+
SequenceLexicon<T, Hasher, KeyEqual>&
|
|
239
|
+
SequenceLexicon<T, Hasher, KeyEqual>::operator=(SequenceLexicon&& x) {
|
|
240
|
+
// Note that move self-assignment has undefined behavior.
|
|
241
|
+
values_ = std::move(x.values_);
|
|
242
|
+
begins_ = std::move(x.begins_);
|
|
243
|
+
// Unfortunately we can't move-assign "id_set_" because we need to change
|
|
244
|
+
// the "this" pointers associated with hasher() and key_equal().
|
|
245
|
+
id_set_ = IdSet(x.id_set_.begin(), x.id_set_.end(), kEmptyKey, 0,
|
|
246
|
+
IdHasher(x.id_set_.hash_funct().hasher(), this),
|
|
247
|
+
IdKeyEqual(x.id_set_.key_eq().key_equal(), this));
|
|
248
|
+
return *this;
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
template <class T, class Hasher, class KeyEqual>
|
|
252
|
+
void SequenceLexicon<T, Hasher, KeyEqual>::Clear() {
|
|
253
|
+
values_.clear();
|
|
254
|
+
begins_.clear();
|
|
255
|
+
id_set_.clear();
|
|
256
|
+
begins_.push_back(0);
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
template <class T, class Hasher, class KeyEqual>
|
|
260
|
+
template <class FwdIterator>
|
|
261
|
+
uint32 SequenceLexicon<T, Hasher, KeyEqual>::Add(FwdIterator begin,
|
|
262
|
+
FwdIterator end) {
|
|
263
|
+
for (; begin != end; ++begin) {
|
|
264
|
+
values_.push_back(*begin);
|
|
265
|
+
}
|
|
266
|
+
begins_.push_back(values_.size());
|
|
267
|
+
uint32 id = begins_.size() - 2;
|
|
268
|
+
auto result = id_set_.insert(id);
|
|
269
|
+
if (result.second) {
|
|
270
|
+
return id;
|
|
271
|
+
} else {
|
|
272
|
+
begins_.pop_back();
|
|
273
|
+
values_.resize(begins_.back());
|
|
274
|
+
return *result.first;
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
template <class T, class Hasher, class KeyEqual>
|
|
279
|
+
template <class Container>
|
|
280
|
+
uint32 SequenceLexicon<T, Hasher, KeyEqual>::Add(const Container& container) {
|
|
281
|
+
return Add(std::begin(container), std::end(container));
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
template <class T, class Hasher, class KeyEqual>
|
|
285
|
+
inline uint32 SequenceLexicon<T, Hasher, KeyEqual>::size() const {
|
|
286
|
+
return begins_.size() - 1;
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
template <class T, class Hasher, class KeyEqual>
|
|
290
|
+
inline typename SequenceLexicon<T, Hasher, KeyEqual>::Sequence
|
|
291
|
+
SequenceLexicon<T, Hasher, KeyEqual>::sequence(uint32 id) const {
|
|
292
|
+
return Sequence(values_.begin() + begins_[id],
|
|
293
|
+
values_.begin() + begins_[id + 1]);
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
#endif // S2_SEQUENCE_LEXICON_H_
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
// Copyright 2016 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/sequence_lexicon.h"
|
|
19
|
+
|
|
20
|
+
#include <array>
|
|
21
|
+
#include <memory>
|
|
22
|
+
#include <vector>
|
|
23
|
+
|
|
24
|
+
#include "s2/base/logging.h"
|
|
25
|
+
#include <gtest/gtest.h>
|
|
26
|
+
#include "s2/third_party/absl/memory/memory.h"
|
|
27
|
+
|
|
28
|
+
using absl::make_unique;
|
|
29
|
+
|
|
30
|
+
template <class T>
|
|
31
|
+
void ExpectSequence(const std::vector<T>& expected,
|
|
32
|
+
const typename SequenceLexicon<T>::Sequence& actual) {
|
|
33
|
+
EXPECT_EQ(expected.size(), actual.size());
|
|
34
|
+
EXPECT_TRUE(std::equal(expected.begin(), expected.end(), actual.begin()));
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
using Seq = std::vector<int64>;
|
|
38
|
+
|
|
39
|
+
TEST(SequenceLexicon, int64) {
|
|
40
|
+
SequenceLexicon<int64> lex;
|
|
41
|
+
EXPECT_EQ(0, lex.Add(Seq{}));
|
|
42
|
+
EXPECT_EQ(1, lex.Add(Seq{5}));
|
|
43
|
+
EXPECT_EQ(0, lex.Add(Seq{}));
|
|
44
|
+
EXPECT_EQ(2, lex.Add(Seq{5, 5}));
|
|
45
|
+
EXPECT_EQ(3, lex.Add(Seq{5, 0, -3}));
|
|
46
|
+
EXPECT_EQ(1, lex.Add(Seq{5}));
|
|
47
|
+
EXPECT_EQ(4, lex.Add(Seq{0x7fffffffffffffff}));
|
|
48
|
+
EXPECT_EQ(3, lex.Add(Seq{5, 0, -3}));
|
|
49
|
+
EXPECT_EQ(0, lex.Add(Seq{}));
|
|
50
|
+
EXPECT_EQ(5, lex.size());
|
|
51
|
+
ExpectSequence(Seq{}, lex.sequence(0));
|
|
52
|
+
ExpectSequence(Seq{5}, lex.sequence(1));
|
|
53
|
+
ExpectSequence(Seq{5, 5}, lex.sequence(2));
|
|
54
|
+
ExpectSequence(Seq{5, 0, -3}, lex.sequence(3));
|
|
55
|
+
ExpectSequence(Seq{0x7fffffffffffffff}, lex.sequence(4));
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
TEST(SequenceLexicon, Clear) {
|
|
59
|
+
SequenceLexicon<int64> lex;
|
|
60
|
+
EXPECT_EQ(0, lex.Add(Seq{1}));
|
|
61
|
+
EXPECT_EQ(1, lex.Add(Seq{2}));
|
|
62
|
+
lex.Clear();
|
|
63
|
+
EXPECT_EQ(0, lex.Add(Seq{2}));
|
|
64
|
+
EXPECT_EQ(1, lex.Add(Seq{1}));
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
TEST(SequenceLexicon, CopyConstructor) {
|
|
68
|
+
auto original = make_unique<SequenceLexicon<int64>>();
|
|
69
|
+
EXPECT_EQ(0, original->Add(Seq{1, 2}));
|
|
70
|
+
auto lex = *original;
|
|
71
|
+
original.reset(nullptr);
|
|
72
|
+
EXPECT_EQ(1, lex.Add(Seq{3, 4}));
|
|
73
|
+
ExpectSequence(Seq{1, 2}, lex.sequence(0));
|
|
74
|
+
ExpectSequence(Seq{3, 4}, lex.sequence(1));
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
TEST(SequenceLexicon, MoveConstructor) {
|
|
78
|
+
auto original = make_unique<SequenceLexicon<int64>>();
|
|
79
|
+
EXPECT_EQ(0, original->Add(Seq{1, 2}));
|
|
80
|
+
auto lex = std::move(*original);
|
|
81
|
+
original.reset(nullptr);
|
|
82
|
+
EXPECT_EQ(1, lex.Add(Seq{3, 4}));
|
|
83
|
+
ExpectSequence(Seq{1, 2}, lex.sequence(0));
|
|
84
|
+
ExpectSequence(Seq{3, 4}, lex.sequence(1));
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
TEST(SequenceLexicon, CopyAssignmentOperator) {
|
|
88
|
+
auto original = make_unique<SequenceLexicon<int64>>();
|
|
89
|
+
EXPECT_EQ(0, original->Add(Seq{1, 2}));
|
|
90
|
+
SequenceLexicon<int64> lex;
|
|
91
|
+
EXPECT_EQ(0, lex.Add(Seq{3, 4}));
|
|
92
|
+
EXPECT_EQ(1, lex.Add(Seq{5, 6}));
|
|
93
|
+
lex = *original;
|
|
94
|
+
original.reset(nullptr);
|
|
95
|
+
lex = *&lex; // Tests self-assignment.
|
|
96
|
+
EXPECT_EQ(1, lex.Add(Seq{7, 8}));
|
|
97
|
+
ExpectSequence(Seq{1, 2}, lex.sequence(0));
|
|
98
|
+
ExpectSequence(Seq{7, 8}, lex.sequence(1));
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
TEST(SequenceLexicon, MoveAssignmentOperator) {
|
|
102
|
+
auto original = make_unique<SequenceLexicon<int64>>();
|
|
103
|
+
EXPECT_EQ(0, original->Add(Seq{1, 2}));
|
|
104
|
+
SequenceLexicon<int64> lex;
|
|
105
|
+
EXPECT_EQ(0, lex.Add(Seq{3, 4}));
|
|
106
|
+
EXPECT_EQ(1, lex.Add(Seq{5, 6}));
|
|
107
|
+
lex = std::move(*original);
|
|
108
|
+
original.reset(nullptr);
|
|
109
|
+
EXPECT_EQ(1, lex.Add(Seq{7, 8}));
|
|
110
|
+
ExpectSequence(Seq{1, 2}, lex.sequence(0));
|
|
111
|
+
ExpectSequence(Seq{7, 8}, lex.sequence(1));
|
|
112
|
+
}
|
|
113
|
+
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
// Copyright 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
|
+
#include <cassert>
|
|
17
|
+
|
|
18
|
+
#include "s2/strings/ostringstream.h"
|
|
19
|
+
|
|
20
|
+
namespace strings {
|
|
21
|
+
|
|
22
|
+
OStringStream::Buf::int_type OStringStream::overflow(int c) {
|
|
23
|
+
assert(s_);
|
|
24
|
+
if (!Buf::traits_type::eq_int_type(c, Buf::traits_type::eof()))
|
|
25
|
+
s_->push_back(static_cast<char>(c));
|
|
26
|
+
return 1;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
std::streamsize OStringStream::xsputn(const char* s, std::streamsize n) {
|
|
30
|
+
assert(s_);
|
|
31
|
+
s_->append(s, n);
|
|
32
|
+
return n;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
} // namespace strings
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
// Copyright 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
|
+
|
|
17
|
+
|
|
18
|
+
#ifndef S2_STRINGS_OSTRINGSTREAM_H_
|
|
19
|
+
#define S2_STRINGS_OSTRINGSTREAM_H_
|
|
20
|
+
|
|
21
|
+
#include <ostream>
|
|
22
|
+
#include <streambuf>
|
|
23
|
+
#include <string>
|
|
24
|
+
|
|
25
|
+
#include "s2/third_party/absl/base/port.h"
|
|
26
|
+
|
|
27
|
+
namespace strings {
|
|
28
|
+
|
|
29
|
+
// The same as std::ostringstream but appends to a user-specified string,
|
|
30
|
+
// and is faster. It is ~70% faster to create, ~50% faster to write to, and
|
|
31
|
+
// completely free to extract the result string.
|
|
32
|
+
//
|
|
33
|
+
// string s;
|
|
34
|
+
// OStringStream strm(&s);
|
|
35
|
+
// strm << 42 << ' ' << 3.14; // appends to `s`
|
|
36
|
+
//
|
|
37
|
+
// The stream object doesn't have to be named. Starting from C++11 operator<<
|
|
38
|
+
// works with rvalues of std::ostream.
|
|
39
|
+
//
|
|
40
|
+
// string s;
|
|
41
|
+
// OStringStream(&s) << 42 << ' ' << 3.14; // appends to `s`
|
|
42
|
+
//
|
|
43
|
+
// OStringStream is faster to create than std::ostringstream but it's still
|
|
44
|
+
// relatively slow. Avoid creating multiple streams where a single stream will
|
|
45
|
+
// do.
|
|
46
|
+
//
|
|
47
|
+
// Creates unnecessary instances of OStringStream: slow.
|
|
48
|
+
//
|
|
49
|
+
// string s;
|
|
50
|
+
// OStringStream(&s) << 42;
|
|
51
|
+
// OStringStream(&s) << ' ';
|
|
52
|
+
// OStringStream(&s) << 3.14;
|
|
53
|
+
//
|
|
54
|
+
// Creates a single instance of OStringStream and reuses it: fast.
|
|
55
|
+
//
|
|
56
|
+
// string s;
|
|
57
|
+
// OStringStream strm(&s);
|
|
58
|
+
// strm << 42;
|
|
59
|
+
// strm << ' ';
|
|
60
|
+
// strm << 3.14;
|
|
61
|
+
//
|
|
62
|
+
// Note: flush() has no effect. No reason to call it.
|
|
63
|
+
class OStringStream : private std::basic_streambuf<char>, public std::ostream {
|
|
64
|
+
public:
|
|
65
|
+
// Export the same types as ostringstream does; for use info, see
|
|
66
|
+
// http://en.cppreference.com/w/cpp/io/basic_ostringstream
|
|
67
|
+
typedef string::allocator_type allocator_type;
|
|
68
|
+
|
|
69
|
+
// These types are defined in both basic_streambuf and ostream, and although
|
|
70
|
+
// they are identical, they cause compiler ambiguities, so we define them to
|
|
71
|
+
// avoid that.
|
|
72
|
+
using std::ostream::char_type;
|
|
73
|
+
using std::ostream::int_type;
|
|
74
|
+
using std::ostream::off_type;
|
|
75
|
+
using std::ostream::pos_type;
|
|
76
|
+
using std::ostream::traits_type;
|
|
77
|
+
|
|
78
|
+
// The argument can be null, in which case you'll need to call str(p) with a
|
|
79
|
+
// non-null argument before you can write to the stream.
|
|
80
|
+
//
|
|
81
|
+
// The destructor of OStringStream doesn't use the string. It's OK to destroy
|
|
82
|
+
// the string before the stream.
|
|
83
|
+
explicit OStringStream(string* s) : std::ostream(this), s_(s) {}
|
|
84
|
+
|
|
85
|
+
string* str() { return s_; }
|
|
86
|
+
const string* str() const { return s_; }
|
|
87
|
+
void str(string* s) { s_ = s; }
|
|
88
|
+
|
|
89
|
+
// These functions are defined in both basic_streambuf and ostream, but it's
|
|
90
|
+
// ostream definition that affects the strings produced.
|
|
91
|
+
using std::ostream::getloc;
|
|
92
|
+
using std::ostream::imbue;
|
|
93
|
+
|
|
94
|
+
private:
|
|
95
|
+
using Buf = std::basic_streambuf<char>;
|
|
96
|
+
|
|
97
|
+
Buf::int_type overflow(int c) override;
|
|
98
|
+
std::streamsize xsputn(const char* s, std::streamsize n) override;
|
|
99
|
+
|
|
100
|
+
string* s_;
|
|
101
|
+
};
|
|
102
|
+
|
|
103
|
+
} // namespace strings
|
|
104
|
+
|
|
105
|
+
#endif // S2_STRINGS_OSTRINGSTREAM_H_
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
// Copyright 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
|
+
#include "s2/strings/serialize.h"
|
|
17
|
+
|
|
18
|
+
#include <string>
|
|
19
|
+
#include <vector>
|
|
20
|
+
|
|
21
|
+
#include "s2/third_party/absl/strings/str_split.h"
|
|
22
|
+
#include "s2/third_party/absl/strings/string_view.h"
|
|
23
|
+
|
|
24
|
+
using absl::StrSplit;
|
|
25
|
+
using absl::string_view;
|
|
26
|
+
using std::pair;
|
|
27
|
+
using std::string;
|
|
28
|
+
using std::vector;
|
|
29
|
+
|
|
30
|
+
namespace strings {
|
|
31
|
+
|
|
32
|
+
bool DictionaryParse(string_view encoded_str,
|
|
33
|
+
vector<pair<string, string>>* items) {
|
|
34
|
+
if (encoded_str.empty())
|
|
35
|
+
return true;
|
|
36
|
+
vector<string_view> const entries = StrSplit(encoded_str, ',');
|
|
37
|
+
for (int i = 0; i < entries.size(); ++i) {
|
|
38
|
+
vector<string_view> const fields = StrSplit(entries[i], ':');
|
|
39
|
+
if (fields.size() != 2) // parsing error
|
|
40
|
+
return false;
|
|
41
|
+
items->push_back(std::make_pair(string(fields[0]), string(fields[1])));
|
|
42
|
+
}
|
|
43
|
+
return true;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
} // namespace strings
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
// Copyright 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
|
+
#ifndef S2_STRINGS_SERIALIZE_H_
|
|
17
|
+
#define S2_STRINGS_SERIALIZE_H_
|
|
18
|
+
|
|
19
|
+
#include <string>
|
|
20
|
+
#include <vector>
|
|
21
|
+
|
|
22
|
+
#include "s2/third_party/absl/strings/string_view.h"
|
|
23
|
+
|
|
24
|
+
namespace strings {
|
|
25
|
+
|
|
26
|
+
// -------------------------------------------------------------------------
|
|
27
|
+
// DictionaryParse
|
|
28
|
+
// This routine parses a common dictionary format (key and value separated
|
|
29
|
+
// by ':', entries separated by commas). This format is used for many
|
|
30
|
+
// complex commandline flags. It is also used to encode dictionaries for
|
|
31
|
+
// exporting them or writing them to a checkpoint. Returns a vector of
|
|
32
|
+
// <key, value> pairs. Returns true if there if no error in parsing, false
|
|
33
|
+
// otherwise.
|
|
34
|
+
// -------------------------------------------------------------------------
|
|
35
|
+
bool DictionaryParse(absl::string_view encoded_str,
|
|
36
|
+
std::vector<std::pair<std::string, std::string>>* items);
|
|
37
|
+
|
|
38
|
+
} // namespace strings
|
|
39
|
+
|
|
40
|
+
#endif // S2_STRINGS_SERIALIZE_H_
|