@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,135 @@
|
|
|
1
|
+
// Copyright 2003 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
|
+
// Define common length units. New length units can be added as needed
|
|
18
|
+
// provided there is a direct, multiplicative scaling to meters.
|
|
19
|
+
//
|
|
20
|
+
// When adding new units, you should add an appropriate GetMyUnit accessor
|
|
21
|
+
// template and (optionally) define a shorthand typedef specialization for
|
|
22
|
+
// float. Also update the physical units unittest to check the conversion
|
|
23
|
+
// ratio.
|
|
24
|
+
|
|
25
|
+
#ifndef S2_UTIL_UNITS_LENGTH_UNITS_H_
|
|
26
|
+
#define S2_UTIL_UNITS_LENGTH_UNITS_H_
|
|
27
|
+
|
|
28
|
+
#include "s2/util/units/physical-units.h"
|
|
29
|
+
|
|
30
|
+
namespace util {
|
|
31
|
+
|
|
32
|
+
namespace units {
|
|
33
|
+
|
|
34
|
+
struct LengthBase {
|
|
35
|
+
// the base unit type is meters
|
|
36
|
+
static const char* const output_suffix;
|
|
37
|
+
|
|
38
|
+
template <typename ValueType, class Unit>
|
|
39
|
+
static ValueType GetInBaseUnit(
|
|
40
|
+
const PhysicalUnit<ValueType, LengthBase, Unit> u) {
|
|
41
|
+
return GetMeters(u);
|
|
42
|
+
}
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
template <typename Float>
|
|
46
|
+
class Length {
|
|
47
|
+
typedef UnitConversion<1, 1> MetersConversion;
|
|
48
|
+
typedef UnitConversion<1, 1000> KilometersConversion;
|
|
49
|
+
typedef UnitConversion<10000, 254> InchesConversion;
|
|
50
|
+
typedef UnitConversion<10000, 3048> FeetConversion;
|
|
51
|
+
typedef UnitConversion<1000, 1609344> MilesConversion;
|
|
52
|
+
typedef UnitConversion<1000, 1> MillimetersConversion;
|
|
53
|
+
typedef UnitConversion<1, 1852> NauticalMilesConversion;
|
|
54
|
+
typedef UnitConversion<10000, 9144> YardsConversion;
|
|
55
|
+
|
|
56
|
+
public:
|
|
57
|
+
typedef PhysicalUnit<Float, LengthBase, MetersConversion> Meters;
|
|
58
|
+
typedef PhysicalUnit<Float, LengthBase, KilometersConversion> Kilometers;
|
|
59
|
+
typedef PhysicalUnit<Float, LengthBase, InchesConversion> Inches;
|
|
60
|
+
typedef PhysicalUnit<Float, LengthBase, FeetConversion> Feet;
|
|
61
|
+
typedef PhysicalUnit<Float, LengthBase, MilesConversion> Miles;
|
|
62
|
+
typedef PhysicalUnit<Float, LengthBase, MillimetersConversion> Millimeters;
|
|
63
|
+
typedef PhysicalUnit<Float, LengthBase, NauticalMilesConversion>
|
|
64
|
+
NauticalMiles;
|
|
65
|
+
typedef PhysicalUnit<Float, LengthBase, YardsConversion> Yards;
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
// Define some shorthand, standard typenames. The standard length
|
|
69
|
+
// type is chosen to be float. If you need greater precision for
|
|
70
|
+
// a specific application, either use the fully qualified typename
|
|
71
|
+
// Length<double>::* or declare local typedefs. This would be an
|
|
72
|
+
// ideal place for a template typedef, if only C++ supported them.
|
|
73
|
+
// Note that units with different floating-point types do not
|
|
74
|
+
// support implicit conversion (use the precision_cast<...> method).
|
|
75
|
+
typedef Length<float>::Meters Meters;
|
|
76
|
+
typedef Length<float>::Kilometers Kilometers;
|
|
77
|
+
typedef Length<float>::Inches Inches;
|
|
78
|
+
typedef Length<float>::Feet Feet;
|
|
79
|
+
typedef Length<float>::Miles Miles;
|
|
80
|
+
typedef Length<float>::Millimeters Millimeters;
|
|
81
|
+
typedef Length<float>::NauticalMiles NauticalMiles;
|
|
82
|
+
typedef Length<float>::Yards Yards;
|
|
83
|
+
|
|
84
|
+
// Explicit unit accessors. In general these are safer than using
|
|
85
|
+
// the value() accessor, particularly in cases where the unit type
|
|
86
|
+
// may not be immediately obvious (such as function returns).
|
|
87
|
+
|
|
88
|
+
template <typename ValueType, class Unit>
|
|
89
|
+
inline ValueType GetMeters(const PhysicalUnit<ValueType, LengthBase, Unit> u) {
|
|
90
|
+
return typename Length<ValueType>::Meters(u).value();
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
template <typename ValueType, class Unit>
|
|
94
|
+
inline ValueType GetKilometers(
|
|
95
|
+
const PhysicalUnit<ValueType, LengthBase, Unit> u) {
|
|
96
|
+
return typename Length<ValueType>::Kilometers(u).value();
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
template <typename ValueType, class Unit>
|
|
100
|
+
inline ValueType GetInches(const PhysicalUnit<ValueType, LengthBase, Unit> u) {
|
|
101
|
+
return typename Length<ValueType>::Inches(u).value();
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
template <typename ValueType, class Unit>
|
|
105
|
+
inline ValueType GetFeet(const PhysicalUnit<ValueType, LengthBase, Unit> u) {
|
|
106
|
+
return typename Length<ValueType>::Feet(u).value();
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
template <typename ValueType, class Unit>
|
|
110
|
+
inline ValueType GetMiles(const PhysicalUnit<ValueType, LengthBase, Unit> u) {
|
|
111
|
+
return typename Length<ValueType>::Miles(u).value();
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
template <typename ValueType, class Unit>
|
|
115
|
+
inline ValueType GetMillimeters(
|
|
116
|
+
const PhysicalUnit<ValueType, LengthBase, Unit> u) {
|
|
117
|
+
return typename Length<ValueType>::Millimeters(u).value();
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
template <typename ValueType, class Unit>
|
|
121
|
+
inline ValueType GetNauticalMiles(
|
|
122
|
+
const PhysicalUnit<ValueType, LengthBase, Unit> u) {
|
|
123
|
+
return typename Length<ValueType>::NauticalMiles(u).value();
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
template <typename ValueType, class Unit>
|
|
127
|
+
inline ValueType GetYards(const PhysicalUnit<ValueType, LengthBase, Unit> u) {
|
|
128
|
+
return typename Length<ValueType>::Yards(u).value();
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
} // end namespace units
|
|
132
|
+
|
|
133
|
+
} // end namespace util
|
|
134
|
+
|
|
135
|
+
#endif // S2_UTIL_UNITS_LENGTH_UNITS_H_
|
|
@@ -0,0 +1,313 @@
|
|
|
1
|
+
// Copyright 2003 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
|
+
// Basic physical unit classes. These classes are not as fancy as
|
|
18
|
+
// some general purpose physical unit libraries, but provide a
|
|
19
|
+
// simple and efficient interface for unit tracking and conversion.
|
|
20
|
+
// In particular, compound units cannot be automatically constructed
|
|
21
|
+
// from or decomposed into simpler units (e.g. velocity = distance /
|
|
22
|
+
// time), but can be defined explicitly as opaque types.
|
|
23
|
+
//
|
|
24
|
+
// These classes define overloaded operators and non-explicit single
|
|
25
|
+
// argument ctors, which breaks the style guidelines, but an exception
|
|
26
|
+
// has been allowed in this case.
|
|
27
|
+
// - Douglas Greiman <dgreiman@google.com>
|
|
28
|
+
//
|
|
29
|
+
// Specific types of physical units are defined in other headers
|
|
30
|
+
// (e.g. angle-units.h). Each unit type can be specialized to either
|
|
31
|
+
// float or double. Non-floating-point types are disallowed, since
|
|
32
|
+
// the implicit conversion logic generally fails for integer division.
|
|
33
|
+
// Attempting to declare integer-based units results in a fairly
|
|
34
|
+
// informative compiler error.
|
|
35
|
+
//
|
|
36
|
+
// All units share common functionality, as demonstrated in this
|
|
37
|
+
// example:
|
|
38
|
+
//
|
|
39
|
+
// #include "angle-units.h"
|
|
40
|
+
//
|
|
41
|
+
// class Nomad {
|
|
42
|
+
// Radians latitude_;
|
|
43
|
+
// ...
|
|
44
|
+
// // With -O2 optimization, the use of Radians in this method is
|
|
45
|
+
// // completely equivalent to using float, but prevents unitless
|
|
46
|
+
// // angles from being passed.
|
|
47
|
+
// void SetLatitude(Radians angle) {
|
|
48
|
+
// S2_CHECK(angle.abs() < Degrees(90.0));
|
|
49
|
+
// latitude_ = angle;
|
|
50
|
+
// latitude_radius_ = EARTH_RADIUS * cos(angle.value());
|
|
51
|
+
// }
|
|
52
|
+
//
|
|
53
|
+
// // This method contains an implicit unit conversion from degrees
|
|
54
|
+
// // to radians. In practice it would make more sense to use
|
|
55
|
+
// // Radians as the argument type to avoid this extra work if
|
|
56
|
+
// // possible (see the two calls of this method below).
|
|
57
|
+
// void MoveNorth(Degrees angle) {
|
|
58
|
+
// SetLatitude(latitude_ + angle);
|
|
59
|
+
// }
|
|
60
|
+
// };
|
|
61
|
+
//
|
|
62
|
+
// void do_tests(float degrees_to_move, float radians_to_move) {
|
|
63
|
+
// Nomad joe;
|
|
64
|
+
//
|
|
65
|
+
// // The use of Degrees(30.0) to set the latitude in radians requires
|
|
66
|
+
// // no runtime conversion.
|
|
67
|
+
// joe.SetLatitude(Degrees(30.0));
|
|
68
|
+
//
|
|
69
|
+
// // The Degrees(...) parameter will be converted to radians at
|
|
70
|
+
// // runtime prior to addition in Nomad::MoveNorth().
|
|
71
|
+
// joe.MoveNorth(Degrees(degrees_to_move));
|
|
72
|
+
//
|
|
73
|
+
// // This is ok, but due to the poor choice of units for the MoveNorth
|
|
74
|
+
// // method's argument, incurs two pointless multiply operations to
|
|
75
|
+
// // convert from radians to degrees and back to radians.
|
|
76
|
+
// joe.MoveNorth(Radians(radians_to_move));
|
|
77
|
+
//
|
|
78
|
+
// // Implicit conversions from unitless values generate errors at
|
|
79
|
+
// // compile time.
|
|
80
|
+
// // joe.MoveNorth(degrees_to_move); // compile ERROR!
|
|
81
|
+
// }
|
|
82
|
+
//
|
|
83
|
+
|
|
84
|
+
#ifndef S2_UTIL_UNITS_PHYSICAL_UNITS_H_
|
|
85
|
+
#define S2_UTIL_UNITS_PHYSICAL_UNITS_H_
|
|
86
|
+
|
|
87
|
+
#include <cmath>
|
|
88
|
+
#include <iosfwd>
|
|
89
|
+
#include <iostream>
|
|
90
|
+
#include <string>
|
|
91
|
+
#include <type_traits>
|
|
92
|
+
|
|
93
|
+
#include "s2/base/integral_types.h"
|
|
94
|
+
#include "s2/third_party/absl/base/macros.h"
|
|
95
|
+
|
|
96
|
+
namespace util {
|
|
97
|
+
|
|
98
|
+
namespace units {
|
|
99
|
+
|
|
100
|
+
// Static conversion scale and offset to convert from a standard base
|
|
101
|
+
// unit to a specific unit. The scale and offset is specified as a
|
|
102
|
+
// rational number to allow static construction at compile time.
|
|
103
|
+
template <int ScaleNumerator, int ScaleDenominator,
|
|
104
|
+
int OffsetNumerator = 0, int OffsetDenominator = 1>
|
|
105
|
+
struct UnitConversion {
|
|
106
|
+
static const int SCALE_NUMERATOR = ScaleNumerator;
|
|
107
|
+
static const int SCALE_DENOMINATOR = ScaleDenominator;
|
|
108
|
+
static const int OFFSET_NUMERATOR = OffsetNumerator;
|
|
109
|
+
static const int OFFSET_DENOMINATOR = OffsetDenominator;
|
|
110
|
+
};
|
|
111
|
+
|
|
112
|
+
template <class FromUnit, class ToUnit, typename Float>
|
|
113
|
+
struct UnitConverter {
|
|
114
|
+
// Linear unit conversion: A' = A * s + t, where
|
|
115
|
+
// - s is a static scale factor and
|
|
116
|
+
// - t is a static offset
|
|
117
|
+
// composed from two UnitConversion structs.
|
|
118
|
+
// Cast one multiplicand to 64 bit to ensure that the integer expression
|
|
119
|
+
// is computed in 64 bit. Otherwise Feet(Miles(x)) will overflow.
|
|
120
|
+
constexpr static inline Float Convert(Float value) {
|
|
121
|
+
// scaling and offset
|
|
122
|
+
return static_cast<Float>(
|
|
123
|
+
(static_cast<double>(value *
|
|
124
|
+
(static_cast<double>(static_cast<uint64>(ToUnit::SCALE_NUMERATOR) *
|
|
125
|
+
FromUnit::SCALE_DENOMINATOR) /
|
|
126
|
+
static_cast<double>(static_cast<uint64>(ToUnit::SCALE_DENOMINATOR) *
|
|
127
|
+
FromUnit::SCALE_NUMERATOR)))) -
|
|
128
|
+
(static_cast<double>(static_cast<uint64>(ToUnit::SCALE_NUMERATOR) *
|
|
129
|
+
FromUnit::SCALE_DENOMINATOR *
|
|
130
|
+
FromUnit::OFFSET_NUMERATOR) /
|
|
131
|
+
static_cast<double>(static_cast<uint64>(ToUnit::SCALE_DENOMINATOR) *
|
|
132
|
+
FromUnit::SCALE_NUMERATOR *
|
|
133
|
+
FromUnit::OFFSET_DENOMINATOR)) +
|
|
134
|
+
(static_cast<double>(ToUnit::OFFSET_NUMERATOR) /
|
|
135
|
+
static_cast<double>(ToUnit::OFFSET_DENOMINATOR)));
|
|
136
|
+
}
|
|
137
|
+
};
|
|
138
|
+
|
|
139
|
+
// Some unit operations are only defined for base units that have linear
|
|
140
|
+
// transformations, as in T(a+b) = T(a) + T(b). Temperatures units are
|
|
141
|
+
// an example of units that do not have linear transformations. By
|
|
142
|
+
// default unit transformations are assumed to be linear; see
|
|
143
|
+
// temperature-units.h for an example of how to override this default.
|
|
144
|
+
template <class Base>
|
|
145
|
+
struct is_linear_unit_transformation : std::true_type { };
|
|
146
|
+
|
|
147
|
+
// Template class holding a single value with an associated physical
|
|
148
|
+
// unit. The unit and conversion parameters are statically defined
|
|
149
|
+
// and optimized at compile time. With optimization (-O2), use of a
|
|
150
|
+
// single physical unit type is as efficient as using a native
|
|
151
|
+
// floating point type. Conversions between units are optimized to
|
|
152
|
+
// (typically) a single multiplication operation. Unit conversions
|
|
153
|
+
// for constants are done at compile time and incur no runtime
|
|
154
|
+
// overhead (again at -O2).
|
|
155
|
+
//
|
|
156
|
+
// Template parameters:
|
|
157
|
+
// Base is the base unit class, such as Angle or Length. If operator<<
|
|
158
|
+
// is used, it must have:
|
|
159
|
+
// - a public static field "output_suffix" and
|
|
160
|
+
// - a public static method Float Base::GetInBaseUnit(PhysicalUnit). An
|
|
161
|
+
// example can be found in length-units.h
|
|
162
|
+
// LengthBase::GetInBaseUnit.
|
|
163
|
+
// Unit is the UnitConversion class that defines a specific unit
|
|
164
|
+
// (such as degrees) in terms of a reference unit (such as radians).
|
|
165
|
+
template <class Float, class Base, class Unit>
|
|
166
|
+
class PhysicalUnit {
|
|
167
|
+
public:
|
|
168
|
+
typedef PhysicalUnit<Float, Base, Unit> Type;
|
|
169
|
+
typedef Float FloatType;
|
|
170
|
+
|
|
171
|
+
// Use 'explicit' to prevent unintentional construction from untyped (or
|
|
172
|
+
// mistyped) values. Note that this also prevents arguably reasonable
|
|
173
|
+
// constructs such as Unit unit = 10.0; use either Unit unit(10.0) or
|
|
174
|
+
// Unit unit = Unit(10.0) instead.
|
|
175
|
+
PhysicalUnit(): value_(static_cast<Float>(0.0)) {}
|
|
176
|
+
constexpr explicit PhysicalUnit(Float value): value_(value) {}
|
|
177
|
+
|
|
178
|
+
// Conversion from other units of the same Base type.
|
|
179
|
+
//
|
|
180
|
+
// Policy decision: not using 'explicit' allows much more natural
|
|
181
|
+
// conversions between units of a given base type. This can result in
|
|
182
|
+
// unintended implicit type conversions, but these incur very little
|
|
183
|
+
// overhead (inlined multiply at -O2) and should be inconsequential in
|
|
184
|
+
// most circumstances. Casts between different base types (including
|
|
185
|
+
// different underlying value types) require explicit handling. The ClangTidy
|
|
186
|
+
// warnings regarding this are therefore suppressed with NOLINT below.
|
|
187
|
+
template <class Unit2>
|
|
188
|
+
constexpr PhysicalUnit(PhysicalUnit<Float, Base, Unit2> other) // NOLINT
|
|
189
|
+
: value_(UnitConverter<Unit2, Unit, Float>::Convert(other.value())) {}
|
|
190
|
+
|
|
191
|
+
// Copy operation from other units of the same Base type.
|
|
192
|
+
template <class Unit2>
|
|
193
|
+
Type operator = (PhysicalUnit<Float, Base, Unit2> other) {
|
|
194
|
+
value_ = UnitConverter<Unit2, Unit, Float>::Convert(other.value());
|
|
195
|
+
return *this;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
// Value accessor. Consider using an explicitly typed accessor whenever
|
|
199
|
+
// the unit type is not immediately obvious (such as function return
|
|
200
|
+
// values). For example:
|
|
201
|
+
// float x = myclass.GetAngle().value(); // what unit is x?
|
|
202
|
+
// float x = GetDegrees(myclass.GetAngle()); // much clearer.
|
|
203
|
+
// float x = Degrees(myclass.GetAngle()).value(); // ok too.
|
|
204
|
+
// Degrees degrees = myclass.GetAngle(); // using a temporary is
|
|
205
|
+
// float x = degrees.value(); // also good.
|
|
206
|
+
constexpr Float value() const { return value_; }
|
|
207
|
+
|
|
208
|
+
// Trivial arithematic operator wrapping.
|
|
209
|
+
Type operator - () const {
|
|
210
|
+
return Type(-value_);
|
|
211
|
+
}
|
|
212
|
+
Type operator * (const Float scale) const {
|
|
213
|
+
return Type(value_ * scale);
|
|
214
|
+
}
|
|
215
|
+
Type operator + (const Type other) const {
|
|
216
|
+
static_assert(is_linear_unit_transformation<Base>::value,
|
|
217
|
+
"operation not defined");
|
|
218
|
+
return Type(value_ + other.value());
|
|
219
|
+
}
|
|
220
|
+
Type operator - (const Type other) const {
|
|
221
|
+
static_assert(is_linear_unit_transformation<Base>::value,
|
|
222
|
+
"operation not defined");
|
|
223
|
+
return Type(value_ - other.value());
|
|
224
|
+
}
|
|
225
|
+
Float operator / (const Type other) const {
|
|
226
|
+
return value_ / other.value();
|
|
227
|
+
}
|
|
228
|
+
Type operator *= (const Float scale) {
|
|
229
|
+
value_ *= scale;
|
|
230
|
+
return *this;
|
|
231
|
+
}
|
|
232
|
+
Type operator += (const Type other) {
|
|
233
|
+
static_assert(is_linear_unit_transformation<Base>::value,
|
|
234
|
+
"operation not defined");
|
|
235
|
+
value_ += other.value();
|
|
236
|
+
return *this;
|
|
237
|
+
}
|
|
238
|
+
Type operator -= (const Type other) {
|
|
239
|
+
static_assert(is_linear_unit_transformation<Base>::value,
|
|
240
|
+
"operation not defined");
|
|
241
|
+
value_ -= other.value();
|
|
242
|
+
return *this;
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
// Simple comparisons. Overloaded equality is intentionally omitted;
|
|
246
|
+
// use equals() instead.
|
|
247
|
+
bool operator < (const Type other) const {
|
|
248
|
+
return value_ < other.value();
|
|
249
|
+
}
|
|
250
|
+
bool operator > (const Type other) const {
|
|
251
|
+
return value_ > other.value();
|
|
252
|
+
}
|
|
253
|
+
bool operator <= (const Type other) const {
|
|
254
|
+
return value_ <= other.value();
|
|
255
|
+
}
|
|
256
|
+
bool operator >= (const Type other) const {
|
|
257
|
+
return value_ >= other.value();
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
// Test equality to within some epsilon. Always false for
|
|
261
|
+
// epsilon < 0.
|
|
262
|
+
bool equals(const Type other,
|
|
263
|
+
const Type epsilon) const {
|
|
264
|
+
Float delta = value_ - other.value_;
|
|
265
|
+
if (delta < static_cast<Float>(0.0)) {
|
|
266
|
+
return -delta <= epsilon.value_;
|
|
267
|
+
}
|
|
268
|
+
return delta <= epsilon.value_;
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
// A little more sugar.
|
|
272
|
+
Type abs() const {
|
|
273
|
+
return (value_ < static_cast<Float>(0.0)) ? -(*this) : *this;
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
// Explicit precision casting within a base unit class.
|
|
277
|
+
template <typename OtherFloat>
|
|
278
|
+
PhysicalUnit<OtherFloat, Base, Unit> precision_cast() const {
|
|
279
|
+
typedef PhysicalUnit<OtherFloat, Base, Unit> CastType;
|
|
280
|
+
return CastType(static_cast<OtherFloat>(value_));
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
private:
|
|
284
|
+
Float value_;
|
|
285
|
+
// Enforce Float to be a floating point type, since unit conversions will
|
|
286
|
+
// generally fail with integers.
|
|
287
|
+
static_assert(std::is_floating_point<Float>::value,
|
|
288
|
+
"Only_use_floating_point_types");
|
|
289
|
+
};
|
|
290
|
+
|
|
291
|
+
// Allow 2*u (in addition to u*2).
|
|
292
|
+
template <typename Scale, typename Float, class Base, class Unit>
|
|
293
|
+
inline PhysicalUnit<Float, Base, Unit> operator * (
|
|
294
|
+
const Scale scale,
|
|
295
|
+
const PhysicalUnit<Float, Base, Unit> value) {
|
|
296
|
+
return value * static_cast<Float>(scale);
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
// we'll print the current value and the value converted to the natural
|
|
300
|
+
// base type
|
|
301
|
+
template <typename Float, typename Base, typename Unit>
|
|
302
|
+
std::ostream& operator<<(std::ostream& os,
|
|
303
|
+
PhysicalUnit<Float, Base, Unit> value) {
|
|
304
|
+
return os << value.value()
|
|
305
|
+
<< " (" << Base::GetInBaseUnit(value)
|
|
306
|
+
<< Base::output_suffix << ")";
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
} // end namespace units
|
|
310
|
+
|
|
311
|
+
} // end namespace util
|
|
312
|
+
|
|
313
|
+
#endif // S2_UTIL_UNITS_PHYSICAL_UNITS_H_
|
|
@@ -0,0 +1,234 @@
|
|
|
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_VALUE_LEXICON_H_
|
|
19
|
+
#define S2_VALUE_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
|
+
|
|
28
|
+
// ValueLexicon is a class that maps distinct values to sequentially numbered
|
|
29
|
+
// integer identifiers. It automatically eliminates duplicates and uses a
|
|
30
|
+
// compact representation. See also SequenceLexicon.
|
|
31
|
+
//
|
|
32
|
+
// Each distinct value is mapped to a 32-bit integer. The space used for each
|
|
33
|
+
// value is approximately 7 bytes plus the space needed for the value itself.
|
|
34
|
+
// For example, int64 values would need approximately 15 bytes each. Note
|
|
35
|
+
// also that values are referred to using 32-bit ids rather than 64-bit
|
|
36
|
+
// pointers.
|
|
37
|
+
//
|
|
38
|
+
// This class has the same thread-safety properties as "string": const methods
|
|
39
|
+
// are thread safe, and non-const methods are not thread safe.
|
|
40
|
+
//
|
|
41
|
+
// Example usage:
|
|
42
|
+
//
|
|
43
|
+
// ValueLexicon<string> lexicon;
|
|
44
|
+
// uint32 cat_id = lexicon.Add("cat");
|
|
45
|
+
// EXPECT_EQ(cat_id, lexicon.Add("cat"));
|
|
46
|
+
// EXPECT_EQ("cat", lexicon.value(cat_id));
|
|
47
|
+
//
|
|
48
|
+
template <class T,
|
|
49
|
+
class Hasher = std::hash<T>,
|
|
50
|
+
class KeyEqual = std::equal_to<T>>
|
|
51
|
+
class ValueLexicon {
|
|
52
|
+
public:
|
|
53
|
+
explicit ValueLexicon(const Hasher& hasher = Hasher(),
|
|
54
|
+
const KeyEqual& key_equal = KeyEqual());
|
|
55
|
+
|
|
56
|
+
// ValueLexicon is movable and copyable.
|
|
57
|
+
ValueLexicon(const ValueLexicon&);
|
|
58
|
+
ValueLexicon& operator=(const ValueLexicon&);
|
|
59
|
+
ValueLexicon(ValueLexicon&&);
|
|
60
|
+
ValueLexicon& operator=(ValueLexicon&&);
|
|
61
|
+
|
|
62
|
+
// Clears all data from the lexicon.
|
|
63
|
+
void Clear();
|
|
64
|
+
|
|
65
|
+
// Add the given value to the lexicon if it is not already present, and
|
|
66
|
+
// return its integer id. Ids are assigned sequentially starting from zero.
|
|
67
|
+
uint32 Add(const T& value);
|
|
68
|
+
|
|
69
|
+
// Return the number of values in the lexicon.
|
|
70
|
+
uint32 size() const;
|
|
71
|
+
|
|
72
|
+
// Return the value with the given id.
|
|
73
|
+
const T& value(uint32 id) const;
|
|
74
|
+
|
|
75
|
+
private:
|
|
76
|
+
friend class IdKeyEqual;
|
|
77
|
+
// Choose kEmptyKey to be the last key that will ever be generated.
|
|
78
|
+
static const uint32 kEmptyKey = std::numeric_limits<uint32>::max();
|
|
79
|
+
|
|
80
|
+
class IdHasher {
|
|
81
|
+
public:
|
|
82
|
+
IdHasher(const Hasher& hasher, const ValueLexicon* lexicon);
|
|
83
|
+
const Hasher& hasher() const;
|
|
84
|
+
size_t operator()(uint32 id) const;
|
|
85
|
+
private:
|
|
86
|
+
Hasher hasher_;
|
|
87
|
+
const ValueLexicon* lexicon_;
|
|
88
|
+
};
|
|
89
|
+
|
|
90
|
+
class IdKeyEqual {
|
|
91
|
+
public:
|
|
92
|
+
IdKeyEqual(const KeyEqual& key_equal, const ValueLexicon* lexicon);
|
|
93
|
+
bool operator()(uint32 id1, uint32 id2) const;
|
|
94
|
+
private:
|
|
95
|
+
KeyEqual key_equal_;
|
|
96
|
+
const ValueLexicon* lexicon_;
|
|
97
|
+
};
|
|
98
|
+
|
|
99
|
+
using IdSet = gtl::dense_hash_set<uint32, IdHasher, IdKeyEqual>;
|
|
100
|
+
|
|
101
|
+
KeyEqual key_equal_;
|
|
102
|
+
std::vector<T> values_;
|
|
103
|
+
IdSet id_set_;
|
|
104
|
+
};
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
////////////////// Implementation details follow ////////////////////
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
template <class T, class Hasher, class KeyEqual>
|
|
111
|
+
const uint32 ValueLexicon<T, Hasher, KeyEqual>::kEmptyKey;
|
|
112
|
+
|
|
113
|
+
template <class T, class Hasher, class KeyEqual>
|
|
114
|
+
ValueLexicon<T, Hasher, KeyEqual>::IdHasher::IdHasher(
|
|
115
|
+
const Hasher& hasher, const ValueLexicon* lexicon)
|
|
116
|
+
: hasher_(hasher), lexicon_(lexicon) {
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
template <class T, class Hasher, class KeyEqual>
|
|
120
|
+
const Hasher& ValueLexicon<T, Hasher, KeyEqual>::IdHasher::hasher() const {
|
|
121
|
+
return hasher_;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
template <class T, class Hasher, class KeyEqual>
|
|
125
|
+
inline size_t ValueLexicon<T, Hasher, KeyEqual>::IdHasher::operator()(
|
|
126
|
+
uint32 id) const {
|
|
127
|
+
return hasher_(lexicon_->value(id));
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
template <class T, class Hasher, class KeyEqual>
|
|
131
|
+
ValueLexicon<T, Hasher, KeyEqual>::IdKeyEqual::IdKeyEqual(
|
|
132
|
+
const KeyEqual& key_equal, const ValueLexicon* lexicon)
|
|
133
|
+
: key_equal_(key_equal), lexicon_(lexicon) {
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
template <class T, class Hasher, class KeyEqual>
|
|
137
|
+
inline bool ValueLexicon<T, Hasher, KeyEqual>::IdKeyEqual::operator()(
|
|
138
|
+
uint32 id1, uint32 id2) const {
|
|
139
|
+
if (id1 == id2) return true;
|
|
140
|
+
if (id1 == lexicon_->kEmptyKey || id2 == lexicon_->kEmptyKey) {
|
|
141
|
+
return false;
|
|
142
|
+
}
|
|
143
|
+
return key_equal_(lexicon_->value(id1), lexicon_->value(id2));
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
template <class T, class Hasher, class KeyEqual>
|
|
147
|
+
ValueLexicon<T, Hasher, KeyEqual>::ValueLexicon(const Hasher& hasher,
|
|
148
|
+
const KeyEqual& key_equal)
|
|
149
|
+
: key_equal_(key_equal),
|
|
150
|
+
id_set_(0, IdHasher(hasher, this),
|
|
151
|
+
IdKeyEqual(key_equal, this)) {
|
|
152
|
+
id_set_.set_empty_key(kEmptyKey);
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
template <class T, class Hasher, class KeyEqual>
|
|
156
|
+
ValueLexicon<T, Hasher, KeyEqual>::ValueLexicon(const ValueLexicon& x)
|
|
157
|
+
: key_equal_(x.key_equal_), values_(x.values_),
|
|
158
|
+
// Unfortunately we can't copy "id_set_" because we need to change the
|
|
159
|
+
// "this" pointers associated with hasher() and key_equal().
|
|
160
|
+
id_set_(x.id_set_.begin(), x.id_set_.end(), kEmptyKey, 0,
|
|
161
|
+
IdHasher(x.id_set_.hash_funct().hasher(), this),
|
|
162
|
+
IdKeyEqual(x.key_equal_, this)) {
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
template <class T, class Hasher, class KeyEqual>
|
|
166
|
+
ValueLexicon<T, Hasher, KeyEqual>::ValueLexicon(ValueLexicon&& x)
|
|
167
|
+
: key_equal_(std::move(x.key_equal_)), values_(std::move(x.values_)),
|
|
168
|
+
// Unfortunately we can't move "id_set_" because we need to change the
|
|
169
|
+
// "this" pointers associated with hasher() and key_equal().
|
|
170
|
+
id_set_(x.id_set_.begin(), x.id_set_.end(), kEmptyKey, 0,
|
|
171
|
+
IdHasher(x.id_set_.hash_funct().hasher(), this),
|
|
172
|
+
IdKeyEqual(x.key_equal_, this)) {
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
template <class T, class Hasher, class KeyEqual>
|
|
176
|
+
ValueLexicon<T, Hasher, KeyEqual>&
|
|
177
|
+
ValueLexicon<T, Hasher, KeyEqual>::operator=(const ValueLexicon& x) {
|
|
178
|
+
// Note that self-assignment is handled correctly by this code.
|
|
179
|
+
key_equal_ = x.key_equal_;
|
|
180
|
+
values_ = x.values_;
|
|
181
|
+
// Unfortunately we can't copy-assign "id_set_" because we need to change
|
|
182
|
+
// the "this" pointers associated with hasher() and key_equal().
|
|
183
|
+
id_set_ = IdSet(x.id_set_.begin(), x.id_set_.end(), kEmptyKey, 0,
|
|
184
|
+
IdHasher(x.id_set_.hash_funct().hasher(), this),
|
|
185
|
+
IdKeyEqual(x.key_equal_, this));
|
|
186
|
+
return *this;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
template <class T, class Hasher, class KeyEqual>
|
|
190
|
+
ValueLexicon<T, Hasher, KeyEqual>&
|
|
191
|
+
ValueLexicon<T, Hasher, KeyEqual>::operator=(ValueLexicon&& x) {
|
|
192
|
+
// Note that move self-assignment has undefined behavior.
|
|
193
|
+
key_equal_ = std::move(x.key_equal_);
|
|
194
|
+
values_ = std::move(x.values_);
|
|
195
|
+
// Unfortunately we can't move-assign "id_set_" because we need to change
|
|
196
|
+
// the "this" pointers associated with hasher() and key_equal().
|
|
197
|
+
id_set_ = IdSet(x.id_set_.begin(), x.id_set_.end(), kEmptyKey, 0,
|
|
198
|
+
IdHasher(x.id_set_.hash_funct().hasher(), this),
|
|
199
|
+
IdKeyEqual(x.key_equal_, this));
|
|
200
|
+
return *this;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
template <class T, class Hasher, class KeyEqual>
|
|
204
|
+
void ValueLexicon<T, Hasher, KeyEqual>::Clear() {
|
|
205
|
+
values_.clear();
|
|
206
|
+
id_set_.clear();
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
template <class T, class Hasher, class KeyEqual>
|
|
210
|
+
uint32 ValueLexicon<T, Hasher, KeyEqual>::Add(const T& value) {
|
|
211
|
+
if (!values_.empty() && key_equal_(value, values_.back())) {
|
|
212
|
+
return values_.size() - 1;
|
|
213
|
+
}
|
|
214
|
+
values_.push_back(value);
|
|
215
|
+
auto result = id_set_.insert(values_.size() - 1);
|
|
216
|
+
if (result.second) {
|
|
217
|
+
return values_.size() - 1;
|
|
218
|
+
} else {
|
|
219
|
+
values_.pop_back();
|
|
220
|
+
return *result.first;
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
template <class T, class Hasher, class KeyEqual>
|
|
225
|
+
inline uint32 ValueLexicon<T, Hasher, KeyEqual>::size() const {
|
|
226
|
+
return values_.size();
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
template <class T, class Hasher, class KeyEqual>
|
|
230
|
+
inline const T& ValueLexicon<T, Hasher, KeyEqual>::value(uint32 id) const {
|
|
231
|
+
return values_[id];
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
#endif // S2_VALUE_LEXICON_H_
|