@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,299 @@
|
|
|
1
|
+
// Copyright 2017 The Abseil Authors.
|
|
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
|
+
// This header file contains C++11 versions of standard <utility> header
|
|
16
|
+
// abstractions available within C++14 and C++17, and are designed to be drop-in
|
|
17
|
+
// replacement for code compliant with C++14 and C++17.
|
|
18
|
+
//
|
|
19
|
+
// The following abstractions are defined:
|
|
20
|
+
//
|
|
21
|
+
// * integer_sequence<T, Ints...> == std::integer_sequence<T, Ints...>
|
|
22
|
+
// * index_sequence<Ints...> == std::index_sequence<Ints...>
|
|
23
|
+
// * make_integer_sequence<T, N> == std::make_integer_sequence<T, N>
|
|
24
|
+
// * make_index_sequence<N> == std::make_index_sequence<N>
|
|
25
|
+
// * index_sequence_for<Ts...> == std::index_sequence_for<Ts...>
|
|
26
|
+
// * apply<Functor, Tuple> == std::apply<Functor, Tuple>
|
|
27
|
+
// * exchange<T> == std::exchange<T>
|
|
28
|
+
//
|
|
29
|
+
// This header file also provides the tag types `in_place_t`, `in_place_type_t`,
|
|
30
|
+
// and `in_place_index_t`, as well as the constant `in_place`, and
|
|
31
|
+
// `constexpr` `std::move()` and `std::forward()` implementations in C++11.
|
|
32
|
+
//
|
|
33
|
+
// References:
|
|
34
|
+
//
|
|
35
|
+
// http://en.cppreference.com/w/cpp/utility/integer_sequence
|
|
36
|
+
// http://en.cppreference.com/w/cpp/utility/apply
|
|
37
|
+
// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3658.html
|
|
38
|
+
//
|
|
39
|
+
|
|
40
|
+
#ifndef S2_THIRD_PARTY_ABSL_UTILITY_UTILITY_H_
|
|
41
|
+
#define S2_THIRD_PARTY_ABSL_UTILITY_UTILITY_H_
|
|
42
|
+
|
|
43
|
+
#include <cstddef>
|
|
44
|
+
#include <cstdlib>
|
|
45
|
+
#include <tuple>
|
|
46
|
+
#include <utility>
|
|
47
|
+
|
|
48
|
+
#include "s2/third_party/absl/base/config.h"
|
|
49
|
+
#include "s2/third_party/absl/base/internal/inline_variable.h"
|
|
50
|
+
#include "s2/third_party/absl/base/internal/invoke.h"
|
|
51
|
+
#include "s2/third_party/absl/meta/type_traits.h"
|
|
52
|
+
|
|
53
|
+
namespace absl {
|
|
54
|
+
|
|
55
|
+
// integer_sequence
|
|
56
|
+
//
|
|
57
|
+
// Class template representing a compile-time integer sequence. An instantiation
|
|
58
|
+
// of `integer_sequence<T, Ints...>` has a sequence of integers encoded in its
|
|
59
|
+
// type through its template arguments (which is a common need when
|
|
60
|
+
// working with C++11 variadic templates). `absl::integer_sequence` is designed
|
|
61
|
+
// to be a drop-in replacement for C++14's `std::integer_sequence`.
|
|
62
|
+
//
|
|
63
|
+
// Example:
|
|
64
|
+
//
|
|
65
|
+
// template< class T, T... Ints >
|
|
66
|
+
// void user_function(integer_sequence<T, Ints...>);
|
|
67
|
+
//
|
|
68
|
+
// int main()
|
|
69
|
+
// {
|
|
70
|
+
// // user_function's `T` will be deduced to `int` and `Ints...`
|
|
71
|
+
// // will be deduced to `0, 1, 2, 3, 4`.
|
|
72
|
+
// user_function(make_integer_sequence<int, 5>());
|
|
73
|
+
// }
|
|
74
|
+
template <typename T, T... Ints>
|
|
75
|
+
struct integer_sequence {
|
|
76
|
+
using value_type = T;
|
|
77
|
+
static constexpr size_t size() noexcept { return sizeof...(Ints); }
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
// index_sequence
|
|
81
|
+
//
|
|
82
|
+
// A helper template for an `integer_sequence` of `size_t`,
|
|
83
|
+
// `absl::index_sequence` is designed to be a drop-in replacement for C++14's
|
|
84
|
+
// `std::index_sequence`.
|
|
85
|
+
template <size_t... Ints>
|
|
86
|
+
using index_sequence = integer_sequence<size_t, Ints...>;
|
|
87
|
+
|
|
88
|
+
namespace utility_internal {
|
|
89
|
+
|
|
90
|
+
template <typename Seq, size_t SeqSize, size_t Rem>
|
|
91
|
+
struct Extend;
|
|
92
|
+
|
|
93
|
+
// Note that SeqSize == sizeof...(Ints). It's passed explicitly for efficiency.
|
|
94
|
+
template <typename T, T... Ints, size_t SeqSize>
|
|
95
|
+
struct Extend<integer_sequence<T, Ints...>, SeqSize, 0> {
|
|
96
|
+
using type = integer_sequence<T, Ints..., (Ints + SeqSize)...>;
|
|
97
|
+
};
|
|
98
|
+
|
|
99
|
+
template <typename T, T... Ints, size_t SeqSize>
|
|
100
|
+
struct Extend<integer_sequence<T, Ints...>, SeqSize, 1> {
|
|
101
|
+
using type = integer_sequence<T, Ints..., (Ints + SeqSize)..., 2 * SeqSize>;
|
|
102
|
+
};
|
|
103
|
+
|
|
104
|
+
// Recursion helper for 'make_integer_sequence<T, N>'.
|
|
105
|
+
// 'Gen<T, N>::type' is an alias for 'integer_sequence<T, 0, 1, ... N-1>'.
|
|
106
|
+
template <typename T, size_t N>
|
|
107
|
+
struct Gen {
|
|
108
|
+
using type =
|
|
109
|
+
typename Extend<typename Gen<T, N / 2>::type, N / 2, N % 2>::type;
|
|
110
|
+
};
|
|
111
|
+
|
|
112
|
+
template <typename T>
|
|
113
|
+
struct Gen<T, 0> {
|
|
114
|
+
using type = integer_sequence<T>;
|
|
115
|
+
};
|
|
116
|
+
|
|
117
|
+
} // namespace utility_internal
|
|
118
|
+
|
|
119
|
+
// Compile-time sequences of integers
|
|
120
|
+
|
|
121
|
+
// make_integer_sequence
|
|
122
|
+
//
|
|
123
|
+
// This template alias is equivalent to
|
|
124
|
+
// `integer_sequence<int, 0, 1, ..., N-1>`, and is designed to be a drop-in
|
|
125
|
+
// replacement for C++14's `std::make_integer_sequence`.
|
|
126
|
+
template <typename T, T N>
|
|
127
|
+
using make_integer_sequence = typename utility_internal::Gen<T, N>::type;
|
|
128
|
+
|
|
129
|
+
// make_index_sequence
|
|
130
|
+
//
|
|
131
|
+
// This template alias is equivalent to `index_sequence<0, 1, ..., N-1>`,
|
|
132
|
+
// and is designed to be a drop-in replacement for C++14's
|
|
133
|
+
// `std::make_index_sequence`.
|
|
134
|
+
template <size_t N>
|
|
135
|
+
using make_index_sequence = make_integer_sequence<size_t, N>;
|
|
136
|
+
|
|
137
|
+
// index_sequence_for
|
|
138
|
+
//
|
|
139
|
+
// Converts a typename pack into an index sequence of the same length, and
|
|
140
|
+
// is designed to be a drop-in replacement for C++14's
|
|
141
|
+
// `std::index_sequence_for()`
|
|
142
|
+
template <typename... Ts>
|
|
143
|
+
using index_sequence_for = make_index_sequence<sizeof...(Ts)>;
|
|
144
|
+
|
|
145
|
+
// Tag types
|
|
146
|
+
|
|
147
|
+
#ifdef ABSL_HAVE_STD_OPTIONAL
|
|
148
|
+
|
|
149
|
+
using std::in_place_t;
|
|
150
|
+
using std::in_place;
|
|
151
|
+
|
|
152
|
+
#else // ABSL_HAVE_STD_OPTIONAL
|
|
153
|
+
|
|
154
|
+
// in_place_t
|
|
155
|
+
//
|
|
156
|
+
// Tag type used to specify in-place construction, such as with
|
|
157
|
+
// `absl::optional`, designed to be a drop-in replacement for C++17's
|
|
158
|
+
// `std::in_place_t`.
|
|
159
|
+
struct in_place_t {};
|
|
160
|
+
|
|
161
|
+
ABSL_INTERNAL_INLINE_CONSTEXPR(in_place_t, in_place, {});
|
|
162
|
+
|
|
163
|
+
#endif // ABSL_HAVE_STD_OPTIONAL
|
|
164
|
+
|
|
165
|
+
#if defined(ABSL_HAVE_STD_ANY) || defined(ABSL_HAVE_STD_VARIANT)
|
|
166
|
+
using std::in_place_type_t;
|
|
167
|
+
#else
|
|
168
|
+
|
|
169
|
+
// in_place_type_t
|
|
170
|
+
//
|
|
171
|
+
// Tag type used for in-place construction when the type to construct needs to
|
|
172
|
+
// be specified, such as with `absl::any`, designed to be a drop-in replacement
|
|
173
|
+
// for C++17's `std::in_place_type_t`.
|
|
174
|
+
template <typename T>
|
|
175
|
+
struct in_place_type_t {};
|
|
176
|
+
#endif // ABSL_HAVE_STD_ANY || ABSL_HAVE_STD_VARIANT
|
|
177
|
+
|
|
178
|
+
#ifdef ABSL_HAVE_STD_VARIANT
|
|
179
|
+
using std::in_place_index_t;
|
|
180
|
+
#else
|
|
181
|
+
|
|
182
|
+
// in_place_index_t
|
|
183
|
+
//
|
|
184
|
+
// Tag type used for in-place construction when the type to construct needs to
|
|
185
|
+
// be specified, such as with `absl::any`, designed to be a drop-in replacement
|
|
186
|
+
// for C++17's `std::in_place_index_t`.
|
|
187
|
+
template <size_t I>
|
|
188
|
+
struct in_place_index_t {};
|
|
189
|
+
#endif // ABSL_HAVE_STD_VARIANT
|
|
190
|
+
|
|
191
|
+
// Constexpr move and forward
|
|
192
|
+
|
|
193
|
+
// move()
|
|
194
|
+
//
|
|
195
|
+
// A constexpr version of `std::move()`, designed to be a drop-in replacement
|
|
196
|
+
// for C++14's `std::move()`.
|
|
197
|
+
template <typename T>
|
|
198
|
+
constexpr absl::remove_reference_t<T>&& move(T&& t) noexcept {
|
|
199
|
+
return static_cast<absl::remove_reference_t<T>&&>(t);
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
// forward()
|
|
203
|
+
//
|
|
204
|
+
// A constexpr version of `std::forward()`, designed to be a drop-in replacement
|
|
205
|
+
// for C++14's `std::forward()`.
|
|
206
|
+
template <typename T>
|
|
207
|
+
constexpr T&& forward(
|
|
208
|
+
absl::remove_reference_t<T>& t) noexcept { // NOLINT(runtime/references)
|
|
209
|
+
return static_cast<T&&>(t);
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
namespace utility_internal {
|
|
213
|
+
// Helper method for expanding tuple into a called method.
|
|
214
|
+
template <typename Functor, typename Tuple, std::size_t... Indexes>
|
|
215
|
+
auto apply_helper(Functor&& functor, Tuple&& t, index_sequence<Indexes...>)
|
|
216
|
+
-> decltype(absl::base_internal::Invoke(
|
|
217
|
+
absl::forward<Functor>(functor),
|
|
218
|
+
std::get<Indexes>(absl::forward<Tuple>(t))...)) {
|
|
219
|
+
return absl::base_internal::Invoke(
|
|
220
|
+
absl::forward<Functor>(functor),
|
|
221
|
+
std::get<Indexes>(absl::forward<Tuple>(t))...);
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
} // namespace utility_internal
|
|
225
|
+
|
|
226
|
+
// apply
|
|
227
|
+
//
|
|
228
|
+
// Invokes a Callable using elements of a tuple as its arguments.
|
|
229
|
+
// Each element of the tuple corresponds to an argument of the call (in order).
|
|
230
|
+
// Both the Callable argument and the tuple argument are perfect-forwarded.
|
|
231
|
+
// For member-function Callables, the first tuple element acts as the `this`
|
|
232
|
+
// pointer. `absl::apply` is designed to be a drop-in replacement for C++17's
|
|
233
|
+
// `std::apply`. Unlike C++17's `std::apply`, this is not currently `constexpr`.
|
|
234
|
+
//
|
|
235
|
+
// Example:
|
|
236
|
+
//
|
|
237
|
+
// class Foo {
|
|
238
|
+
// public:
|
|
239
|
+
// void Bar(int);
|
|
240
|
+
// };
|
|
241
|
+
// void user_function1(int, string);
|
|
242
|
+
// void user_function2(std::unique_ptr<Foo>);
|
|
243
|
+
// auto user_lambda = [](int, int) {};
|
|
244
|
+
//
|
|
245
|
+
// int main()
|
|
246
|
+
// {
|
|
247
|
+
// std::tuple<int, string> tuple1(42, "bar");
|
|
248
|
+
// // Invokes the first user function on int, string.
|
|
249
|
+
// absl::apply(&user_function1, tuple1);
|
|
250
|
+
//
|
|
251
|
+
// std::tuple<std::unique_ptr<Foo>> tuple2(absl::make_unique<Foo>());
|
|
252
|
+
// // Invokes the user function that takes ownership of the unique
|
|
253
|
+
// // pointer.
|
|
254
|
+
// absl::apply(&user_function2, std::move(tuple2));
|
|
255
|
+
//
|
|
256
|
+
// auto foo = absl::make_unique<Foo>();
|
|
257
|
+
// std::tuple<Foo*, int> tuple3(foo.get(), 42);
|
|
258
|
+
// // Invokes the method Bar on foo with one argument, 42.
|
|
259
|
+
// absl::apply(&Foo::Bar, tuple3);
|
|
260
|
+
//
|
|
261
|
+
// std::tuple<int, int> tuple4(8, 9);
|
|
262
|
+
// // Invokes a lambda.
|
|
263
|
+
// absl::apply(user_lambda, tuple4);
|
|
264
|
+
// }
|
|
265
|
+
template <typename Functor, typename Tuple>
|
|
266
|
+
auto apply(Functor&& functor, Tuple&& t)
|
|
267
|
+
-> decltype(utility_internal::apply_helper(
|
|
268
|
+
absl::forward<Functor>(functor), absl::forward<Tuple>(t),
|
|
269
|
+
absl::make_index_sequence<std::tuple_size<
|
|
270
|
+
typename std::remove_reference<Tuple>::type>::value>{})) {
|
|
271
|
+
return utility_internal::apply_helper(
|
|
272
|
+
absl::forward<Functor>(functor), absl::forward<Tuple>(t),
|
|
273
|
+
absl::make_index_sequence<std::tuple_size<
|
|
274
|
+
typename std::remove_reference<Tuple>::type>::value>{});
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
// exchange
|
|
278
|
+
//
|
|
279
|
+
// Replaces the value of `obj` with `new_value` and returns the old value of
|
|
280
|
+
// `obj`. `absl::exchange` is designed to be a drop-in replacement for C++14's
|
|
281
|
+
// `std::exchange`.
|
|
282
|
+
//
|
|
283
|
+
// Example:
|
|
284
|
+
//
|
|
285
|
+
// Foo& operator=(Foo&& other) {
|
|
286
|
+
// ptr1_ = absl::exchange(other.ptr1_, nullptr);
|
|
287
|
+
// int1_ = absl::exchange(other.int1_, -1);
|
|
288
|
+
// return *this;
|
|
289
|
+
// }
|
|
290
|
+
template <typename T, typename U = T>
|
|
291
|
+
T exchange(T& obj, U&& new_value) {
|
|
292
|
+
T old_value = absl::move(obj);
|
|
293
|
+
obj = absl::forward<U>(new_value);
|
|
294
|
+
return old_value;
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
} // namespace absl
|
|
298
|
+
|
|
299
|
+
#endif // S2_THIRD_PARTY_ABSL_UTILITY_UTILITY_H_
|
|
@@ -0,0 +1,274 @@
|
|
|
1
|
+
// Copyright 2009 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: jyrki@google.com (Jyrki Alakuijala)
|
|
17
|
+
//
|
|
18
|
+
// Performance notes:
|
|
19
|
+
// 2009-01-16: hendrie@google.com microbenchmarked InterleaveUint32 against
|
|
20
|
+
// two table-free implementations from "Hacker's Delight" section 7-2.
|
|
21
|
+
// This implementation was substantially faster: 8 ns vs 17 ns, even
|
|
22
|
+
// without subtracting the time taken in the test harness itself.
|
|
23
|
+
// Test environment: workstation w/ 2.4 GHz Core 2 Duo, compiler target
|
|
24
|
+
// gcc-4.3.1-glibc-2.3.6-grte-k8.
|
|
25
|
+
// TODO(user): Inlining InterleaveUint32 yields a measurable speedup (5
|
|
26
|
+
// ns vs. 8 ns). Consider cost/benefit of moving implementations inline.
|
|
27
|
+
|
|
28
|
+
#include "s2/util/bits/bit-interleave.h"
|
|
29
|
+
|
|
30
|
+
#include "s2/base/integral_types.h"
|
|
31
|
+
|
|
32
|
+
namespace util_bits {
|
|
33
|
+
|
|
34
|
+
static const uint16 kInterleaveLut[256] = {
|
|
35
|
+
0x0000, 0x0001, 0x0004, 0x0005, 0x0010, 0x0011, 0x0014, 0x0015,
|
|
36
|
+
0x0040, 0x0041, 0x0044, 0x0045, 0x0050, 0x0051, 0x0054, 0x0055,
|
|
37
|
+
0x0100, 0x0101, 0x0104, 0x0105, 0x0110, 0x0111, 0x0114, 0x0115,
|
|
38
|
+
0x0140, 0x0141, 0x0144, 0x0145, 0x0150, 0x0151, 0x0154, 0x0155,
|
|
39
|
+
0x0400, 0x0401, 0x0404, 0x0405, 0x0410, 0x0411, 0x0414, 0x0415,
|
|
40
|
+
0x0440, 0x0441, 0x0444, 0x0445, 0x0450, 0x0451, 0x0454, 0x0455,
|
|
41
|
+
0x0500, 0x0501, 0x0504, 0x0505, 0x0510, 0x0511, 0x0514, 0x0515,
|
|
42
|
+
0x0540, 0x0541, 0x0544, 0x0545, 0x0550, 0x0551, 0x0554, 0x0555,
|
|
43
|
+
|
|
44
|
+
0x1000, 0x1001, 0x1004, 0x1005, 0x1010, 0x1011, 0x1014, 0x1015,
|
|
45
|
+
0x1040, 0x1041, 0x1044, 0x1045, 0x1050, 0x1051, 0x1054, 0x1055,
|
|
46
|
+
0x1100, 0x1101, 0x1104, 0x1105, 0x1110, 0x1111, 0x1114, 0x1115,
|
|
47
|
+
0x1140, 0x1141, 0x1144, 0x1145, 0x1150, 0x1151, 0x1154, 0x1155,
|
|
48
|
+
0x1400, 0x1401, 0x1404, 0x1405, 0x1410, 0x1411, 0x1414, 0x1415,
|
|
49
|
+
0x1440, 0x1441, 0x1444, 0x1445, 0x1450, 0x1451, 0x1454, 0x1455,
|
|
50
|
+
0x1500, 0x1501, 0x1504, 0x1505, 0x1510, 0x1511, 0x1514, 0x1515,
|
|
51
|
+
0x1540, 0x1541, 0x1544, 0x1545, 0x1550, 0x1551, 0x1554, 0x1555,
|
|
52
|
+
|
|
53
|
+
0x4000, 0x4001, 0x4004, 0x4005, 0x4010, 0x4011, 0x4014, 0x4015,
|
|
54
|
+
0x4040, 0x4041, 0x4044, 0x4045, 0x4050, 0x4051, 0x4054, 0x4055,
|
|
55
|
+
0x4100, 0x4101, 0x4104, 0x4105, 0x4110, 0x4111, 0x4114, 0x4115,
|
|
56
|
+
0x4140, 0x4141, 0x4144, 0x4145, 0x4150, 0x4151, 0x4154, 0x4155,
|
|
57
|
+
0x4400, 0x4401, 0x4404, 0x4405, 0x4410, 0x4411, 0x4414, 0x4415,
|
|
58
|
+
0x4440, 0x4441, 0x4444, 0x4445, 0x4450, 0x4451, 0x4454, 0x4455,
|
|
59
|
+
0x4500, 0x4501, 0x4504, 0x4505, 0x4510, 0x4511, 0x4514, 0x4515,
|
|
60
|
+
0x4540, 0x4541, 0x4544, 0x4545, 0x4550, 0x4551, 0x4554, 0x4555,
|
|
61
|
+
|
|
62
|
+
0x5000, 0x5001, 0x5004, 0x5005, 0x5010, 0x5011, 0x5014, 0x5015,
|
|
63
|
+
0x5040, 0x5041, 0x5044, 0x5045, 0x5050, 0x5051, 0x5054, 0x5055,
|
|
64
|
+
0x5100, 0x5101, 0x5104, 0x5105, 0x5110, 0x5111, 0x5114, 0x5115,
|
|
65
|
+
0x5140, 0x5141, 0x5144, 0x5145, 0x5150, 0x5151, 0x5154, 0x5155,
|
|
66
|
+
0x5400, 0x5401, 0x5404, 0x5405, 0x5410, 0x5411, 0x5414, 0x5415,
|
|
67
|
+
0x5440, 0x5441, 0x5444, 0x5445, 0x5450, 0x5451, 0x5454, 0x5455,
|
|
68
|
+
0x5500, 0x5501, 0x5504, 0x5505, 0x5510, 0x5511, 0x5514, 0x5515,
|
|
69
|
+
0x5540, 0x5541, 0x5544, 0x5545, 0x5550, 0x5551, 0x5554, 0x5555,
|
|
70
|
+
};
|
|
71
|
+
|
|
72
|
+
uint16 InterleaveUint8(const uint8 val0, const uint8 val1) {
|
|
73
|
+
return kInterleaveLut[val0] | (kInterleaveLut[val1] << 1);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
uint32 InterleaveUint16(const uint16 val0, const uint16 val1) {
|
|
77
|
+
return kInterleaveLut[val0 & 0xff] |
|
|
78
|
+
(kInterleaveLut[val0 >> 8] << 16) |
|
|
79
|
+
(kInterleaveLut[val1 & 0xff] << 1) |
|
|
80
|
+
(kInterleaveLut[val1 >> 8] << 17);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
uint64 InterleaveUint32(const uint32 val0, const uint32 val1) {
|
|
84
|
+
return
|
|
85
|
+
(static_cast<uint64>(kInterleaveLut[val0 & 0xff])) |
|
|
86
|
+
(static_cast<uint64>(kInterleaveLut[(val0 >> 8) & 0xff]) << 16) |
|
|
87
|
+
(static_cast<uint64>(kInterleaveLut[(val0 >> 16) & 0xff]) << 32) |
|
|
88
|
+
(static_cast<uint64>(kInterleaveLut[val0 >> 24]) << 48) |
|
|
89
|
+
(static_cast<uint64>(kInterleaveLut[val1 & 0xff]) << 1) |
|
|
90
|
+
(static_cast<uint64>(kInterleaveLut[(val1 >> 8) & 0xff]) << 17) |
|
|
91
|
+
(static_cast<uint64>(kInterleaveLut[(val1 >> 16) & 0xff]) << 33) |
|
|
92
|
+
(static_cast<uint64>(kInterleaveLut[val1 >> 24]) << 49);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// The lookup table below can convert a sequence of interleaved 8 bits into
|
|
96
|
+
// non-interleaved 4 bits. The table can convert both odd and even bits at the
|
|
97
|
+
// same time, and lut[x & 0x55] converts the even bits (bits 0, 2, 4 and 6),
|
|
98
|
+
// while lut[x & 0xaa] converts the odd bits (bits 1, 3, 5 and 7).
|
|
99
|
+
//
|
|
100
|
+
// The lookup table below was generated using the following python code:
|
|
101
|
+
//
|
|
102
|
+
// def deinterleave(bits):
|
|
103
|
+
// if bits == 0: return 0
|
|
104
|
+
// if bits < 4: return 1
|
|
105
|
+
// return deinterleave(bits / 4) * 2 + deinterleave(bits & 3)
|
|
106
|
+
//
|
|
107
|
+
// for i in range(256): print "0x%x," % deinterleave(i),
|
|
108
|
+
//
|
|
109
|
+
static const uint8 kDeinterleaveLut[256] = {
|
|
110
|
+
0x0, 0x1, 0x1, 0x1, 0x2, 0x3, 0x3, 0x3,
|
|
111
|
+
0x2, 0x3, 0x3, 0x3, 0x2, 0x3, 0x3, 0x3,
|
|
112
|
+
0x4, 0x5, 0x5, 0x5, 0x6, 0x7, 0x7, 0x7,
|
|
113
|
+
0x6, 0x7, 0x7, 0x7, 0x6, 0x7, 0x7, 0x7,
|
|
114
|
+
0x4, 0x5, 0x5, 0x5, 0x6, 0x7, 0x7, 0x7,
|
|
115
|
+
0x6, 0x7, 0x7, 0x7, 0x6, 0x7, 0x7, 0x7,
|
|
116
|
+
0x4, 0x5, 0x5, 0x5, 0x6, 0x7, 0x7, 0x7,
|
|
117
|
+
0x6, 0x7, 0x7, 0x7, 0x6, 0x7, 0x7, 0x7,
|
|
118
|
+
|
|
119
|
+
0x8, 0x9, 0x9, 0x9, 0xa, 0xb, 0xb, 0xb,
|
|
120
|
+
0xa, 0xb, 0xb, 0xb, 0xa, 0xb, 0xb, 0xb,
|
|
121
|
+
0xc, 0xd, 0xd, 0xd, 0xe, 0xf, 0xf, 0xf,
|
|
122
|
+
0xe, 0xf, 0xf, 0xf, 0xe, 0xf, 0xf, 0xf,
|
|
123
|
+
0xc, 0xd, 0xd, 0xd, 0xe, 0xf, 0xf, 0xf,
|
|
124
|
+
0xe, 0xf, 0xf, 0xf, 0xe, 0xf, 0xf, 0xf,
|
|
125
|
+
0xc, 0xd, 0xd, 0xd, 0xe, 0xf, 0xf, 0xf,
|
|
126
|
+
0xe, 0xf, 0xf, 0xf, 0xe, 0xf, 0xf, 0xf,
|
|
127
|
+
|
|
128
|
+
0x8, 0x9, 0x9, 0x9, 0xa, 0xb, 0xb, 0xb,
|
|
129
|
+
0xa, 0xb, 0xb, 0xb, 0xa, 0xb, 0xb, 0xb,
|
|
130
|
+
0xc, 0xd, 0xd, 0xd, 0xe, 0xf, 0xf, 0xf,
|
|
131
|
+
0xe, 0xf, 0xf, 0xf, 0xe, 0xf, 0xf, 0xf,
|
|
132
|
+
0xc, 0xd, 0xd, 0xd, 0xe, 0xf, 0xf, 0xf,
|
|
133
|
+
0xe, 0xf, 0xf, 0xf, 0xe, 0xf, 0xf, 0xf,
|
|
134
|
+
0xc, 0xd, 0xd, 0xd, 0xe, 0xf, 0xf, 0xf,
|
|
135
|
+
0xe, 0xf, 0xf, 0xf, 0xe, 0xf, 0xf, 0xf,
|
|
136
|
+
|
|
137
|
+
0x8, 0x9, 0x9, 0x9, 0xa, 0xb, 0xb, 0xb,
|
|
138
|
+
0xa, 0xb, 0xb, 0xb, 0xa, 0xb, 0xb, 0xb,
|
|
139
|
+
0xc, 0xd, 0xd, 0xd, 0xe, 0xf, 0xf, 0xf,
|
|
140
|
+
0xe, 0xf, 0xf, 0xf, 0xe, 0xf, 0xf, 0xf,
|
|
141
|
+
0xc, 0xd, 0xd, 0xd, 0xe, 0xf, 0xf, 0xf,
|
|
142
|
+
0xe, 0xf, 0xf, 0xf, 0xe, 0xf, 0xf, 0xf,
|
|
143
|
+
0xc, 0xd, 0xd, 0xd, 0xe, 0xf, 0xf, 0xf,
|
|
144
|
+
0xe, 0xf, 0xf, 0xf, 0xe, 0xf, 0xf, 0xf,
|
|
145
|
+
};
|
|
146
|
+
|
|
147
|
+
void DeinterleaveUint8(uint16 val, uint8 *val0, uint8 *val1) {
|
|
148
|
+
*val0 = ((kDeinterleaveLut[val & 0x55]) |
|
|
149
|
+
(kDeinterleaveLut[(val >> 8) & 0x55] << 4));
|
|
150
|
+
*val1 = ((kDeinterleaveLut[val & 0xaa]) |
|
|
151
|
+
(kDeinterleaveLut[(val >> 8) & 0xaa] << 4));
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
void DeinterleaveUint16(uint32 code, uint16 *val0, uint16 *val1) {
|
|
155
|
+
*val0 = ((kDeinterleaveLut[code & 0x55]) |
|
|
156
|
+
(kDeinterleaveLut[(code >> 8) & 0x55] << 4) |
|
|
157
|
+
(kDeinterleaveLut[(code >> 16) & 0x55] << 8) |
|
|
158
|
+
(kDeinterleaveLut[(code >> 24) & 0x55] << 12));
|
|
159
|
+
*val1 = ((kDeinterleaveLut[code & 0xaa]) |
|
|
160
|
+
(kDeinterleaveLut[(code >> 8) & 0xaa] << 4) |
|
|
161
|
+
(kDeinterleaveLut[(code >> 16) & 0xaa] << 8) |
|
|
162
|
+
(kDeinterleaveLut[(code >> 24) & 0xaa] << 12));
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
void DeinterleaveUint32(uint64 code, uint32 *val0, uint32 *val1) {
|
|
166
|
+
*val0 = ((kDeinterleaveLut[code & 0x55]) |
|
|
167
|
+
(kDeinterleaveLut[(code >> 8) & 0x55] << 4) |
|
|
168
|
+
(kDeinterleaveLut[(code >> 16) & 0x55] << 8) |
|
|
169
|
+
(kDeinterleaveLut[(code >> 24) & 0x55] << 12) |
|
|
170
|
+
(kDeinterleaveLut[(code >> 32) & 0x55] << 16) |
|
|
171
|
+
(kDeinterleaveLut[(code >> 40) & 0x55] << 20) |
|
|
172
|
+
(kDeinterleaveLut[(code >> 48) & 0x55] << 24) |
|
|
173
|
+
(kDeinterleaveLut[(code >> 56) & 0x55] << 28));
|
|
174
|
+
*val1 = ((kDeinterleaveLut[code & 0xaa]) |
|
|
175
|
+
(kDeinterleaveLut[(code >> 8) & 0xaa] << 4) |
|
|
176
|
+
(kDeinterleaveLut[(code >> 16) & 0xaa] << 8) |
|
|
177
|
+
(kDeinterleaveLut[(code >> 24) & 0xaa] << 12) |
|
|
178
|
+
(kDeinterleaveLut[(code >> 32) & 0xaa] << 16) |
|
|
179
|
+
(kDeinterleaveLut[(code >> 40) & 0xaa] << 20) |
|
|
180
|
+
(kDeinterleaveLut[(code >> 48) & 0xaa] << 24) |
|
|
181
|
+
(kDeinterleaveLut[(code >> 56) & 0xaa] << 28));
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
// Derivation of the multiplication based interleave algorithm:
|
|
185
|
+
// 1. Original value, bit positions shown:
|
|
186
|
+
// x = --------------------------------------------------------87654321
|
|
187
|
+
// 2. Replicate the byte and select the bits we want:
|
|
188
|
+
// * 0b0000000100000001000000010000000100000001000000010000000100000001
|
|
189
|
+
// 0x 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1
|
|
190
|
+
// => 8765432187654321876543218765432187654321876543218765432187654321
|
|
191
|
+
// & 0b0000000000000000000000001100000000001100000000000011000000000011
|
|
192
|
+
// 0x 0 0 0 0 0 0 C 0 0 C 0 0 3 0 0 3
|
|
193
|
+
// => ------------------------87----------43------------65----------21
|
|
194
|
+
// 3. Use multiplication to perform additions at different offsets:
|
|
195
|
+
// * 0b0000000000000000000000000000000000000000010100000000000000000101
|
|
196
|
+
// 0x 0 0 0 0 0 0 0 0 0 0 5 0 0 0 0 5
|
|
197
|
+
// =>
|
|
198
|
+
// ------------------------87----------43------------65----------21
|
|
199
|
+
// + ----------------------87----------43------------65----------21
|
|
200
|
+
// + ----87----------43------------65----------21
|
|
201
|
+
// + --87----------43------------65----------21
|
|
202
|
+
// => --8787--------4343----8787--6565--4343--2121----6565--------2121
|
|
203
|
+
// 4. Notice the bits never collide. Select the bits we want.
|
|
204
|
+
// & 0b0000000000000000000000100100100100100100100100000000000000000000
|
|
205
|
+
// 0x 0 0 0 0 0 2 4 9 2 4 9 0 0 0 0 0
|
|
206
|
+
// => ----------------------8--7--6--5--4--3--2--1--------------------
|
|
207
|
+
// 5. To produce the final result, we bitwise OR the 3 split integers and shift
|
|
208
|
+
// back to the LSB. To save instructions, we use template<N> to have steps
|
|
209
|
+
// 3 and 4 produce results shifted over N bits.
|
|
210
|
+
// Benchmark Time(ns) CPU(ns) Iterations
|
|
211
|
+
// -------------------------------------------------------------
|
|
212
|
+
// BM_3_InterleaveUint8 5 5 141967960
|
|
213
|
+
// BM_3_ReferenceBitInterleave3 58 58 10000000
|
|
214
|
+
// BM_3_InterleaveUint8_NoTemplate 11 11 61082024
|
|
215
|
+
template<int kShift>
|
|
216
|
+
static uint64 SplitFor3(uint8 x) {
|
|
217
|
+
return
|
|
218
|
+
((((x * 0x0101010101010101ULL)
|
|
219
|
+
& 0x000000C00C003003ULL)
|
|
220
|
+
* (0x0000000000500005ULL << kShift))
|
|
221
|
+
& (0x0000024924900000ULL << kShift));
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
uint32 InterleaveUint8(uint8 val0, uint8 val1, uint8 val2) {
|
|
225
|
+
return static_cast<uint32>(
|
|
226
|
+
(SplitFor3<0>(val0) | SplitFor3<1>(val1) | SplitFor3<2>(val2)) >> 20);
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
// Multiplication based de-interleave algorithm:
|
|
230
|
+
// 1. Original value, bit positions shown:
|
|
231
|
+
// --------xx8xx7xx6xx5xx4xx3xx2xx1
|
|
232
|
+
// & 0x 0 0 2 4 9 2 4 9
|
|
233
|
+
// => ----------8--7--6--5--4--3--2--1
|
|
234
|
+
// 2. Use multiplication to perform additions at different offsets:
|
|
235
|
+
// * 0b00000000000000000000000000010101
|
|
236
|
+
// 0x 0 0 0 0 0 0 1 5
|
|
237
|
+
// =>
|
|
238
|
+
// ----------8--7--6--5--4--3--2--1
|
|
239
|
+
// + --------8--7--6--5--4--3--2--1
|
|
240
|
+
// + ------8--7--6--5--4--3--2--1
|
|
241
|
+
// => ------8-8787676565454343232121-1
|
|
242
|
+
// 3. Select the bits we need
|
|
243
|
+
// & 0b00000000001110000001110000001100
|
|
244
|
+
// 0x 0 0 3 8 1 C 0 C
|
|
245
|
+
// => ----------876------543------21--
|
|
246
|
+
// 4. Multiply again to make the additions we need
|
|
247
|
+
// * 0b00000000000000000001000001000001
|
|
248
|
+
// 0x 0 0 0 0 1 0 4 1
|
|
249
|
+
// =>
|
|
250
|
+
// ----------876------543------21--
|
|
251
|
+
// + ----876------543------21--
|
|
252
|
+
// + 6------543------21--
|
|
253
|
+
// => ----------87654321--------------
|
|
254
|
+
// 5. Shift down so it lives at the lower 8 bits.
|
|
255
|
+
// Benchmark Time(ns) CPU(ns) Iterations
|
|
256
|
+
// ----------------------------------------------------------------
|
|
257
|
+
// BM_3_DeinterleaveUint8 8 8 88136788
|
|
258
|
+
// BM_3_DeinterleaveUint8_Using_Template 10 10 67385445
|
|
259
|
+
// BM_3_DeinterleaveUint8_Uint64_Param 10 10 70838731
|
|
260
|
+
// BM_3_ReferenceDeinterleaveUint8 79 79 8712211
|
|
261
|
+
static inline uint8 UnsplitFor3(uint32 x) {
|
|
262
|
+
return ((((x & 0x00249249U)
|
|
263
|
+
* 0x00000015U)
|
|
264
|
+
& 0x00381C0CU)
|
|
265
|
+
* 0x00001041U) >> 14;
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
void DeinterleaveUint8(uint32 x, uint8* a, uint8* b, uint8* c) {
|
|
269
|
+
*a = UnsplitFor3(x);
|
|
270
|
+
*b = UnsplitFor3(x >> 1);
|
|
271
|
+
*c = UnsplitFor3(x >> 2);
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
} // namespace util_bits
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
// Copyright 2009 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: jyrki@google.com (Jyrki Alakuijala)
|
|
17
|
+
//
|
|
18
|
+
// Interleaving bits quickly by table lookup.
|
|
19
|
+
|
|
20
|
+
#ifndef S2_UTIL_BITS_BIT_INTERLEAVE_H_
|
|
21
|
+
#define S2_UTIL_BITS_BIT_INTERLEAVE_H_
|
|
22
|
+
|
|
23
|
+
#include "s2/base/integral_types.h"
|
|
24
|
+
|
|
25
|
+
namespace util_bits {
|
|
26
|
+
|
|
27
|
+
// These functions interleave the given arguments into the return value.
|
|
28
|
+
//
|
|
29
|
+
// The 0-bit in val0 will be the 0-bit in the return value.
|
|
30
|
+
// The 0-bit in val1 will be the 1-bit in the return value.
|
|
31
|
+
// The 1-bit of val0 will be the 2-bit in the return value, and so on.
|
|
32
|
+
uint16 InterleaveUint8(uint8 val0, uint8 val1);
|
|
33
|
+
uint32 InterleaveUint16(uint16 val0, uint16 val1);
|
|
34
|
+
uint64 InterleaveUint32(uint32 val0, uint32 val1);
|
|
35
|
+
|
|
36
|
+
// These functions will decode the interleaved values.
|
|
37
|
+
void DeinterleaveUint8(uint16 code, uint8 *val0, uint8 *val1);
|
|
38
|
+
void DeinterleaveUint16(uint32 code, uint16 *val0, uint16 *val1);
|
|
39
|
+
void DeinterleaveUint32(uint64 code, uint32 *val0, uint32 *val1);
|
|
40
|
+
|
|
41
|
+
// These functions interleave three arguments into the return value.
|
|
42
|
+
// The 0-bit in val0 will be the 0-bit in the return value.
|
|
43
|
+
// The 0-bit in val1 will be the 1-bit in the return value.
|
|
44
|
+
// The 0-bit in val2 will be the 2-bit in the return value.
|
|
45
|
+
// The 1-bit of val0 will be the 3-bit in the return value, and so on.
|
|
46
|
+
uint32 InterleaveUint8(uint8 val0, uint8 val1, uint8 val2);
|
|
47
|
+
|
|
48
|
+
// These functions will decode the interleaved values.
|
|
49
|
+
void DeinterleaveUint8(uint32 code, uint8 *val0, uint8* val1, uint8* val2);
|
|
50
|
+
|
|
51
|
+
} // namespace util_bits
|
|
52
|
+
|
|
53
|
+
#endif // S2_UTIL_BITS_BIT_INTERLEAVE_H_
|