@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,859 @@
|
|
|
1
|
+
// Copyright 2005 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
|
+
// Utility functions that depend on bytesex. We define htonll and ntohll,
|
|
18
|
+
// as well as "Google" versions of all the standards: ghtonl, ghtons, and
|
|
19
|
+
// so on. These functions do exactly the same as their standard variants,
|
|
20
|
+
// but don't require including the dangerous netinet/in.h.
|
|
21
|
+
//
|
|
22
|
+
// Buffer routines will copy to and from buffers without causing
|
|
23
|
+
// a bus error when the architecture requires different byte alignments.
|
|
24
|
+
#ifndef S2_UTIL_ENDIAN_ENDIAN_H_
|
|
25
|
+
#define S2_UTIL_ENDIAN_ENDIAN_H_
|
|
26
|
+
|
|
27
|
+
#include <cassert>
|
|
28
|
+
#include <type_traits>
|
|
29
|
+
|
|
30
|
+
#include "s2/base/integral_types.h"
|
|
31
|
+
#include "s2/base/logging.h"
|
|
32
|
+
#include "s2/base/port.h"
|
|
33
|
+
#include "s2/third_party/absl/base/casts.h"
|
|
34
|
+
#include "s2/third_party/absl/base/port.h"
|
|
35
|
+
#include "s2/third_party/absl/numeric/int128.h"
|
|
36
|
+
|
|
37
|
+
// Use compiler byte-swapping intrinsics if they are available. 32-bit
|
|
38
|
+
// and 64-bit versions are available in Clang and GCC as of GCC 4.3.0.
|
|
39
|
+
// The 16-bit version is available in Clang and GCC only as of GCC 4.8.0.
|
|
40
|
+
// For simplicity, we enable them all only for GCC 4.8.0 or later.
|
|
41
|
+
#if defined(__clang__) || \
|
|
42
|
+
(defined(__GNUC__) && ((__GNUC__ == 4 && __GNUC_MINOR__ >= 8) || \
|
|
43
|
+
__GNUC__ >= 5))
|
|
44
|
+
|
|
45
|
+
inline uint64 gbswap_64(uint64 host_int) {
|
|
46
|
+
return __builtin_bswap64(host_int);
|
|
47
|
+
}
|
|
48
|
+
inline uint32 gbswap_32(uint32 host_int) {
|
|
49
|
+
return __builtin_bswap32(host_int);
|
|
50
|
+
}
|
|
51
|
+
inline uint16 gbswap_16(uint16 host_int) {
|
|
52
|
+
return __builtin_bswap16(host_int);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
#else
|
|
56
|
+
|
|
57
|
+
inline uint64 gbswap_64(uint64 host_int) {
|
|
58
|
+
#if defined(__GNUC__) && defined(__x86_64__) && \
|
|
59
|
+
!(defined(__APPLE__) && defined(__MACH__))
|
|
60
|
+
// Adapted from /usr/include/byteswap.h. Not available on Mac.
|
|
61
|
+
if (__builtin_constant_p(host_int)) {
|
|
62
|
+
return __bswap_constant_64(host_int);
|
|
63
|
+
} else {
|
|
64
|
+
uint64 result;
|
|
65
|
+
__asm__("bswap %0" : "=r" (result) : "0" (host_int));
|
|
66
|
+
return result;
|
|
67
|
+
}
|
|
68
|
+
#elif defined(bswap_64)
|
|
69
|
+
return bswap_64(host_int);
|
|
70
|
+
#else
|
|
71
|
+
return static_cast<uint64>(bswap_32(static_cast<uint32>(host_int >> 32))) |
|
|
72
|
+
(static_cast<uint64>(bswap_32(static_cast<uint32>(host_int))) << 32);
|
|
73
|
+
#endif // bswap_64
|
|
74
|
+
}
|
|
75
|
+
inline uint32 gbswap_32(uint32 host_int) {
|
|
76
|
+
return bswap_32(host_int);
|
|
77
|
+
}
|
|
78
|
+
inline uint16 gbswap_16(uint16 host_int) {
|
|
79
|
+
return bswap_16(host_int);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
#endif // intrinics available
|
|
83
|
+
|
|
84
|
+
inline absl::uint128 gbswap_128(absl::uint128 host_int) {
|
|
85
|
+
return absl::MakeUint128(gbswap_64(absl::Uint128Low64(host_int)),
|
|
86
|
+
gbswap_64(absl::Uint128High64(host_int)));
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
#ifdef IS_LITTLE_ENDIAN
|
|
90
|
+
|
|
91
|
+
// Definitions for ntohl etc. that don't require us to include
|
|
92
|
+
// netinet/in.h. We wrap gbswap_32 and gbswap_16 in functions rather
|
|
93
|
+
// than just #defining them because in debug mode, gcc doesn't
|
|
94
|
+
// correctly handle the (rather involved) definitions of bswap_32.
|
|
95
|
+
// gcc guarantees that inline functions are as fast as macros, so
|
|
96
|
+
// this isn't a performance hit.
|
|
97
|
+
inline uint16 ghtons(uint16 x) { return gbswap_16(x); }
|
|
98
|
+
inline uint32 ghtonl(uint32 x) { return gbswap_32(x); }
|
|
99
|
+
inline uint64 ghtonll(uint64 x) { return gbswap_64(x); }
|
|
100
|
+
|
|
101
|
+
#elif defined IS_BIG_ENDIAN
|
|
102
|
+
|
|
103
|
+
// These definitions are simpler on big-endian machines
|
|
104
|
+
// These are functions instead of macros to avoid self-assignment warnings
|
|
105
|
+
// on calls such as "i = ghtnol(i);". This also provides type checking.
|
|
106
|
+
inline uint16 ghtons(uint16 x) { return x; }
|
|
107
|
+
inline uint32 ghtonl(uint32 x) { return x; }
|
|
108
|
+
inline uint64 ghtonll(uint64 x) { return x; }
|
|
109
|
+
|
|
110
|
+
#else
|
|
111
|
+
#error "Unsupported bytesex: Either IS_BIG_ENDIAN or IS_LITTLE_ENDIAN must be defined" // NOLINT
|
|
112
|
+
#endif // bytesex
|
|
113
|
+
|
|
114
|
+
#ifndef htonll
|
|
115
|
+
// With the rise of 64-bit, some systems are beginning to define this.
|
|
116
|
+
#define htonll(x) ghtonll(x)
|
|
117
|
+
#endif // htonll
|
|
118
|
+
|
|
119
|
+
// ntoh* and hton* are the same thing for any size and bytesex,
|
|
120
|
+
// since the function is an involution, i.e., its own inverse.
|
|
121
|
+
inline uint16 gntohs(uint16 x) { return ghtons(x); }
|
|
122
|
+
inline uint32 gntohl(uint32 x) { return ghtonl(x); }
|
|
123
|
+
inline uint64 gntohll(uint64 x) { return ghtonll(x); }
|
|
124
|
+
|
|
125
|
+
#ifndef ntohll
|
|
126
|
+
#define ntohll(x) htonll(x)
|
|
127
|
+
#endif // ntohll
|
|
128
|
+
|
|
129
|
+
// We provide unified FromHost and ToHost APIs for all integral types and float,
|
|
130
|
+
// double types. If variable v's type is known to be one of these types, the
|
|
131
|
+
// client can simply call the following function without worrying about its
|
|
132
|
+
// return type.
|
|
133
|
+
// LittleEndian::FromHost(v), or BigEndian::FromHost(v)
|
|
134
|
+
// LittleEndian::ToHost(v), or BigEndian::ToHost(v)
|
|
135
|
+
// This unified FromHost and ToHost APIs are useful inside a template when the
|
|
136
|
+
// type of v is a template parameter.
|
|
137
|
+
//
|
|
138
|
+
// In order to unify all "IntType FromHostxx(ValueType)" and "IntType
|
|
139
|
+
// ToHostxx(ValueType)" APIs, we use the following trait class to automatically
|
|
140
|
+
// find the corresponding IntType given a ValueType, where IntType is an
|
|
141
|
+
// unsigned integer type with the same size of ValueType. The supported
|
|
142
|
+
// ValueTypes are uint8, uint16, uint32, uint64, int8, int16, int32, int64,
|
|
143
|
+
// bool, float, double.
|
|
144
|
+
//
|
|
145
|
+
// template <class ValueType>
|
|
146
|
+
// struct tofromhost_value_type_traits {
|
|
147
|
+
// typedef ValueType value_type;
|
|
148
|
+
// typedef IntType int_type;
|
|
149
|
+
// }
|
|
150
|
+
//
|
|
151
|
+
// We don't provide the default implementation for this trait struct.
|
|
152
|
+
// So that if ValueType is not supported by the FromHost and ToHost APIs, it
|
|
153
|
+
// will give a compile time error.
|
|
154
|
+
template <class ValueType>
|
|
155
|
+
struct tofromhost_value_type_traits;
|
|
156
|
+
|
|
157
|
+
// General byte order converter class template. It provides a common
|
|
158
|
+
// implementation for LittleEndian::FromHost(ValueType),
|
|
159
|
+
// BigEndian::FromHost(ValueType), LittleEndian::ToHost(ValueType), and
|
|
160
|
+
// BigEndian::ToHost(ValueType).
|
|
161
|
+
template <class EndianClass, typename ValueType>
|
|
162
|
+
class GeneralFormatConverter {
|
|
163
|
+
public:
|
|
164
|
+
static typename tofromhost_value_type_traits<ValueType>::int_type FromHost(
|
|
165
|
+
ValueType v);
|
|
166
|
+
static typename tofromhost_value_type_traits<ValueType>::int_type ToHost(
|
|
167
|
+
ValueType v);
|
|
168
|
+
};
|
|
169
|
+
|
|
170
|
+
// Utilities to convert numbers between the current hosts's native byte
|
|
171
|
+
// order and little-endian byte order
|
|
172
|
+
//
|
|
173
|
+
// Load/Store methods are alignment safe
|
|
174
|
+
class LittleEndian {
|
|
175
|
+
public:
|
|
176
|
+
// Conversion functions.
|
|
177
|
+
#ifdef IS_LITTLE_ENDIAN
|
|
178
|
+
|
|
179
|
+
static uint16 FromHost16(uint16 x) { return x; }
|
|
180
|
+
static uint16 ToHost16(uint16 x) { return x; }
|
|
181
|
+
|
|
182
|
+
static uint32 FromHost32(uint32 x) { return x; }
|
|
183
|
+
static uint32 ToHost32(uint32 x) { return x; }
|
|
184
|
+
|
|
185
|
+
static uint64 FromHost64(uint64 x) { return x; }
|
|
186
|
+
static uint64 ToHost64(uint64 x) { return x; }
|
|
187
|
+
|
|
188
|
+
static absl::uint128 FromHost128(absl::uint128 x) { return x; }
|
|
189
|
+
static absl::uint128 ToHost128(absl::uint128 x) { return x; }
|
|
190
|
+
|
|
191
|
+
static constexpr bool IsLittleEndian() { return true; }
|
|
192
|
+
|
|
193
|
+
#elif defined IS_BIG_ENDIAN
|
|
194
|
+
|
|
195
|
+
static uint16 FromHost16(uint16 x) { return gbswap_16(x); }
|
|
196
|
+
static uint16 ToHost16(uint16 x) { return gbswap_16(x); }
|
|
197
|
+
|
|
198
|
+
static uint32 FromHost32(uint32 x) { return gbswap_32(x); }
|
|
199
|
+
static uint32 ToHost32(uint32 x) { return gbswap_32(x); }
|
|
200
|
+
|
|
201
|
+
static uint64 FromHost64(uint64 x) { return gbswap_64(x); }
|
|
202
|
+
static uint64 ToHost64(uint64 x) { return gbswap_64(x); }
|
|
203
|
+
|
|
204
|
+
static absl::uint128 FromHost128(absl::uint128 x) { return gbswap_128(x); }
|
|
205
|
+
static absl::uint128 ToHost128(absl::uint128 x) { return gbswap_128(x); }
|
|
206
|
+
|
|
207
|
+
static constexpr bool IsLittleEndian() { return false; }
|
|
208
|
+
|
|
209
|
+
#endif /* ENDIAN */
|
|
210
|
+
|
|
211
|
+
// Unified LittleEndian::FromHost(ValueType v) API.
|
|
212
|
+
template <class ValueType>
|
|
213
|
+
static typename tofromhost_value_type_traits<ValueType>::int_type FromHost(
|
|
214
|
+
ValueType v) {
|
|
215
|
+
return GeneralFormatConverter<LittleEndian, ValueType>::FromHost(v);
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
// Unified LittleEndian::ToHost(ValueType v) API.
|
|
219
|
+
template <class ValueType>
|
|
220
|
+
static typename tofromhost_value_type_traits<ValueType>::value_type ToHost(
|
|
221
|
+
ValueType v) {
|
|
222
|
+
return GeneralFormatConverter<LittleEndian, ValueType>::ToHost(v);
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
// Functions to do unaligned loads and stores in little-endian order.
|
|
226
|
+
static uint16 Load16(const void *p) {
|
|
227
|
+
return ToHost16(UNALIGNED_LOAD16(p));
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
static void Store16(void *p, uint16 v) {
|
|
231
|
+
UNALIGNED_STORE16(p, FromHost16(v));
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
static uint32 Load24(const void* p) {
|
|
235
|
+
#ifdef IS_LITTLE_ENDIAN
|
|
236
|
+
uint32 result = 0;
|
|
237
|
+
memcpy(&result, p, 3);
|
|
238
|
+
return result;
|
|
239
|
+
#else
|
|
240
|
+
const uint8* data = reinterpret_cast<const uint8*>(p);
|
|
241
|
+
return Load16(data) + (data[2] << 16);
|
|
242
|
+
#endif
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
static void Store24(void* p, uint32 v) {
|
|
246
|
+
#ifdef IS_LITTLE_ENDIAN
|
|
247
|
+
memcpy(p, &v, 3);
|
|
248
|
+
#else
|
|
249
|
+
uint8* data = reinterpret_cast<uint8*>(p);
|
|
250
|
+
data[0] = v & 0xFF;
|
|
251
|
+
data[1] = (v >> 8) & 0xFF;
|
|
252
|
+
data[2] = (v >> 16) & 0xFF;
|
|
253
|
+
#endif
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
static uint32 Load32(const void *p) {
|
|
257
|
+
return ToHost32(UNALIGNED_LOAD32(p));
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
static void Store32(void *p, uint32 v) {
|
|
261
|
+
UNALIGNED_STORE32(p, FromHost32(v));
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
static uint64 Load64(const void *p) {
|
|
265
|
+
return ToHost64(UNALIGNED_LOAD64(p));
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
// Build a uint64 from 1-8 bytes.
|
|
269
|
+
// 8 * len least significant bits are loaded from the memory with
|
|
270
|
+
// LittleEndian order. The 64 - 8 * len most significant bits are
|
|
271
|
+
// set all to 0.
|
|
272
|
+
// In latex-friendly words, this function returns:
|
|
273
|
+
// $\sum_{i=0}^{len-1} p[i] 256^{i}$, where p[i] is unsigned.
|
|
274
|
+
//
|
|
275
|
+
// This function is equivalent to:
|
|
276
|
+
// uint64 val = 0;
|
|
277
|
+
// memcpy(&val, p, len);
|
|
278
|
+
// return ToHost64(val);
|
|
279
|
+
// TODO(jyrki): write a small benchmark and benchmark the speed
|
|
280
|
+
// of a memcpy based approach.
|
|
281
|
+
//
|
|
282
|
+
// For speed reasons this function does not work for len == 0.
|
|
283
|
+
// The caller needs to guarantee that 1 <= len <= 8.
|
|
284
|
+
static uint64 Load64VariableLength(const void * const p, int len) {
|
|
285
|
+
assert(len >= 1 && len <= 8);
|
|
286
|
+
const char * const buf = static_cast<const char * const>(p);
|
|
287
|
+
uint64 val = 0;
|
|
288
|
+
--len;
|
|
289
|
+
do {
|
|
290
|
+
val = (val << 8) | buf[len];
|
|
291
|
+
// (--len >= 0) is about 10 % faster than (len--) in some benchmarks.
|
|
292
|
+
} while (--len >= 0);
|
|
293
|
+
// No ToHost64(...) needed. The bytes are accessed in little-endian manner
|
|
294
|
+
// on every architecture.
|
|
295
|
+
return val;
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
static void Store64(void *p, uint64 v) {
|
|
299
|
+
UNALIGNED_STORE64(p, FromHost64(v));
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
static absl::uint128 Load128(const void* p) {
|
|
303
|
+
return absl::MakeUint128(
|
|
304
|
+
ToHost64(UNALIGNED_LOAD64(reinterpret_cast<const uint64*>(p) + 1)),
|
|
305
|
+
ToHost64(UNALIGNED_LOAD64(p)));
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
static void Store128(void* p, const absl::uint128 v) {
|
|
309
|
+
UNALIGNED_STORE64(p, FromHost64(absl::Uint128Low64(v)));
|
|
310
|
+
UNALIGNED_STORE64(reinterpret_cast<uint64*>(p) + 1,
|
|
311
|
+
FromHost64(absl::Uint128High64(v)));
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
// Build a uint128 from 1-16 bytes.
|
|
315
|
+
// 8 * len least significant bits are loaded from the memory with
|
|
316
|
+
// LittleEndian order. The 128 - 8 * len most significant bits are
|
|
317
|
+
// set all to 0.
|
|
318
|
+
static absl::uint128 Load128VariableLength(const void* p, int len) {
|
|
319
|
+
if (len <= 8) {
|
|
320
|
+
return absl::uint128(Load64VariableLength(p, len));
|
|
321
|
+
} else {
|
|
322
|
+
return absl::MakeUint128(
|
|
323
|
+
Load64VariableLength(static_cast<const char*>(p) + 8, len - 8),
|
|
324
|
+
Load64(p));
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
// Load & Store in machine's word size.
|
|
329
|
+
static uword_t LoadUnsignedWord(const void *p) {
|
|
330
|
+
if (sizeof(uword_t) == 8)
|
|
331
|
+
return Load64(p);
|
|
332
|
+
else
|
|
333
|
+
return Load32(p);
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
static void StoreUnsignedWord(void *p, uword_t v) {
|
|
337
|
+
if (sizeof(v) == 8)
|
|
338
|
+
Store64(p, v);
|
|
339
|
+
else
|
|
340
|
+
Store32(p, v);
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
// Unified LittleEndian::Load/Store<T> API.
|
|
344
|
+
|
|
345
|
+
// Returns the T value encoded by the leading bytes of 'p', interpreted
|
|
346
|
+
// according to the format specified below. 'p' has no alignment restrictions.
|
|
347
|
+
//
|
|
348
|
+
// Type Format
|
|
349
|
+
// ---------------- -------------------------------------------------------
|
|
350
|
+
// uint{8,16,32,64} Little-endian binary representation.
|
|
351
|
+
// int{8,16,32,64} Little-endian twos-complement binary representation.
|
|
352
|
+
// float,double Little-endian IEEE-754 format.
|
|
353
|
+
// char The raw byte.
|
|
354
|
+
// bool A byte. 0 maps to false; all other values map to true.
|
|
355
|
+
template<typename T>
|
|
356
|
+
static T Load(const char* p);
|
|
357
|
+
|
|
358
|
+
// Encodes 'value' in the format corresponding to T. Supported types are
|
|
359
|
+
// described in Load<T>(). 'p' has no alignment restrictions. In-place Store
|
|
360
|
+
// is safe (that is, it is safe to call
|
|
361
|
+
// Store(x, reinterpret_cast<char*>(&x))).
|
|
362
|
+
template<typename T>
|
|
363
|
+
static void Store(T value, char* p);
|
|
364
|
+
};
|
|
365
|
+
|
|
366
|
+
// Utilities to convert numbers between the current hosts's native byte
|
|
367
|
+
// order and big-endian byte order (same as network byte order)
|
|
368
|
+
//
|
|
369
|
+
// Load/Store methods are alignment safe
|
|
370
|
+
class BigEndian {
|
|
371
|
+
public:
|
|
372
|
+
#ifdef IS_LITTLE_ENDIAN
|
|
373
|
+
|
|
374
|
+
static uint16 FromHost16(uint16 x) { return gbswap_16(x); }
|
|
375
|
+
static uint16 ToHost16(uint16 x) { return gbswap_16(x); }
|
|
376
|
+
|
|
377
|
+
static uint32 FromHost32(uint32 x) { return gbswap_32(x); }
|
|
378
|
+
static uint32 ToHost32(uint32 x) { return gbswap_32(x); }
|
|
379
|
+
|
|
380
|
+
static uint64 FromHost64(uint64 x) { return gbswap_64(x); }
|
|
381
|
+
static uint64 ToHost64(uint64 x) { return gbswap_64(x); }
|
|
382
|
+
|
|
383
|
+
static absl::uint128 FromHost128(absl::uint128 x) { return gbswap_128(x); }
|
|
384
|
+
static absl::uint128 ToHost128(absl::uint128 x) { return gbswap_128(x); }
|
|
385
|
+
|
|
386
|
+
static constexpr bool IsLittleEndian() { return true; }
|
|
387
|
+
|
|
388
|
+
#elif defined IS_BIG_ENDIAN
|
|
389
|
+
|
|
390
|
+
static uint16 FromHost16(uint16 x) { return x; }
|
|
391
|
+
static uint16 ToHost16(uint16 x) { return x; }
|
|
392
|
+
|
|
393
|
+
static uint32 FromHost32(uint32 x) { return x; }
|
|
394
|
+
static uint32 ToHost32(uint32 x) { return x; }
|
|
395
|
+
|
|
396
|
+
static uint64 FromHost64(uint64 x) { return x; }
|
|
397
|
+
static uint64 ToHost64(uint64 x) { return x; }
|
|
398
|
+
|
|
399
|
+
static absl::uint128 FromHost128(absl::uint128 x) { return x; }
|
|
400
|
+
static absl::uint128 ToHost128(absl::uint128 x) { return x; }
|
|
401
|
+
|
|
402
|
+
static constexpr bool IsLittleEndian() { return false; }
|
|
403
|
+
|
|
404
|
+
#endif /* ENDIAN */
|
|
405
|
+
|
|
406
|
+
// Unified BigEndian::FromHost(ValueType v) API.
|
|
407
|
+
template <class ValueType>
|
|
408
|
+
static typename tofromhost_value_type_traits<ValueType>::int_type FromHost(
|
|
409
|
+
ValueType v) {
|
|
410
|
+
return GeneralFormatConverter<BigEndian, ValueType>::FromHost(v);
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
// Unified BigEndian::ToHost(ValueType v) API.
|
|
414
|
+
template <class ValueType>
|
|
415
|
+
static typename tofromhost_value_type_traits<ValueType>::value_type ToHost(
|
|
416
|
+
ValueType v) {
|
|
417
|
+
return GeneralFormatConverter<BigEndian, ValueType>::ToHost(v);
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
// Functions to do unaligned loads and stores in big-endian order.
|
|
421
|
+
static uint16 Load16(const void *p) {
|
|
422
|
+
return ToHost16(UNALIGNED_LOAD16(p));
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
static void Store16(void *p, uint16 v) {
|
|
426
|
+
UNALIGNED_STORE16(p, FromHost16(v));
|
|
427
|
+
}
|
|
428
|
+
|
|
429
|
+
static uint32 Load24(const void* p) {
|
|
430
|
+
const uint8* data = reinterpret_cast<const uint8*>(p);
|
|
431
|
+
return (data[0] << 16) + Load16(data + 1);
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
static void Store24(void* p, uint32 v) {
|
|
435
|
+
uint8* data = reinterpret_cast<uint8*>(p);
|
|
436
|
+
Store16(data + 1, static_cast<uint16>(v));
|
|
437
|
+
*data = static_cast<uint8>(v >> 16);
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
static uint32 Load32(const void *p) {
|
|
441
|
+
return ToHost32(UNALIGNED_LOAD32(p));
|
|
442
|
+
}
|
|
443
|
+
|
|
444
|
+
static void Store32(void *p, uint32 v) {
|
|
445
|
+
UNALIGNED_STORE32(p, FromHost32(v));
|
|
446
|
+
}
|
|
447
|
+
|
|
448
|
+
static uint64 Load64(const void *p) {
|
|
449
|
+
return ToHost64(UNALIGNED_LOAD64(p));
|
|
450
|
+
}
|
|
451
|
+
|
|
452
|
+
// Semantically build a uint64 from 1-8 bytes.
|
|
453
|
+
// 8 * len least significant bits are loaded from the memory with
|
|
454
|
+
// BigEndian order. The 64 - 8 * len most significant bits are
|
|
455
|
+
// set all to 0.
|
|
456
|
+
// In latex-friendly words, this function returns:
|
|
457
|
+
// $\sum_{i=0}^{len-1} p[i] 256^{i}$, where p[i] is unsigned.
|
|
458
|
+
//
|
|
459
|
+
// This function is equivalent to:
|
|
460
|
+
// uint64 val = 0;
|
|
461
|
+
// memcpy(&val, p, len);
|
|
462
|
+
// return ToHost64(val);
|
|
463
|
+
// TODO(jyrki): write a small benchmark and benchmark the speed
|
|
464
|
+
// of a memcpy based approach.
|
|
465
|
+
//
|
|
466
|
+
// For speed reasons this function does not work for len == 0.
|
|
467
|
+
// The caller needs to guarantee that 1 <= len <= 8.
|
|
468
|
+
|
|
469
|
+
static uint64 Load64VariableLength(const void * const p, int len) {
|
|
470
|
+
// uint64 val = LittleEndian::Load64VariableLength(p, len);
|
|
471
|
+
// return Load64(&val) >> (8*(8-len));
|
|
472
|
+
assert(len >= 1 && len <= 8);
|
|
473
|
+
const char* buf = static_cast<const char * const>(p);
|
|
474
|
+
uint64 val = 0;
|
|
475
|
+
do {
|
|
476
|
+
val = (val << 8) | *buf;
|
|
477
|
+
++buf;
|
|
478
|
+
} while (--len > 0);
|
|
479
|
+
return val;
|
|
480
|
+
}
|
|
481
|
+
|
|
482
|
+
static void Store64(void *p, uint64 v) {
|
|
483
|
+
UNALIGNED_STORE64(p, FromHost64(v));
|
|
484
|
+
}
|
|
485
|
+
|
|
486
|
+
static absl::uint128 Load128(const void* p) {
|
|
487
|
+
return absl::MakeUint128(
|
|
488
|
+
ToHost64(UNALIGNED_LOAD64(p)),
|
|
489
|
+
ToHost64(UNALIGNED_LOAD64(reinterpret_cast<const uint64*>(p) + 1)));
|
|
490
|
+
}
|
|
491
|
+
|
|
492
|
+
static void Store128(void* p, const absl::uint128 v) {
|
|
493
|
+
UNALIGNED_STORE64(p, FromHost64(absl::Uint128High64(v)));
|
|
494
|
+
UNALIGNED_STORE64(reinterpret_cast<uint64*>(p) + 1,
|
|
495
|
+
FromHost64(absl::Uint128Low64(v)));
|
|
496
|
+
}
|
|
497
|
+
|
|
498
|
+
// Build a uint128 from 1-16 bytes.
|
|
499
|
+
// 8 * len least significant bits are loaded from the memory with
|
|
500
|
+
// BigEndian order. The 128 - 8 * len most significant bits are
|
|
501
|
+
// set all to 0.
|
|
502
|
+
static absl::uint128 Load128VariableLength(const void* p, int len) {
|
|
503
|
+
if (len <= 8) {
|
|
504
|
+
return absl::uint128(
|
|
505
|
+
Load64VariableLength(static_cast<const char*>(p), len));
|
|
506
|
+
} else if (len < 16) {
|
|
507
|
+
return absl::MakeUint128(Load64VariableLength(p, len - 8),
|
|
508
|
+
Load64(static_cast<const char*>(p) + len - 8));
|
|
509
|
+
} else {
|
|
510
|
+
return absl::MakeUint128(Load64(static_cast<const char*>(p)),
|
|
511
|
+
Load64(static_cast<const char*>(p) + 8));
|
|
512
|
+
}
|
|
513
|
+
}
|
|
514
|
+
|
|
515
|
+
// Load & Store in machine's word size.
|
|
516
|
+
static uword_t LoadUnsignedWord(const void *p) {
|
|
517
|
+
if (sizeof(uword_t) == 8)
|
|
518
|
+
return Load64(p);
|
|
519
|
+
else
|
|
520
|
+
return Load32(p);
|
|
521
|
+
}
|
|
522
|
+
|
|
523
|
+
static void StoreUnsignedWord(void *p, uword_t v) {
|
|
524
|
+
if (sizeof(uword_t) == 8)
|
|
525
|
+
Store64(p, v);
|
|
526
|
+
else
|
|
527
|
+
Store32(p, v);
|
|
528
|
+
}
|
|
529
|
+
|
|
530
|
+
// Unified BigEndian::Load/Store<T> API.
|
|
531
|
+
|
|
532
|
+
// Returns the T value encoded by the leading bytes of 'p', interpreted
|
|
533
|
+
// according to the format specified below. 'p' has no alignment restrictions.
|
|
534
|
+
//
|
|
535
|
+
// Type Format
|
|
536
|
+
// ---------------- -------------------------------------------------------
|
|
537
|
+
// uint{8,16,32,64} Big-endian binary representation.
|
|
538
|
+
// int{8,16,32,64} Big-endian twos-complement binary representation.
|
|
539
|
+
// float,double Big-endian IEEE-754 format.
|
|
540
|
+
// char The raw byte.
|
|
541
|
+
// bool A byte. 0 maps to false; all other values map to true.
|
|
542
|
+
template<typename T>
|
|
543
|
+
static T Load(const char* p);
|
|
544
|
+
|
|
545
|
+
// Encodes 'value' in the format corresponding to T. Supported types are
|
|
546
|
+
// described in Load<T>(). 'p' has no alignment restrictions. In-place Store
|
|
547
|
+
// is safe (that is, it is safe to call
|
|
548
|
+
// Store(x, reinterpret_cast<char*>(&x))).
|
|
549
|
+
template<typename T>
|
|
550
|
+
static void Store(T value, char* p);
|
|
551
|
+
}; // BigEndian
|
|
552
|
+
|
|
553
|
+
// Network byte order is big-endian
|
|
554
|
+
typedef BigEndian NetworkByteOrder;
|
|
555
|
+
|
|
556
|
+
//////////////////////////////////////////////////////////////////////
|
|
557
|
+
// Implementation details: Clients can stop reading here.
|
|
558
|
+
//
|
|
559
|
+
// Define ValueType->IntType mapping for the unified
|
|
560
|
+
// "IntType FromHost(ValueType)" API. The mapping is implemented via
|
|
561
|
+
// tofromhost_value_type_traits trait struct. Every legal ValueType has its own
|
|
562
|
+
// specialization. There is no default body for this trait struct, so that
|
|
563
|
+
// any type that is not supported by the unified FromHost API
|
|
564
|
+
// will trigger a compile time error.
|
|
565
|
+
#define FROMHOST_TYPE_MAP(ITYPE, VTYPE) \
|
|
566
|
+
template <> \
|
|
567
|
+
struct tofromhost_value_type_traits<VTYPE> { \
|
|
568
|
+
typedef VTYPE value_type; \
|
|
569
|
+
typedef ITYPE int_type; \
|
|
570
|
+
};
|
|
571
|
+
|
|
572
|
+
FROMHOST_TYPE_MAP(uint8, uint8);
|
|
573
|
+
FROMHOST_TYPE_MAP(uint8, int8);
|
|
574
|
+
FROMHOST_TYPE_MAP(uint16, uint16);
|
|
575
|
+
FROMHOST_TYPE_MAP(uint16, int16);
|
|
576
|
+
FROMHOST_TYPE_MAP(uint32, uint32);
|
|
577
|
+
FROMHOST_TYPE_MAP(uint32, int32);
|
|
578
|
+
FROMHOST_TYPE_MAP(uint64, uint64);
|
|
579
|
+
FROMHOST_TYPE_MAP(uint64, int64);
|
|
580
|
+
FROMHOST_TYPE_MAP(uint32, float);
|
|
581
|
+
FROMHOST_TYPE_MAP(uint64, double);
|
|
582
|
+
FROMHOST_TYPE_MAP(uint8, bool);
|
|
583
|
+
FROMHOST_TYPE_MAP(absl::uint128, absl::uint128);
|
|
584
|
+
#undef FROMHOST_TYPE_MAP
|
|
585
|
+
|
|
586
|
+
// Default implementation for the unified FromHost(ValueType) API, which
|
|
587
|
+
// handles all integral types (ValueType is one of uint8, int8, uint16, int16,
|
|
588
|
+
// uint32, int32, uint64, int64). The compiler will remove the switch case
|
|
589
|
+
// branches and unnecessary static_cast, when the template is expanded.
|
|
590
|
+
template <class EndianClass, typename ValueType>
|
|
591
|
+
typename tofromhost_value_type_traits<ValueType>::int_type
|
|
592
|
+
GeneralFormatConverter<EndianClass, ValueType>::FromHost(ValueType v) {
|
|
593
|
+
switch (sizeof(ValueType)) {
|
|
594
|
+
case 1:
|
|
595
|
+
return static_cast<uint8>(v);
|
|
596
|
+
break;
|
|
597
|
+
case 2:
|
|
598
|
+
return EndianClass::FromHost16(static_cast<uint16>(v));
|
|
599
|
+
break;
|
|
600
|
+
case 4:
|
|
601
|
+
return EndianClass::FromHost32(static_cast<uint32>(v));
|
|
602
|
+
break;
|
|
603
|
+
case 8:
|
|
604
|
+
return EndianClass::FromHost64(static_cast<uint64>(v));
|
|
605
|
+
break;
|
|
606
|
+
default:
|
|
607
|
+
S2_LOG(FATAL) << "Unexpected value size: " << sizeof(ValueType);
|
|
608
|
+
}
|
|
609
|
+
}
|
|
610
|
+
|
|
611
|
+
// Default implementation for the unified ToHost(ValueType) API, which handles
|
|
612
|
+
// all integral types (ValueType is one of uint8, int8, uint16, int16, uint32,
|
|
613
|
+
// int32, uint64, int64). The compiler will remove the switch case branches and
|
|
614
|
+
// unnecessary static_cast, when the template is expanded.
|
|
615
|
+
template <class EndianClass, typename ValueType>
|
|
616
|
+
typename tofromhost_value_type_traits<ValueType>::int_type
|
|
617
|
+
GeneralFormatConverter<EndianClass, ValueType>::ToHost(ValueType v) {
|
|
618
|
+
switch (sizeof(ValueType)) {
|
|
619
|
+
case 1:
|
|
620
|
+
return static_cast<uint8>(v);
|
|
621
|
+
break;
|
|
622
|
+
case 2:
|
|
623
|
+
return EndianClass::ToHost16(static_cast<uint16>(v));
|
|
624
|
+
break;
|
|
625
|
+
case 4:
|
|
626
|
+
return EndianClass::ToHost32(static_cast<uint32>(v));
|
|
627
|
+
break;
|
|
628
|
+
case 8:
|
|
629
|
+
return EndianClass::ToHost64(static_cast<uint64>(v));
|
|
630
|
+
break;
|
|
631
|
+
default:
|
|
632
|
+
S2_LOG(FATAL) << "Unexpected value size: " << sizeof(ValueType);
|
|
633
|
+
}
|
|
634
|
+
}
|
|
635
|
+
|
|
636
|
+
// Specialization of the unified FromHost(ValueType) API, which handles
|
|
637
|
+
// float types (ValueType is float).
|
|
638
|
+
template <class EndianClass>
|
|
639
|
+
class GeneralFormatConverter<EndianClass, float> {
|
|
640
|
+
public:
|
|
641
|
+
static typename tofromhost_value_type_traits<float>::int_type FromHost(
|
|
642
|
+
float v) {
|
|
643
|
+
return EndianClass::FromHost32(absl::bit_cast<uint32>(v));
|
|
644
|
+
}
|
|
645
|
+
static typename tofromhost_value_type_traits<float>::int_type ToHost(
|
|
646
|
+
float v) {
|
|
647
|
+
return absl::bit_cast<float>(
|
|
648
|
+
EndianClass::ToHost32(absl::bit_cast<uint32>(v)));
|
|
649
|
+
}
|
|
650
|
+
};
|
|
651
|
+
|
|
652
|
+
// Specialization of the unified FromHost(ValueType) API, which handles
|
|
653
|
+
// double types (ValueType is double).
|
|
654
|
+
template <class EndianClass>
|
|
655
|
+
class GeneralFormatConverter<EndianClass, double> {
|
|
656
|
+
public:
|
|
657
|
+
static typename tofromhost_value_type_traits<double>::int_type FromHost(
|
|
658
|
+
double v) {
|
|
659
|
+
return EndianClass::FromHost64(absl::bit_cast<uint64>(v));
|
|
660
|
+
}
|
|
661
|
+
static typename tofromhost_value_type_traits<double>::int_type ToHost(
|
|
662
|
+
double v) {
|
|
663
|
+
return absl::bit_cast<double>(
|
|
664
|
+
EndianClass::ToHost64(absl::bit_cast<uint64>(v)));
|
|
665
|
+
}
|
|
666
|
+
};
|
|
667
|
+
|
|
668
|
+
// Specialization of the unified FromHost(ValueType) API, which handles
|
|
669
|
+
// uint128 types (ValueType is uint128).
|
|
670
|
+
template <class EndianClass>
|
|
671
|
+
class GeneralFormatConverter<EndianClass, absl::uint128> {
|
|
672
|
+
public:
|
|
673
|
+
static typename tofromhost_value_type_traits<absl::uint128>::int_type
|
|
674
|
+
FromHost(absl::uint128 v) {
|
|
675
|
+
return EndianClass::FromHost128(v);
|
|
676
|
+
}
|
|
677
|
+
static typename tofromhost_value_type_traits<absl::uint128>::int_type ToHost(
|
|
678
|
+
absl::uint128 v) {
|
|
679
|
+
return EndianClass::ToHost128(v);
|
|
680
|
+
}
|
|
681
|
+
};
|
|
682
|
+
|
|
683
|
+
namespace endian_internal {
|
|
684
|
+
// Integer helper methods for the unified Load/Store APIs.
|
|
685
|
+
|
|
686
|
+
// Which branch of the 'case' to use is decided at compile time, so despite the
|
|
687
|
+
// apparent size of this function, it compiles into efficient code.
|
|
688
|
+
template<typename EndianClass, typename T>
|
|
689
|
+
inline T LoadInteger(const char* p) {
|
|
690
|
+
static_assert(sizeof(T) <= 8 && std::is_integral<T>::value,
|
|
691
|
+
"T needs to be an integral type with size <= 8.");
|
|
692
|
+
switch (sizeof(T)) {
|
|
693
|
+
case 1: return *reinterpret_cast<const T*>(p);
|
|
694
|
+
case 2: return EndianClass::ToHost16(UNALIGNED_LOAD16(p));
|
|
695
|
+
case 4: return EndianClass::ToHost32(UNALIGNED_LOAD32(p));
|
|
696
|
+
case 8: return EndianClass::ToHost64(UNALIGNED_LOAD64(p));
|
|
697
|
+
default: {
|
|
698
|
+
S2_LOG(FATAL) << "Not reached!";
|
|
699
|
+
return 0;
|
|
700
|
+
}
|
|
701
|
+
}
|
|
702
|
+
}
|
|
703
|
+
|
|
704
|
+
// Which branch of the 'case' to use is decided at compile time, so despite the
|
|
705
|
+
// apparent size of this function, it compiles into efficient code.
|
|
706
|
+
template<typename EndianClass, typename T>
|
|
707
|
+
inline void StoreInteger(T value, char* p) {
|
|
708
|
+
static_assert(sizeof(T) <= 8 && std::is_integral<T>::value,
|
|
709
|
+
"T needs to be an integral type with size <= 8.");
|
|
710
|
+
switch (sizeof(T)) {
|
|
711
|
+
case 1: *reinterpret_cast<T*>(p) = value; break;
|
|
712
|
+
case 2: UNALIGNED_STORE16(p, EndianClass::FromHost16(value)); break;
|
|
713
|
+
case 4: UNALIGNED_STORE32(p, EndianClass::FromHost32(value)); break;
|
|
714
|
+
case 8: UNALIGNED_STORE64(p, EndianClass::FromHost64(value)); break;
|
|
715
|
+
default: {
|
|
716
|
+
S2_LOG(FATAL) << "Not reached!";
|
|
717
|
+
}
|
|
718
|
+
}
|
|
719
|
+
}
|
|
720
|
+
|
|
721
|
+
// Floating point helper methods for the unified Load/Store APIs.
|
|
722
|
+
|
|
723
|
+
template<typename EndianClass>
|
|
724
|
+
inline float LoadFloat(const char* p) {
|
|
725
|
+
return absl::bit_cast<float>(EndianClass::ToHost32(UNALIGNED_LOAD32(p)));
|
|
726
|
+
}
|
|
727
|
+
|
|
728
|
+
template<typename EndianClass>
|
|
729
|
+
inline void StoreFloat(float value, char* p) {
|
|
730
|
+
UNALIGNED_STORE32(p, EndianClass::FromHost32(absl::bit_cast<uint32>(value)));
|
|
731
|
+
}
|
|
732
|
+
|
|
733
|
+
template<typename EndianClass>
|
|
734
|
+
inline double LoadDouble(const char* p) {
|
|
735
|
+
return absl::bit_cast<double>(EndianClass::ToHost64(UNALIGNED_LOAD64(p)));
|
|
736
|
+
}
|
|
737
|
+
|
|
738
|
+
template<typename EndianClass>
|
|
739
|
+
inline void StoreDouble(double value, char* p) {
|
|
740
|
+
UNALIGNED_STORE64(p, EndianClass::FromHost64(absl::bit_cast<uint64>(value)));
|
|
741
|
+
}
|
|
742
|
+
|
|
743
|
+
} // namespace endian_internal
|
|
744
|
+
|
|
745
|
+
// Load/Store for integral values.
|
|
746
|
+
|
|
747
|
+
template<typename T>
|
|
748
|
+
inline T LittleEndian::Load(const char* p) {
|
|
749
|
+
return endian_internal::LoadInteger<LittleEndian, T>(p);
|
|
750
|
+
}
|
|
751
|
+
|
|
752
|
+
template<typename T>
|
|
753
|
+
inline void LittleEndian::Store(T value, char* p) {
|
|
754
|
+
endian_internal::StoreInteger<LittleEndian, T>(value, p);
|
|
755
|
+
}
|
|
756
|
+
|
|
757
|
+
template<typename T>
|
|
758
|
+
inline T BigEndian::Load(const char* p) {
|
|
759
|
+
return endian_internal::LoadInteger<BigEndian, T>(p);
|
|
760
|
+
}
|
|
761
|
+
|
|
762
|
+
template<typename T>
|
|
763
|
+
inline void BigEndian::Store(T value, char* p) {
|
|
764
|
+
endian_internal::StoreInteger<BigEndian, T>(value, p);
|
|
765
|
+
}
|
|
766
|
+
|
|
767
|
+
// Load/Store for bool. Sanitizes bool on the way in for safety.
|
|
768
|
+
|
|
769
|
+
template<>
|
|
770
|
+
inline bool LittleEndian::Load<bool>(const char* p) {
|
|
771
|
+
static_assert(sizeof(bool) == 1, "Unexpected sizeof(bool)");
|
|
772
|
+
return *p != 0;
|
|
773
|
+
}
|
|
774
|
+
|
|
775
|
+
template<>
|
|
776
|
+
inline void LittleEndian::Store<bool>(bool value, char* p) {
|
|
777
|
+
static_assert(sizeof(bool) == 1, "Unexpected sizeof(bool)");
|
|
778
|
+
*p = value ? 1 : 0;
|
|
779
|
+
}
|
|
780
|
+
|
|
781
|
+
template<>
|
|
782
|
+
inline bool BigEndian::Load<bool>(const char* p) {
|
|
783
|
+
static_assert(sizeof(bool) == 1, "Unexpected sizeof(bool)");
|
|
784
|
+
return *p != 0;
|
|
785
|
+
}
|
|
786
|
+
|
|
787
|
+
template<>
|
|
788
|
+
inline void BigEndian::Store<bool>(bool value, char* p) {
|
|
789
|
+
static_assert(sizeof(bool) == 1, "Unexpected sizeof(bool)");
|
|
790
|
+
*p = value ? 1 : 0;
|
|
791
|
+
}
|
|
792
|
+
|
|
793
|
+
// Load/Store for float.
|
|
794
|
+
|
|
795
|
+
template<>
|
|
796
|
+
inline float LittleEndian::Load<float>(const char* p) {
|
|
797
|
+
return endian_internal::LoadFloat<LittleEndian>(p);
|
|
798
|
+
}
|
|
799
|
+
|
|
800
|
+
template<>
|
|
801
|
+
inline void LittleEndian::Store<float>(float value, char* p) {
|
|
802
|
+
endian_internal::StoreFloat<LittleEndian>(value, p);
|
|
803
|
+
}
|
|
804
|
+
|
|
805
|
+
template<>
|
|
806
|
+
inline float BigEndian::Load<float>(const char* p) {
|
|
807
|
+
return endian_internal::LoadFloat<BigEndian>(p);
|
|
808
|
+
}
|
|
809
|
+
|
|
810
|
+
template<>
|
|
811
|
+
inline void BigEndian::Store<float>(float value, char* p) {
|
|
812
|
+
endian_internal::StoreFloat<BigEndian>(value, p);
|
|
813
|
+
}
|
|
814
|
+
|
|
815
|
+
// Load/Store for double.
|
|
816
|
+
|
|
817
|
+
template<>
|
|
818
|
+
inline double LittleEndian::Load<double>(const char* p) {
|
|
819
|
+
return endian_internal::LoadDouble<LittleEndian>(p);
|
|
820
|
+
}
|
|
821
|
+
|
|
822
|
+
template<>
|
|
823
|
+
inline void LittleEndian::Store<double>(double value, char* p) {
|
|
824
|
+
endian_internal::StoreDouble<LittleEndian>(value, p);
|
|
825
|
+
}
|
|
826
|
+
|
|
827
|
+
template<>
|
|
828
|
+
inline double BigEndian::Load<double>(const char* p) {
|
|
829
|
+
return endian_internal::LoadDouble<BigEndian>(p);
|
|
830
|
+
}
|
|
831
|
+
|
|
832
|
+
template<>
|
|
833
|
+
inline void BigEndian::Store<double>(double value, char* p) {
|
|
834
|
+
endian_internal::StoreDouble<BigEndian>(value, p);
|
|
835
|
+
}
|
|
836
|
+
|
|
837
|
+
// Load/Store for uint128.
|
|
838
|
+
|
|
839
|
+
template <>
|
|
840
|
+
inline absl::uint128 LittleEndian::Load<absl::uint128>(const char* p) {
|
|
841
|
+
return LittleEndian::Load128(p);
|
|
842
|
+
}
|
|
843
|
+
|
|
844
|
+
template <>
|
|
845
|
+
inline void LittleEndian::Store<absl::uint128>(absl::uint128 value, char* p) {
|
|
846
|
+
LittleEndian::Store128(p, value);
|
|
847
|
+
}
|
|
848
|
+
|
|
849
|
+
template <>
|
|
850
|
+
inline absl::uint128 BigEndian::Load<absl::uint128>(const char* p) {
|
|
851
|
+
return BigEndian::Load128(p);
|
|
852
|
+
}
|
|
853
|
+
|
|
854
|
+
template <>
|
|
855
|
+
inline void BigEndian::Store<absl::uint128>(absl::uint128 value, char* p) {
|
|
856
|
+
BigEndian::Store128(p, value);
|
|
857
|
+
}
|
|
858
|
+
|
|
859
|
+
#endif // S2_UTIL_ENDIAN_ENDIAN_H_
|