@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,569 @@
|
|
|
1
|
+
// Copyright Google Inc. All Rights Reserved.
|
|
2
|
+
//
|
|
3
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
// you may not use this file except in compliance with the License.
|
|
5
|
+
// You may obtain a copy of the License at
|
|
6
|
+
//
|
|
7
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
//
|
|
9
|
+
// Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
// distributed under the License is distributed on an "AS-IS" BASIS,
|
|
11
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
// See the License for the specific language governing permissions and
|
|
13
|
+
// limitations under the License.
|
|
14
|
+
//
|
|
15
|
+
|
|
16
|
+
// Simple classes to handle vectors in 2D, 3D, and 4D.
|
|
17
|
+
//
|
|
18
|
+
// Maintainers: Please be mindful of extreme degradations in unoptimized
|
|
19
|
+
// performance here.
|
|
20
|
+
#ifndef S2_UTIL_MATH_VECTOR_H_
|
|
21
|
+
#define S2_UTIL_MATH_VECTOR_H_
|
|
22
|
+
|
|
23
|
+
#include <algorithm>
|
|
24
|
+
#include <cmath>
|
|
25
|
+
#include <cstdlib>
|
|
26
|
+
#include <iosfwd>
|
|
27
|
+
#include <iostream> // NOLINT(readability/streams)
|
|
28
|
+
#include <limits>
|
|
29
|
+
#include <type_traits>
|
|
30
|
+
|
|
31
|
+
#include "s2/base/integral_types.h"
|
|
32
|
+
#include "s2/base/logging.h"
|
|
33
|
+
#include "s2/third_party/absl/base/macros.h"
|
|
34
|
+
#include "s2/third_party/absl/utility/utility.h"
|
|
35
|
+
|
|
36
|
+
template <typename T> class Vector2;
|
|
37
|
+
template <typename T> class Vector3;
|
|
38
|
+
template <typename T> class Vector4;
|
|
39
|
+
|
|
40
|
+
namespace util {
|
|
41
|
+
namespace math {
|
|
42
|
+
namespace internal_vector {
|
|
43
|
+
|
|
44
|
+
// CRTP base class for all Vector templates.
|
|
45
|
+
template <template <typename> class VecTemplate, typename T, std::size_t N>
|
|
46
|
+
class BasicVector {
|
|
47
|
+
using D = VecTemplate<T>;
|
|
48
|
+
|
|
49
|
+
protected:
|
|
50
|
+
// FloatType is the type returned by Norm() and Angle(). These methods are
|
|
51
|
+
// special because they return floating-point values even when VType is an
|
|
52
|
+
// integer.
|
|
53
|
+
typedef typename std::conditional<std::is_integral<T>::value,
|
|
54
|
+
double, T>::type FloatType;
|
|
55
|
+
|
|
56
|
+
using IdxSeqN = typename absl::make_index_sequence<N>;
|
|
57
|
+
|
|
58
|
+
template <std::size_t I, typename F, typename... As>
|
|
59
|
+
static auto Reduce(F f, As*... as)
|
|
60
|
+
-> decltype(f(as[I]...)) {
|
|
61
|
+
return f(as[I]...);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
template <typename R = D, std::size_t... Is, typename F, typename... As>
|
|
65
|
+
static R GenerateEach(absl::index_sequence<Is...>, F f, As*... as) {
|
|
66
|
+
return R(Reduce<Is>(f, as...)...);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// Generate<R>(f,a,b,...) returns an R(...), where the constructor arguments
|
|
70
|
+
// are created as a transform. R(f(a[0],b[0],...), f(a[1],b[1],...), ...),
|
|
71
|
+
// and with a,b,... all optional.
|
|
72
|
+
template <typename R = D, typename F, typename... As>
|
|
73
|
+
static R Generate(F f, As&&... as) {
|
|
74
|
+
return GenerateEach<R>(IdxSeqN(), f, std::forward<As>(as).Data()...);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
public:
|
|
78
|
+
enum { SIZE = N };
|
|
79
|
+
static int Size() { return SIZE; }
|
|
80
|
+
|
|
81
|
+
void Clear() { AsD() = D(); }
|
|
82
|
+
|
|
83
|
+
T& operator[](int b) {
|
|
84
|
+
S2_DCHECK_GE(b, 0);
|
|
85
|
+
S2_DCHECK_LT(b, SIZE);
|
|
86
|
+
return static_cast<D&>(*this).Data()[b];
|
|
87
|
+
}
|
|
88
|
+
T operator[](int b) const {
|
|
89
|
+
S2_DCHECK_GE(b, 0);
|
|
90
|
+
S2_DCHECK_LT(b, SIZE);
|
|
91
|
+
return static_cast<const D&>(*this).Data()[b];
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
// TODO(user): Relationals should be nonmembers.
|
|
95
|
+
bool operator==(const D& b) const {
|
|
96
|
+
const T* ap = static_cast<const D&>(*this).Data();
|
|
97
|
+
return std::equal(ap, ap + this->Size(), b.Data());
|
|
98
|
+
}
|
|
99
|
+
bool operator!=(const D& b) const { return !(AsD() == b); }
|
|
100
|
+
bool operator<(const D& b) const {
|
|
101
|
+
const T* ap = static_cast<const D&>(*this).Data();
|
|
102
|
+
const T* bp = b.Data();
|
|
103
|
+
return std::lexicographical_compare(
|
|
104
|
+
ap, ap + this->Size(), bp, bp + b.Size());
|
|
105
|
+
}
|
|
106
|
+
bool operator>(const D& b) const { return b < AsD(); }
|
|
107
|
+
bool operator<=(const D& b) const { return !(AsD() > b); }
|
|
108
|
+
bool operator>=(const D& b) const { return !(AsD() < b); }
|
|
109
|
+
|
|
110
|
+
D& operator+=(const D& b) {
|
|
111
|
+
PlusEq(static_cast<D&>(*this).Data(), b.Data(), IdxSeqN{});
|
|
112
|
+
return static_cast<D&>(*this);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
D& operator-=(const D& b) {
|
|
116
|
+
MinusEq(static_cast<D&>(*this).Data(), b.Data(), IdxSeqN{});
|
|
117
|
+
return static_cast<D&>(*this);
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
D& operator*=(T k) {
|
|
121
|
+
MulEq(static_cast<D&>(*this).Data(), k, IdxSeqN{});
|
|
122
|
+
return static_cast<D&>(*this);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
D& operator/=(T k) {
|
|
126
|
+
DivEq(static_cast<D&>(*this).Data(), k, IdxSeqN{});
|
|
127
|
+
return static_cast<D&>(*this);
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
D operator+(const D& b) const { return D(AsD()) += b; }
|
|
131
|
+
D operator-(const D& b) const { return D(AsD()) -= b; }
|
|
132
|
+
D operator*(T k) const { return D(AsD()) *= k; }
|
|
133
|
+
D operator/(T k) const { return D(AsD()) /= k; }
|
|
134
|
+
|
|
135
|
+
friend D operator-(const D& a) {
|
|
136
|
+
return Generate([](const T& x) { return -x; }, a);
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
// Convert from another vector type
|
|
140
|
+
template <typename T2>
|
|
141
|
+
static D Cast(const VecTemplate<T2> &b) {
|
|
142
|
+
return Generate([](const T2& x) { return static_cast<T>(x); }, b);
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
// multiply two vectors component by component
|
|
146
|
+
D MulComponents(const D &b) const {
|
|
147
|
+
return Generate([](const T& x, const T& y) { return x * y; }, AsD(), b);
|
|
148
|
+
}
|
|
149
|
+
// divide two vectors component by component
|
|
150
|
+
D DivComponents(const D &b) const {
|
|
151
|
+
return Generate([](const T& x, const T& y) { return x / y; }, AsD(), b);
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
// Element-wise max. {max(a[0],b[0]), max(a[1],b[1]), ...}
|
|
155
|
+
friend D Max(const D &a, const D &b) {
|
|
156
|
+
return Generate([](const T& x, const T& y) {
|
|
157
|
+
return std::max(x, y);
|
|
158
|
+
}, a, b);
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
// Element-wise min. {min(a[0],b[0]), min(a[1],b[1]), ...}
|
|
162
|
+
friend D Min(const D &a, const D &b) {
|
|
163
|
+
return Generate([](const T& x, const T& y) {
|
|
164
|
+
return std::min(x, y);
|
|
165
|
+
}, a, b);
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
T DotProd(const D& b) const {
|
|
169
|
+
return Dot(static_cast<T>(0), static_cast<const D&>(*this).Data(), b.Data(),
|
|
170
|
+
IdxSeqN{});
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
// Squared Euclidean norm (the dot product with itself).
|
|
174
|
+
T Norm2() const { return DotProd(AsD()); }
|
|
175
|
+
|
|
176
|
+
// Euclidean norm. For integer T, correct only if Norm2 does not overflow.
|
|
177
|
+
FloatType Norm() const {
|
|
178
|
+
using std::sqrt;
|
|
179
|
+
return sqrt(Norm2());
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
// Normalized vector if the norm is nonzero. Not for integer types.
|
|
183
|
+
D Normalize() const {
|
|
184
|
+
static_assert(!std::is_integral<T>::value, "must be floating point");
|
|
185
|
+
T n = Norm();
|
|
186
|
+
if (n != T(0.0)) {
|
|
187
|
+
n = T(1.0) / n;
|
|
188
|
+
}
|
|
189
|
+
return D(AsD()) *= n;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
// Compose a vector from the sqrt of each component.
|
|
193
|
+
D Sqrt() const {
|
|
194
|
+
return Generate([](const T& x) {
|
|
195
|
+
using std::sqrt;
|
|
196
|
+
return sqrt(x);
|
|
197
|
+
}, AsD());
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
// Take the floor of each component.
|
|
201
|
+
D Floor() const {
|
|
202
|
+
return Generate([](const T& x) { return floor(x); }, AsD());
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
// Take the ceil of each component.
|
|
206
|
+
D Ceil() const {
|
|
207
|
+
return Generate([](const T& x) { return ceil(x); }, AsD());
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
// Round of each component.
|
|
211
|
+
D FRound() const {
|
|
212
|
+
using std::rint;
|
|
213
|
+
return Generate([](const T& x) { return rint(x); }, AsD());
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
// Round of each component and return an integer vector.
|
|
217
|
+
VecTemplate<int> IRound() const {
|
|
218
|
+
using std::lrint;
|
|
219
|
+
return Generate<VecTemplate<int>>([](const T& x) { return lrint(x); },
|
|
220
|
+
AsD());
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
// True if any of the components is not a number.
|
|
224
|
+
bool IsNaN() const {
|
|
225
|
+
bool r = false;
|
|
226
|
+
const T* ap = AsD().Data();
|
|
227
|
+
for (int i = 0; i < SIZE; ++i)
|
|
228
|
+
r = r || std::isnan(ap[i]);
|
|
229
|
+
return r;
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
// A Vector populated with all NaN values.
|
|
233
|
+
static D NaN() {
|
|
234
|
+
return Generate([] { return std::numeric_limits<T>::quiet_NaN(); });
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
friend std::ostream& operator<<(std::ostream& out, const D& v) {
|
|
238
|
+
out << "[";
|
|
239
|
+
const char *sep = "";
|
|
240
|
+
for (int i = 0; i < SIZE; ++i) {
|
|
241
|
+
out << sep;
|
|
242
|
+
Print(out, v[i]);
|
|
243
|
+
sep = ", ";
|
|
244
|
+
}
|
|
245
|
+
return out << "]";
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
// These are only public for technical reasons (see cl/121145822).
|
|
249
|
+
template <typename K>
|
|
250
|
+
D MulScalarInternal(const K& k) const {
|
|
251
|
+
return Generate([k](const T& x) { return k * x; }, AsD());
|
|
252
|
+
}
|
|
253
|
+
template <typename K>
|
|
254
|
+
D DivScalarInternal(const K& k) const {
|
|
255
|
+
return Generate([k](const T& x) { return k / x; }, AsD());
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
private:
|
|
259
|
+
const D& AsD() const { return static_cast<const D&>(*this); }
|
|
260
|
+
D& AsD() { return static_cast<D&>(*this); }
|
|
261
|
+
|
|
262
|
+
// ostream << uint8 prints the ASCII character, which is not useful.
|
|
263
|
+
// Cast to int so that numbers will be printed instead.
|
|
264
|
+
template <typename U>
|
|
265
|
+
static void Print(std::ostream& out, const U& v) { out << v; }
|
|
266
|
+
static void Print(std::ostream& out, uint8 v) { out << static_cast<int>(v); }
|
|
267
|
+
|
|
268
|
+
// Ignores its arguments so that side-effects of variadic unpacking can occur.
|
|
269
|
+
static void Ignore(std::initializer_list<bool>) {}
|
|
270
|
+
|
|
271
|
+
template <std::size_t... Is>
|
|
272
|
+
static T Dot(T sum, const T* a, const T* b, absl::index_sequence<Is...>) {
|
|
273
|
+
Ignore({(sum += a[Is] * b[Is], true)...});
|
|
274
|
+
return sum;
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
template <std::size_t... Is>
|
|
278
|
+
static void PlusEq(T* a, const T* b, absl::index_sequence<Is...>) {
|
|
279
|
+
Ignore({(a[Is] += b[Is], true)...});
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
template <std::size_t... Is>
|
|
283
|
+
static void MinusEq(T* a, const T* b, absl::index_sequence<Is...>) {
|
|
284
|
+
Ignore({(a[Is] -= b[Is], true)...});
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
template <std::size_t... Is>
|
|
288
|
+
static void MulEq(T* a, T b, absl::index_sequence<Is...>) {
|
|
289
|
+
Ignore({(a[Is] *= b, true)...});
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
template <std::size_t... Is>
|
|
293
|
+
static void DivEq(T* a, T b, absl::index_sequence<Is...>) {
|
|
294
|
+
Ignore({(a[Is] /= b, true)...});
|
|
295
|
+
}
|
|
296
|
+
};
|
|
297
|
+
|
|
298
|
+
// These templates must be defined outside of BasicVector so that the
|
|
299
|
+
// template specialization match algorithm must deduce 'a'. See the review
|
|
300
|
+
// of cl/119944115.
|
|
301
|
+
template <typename K,
|
|
302
|
+
template <typename> class VT2, typename T2, std::size_t N2>
|
|
303
|
+
VT2<T2> operator*(const K& k, const BasicVector<VT2, T2, N2>& a) {
|
|
304
|
+
return a.MulScalarInternal(k);
|
|
305
|
+
}
|
|
306
|
+
template <typename K,
|
|
307
|
+
template <typename> class VT2, typename T2, std::size_t N2>
|
|
308
|
+
VT2<T2> operator/(const K& k, const BasicVector<VT2, T2, N2>& a) {
|
|
309
|
+
return a.DivScalarInternal(k);
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
} // namespace internal_vector
|
|
313
|
+
} // namespace math
|
|
314
|
+
} // namespace util
|
|
315
|
+
|
|
316
|
+
// ======================================================================
|
|
317
|
+
template <typename T>
|
|
318
|
+
class Vector2
|
|
319
|
+
: public util::math::internal_vector::BasicVector<Vector2, T, 2> {
|
|
320
|
+
private:
|
|
321
|
+
using Base = util::math::internal_vector::BasicVector<::Vector2, T, 2>;
|
|
322
|
+
using VType = T;
|
|
323
|
+
|
|
324
|
+
public:
|
|
325
|
+
typedef VType BaseType;
|
|
326
|
+
using FloatType = typename Base::FloatType;
|
|
327
|
+
using Base::SIZE;
|
|
328
|
+
|
|
329
|
+
Vector2() : c_() {}
|
|
330
|
+
Vector2(T x, T y) {
|
|
331
|
+
c_[0] = x;
|
|
332
|
+
c_[1] = y;
|
|
333
|
+
}
|
|
334
|
+
explicit Vector2(const Vector3<T> &b) : Vector2(b.x(), b.y()) {}
|
|
335
|
+
explicit Vector2(const Vector4<T> &b) : Vector2(b.x(), b.y()) {}
|
|
336
|
+
|
|
337
|
+
T* Data() { return c_; }
|
|
338
|
+
const T* Data() const { return c_; }
|
|
339
|
+
|
|
340
|
+
void x(T v) { c_[0] = v; }
|
|
341
|
+
void y(T v) { c_[1] = v; }
|
|
342
|
+
T x() const { return c_[0]; }
|
|
343
|
+
T y() const { return c_[1]; }
|
|
344
|
+
|
|
345
|
+
bool aequal(const Vector2 &vb, FloatType margin) const {
|
|
346
|
+
using std::fabs;
|
|
347
|
+
return (fabs(c_[0]-vb.c_[0]) < margin) && (fabs(c_[1]-vb.c_[1]) < margin);
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
void Set(T x, T y) { *this = Vector2(x, y); }
|
|
351
|
+
|
|
352
|
+
// Cross product. Be aware that if T is an integer type, the high bits
|
|
353
|
+
// of the result are silently discarded.
|
|
354
|
+
T CrossProd(const Vector2 &vb) const {
|
|
355
|
+
return c_[0] * vb.c_[1] - c_[1] * vb.c_[0];
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
// Returns the angle between "this" and v in radians. If either vector is
|
|
359
|
+
// zero-length, or nearly zero-length, the result will be zero, regardless of
|
|
360
|
+
// the other value.
|
|
361
|
+
FloatType Angle(const Vector2 &v) const {
|
|
362
|
+
using std::atan2;
|
|
363
|
+
return atan2(CrossProd(v), this->DotProd(v));
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
// return a vector orthogonal to the current one
|
|
367
|
+
// with the same norm and counterclockwise to it
|
|
368
|
+
Vector2 Ortho() const { return Vector2(-c_[1], c_[0]); }
|
|
369
|
+
|
|
370
|
+
// TODO(user): unify Fabs/Abs between all Vector classes.
|
|
371
|
+
Vector2 Fabs() const {
|
|
372
|
+
using std::fabs;
|
|
373
|
+
return Vector2(fabs(c_[0]), fabs(c_[1]));
|
|
374
|
+
}
|
|
375
|
+
Vector2 Abs() const {
|
|
376
|
+
static_assert(std::is_integral<VType>::value, "use Fabs for float_types");
|
|
377
|
+
static_assert(static_cast<VType>(-1) == -1, "type must be signed");
|
|
378
|
+
static_assert(sizeof(c_[0]) <= sizeof(int), "Abs truncates to int");
|
|
379
|
+
return Vector2(abs(c_[0]), abs(c_[1]));
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
private:
|
|
383
|
+
VType c_[SIZE];
|
|
384
|
+
};
|
|
385
|
+
|
|
386
|
+
template <typename T>
|
|
387
|
+
class Vector3
|
|
388
|
+
: public util::math::internal_vector::BasicVector<Vector3, T, 3> {
|
|
389
|
+
private:
|
|
390
|
+
using Base = util::math::internal_vector::BasicVector<::Vector3, T, 3>;
|
|
391
|
+
using VType = T;
|
|
392
|
+
|
|
393
|
+
public:
|
|
394
|
+
typedef VType BaseType;
|
|
395
|
+
using FloatType = typename Base::FloatType;
|
|
396
|
+
using Base::SIZE;
|
|
397
|
+
|
|
398
|
+
Vector3() : c_() {}
|
|
399
|
+
Vector3(T x, T y, T z) {
|
|
400
|
+
c_[0] = x;
|
|
401
|
+
c_[1] = y;
|
|
402
|
+
c_[2] = z;
|
|
403
|
+
}
|
|
404
|
+
Vector3(const Vector2<T> &b, T z) : Vector3(b.x(), b.y(), z) {}
|
|
405
|
+
explicit Vector3(const Vector4<T> &b) : Vector3(b.x(), b.y(), b.z()) {}
|
|
406
|
+
|
|
407
|
+
T* Data() { return c_; }
|
|
408
|
+
const T* Data() const { return c_; }
|
|
409
|
+
|
|
410
|
+
void x(const T &v) { c_[0] = v; }
|
|
411
|
+
void y(const T &v) { c_[1] = v; }
|
|
412
|
+
void z(const T &v) { c_[2] = v; }
|
|
413
|
+
T x() const { return c_[0]; }
|
|
414
|
+
T y() const { return c_[1]; }
|
|
415
|
+
T z() const { return c_[2]; }
|
|
416
|
+
|
|
417
|
+
bool aequal(const Vector3 &vb, FloatType margin) const {
|
|
418
|
+
using std::abs;
|
|
419
|
+
return (abs(c_[0] - vb.c_[0]) < margin)
|
|
420
|
+
&& (abs(c_[1] - vb.c_[1]) < margin)
|
|
421
|
+
&& (abs(c_[2] - vb.c_[2]) < margin);
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
void Set(T x, T y, T z) { *this = Vector3(x, y, z); }
|
|
425
|
+
|
|
426
|
+
// Cross product. Be aware that if VType is an integer type, the high bits
|
|
427
|
+
// of the result are silently discarded.
|
|
428
|
+
Vector3 CrossProd(const Vector3& vb) const {
|
|
429
|
+
return Vector3(c_[1] * vb.c_[2] - c_[2] * vb.c_[1],
|
|
430
|
+
c_[2] * vb.c_[0] - c_[0] * vb.c_[2],
|
|
431
|
+
c_[0] * vb.c_[1] - c_[1] * vb.c_[0]);
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
// Returns a unit vector orthogonal to this one.
|
|
435
|
+
Vector3 Ortho() const {
|
|
436
|
+
int k = LargestAbsComponent() - 1;
|
|
437
|
+
if (k < 0) k = 2;
|
|
438
|
+
Vector3 temp;
|
|
439
|
+
temp[k] = T(1);
|
|
440
|
+
return CrossProd(temp).Normalize();
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
// Returns the angle between two vectors in radians. If either vector is
|
|
444
|
+
// zero-length, or nearly zero-length, the result will be zero, regardless of
|
|
445
|
+
// the other value.
|
|
446
|
+
FloatType Angle(const Vector3 &va) const {
|
|
447
|
+
using std::atan2;
|
|
448
|
+
return atan2(CrossProd(va).Norm(), this->DotProd(va));
|
|
449
|
+
}
|
|
450
|
+
|
|
451
|
+
Vector3 Fabs() const {
|
|
452
|
+
return Abs();
|
|
453
|
+
}
|
|
454
|
+
|
|
455
|
+
Vector3 Abs() const {
|
|
456
|
+
static_assert(
|
|
457
|
+
!std::is_integral<VType>::value || static_cast<VType>(-1) == -1,
|
|
458
|
+
"type must be signed");
|
|
459
|
+
using std::abs;
|
|
460
|
+
return Vector3(abs(c_[0]), abs(c_[1]), abs(c_[2]));
|
|
461
|
+
}
|
|
462
|
+
|
|
463
|
+
// return the index of the largest component (fabs)
|
|
464
|
+
int LargestAbsComponent() const {
|
|
465
|
+
Vector3 temp = Abs();
|
|
466
|
+
return temp[0] > temp[1] ?
|
|
467
|
+
temp[0] > temp[2] ? 0 : 2 :
|
|
468
|
+
temp[1] > temp[2] ? 1 : 2;
|
|
469
|
+
}
|
|
470
|
+
|
|
471
|
+
// return the index of the smallest, median ,largest component of the vector
|
|
472
|
+
Vector3<int> ComponentOrder() const {
|
|
473
|
+
using std::swap;
|
|
474
|
+
Vector3<int> temp(0, 1, 2);
|
|
475
|
+
if (c_[temp[0]] > c_[temp[1]]) swap(temp[0], temp[1]);
|
|
476
|
+
if (c_[temp[1]] > c_[temp[2]]) swap(temp[1], temp[2]);
|
|
477
|
+
if (c_[temp[0]] > c_[temp[1]]) swap(temp[0], temp[1]);
|
|
478
|
+
return temp;
|
|
479
|
+
}
|
|
480
|
+
|
|
481
|
+
private:
|
|
482
|
+
VType c_[SIZE];
|
|
483
|
+
};
|
|
484
|
+
|
|
485
|
+
template <typename T>
|
|
486
|
+
class Vector4
|
|
487
|
+
: public util::math::internal_vector::BasicVector<Vector4, T, 4> {
|
|
488
|
+
private:
|
|
489
|
+
using Base = util::math::internal_vector::BasicVector<::Vector4, T, 4>;
|
|
490
|
+
using VType = T;
|
|
491
|
+
|
|
492
|
+
public:
|
|
493
|
+
typedef VType BaseType;
|
|
494
|
+
using FloatType = typename Base::FloatType;
|
|
495
|
+
using Base::SIZE;
|
|
496
|
+
|
|
497
|
+
Vector4() : c_() {}
|
|
498
|
+
Vector4(T x, T y, T z, T w) {
|
|
499
|
+
c_[0] = x;
|
|
500
|
+
c_[1] = y;
|
|
501
|
+
c_[2] = z;
|
|
502
|
+
c_[3] = w;
|
|
503
|
+
}
|
|
504
|
+
|
|
505
|
+
Vector4(const Vector2<T> &b, T z, T w)
|
|
506
|
+
: Vector4(b.x(), b.y(), z, w) {}
|
|
507
|
+
Vector4(const Vector2<T> &a, const Vector2<T> &b)
|
|
508
|
+
: Vector4(a.x(), a.y(), b.x(), b.y()) {}
|
|
509
|
+
Vector4(const Vector3<T> &b, T w)
|
|
510
|
+
: Vector4(b.x(), b.y(), b.z(), w) {}
|
|
511
|
+
|
|
512
|
+
T* Data() { return c_; }
|
|
513
|
+
const T* Data() const { return c_; }
|
|
514
|
+
|
|
515
|
+
bool aequal(const Vector4 &vb, FloatType margin) const {
|
|
516
|
+
using std::fabs;
|
|
517
|
+
return (fabs(c_[0] - vb.c_[0]) < margin)
|
|
518
|
+
&& (fabs(c_[1] - vb.c_[1]) < margin)
|
|
519
|
+
&& (fabs(c_[2] - vb.c_[2]) < margin)
|
|
520
|
+
&& (fabs(c_[3] - vb.c_[3]) < margin);
|
|
521
|
+
}
|
|
522
|
+
|
|
523
|
+
void x(const T &v) { c_[0] = v; }
|
|
524
|
+
void y(const T &v) { c_[1] = v; }
|
|
525
|
+
void z(const T &v) { c_[2] = v; }
|
|
526
|
+
void w(const T &v) { c_[3] = v; }
|
|
527
|
+
T x() const { return c_[0]; }
|
|
528
|
+
T y() const { return c_[1]; }
|
|
529
|
+
T z() const { return c_[2]; }
|
|
530
|
+
T w() const { return c_[3]; }
|
|
531
|
+
|
|
532
|
+
void Set(T x, T y, T z, T w) { *this = Vector4(x, y, z, w); }
|
|
533
|
+
|
|
534
|
+
Vector4 Fabs() const {
|
|
535
|
+
using std::fabs;
|
|
536
|
+
return Vector4(fabs(c_[0]), fabs(c_[1]), fabs(c_[2]), fabs(c_[3]));
|
|
537
|
+
}
|
|
538
|
+
|
|
539
|
+
Vector4 Abs() const {
|
|
540
|
+
static_assert(std::is_integral<VType>::value, "use Fabs for float types");
|
|
541
|
+
static_assert(static_cast<VType>(-1) == -1, "type must be signed");
|
|
542
|
+
static_assert(sizeof(c_[0]) <= sizeof(int), "Abs truncates to int");
|
|
543
|
+
return Vector4(abs(c_[0]), abs(c_[1]), abs(c_[2]), abs(c_[3]));
|
|
544
|
+
}
|
|
545
|
+
|
|
546
|
+
private:
|
|
547
|
+
VType c_[SIZE];
|
|
548
|
+
};
|
|
549
|
+
|
|
550
|
+
typedef Vector2<uint8> Vector2_b;
|
|
551
|
+
typedef Vector2<int16> Vector2_s;
|
|
552
|
+
typedef Vector2<int> Vector2_i;
|
|
553
|
+
typedef Vector2<float> Vector2_f;
|
|
554
|
+
typedef Vector2<double> Vector2_d;
|
|
555
|
+
|
|
556
|
+
typedef Vector3<uint8> Vector3_b;
|
|
557
|
+
typedef Vector3<int16> Vector3_s;
|
|
558
|
+
typedef Vector3<int> Vector3_i;
|
|
559
|
+
typedef Vector3<float> Vector3_f;
|
|
560
|
+
typedef Vector3<double> Vector3_d;
|
|
561
|
+
|
|
562
|
+
typedef Vector4<uint8> Vector4_b;
|
|
563
|
+
typedef Vector4<int16> Vector4_s;
|
|
564
|
+
typedef Vector4<int> Vector4_i;
|
|
565
|
+
typedef Vector4<float> Vector4_f;
|
|
566
|
+
typedef Vector4<double> Vector4_d;
|
|
567
|
+
|
|
568
|
+
|
|
569
|
+
#endif // S2_UTIL_MATH_VECTOR_H_
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
// Copyright Google Inc. All Rights Reserved.
|
|
2
|
+
//
|
|
3
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
// you may not use this file except in compliance with the License.
|
|
5
|
+
// You may obtain a copy of the License at
|
|
6
|
+
//
|
|
7
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
//
|
|
9
|
+
// Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
// distributed under the License is distributed on an "AS-IS" BASIS,
|
|
11
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
// See the License for the specific language governing permissions and
|
|
13
|
+
// limitations under the License.
|
|
14
|
+
//
|
|
15
|
+
|
|
16
|
+
#ifndef S2_UTIL_MATH_VECTOR3_HASH_H_
|
|
17
|
+
#define S2_UTIL_MATH_VECTOR3_HASH_H_
|
|
18
|
+
|
|
19
|
+
#include <cstddef>
|
|
20
|
+
#include <functional>
|
|
21
|
+
#include <type_traits>
|
|
22
|
+
|
|
23
|
+
#include "s2/util/hash/mix.h"
|
|
24
|
+
#include "s2/util/math/vector.h"
|
|
25
|
+
|
|
26
|
+
template <class T>
|
|
27
|
+
struct GoodFastHash;
|
|
28
|
+
|
|
29
|
+
template <class VType>
|
|
30
|
+
struct GoodFastHash<Vector2<VType>> {
|
|
31
|
+
std::size_t operator()(const Vector2<VType>& v) const {
|
|
32
|
+
static_assert(std::is_pod<VType>::value, "POD expected");
|
|
33
|
+
// std::hash collapses +/-0.
|
|
34
|
+
std::hash<VType> h;
|
|
35
|
+
HashMix mix(h(v.x()));
|
|
36
|
+
mix.Mix(h(v.y()));
|
|
37
|
+
return mix.get();
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
template <class VType>
|
|
42
|
+
struct GoodFastHash<Vector3<VType>> {
|
|
43
|
+
std::size_t operator()(const Vector3<VType>& v) const {
|
|
44
|
+
static_assert(std::is_pod<VType>::value, "POD expected");
|
|
45
|
+
// std::hash collapses +/-0.
|
|
46
|
+
std::hash<VType> h;
|
|
47
|
+
HashMix mix(h(v.x()));
|
|
48
|
+
mix.Mix(h(v.y()));
|
|
49
|
+
mix.Mix(h(v.z()));
|
|
50
|
+
return mix.get();
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
#endif // S2_UTIL_MATH_VECTOR3_HASH_H_
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
// Copyright 2004 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
|
+
// Provide definitions for length unit constants
|
|
18
|
+
|
|
19
|
+
#include "s2/util/units/length-units.h"
|
|
20
|
+
|
|
21
|
+
const char * const util::units::LengthBase::output_suffix = "m";
|