@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.
Files changed (471) hide show
  1. package/.circleci/config.yml +45 -0
  2. package/.dockerignore +1 -0
  3. package/.gitmodules +3 -0
  4. package/CHANGELOG.md +33 -0
  5. package/LICENSE +201 -0
  6. package/README.md +147 -0
  7. package/binding.gyp +170 -0
  8. package/docker/Dockerfile.node20.test +8 -0
  9. package/docker/Dockerfile.node22.test +8 -0
  10. package/docker/Dockerfile.node24.test +8 -0
  11. package/index.d.ts +117 -0
  12. package/index.js +6 -0
  13. package/jest.config.js +184 -0
  14. package/package.json +43 -0
  15. package/publish-linux.sh +18 -0
  16. package/publish-osx.sh +19 -0
  17. package/src/builder.cc +84 -0
  18. package/src/builder.h +29 -0
  19. package/src/cell.cc +71 -0
  20. package/src/cell.h +26 -0
  21. package/src/cell_id.cc +210 -0
  22. package/src/cell_id.h +44 -0
  23. package/src/cell_union.cc +237 -0
  24. package/src/cell_union.h +34 -0
  25. package/src/earth.cc +185 -0
  26. package/src/earth.h +33 -0
  27. package/src/latlng.cc +132 -0
  28. package/src/latlng.h +28 -0
  29. package/src/loop.cc +51 -0
  30. package/src/loop.h +21 -0
  31. package/src/point.cc +69 -0
  32. package/src/point.h +23 -0
  33. package/src/polygon.cc +36 -0
  34. package/src/polygon.h +20 -0
  35. package/src/polyline.cc +186 -0
  36. package/src/polyline.h +34 -0
  37. package/src/region_coverer.cc +450 -0
  38. package/src/region_coverer.h +56 -0
  39. package/src/s2.cc +27 -0
  40. package/test/Cell.test.js +37 -0
  41. package/test/CellId.test.js +135 -0
  42. package/test/CellUnion.test.js +150 -0
  43. package/test/Earth.test.js +62 -0
  44. package/test/LatLng.test.js +45 -0
  45. package/test/Point.test.js +14 -0
  46. package/test/Polyline.test.js +78 -0
  47. package/test/RegionCoverer.test.js +301 -0
  48. package/test.sh +16 -0
  49. package/third_party/s2geometry/.travis.yml +163 -0
  50. package/third_party/s2geometry/AUTHORS +13 -0
  51. package/third_party/s2geometry/CONTRIBUTING.md +65 -0
  52. package/third_party/s2geometry/CONTRIBUTORS +30 -0
  53. package/third_party/s2geometry/LICENSE +202 -0
  54. package/third_party/s2geometry/NOTICE +5 -0
  55. package/third_party/s2geometry/README.md +127 -0
  56. package/third_party/s2geometry/doc/examples/point_index.cc +44 -0
  57. package/third_party/s2geometry/doc/examples/term_index.cc +99 -0
  58. package/third_party/s2geometry/doc/examples/term_index.py +101 -0
  59. package/third_party/s2geometry/src/python/coder.i +125 -0
  60. package/third_party/s2geometry/src/python/pywraps2_test.py +786 -0
  61. package/third_party/s2geometry/src/python/s2.i +37 -0
  62. package/third_party/s2geometry/src/python/s2_common.i +756 -0
  63. package/third_party/s2geometry/src/s2/_fp_contract_off.h +60 -0
  64. package/third_party/s2geometry/src/s2/base/casts.h +318 -0
  65. package/third_party/s2geometry/src/s2/base/commandlineflags.h +67 -0
  66. package/third_party/s2geometry/src/s2/base/integral_types.h +31 -0
  67. package/third_party/s2geometry/src/s2/base/log_severity.h +40 -0
  68. package/third_party/s2geometry/src/s2/base/logging.h +173 -0
  69. package/third_party/s2geometry/src/s2/base/mutex.h +61 -0
  70. package/third_party/s2geometry/src/s2/base/port.h +999 -0
  71. package/third_party/s2geometry/src/s2/base/spinlock.h +60 -0
  72. package/third_party/s2geometry/src/s2/base/stringprintf.cc +107 -0
  73. package/third_party/s2geometry/src/s2/base/stringprintf.h +53 -0
  74. package/third_party/s2geometry/src/s2/base/strtoint.cc +65 -0
  75. package/third_party/s2geometry/src/s2/base/strtoint.h +106 -0
  76. package/third_party/s2geometry/src/s2/base/timer.h +50 -0
  77. package/third_party/s2geometry/src/s2/encoded_s2cell_id_vector.cc +164 -0
  78. package/third_party/s2geometry/src/s2/encoded_s2cell_id_vector.h +110 -0
  79. package/third_party/s2geometry/src/s2/encoded_s2cell_id_vector_test.cc +232 -0
  80. package/third_party/s2geometry/src/s2/encoded_s2point_vector.cc +838 -0
  81. package/third_party/s2geometry/src/s2/encoded_s2point_vector.h +140 -0
  82. package/third_party/s2geometry/src/s2/encoded_s2point_vector_test.cc +344 -0
  83. package/third_party/s2geometry/src/s2/encoded_s2shape_index.cc +181 -0
  84. package/third_party/s2geometry/src/s2/encoded_s2shape_index.h +276 -0
  85. package/third_party/s2geometry/src/s2/encoded_s2shape_index_test.cc +244 -0
  86. package/third_party/s2geometry/src/s2/encoded_string_vector.cc +66 -0
  87. package/third_party/s2geometry/src/s2/encoded_string_vector.h +164 -0
  88. package/third_party/s2geometry/src/s2/encoded_string_vector_test.cc +69 -0
  89. package/third_party/s2geometry/src/s2/encoded_uint_vector.h +299 -0
  90. package/third_party/s2geometry/src/s2/encoded_uint_vector_test.cc +124 -0
  91. package/third_party/s2geometry/src/s2/id_set_lexicon.cc +81 -0
  92. package/third_party/s2geometry/src/s2/id_set_lexicon.h +199 -0
  93. package/third_party/s2geometry/src/s2/id_set_lexicon_test.cc +70 -0
  94. package/third_party/s2geometry/src/s2/mutable_s2shape_index.cc +1585 -0
  95. package/third_party/s2geometry/src/s2/mutable_s2shape_index.h +600 -0
  96. package/third_party/s2geometry/src/s2/mutable_s2shape_index_test.cc +589 -0
  97. package/third_party/s2geometry/src/s2/r1interval.h +220 -0
  98. package/third_party/s2geometry/src/s2/r1interval_test.cc +185 -0
  99. package/third_party/s2geometry/src/s2/r2.h +26 -0
  100. package/third_party/s2geometry/src/s2/r2rect.cc +93 -0
  101. package/third_party/s2geometry/src/s2/r2rect.h +234 -0
  102. package/third_party/s2geometry/src/s2/r2rect_test.cc +228 -0
  103. package/third_party/s2geometry/src/s2/s1angle.cc +54 -0
  104. package/third_party/s2geometry/src/s2/s1angle.h +336 -0
  105. package/third_party/s2geometry/src/s2/s1angle_test.cc +185 -0
  106. package/third_party/s2geometry/src/s2/s1chord_angle.cc +159 -0
  107. package/third_party/s2geometry/src/s2/s1chord_angle.h +369 -0
  108. package/third_party/s2geometry/src/s2/s1chord_angle_test.cc +207 -0
  109. package/third_party/s2geometry/src/s2/s1interval.cc +296 -0
  110. package/third_party/s2geometry/src/s2/s1interval.h +266 -0
  111. package/third_party/s2geometry/src/s2/s1interval_test.cc +469 -0
  112. package/third_party/s2geometry/src/s2/s2boolean_operation.cc +2391 -0
  113. package/third_party/s2geometry/src/s2/s2boolean_operation.h +501 -0
  114. package/third_party/s2geometry/src/s2/s2boolean_operation_test.cc +1400 -0
  115. package/third_party/s2geometry/src/s2/s2builder.cc +1828 -0
  116. package/third_party/s2geometry/src/s2/s2builder.h +1057 -0
  117. package/third_party/s2geometry/src/s2/s2builder_graph.cc +1084 -0
  118. package/third_party/s2geometry/src/s2/s2builder_graph.h +799 -0
  119. package/third_party/s2geometry/src/s2/s2builder_graph_test.cc +462 -0
  120. package/third_party/s2geometry/src/s2/s2builder_layer.h +50 -0
  121. package/third_party/s2geometry/src/s2/s2builder_test.cc +1329 -0
  122. package/third_party/s2geometry/src/s2/s2builderutil_closed_set_normalizer.cc +313 -0
  123. package/third_party/s2geometry/src/s2/s2builderutil_closed_set_normalizer.h +221 -0
  124. package/third_party/s2geometry/src/s2/s2builderutil_closed_set_normalizer_test.cc +261 -0
  125. package/third_party/s2geometry/src/s2/s2builderutil_find_polygon_degeneracies.cc +392 -0
  126. package/third_party/s2geometry/src/s2/s2builderutil_find_polygon_degeneracies.h +86 -0
  127. package/third_party/s2geometry/src/s2/s2builderutil_find_polygon_degeneracies_test.cc +182 -0
  128. package/third_party/s2geometry/src/s2/s2builderutil_graph_shape.h +57 -0
  129. package/third_party/s2geometry/src/s2/s2builderutil_lax_polygon_layer.cc +212 -0
  130. package/third_party/s2geometry/src/s2/s2builderutil_lax_polygon_layer.h +218 -0
  131. package/third_party/s2geometry/src/s2/s2builderutil_lax_polygon_layer_test.cc +367 -0
  132. package/third_party/s2geometry/src/s2/s2builderutil_s2point_vector_layer.cc +74 -0
  133. package/third_party/s2geometry/src/s2/s2builderutil_s2point_vector_layer.h +122 -0
  134. package/third_party/s2geometry/src/s2/s2builderutil_s2point_vector_layer_test.cc +167 -0
  135. package/third_party/s2geometry/src/s2/s2builderutil_s2polygon_layer.cc +191 -0
  136. package/third_party/s2geometry/src/s2/s2builderutil_s2polygon_layer.h +211 -0
  137. package/third_party/s2geometry/src/s2/s2builderutil_s2polygon_layer_test.cc +312 -0
  138. package/third_party/s2geometry/src/s2/s2builderutil_s2polyline_layer.cc +105 -0
  139. package/third_party/s2geometry/src/s2/s2builderutil_s2polyline_layer.h +174 -0
  140. package/third_party/s2geometry/src/s2/s2builderutil_s2polyline_layer_test.cc +220 -0
  141. package/third_party/s2geometry/src/s2/s2builderutil_s2polyline_vector_layer.cc +98 -0
  142. package/third_party/s2geometry/src/s2/s2builderutil_s2polyline_vector_layer.h +292 -0
  143. package/third_party/s2geometry/src/s2/s2builderutil_s2polyline_vector_layer_test.cc +233 -0
  144. package/third_party/s2geometry/src/s2/s2builderutil_snap_functions.cc +354 -0
  145. package/third_party/s2geometry/src/s2/s2builderutil_snap_functions.h +239 -0
  146. package/third_party/s2geometry/src/s2/s2builderutil_snap_functions_test.cc +716 -0
  147. package/third_party/s2geometry/src/s2/s2builderutil_testing.cc +37 -0
  148. package/third_party/s2geometry/src/s2/s2builderutil_testing.h +100 -0
  149. package/third_party/s2geometry/src/s2/s2builderutil_testing_test.cc +85 -0
  150. package/third_party/s2geometry/src/s2/s2cap.cc +347 -0
  151. package/third_party/s2geometry/src/s2/s2cap.h +286 -0
  152. package/third_party/s2geometry/src/s2/s2cap_test.cc +379 -0
  153. package/third_party/s2geometry/src/s2/s2cell.cc +552 -0
  154. package/third_party/s2geometry/src/s2/s2cell.h +249 -0
  155. package/third_party/s2geometry/src/s2/s2cell_id.cc +619 -0
  156. package/third_party/s2geometry/src/s2/s2cell_id.h +705 -0
  157. package/third_party/s2geometry/src/s2/s2cell_id_test.cc +633 -0
  158. package/third_party/s2geometry/src/s2/s2cell_index.cc +149 -0
  159. package/third_party/s2geometry/src/s2/s2cell_index.h +660 -0
  160. package/third_party/s2geometry/src/s2/s2cell_index_test.cc +411 -0
  161. package/third_party/s2geometry/src/s2/s2cell_test.cc +687 -0
  162. package/third_party/s2geometry/src/s2/s2cell_union.cc +515 -0
  163. package/third_party/s2geometry/src/s2/s2cell_union.h +399 -0
  164. package/third_party/s2geometry/src/s2/s2cell_union_test.cc +598 -0
  165. package/third_party/s2geometry/src/s2/s2centroids.cc +84 -0
  166. package/third_party/s2geometry/src/s2/s2centroids.h +87 -0
  167. package/third_party/s2geometry/src/s2/s2centroids_test.cc +82 -0
  168. package/third_party/s2geometry/src/s2/s2closest_cell_query.cc +123 -0
  169. package/third_party/s2geometry/src/s2/s2closest_cell_query.h +385 -0
  170. package/third_party/s2geometry/src/s2/s2closest_cell_query_base.h +841 -0
  171. package/third_party/s2geometry/src/s2/s2closest_cell_query_base_test.cc +63 -0
  172. package/third_party/s2geometry/src/s2/s2closest_cell_query_test.cc +412 -0
  173. package/third_party/s2geometry/src/s2/s2closest_edge_query.cc +106 -0
  174. package/third_party/s2geometry/src/s2/s2closest_edge_query.h +421 -0
  175. package/third_party/s2geometry/src/s2/s2closest_edge_query_base.h +946 -0
  176. package/third_party/s2geometry/src/s2/s2closest_edge_query_base_test.cc +59 -0
  177. package/third_party/s2geometry/src/s2/s2closest_edge_query_test.cc +505 -0
  178. package/third_party/s2geometry/src/s2/s2closest_edge_query_testing.h +91 -0
  179. package/third_party/s2geometry/src/s2/s2closest_point_query.cc +66 -0
  180. package/third_party/s2geometry/src/s2/s2closest_point_query.h +465 -0
  181. package/third_party/s2geometry/src/s2/s2closest_point_query_base.h +767 -0
  182. package/third_party/s2geometry/src/s2/s2closest_point_query_base_test.cc +63 -0
  183. package/third_party/s2geometry/src/s2/s2closest_point_query_test.cc +312 -0
  184. package/third_party/s2geometry/src/s2/s2contains_point_query.h +328 -0
  185. package/third_party/s2geometry/src/s2/s2contains_point_query_test.cc +159 -0
  186. package/third_party/s2geometry/src/s2/s2contains_vertex_query.cc +39 -0
  187. package/third_party/s2geometry/src/s2/s2contains_vertex_query.h +66 -0
  188. package/third_party/s2geometry/src/s2/s2contains_vertex_query_test.cc +67 -0
  189. package/third_party/s2geometry/src/s2/s2convex_hull_query.cc +198 -0
  190. package/third_party/s2geometry/src/s2/s2convex_hull_query.h +110 -0
  191. package/third_party/s2geometry/src/s2/s2convex_hull_query_test.cc +208 -0
  192. package/third_party/s2geometry/src/s2/s2coords.cc +146 -0
  193. package/third_party/s2geometry/src/s2/s2coords.h +459 -0
  194. package/third_party/s2geometry/src/s2/s2coords_internal.h +71 -0
  195. package/third_party/s2geometry/src/s2/s2coords_test.cc +218 -0
  196. package/third_party/s2geometry/src/s2/s2crossing_edge_query.cc +380 -0
  197. package/third_party/s2geometry/src/s2/s2crossing_edge_query.h +220 -0
  198. package/third_party/s2geometry/src/s2/s2crossing_edge_query_test.cc +382 -0
  199. package/third_party/s2geometry/src/s2/s2debug.cc +23 -0
  200. package/third_party/s2geometry/src/s2/s2debug.h +69 -0
  201. package/third_party/s2geometry/src/s2/s2distance_target.h +165 -0
  202. package/third_party/s2geometry/src/s2/s2earth.cc +52 -0
  203. package/third_party/s2geometry/src/s2/s2earth.h +268 -0
  204. package/third_party/s2geometry/src/s2/s2earth_test.cc +146 -0
  205. package/third_party/s2geometry/src/s2/s2edge_clipping.cc +462 -0
  206. package/third_party/s2geometry/src/s2/s2edge_clipping.h +183 -0
  207. package/third_party/s2geometry/src/s2/s2edge_clipping_test.cc +335 -0
  208. package/third_party/s2geometry/src/s2/s2edge_crosser.cc +85 -0
  209. package/third_party/s2geometry/src/s2/s2edge_crosser.h +343 -0
  210. package/third_party/s2geometry/src/s2/s2edge_crosser_test.cc +264 -0
  211. package/third_party/s2geometry/src/s2/s2edge_crossings.cc +515 -0
  212. package/third_party/s2geometry/src/s2/s2edge_crossings.h +138 -0
  213. package/third_party/s2geometry/src/s2/s2edge_crossings_internal.h +59 -0
  214. package/third_party/s2geometry/src/s2/s2edge_crossings_test.cc +246 -0
  215. package/third_party/s2geometry/src/s2/s2edge_distances.cc +419 -0
  216. package/third_party/s2geometry/src/s2/s2edge_distances.h +192 -0
  217. package/third_party/s2geometry/src/s2/s2edge_distances_test.cc +539 -0
  218. package/third_party/s2geometry/src/s2/s2edge_tessellator.cc +276 -0
  219. package/third_party/s2geometry/src/s2/s2edge_tessellator.h +101 -0
  220. package/third_party/s2geometry/src/s2/s2edge_tessellator_test.cc +492 -0
  221. package/third_party/s2geometry/src/s2/s2edge_vector_shape.h +85 -0
  222. package/third_party/s2geometry/src/s2/s2edge_vector_shape_test.cc +66 -0
  223. package/third_party/s2geometry/src/s2/s2error.cc +29 -0
  224. package/third_party/s2geometry/src/s2/s2error.h +147 -0
  225. package/third_party/s2geometry/src/s2/s2error_test.cc +31 -0
  226. package/third_party/s2geometry/src/s2/s2furthest_edge_query.cc +117 -0
  227. package/third_party/s2geometry/src/s2/s2furthest_edge_query.h +439 -0
  228. package/third_party/s2geometry/src/s2/s2furthest_edge_query_test.cc +487 -0
  229. package/third_party/s2geometry/src/s2/s2latlng.cc +90 -0
  230. package/third_party/s2geometry/src/s2/s2latlng.h +234 -0
  231. package/third_party/s2geometry/src/s2/s2latlng_rect.cc +727 -0
  232. package/third_party/s2geometry/src/s2/s2latlng_rect.h +434 -0
  233. package/third_party/s2geometry/src/s2/s2latlng_rect_bounder.cc +344 -0
  234. package/third_party/s2geometry/src/s2/s2latlng_rect_bounder.h +89 -0
  235. package/third_party/s2geometry/src/s2/s2latlng_rect_bounder_test.cc +306 -0
  236. package/third_party/s2geometry/src/s2/s2latlng_rect_test.cc +1030 -0
  237. package/third_party/s2geometry/src/s2/s2latlng_test.cc +165 -0
  238. package/third_party/s2geometry/src/s2/s2lax_loop_shape.cc +104 -0
  239. package/third_party/s2geometry/src/s2/s2lax_loop_shape.h +153 -0
  240. package/third_party/s2geometry/src/s2/s2lax_loop_shape_test.cc +101 -0
  241. package/third_party/s2geometry/src/s2/s2lax_polygon_shape.cc +348 -0
  242. package/third_party/s2geometry/src/s2/s2lax_polygon_shape.h +183 -0
  243. package/third_party/s2geometry/src/s2/s2lax_polygon_shape_test.cc +234 -0
  244. package/third_party/s2geometry/src/s2/s2lax_polyline_shape.cc +118 -0
  245. package/third_party/s2geometry/src/s2/s2lax_polyline_shape.h +124 -0
  246. package/third_party/s2geometry/src/s2/s2lax_polyline_shape_test.cc +62 -0
  247. package/third_party/s2geometry/src/s2/s2loop.cc +1509 -0
  248. package/third_party/s2geometry/src/s2/s2loop.h +711 -0
  249. package/third_party/s2geometry/src/s2/s2loop_measures.cc +313 -0
  250. package/third_party/s2geometry/src/s2/s2loop_measures.h +280 -0
  251. package/third_party/s2geometry/src/s2/s2loop_measures_test.cc +367 -0
  252. package/third_party/s2geometry/src/s2/s2loop_test.cc +1371 -0
  253. package/third_party/s2geometry/src/s2/s2max_distance_targets.cc +265 -0
  254. package/third_party/s2geometry/src/s2/s2max_distance_targets.h +241 -0
  255. package/third_party/s2geometry/src/s2/s2max_distance_targets_test.cc +367 -0
  256. package/third_party/s2geometry/src/s2/s2measures.cc +128 -0
  257. package/third_party/s2geometry/src/s2/s2measures.h +78 -0
  258. package/third_party/s2geometry/src/s2/s2measures_test.cc +135 -0
  259. package/third_party/s2geometry/src/s2/s2metrics.cc +122 -0
  260. package/third_party/s2geometry/src/s2/s2metrics.h +199 -0
  261. package/third_party/s2geometry/src/s2/s2metrics_test.cc +127 -0
  262. package/third_party/s2geometry/src/s2/s2min_distance_targets.cc +295 -0
  263. package/third_party/s2geometry/src/s2/s2min_distance_targets.h +273 -0
  264. package/third_party/s2geometry/src/s2/s2min_distance_targets_test.cc +239 -0
  265. package/third_party/s2geometry/src/s2/s2padded_cell.cc +162 -0
  266. package/third_party/s2geometry/src/s2/s2padded_cell.h +108 -0
  267. package/third_party/s2geometry/src/s2/s2padded_cell_test.cc +138 -0
  268. package/third_party/s2geometry/src/s2/s2point.h +38 -0
  269. package/third_party/s2geometry/src/s2/s2point_compression.cc +388 -0
  270. package/third_party/s2geometry/src/s2/s2point_compression.h +78 -0
  271. package/third_party/s2geometry/src/s2/s2point_compression_test.cc +305 -0
  272. package/third_party/s2geometry/src/s2/s2point_index.h +345 -0
  273. package/third_party/s2geometry/src/s2/s2point_index_test.cc +147 -0
  274. package/third_party/s2geometry/src/s2/s2point_region.cc +72 -0
  275. package/third_party/s2geometry/src/s2/s2point_region.h +76 -0
  276. package/third_party/s2geometry/src/s2/s2point_region_test.cc +100 -0
  277. package/third_party/s2geometry/src/s2/s2point_span.h +57 -0
  278. package/third_party/s2geometry/src/s2/s2point_test.cc +47 -0
  279. package/third_party/s2geometry/src/s2/s2point_vector_shape.h +127 -0
  280. package/third_party/s2geometry/src/s2/s2point_vector_shape_test.cc +59 -0
  281. package/third_party/s2geometry/src/s2/s2pointutil.cc +131 -0
  282. package/third_party/s2geometry/src/s2/s2pointutil.h +138 -0
  283. package/third_party/s2geometry/src/s2/s2pointutil_test.cc +157 -0
  284. package/third_party/s2geometry/src/s2/s2polygon.cc +1569 -0
  285. package/third_party/s2geometry/src/s2/s2polygon.h +934 -0
  286. package/third_party/s2geometry/src/s2/s2polygon_test.cc +3025 -0
  287. package/third_party/s2geometry/src/s2/s2polyline.cc +645 -0
  288. package/third_party/s2geometry/src/s2/s2polyline.h +379 -0
  289. package/third_party/s2geometry/src/s2/s2polyline_alignment.cc +414 -0
  290. package/third_party/s2geometry/src/s2/s2polyline_alignment.h +245 -0
  291. package/third_party/s2geometry/src/s2/s2polyline_alignment_internal.h +158 -0
  292. package/third_party/s2geometry/src/s2/s2polyline_alignment_test.cc +610 -0
  293. package/third_party/s2geometry/src/s2/s2polyline_measures.cc +42 -0
  294. package/third_party/s2geometry/src/s2/s2polyline_measures.h +53 -0
  295. package/third_party/s2geometry/src/s2/s2polyline_measures_test.cc +57 -0
  296. package/third_party/s2geometry/src/s2/s2polyline_simplifier.cc +187 -0
  297. package/third_party/s2geometry/src/s2/s2polyline_simplifier.h +109 -0
  298. package/third_party/s2geometry/src/s2/s2polyline_simplifier_test.cc +165 -0
  299. package/third_party/s2geometry/src/s2/s2polyline_test.cc +554 -0
  300. package/third_party/s2geometry/src/s2/s2predicates.cc +1486 -0
  301. package/third_party/s2geometry/src/s2/s2predicates.h +282 -0
  302. package/third_party/s2geometry/src/s2/s2predicates_internal.h +135 -0
  303. package/third_party/s2geometry/src/s2/s2predicates_test.cc +1427 -0
  304. package/third_party/s2geometry/src/s2/s2projections.cc +109 -0
  305. package/third_party/s2geometry/src/s2/s2projections.h +161 -0
  306. package/third_party/s2geometry/src/s2/s2projections_test.cc +78 -0
  307. package/third_party/s2geometry/src/s2/s2r2rect.cc +88 -0
  308. package/third_party/s2geometry/src/s2/s2r2rect.h +292 -0
  309. package/third_party/s2geometry/src/s2/s2r2rect_test.cc +312 -0
  310. package/third_party/s2geometry/src/s2/s2region.cc +26 -0
  311. package/third_party/s2geometry/src/s2/s2region.h +142 -0
  312. package/third_party/s2geometry/src/s2/s2region_coverer.cc +514 -0
  313. package/third_party/s2geometry/src/s2/s2region_coverer.h +356 -0
  314. package/third_party/s2geometry/src/s2/s2region_coverer_test.cc +509 -0
  315. package/third_party/s2geometry/src/s2/s2region_intersection.cc +84 -0
  316. package/third_party/s2geometry/src/s2/s2region_intersection.h +79 -0
  317. package/third_party/s2geometry/src/s2/s2region_term_indexer.cc +270 -0
  318. package/third_party/s2geometry/src/s2/s2region_term_indexer.h +299 -0
  319. package/third_party/s2geometry/src/s2/s2region_term_indexer_test.cc +209 -0
  320. package/third_party/s2geometry/src/s2/s2region_test.cc +370 -0
  321. package/third_party/s2geometry/src/s2/s2region_union.cc +90 -0
  322. package/third_party/s2geometry/src/s2/s2region_union.h +83 -0
  323. package/third_party/s2geometry/src/s2/s2region_union_test.cc +89 -0
  324. package/third_party/s2geometry/src/s2/s2shape.h +283 -0
  325. package/third_party/s2geometry/src/s2/s2shape_index.cc +321 -0
  326. package/third_party/s2geometry/src/s2/s2shape_index.h +781 -0
  327. package/third_party/s2geometry/src/s2/s2shape_index_buffered_region.cc +113 -0
  328. package/third_party/s2geometry/src/s2/s2shape_index_buffered_region.h +135 -0
  329. package/third_party/s2geometry/src/s2/s2shape_index_buffered_region_test.cc +162 -0
  330. package/third_party/s2geometry/src/s2/s2shape_index_measures.cc +92 -0
  331. package/third_party/s2geometry/src/s2/s2shape_index_measures.h +100 -0
  332. package/third_party/s2geometry/src/s2/s2shape_index_measures_test.cc +136 -0
  333. package/third_party/s2geometry/src/s2/s2shape_index_region.h +350 -0
  334. package/third_party/s2geometry/src/s2/s2shape_index_region_test.cc +161 -0
  335. package/third_party/s2geometry/src/s2/s2shape_index_test.cc +24 -0
  336. package/third_party/s2geometry/src/s2/s2shape_measures.cc +138 -0
  337. package/third_party/s2geometry/src/s2/s2shape_measures.h +95 -0
  338. package/third_party/s2geometry/src/s2/s2shape_measures_test.cc +139 -0
  339. package/third_party/s2geometry/src/s2/s2shapeutil_build_polygon_boundaries.cc +120 -0
  340. package/third_party/s2geometry/src/s2/s2shapeutil_build_polygon_boundaries.h +66 -0
  341. package/third_party/s2geometry/src/s2/s2shapeutil_build_polygon_boundaries_test.cc +170 -0
  342. package/third_party/s2geometry/src/s2/s2shapeutil_coding.cc +253 -0
  343. package/third_party/s2geometry/src/s2/s2shapeutil_coding.h +283 -0
  344. package/third_party/s2geometry/src/s2/s2shapeutil_coding_test.cc +54 -0
  345. package/third_party/s2geometry/src/s2/s2shapeutil_contains_brute_force.cc +40 -0
  346. package/third_party/s2geometry/src/s2/s2shapeutil_contains_brute_force.h +41 -0
  347. package/third_party/s2geometry/src/s2/s2shapeutil_contains_brute_force_test.cc +55 -0
  348. package/third_party/s2geometry/src/s2/s2shapeutil_count_edges.h +57 -0
  349. package/third_party/s2geometry/src/s2/s2shapeutil_count_edges_test.cc +43 -0
  350. package/third_party/s2geometry/src/s2/s2shapeutil_edge_iterator.cc +45 -0
  351. package/third_party/s2geometry/src/s2/s2shapeutil_edge_iterator.h +72 -0
  352. package/third_party/s2geometry/src/s2/s2shapeutil_edge_iterator_test.cc +116 -0
  353. package/third_party/s2geometry/src/s2/s2shapeutil_get_reference_point.cc +107 -0
  354. package/third_party/s2geometry/src/s2/s2shapeutil_get_reference_point.h +48 -0
  355. package/third_party/s2geometry/src/s2/s2shapeutil_get_reference_point_test.cc +104 -0
  356. package/third_party/s2geometry/src/s2/s2shapeutil_range_iterator.cc +58 -0
  357. package/third_party/s2geometry/src/s2/s2shapeutil_range_iterator.h +65 -0
  358. package/third_party/s2geometry/src/s2/s2shapeutil_range_iterator_test.cc +61 -0
  359. package/third_party/s2geometry/src/s2/s2shapeutil_shape_edge.h +58 -0
  360. package/third_party/s2geometry/src/s2/s2shapeutil_shape_edge_id.h +97 -0
  361. package/third_party/s2geometry/src/s2/s2shapeutil_testing.cc +104 -0
  362. package/third_party/s2geometry/src/s2/s2shapeutil_testing.h +36 -0
  363. package/third_party/s2geometry/src/s2/s2shapeutil_visit_crossing_edge_pairs.cc +440 -0
  364. package/third_party/s2geometry/src/s2/s2shapeutil_visit_crossing_edge_pairs.h +72 -0
  365. package/third_party/s2geometry/src/s2/s2shapeutil_visit_crossing_edge_pairs_test.cc +184 -0
  366. package/third_party/s2geometry/src/s2/s2testing.cc +464 -0
  367. package/third_party/s2geometry/src/s2/s2testing.h +385 -0
  368. package/third_party/s2geometry/src/s2/s2testing_test.cc +166 -0
  369. package/third_party/s2geometry/src/s2/s2text_format.cc +506 -0
  370. package/third_party/s2geometry/src/s2/s2text_format.h +289 -0
  371. package/third_party/s2geometry/src/s2/s2text_format_test.cc +417 -0
  372. package/third_party/s2geometry/src/s2/s2wedge_relations.cc +80 -0
  373. package/third_party/s2geometry/src/s2/s2wedge_relations.h +64 -0
  374. package/third_party/s2geometry/src/s2/s2wedge_relations_test.cc +89 -0
  375. package/third_party/s2geometry/src/s2/sequence_lexicon.h +296 -0
  376. package/third_party/s2geometry/src/s2/sequence_lexicon_test.cc +113 -0
  377. package/third_party/s2geometry/src/s2/strings/ostringstream.cc +35 -0
  378. package/third_party/s2geometry/src/s2/strings/ostringstream.h +105 -0
  379. package/third_party/s2geometry/src/s2/strings/serialize.cc +46 -0
  380. package/third_party/s2geometry/src/s2/strings/serialize.h +40 -0
  381. package/third_party/s2geometry/src/s2/third_party/absl/algorithm/algorithm.h +187 -0
  382. package/third_party/s2geometry/src/s2/third_party/absl/base/attributes.h +666 -0
  383. package/third_party/s2geometry/src/s2/third_party/absl/base/casts.h +189 -0
  384. package/third_party/s2geometry/src/s2/third_party/absl/base/config.h +462 -0
  385. package/third_party/s2geometry/src/s2/third_party/absl/base/dynamic_annotations.cc +129 -0
  386. package/third_party/s2geometry/src/s2/third_party/absl/base/dynamic_annotations.h +394 -0
  387. package/third_party/s2geometry/src/s2/third_party/absl/base/internal/atomic_hook.h +168 -0
  388. package/third_party/s2geometry/src/s2/third_party/absl/base/internal/identity.h +33 -0
  389. package/third_party/s2geometry/src/s2/third_party/absl/base/internal/inline_variable.h +117 -0
  390. package/third_party/s2geometry/src/s2/third_party/absl/base/internal/invoke.h +188 -0
  391. package/third_party/s2geometry/src/s2/third_party/absl/base/internal/raw_logging.cc +254 -0
  392. package/third_party/s2geometry/src/s2/third_party/absl/base/internal/raw_logging.h +205 -0
  393. package/third_party/s2geometry/src/s2/third_party/absl/base/internal/throw_delegate.cc +106 -0
  394. package/third_party/s2geometry/src/s2/third_party/absl/base/internal/throw_delegate.h +71 -0
  395. package/third_party/s2geometry/src/s2/third_party/absl/base/internal/unaligned_access.h +322 -0
  396. package/third_party/s2geometry/src/s2/third_party/absl/base/log_severity.h +77 -0
  397. package/third_party/s2geometry/src/s2/third_party/absl/base/macros.h +236 -0
  398. package/third_party/s2geometry/src/s2/third_party/absl/base/optimization.h +177 -0
  399. package/third_party/s2geometry/src/s2/third_party/absl/base/policy_checks.h +124 -0
  400. package/third_party/s2geometry/src/s2/third_party/absl/base/port.h +97 -0
  401. package/third_party/s2geometry/src/s2/third_party/absl/base/thread_annotations.h +277 -0
  402. package/third_party/s2geometry/src/s2/third_party/absl/container/fixed_array.h +523 -0
  403. package/third_party/s2geometry/src/s2/third_party/absl/container/inlined_vector.h +1453 -0
  404. package/third_party/s2geometry/src/s2/third_party/absl/container/internal/compressed_tuple.h +191 -0
  405. package/third_party/s2geometry/src/s2/third_party/absl/container/internal/container_memory.h +424 -0
  406. package/third_party/s2geometry/src/s2/third_party/absl/container/internal/layout.h +739 -0
  407. package/third_party/s2geometry/src/s2/third_party/absl/memory/memory.h +755 -0
  408. package/third_party/s2geometry/src/s2/third_party/absl/meta/type_traits.h +436 -0
  409. package/third_party/s2geometry/src/s2/third_party/absl/numeric/int128.cc +232 -0
  410. package/third_party/s2geometry/src/s2/third_party/absl/numeric/int128.h +656 -0
  411. package/third_party/s2geometry/src/s2/third_party/absl/numeric/int128_have_intrinsic.inc +3 -0
  412. package/third_party/s2geometry/src/s2/third_party/absl/numeric/int128_no_intrinsic.inc +3 -0
  413. package/third_party/s2geometry/src/s2/third_party/absl/strings/ascii.cc +198 -0
  414. package/third_party/s2geometry/src/s2/third_party/absl/strings/ascii.h +239 -0
  415. package/third_party/s2geometry/src/s2/third_party/absl/strings/ascii_ctype.h +66 -0
  416. package/third_party/s2geometry/src/s2/third_party/absl/strings/internal/bits.h +53 -0
  417. package/third_party/s2geometry/src/s2/third_party/absl/strings/internal/memutil.cc +110 -0
  418. package/third_party/s2geometry/src/s2/third_party/absl/strings/internal/memutil.h +146 -0
  419. package/third_party/s2geometry/src/s2/third_party/absl/strings/internal/resize_uninitialized.h +72 -0
  420. package/third_party/s2geometry/src/s2/third_party/absl/strings/match.cc +38 -0
  421. package/third_party/s2geometry/src/s2/third_party/absl/strings/match.h +89 -0
  422. package/third_party/s2geometry/src/s2/third_party/absl/strings/numbers.cc +909 -0
  423. package/third_party/s2geometry/src/s2/third_party/absl/strings/numbers.h +187 -0
  424. package/third_party/s2geometry/src/s2/third_party/absl/strings/str_cat.cc +240 -0
  425. package/third_party/s2geometry/src/s2/third_party/absl/strings/str_cat.h +398 -0
  426. package/third_party/s2geometry/src/s2/third_party/absl/strings/str_join.h +22 -0
  427. package/third_party/s2geometry/src/s2/third_party/absl/strings/str_split.cc +47 -0
  428. package/third_party/s2geometry/src/s2/third_party/absl/strings/str_split.h +43 -0
  429. package/third_party/s2geometry/src/s2/third_party/absl/strings/string_view.cc +245 -0
  430. package/third_party/s2geometry/src/s2/third_party/absl/strings/string_view.h +602 -0
  431. package/third_party/s2geometry/src/s2/third_party/absl/strings/strip.cc +42 -0
  432. package/third_party/s2geometry/src/s2/third_party/absl/strings/strip.h +130 -0
  433. package/third_party/s2geometry/src/s2/third_party/absl/types/span.h +793 -0
  434. package/third_party/s2geometry/src/s2/third_party/absl/utility/utility.h +299 -0
  435. package/third_party/s2geometry/src/s2/util/bits/bit-interleave.cc +274 -0
  436. package/third_party/s2geometry/src/s2/util/bits/bit-interleave.h +53 -0
  437. package/third_party/s2geometry/src/s2/util/bits/bits.cc +155 -0
  438. package/third_party/s2geometry/src/s2/util/bits/bits.h +745 -0
  439. package/third_party/s2geometry/src/s2/util/coding/coder.cc +83 -0
  440. package/third_party/s2geometry/src/s2/util/coding/coder.h +553 -0
  441. package/third_party/s2geometry/src/s2/util/coding/nth-derivative.h +134 -0
  442. package/third_party/s2geometry/src/s2/util/coding/transforms.h +62 -0
  443. package/third_party/s2geometry/src/s2/util/coding/varint.cc +289 -0
  444. package/third_party/s2geometry/src/s2/util/coding/varint.h +476 -0
  445. package/third_party/s2geometry/src/s2/util/endian/endian.h +859 -0
  446. package/third_party/s2geometry/src/s2/util/gtl/btree.h +2471 -0
  447. package/third_party/s2geometry/src/s2/util/gtl/btree_container.h +411 -0
  448. package/third_party/s2geometry/src/s2/util/gtl/btree_map.h +79 -0
  449. package/third_party/s2geometry/src/s2/util/gtl/btree_set.h +73 -0
  450. package/third_party/s2geometry/src/s2/util/gtl/compact_array.h +653 -0
  451. package/third_party/s2geometry/src/s2/util/gtl/container_logging.h +291 -0
  452. package/third_party/s2geometry/src/s2/util/gtl/dense_hash_set.h +358 -0
  453. package/third_party/s2geometry/src/s2/util/gtl/densehashtable.h +1493 -0
  454. package/third_party/s2geometry/src/s2/util/gtl/hashtable_common.h +253 -0
  455. package/third_party/s2geometry/src/s2/util/gtl/layout.h +28 -0
  456. package/third_party/s2geometry/src/s2/util/gtl/legacy_random_shuffle.h +77 -0
  457. package/third_party/s2geometry/src/s2/util/hash/mix.h +76 -0
  458. package/third_party/s2geometry/src/s2/util/math/exactfloat/exactfloat.cc +832 -0
  459. package/third_party/s2geometry/src/s2/util/math/exactfloat/exactfloat.h +646 -0
  460. package/third_party/s2geometry/src/s2/util/math/mathutil.cc +75 -0
  461. package/third_party/s2geometry/src/s2/util/math/mathutil.h +189 -0
  462. package/third_party/s2geometry/src/s2/util/math/matrix3x3.h +574 -0
  463. package/third_party/s2geometry/src/s2/util/math/vector.h +569 -0
  464. package/third_party/s2geometry/src/s2/util/math/vector3_hash.h +54 -0
  465. package/third_party/s2geometry/src/s2/util/units/length-units.cc +21 -0
  466. package/third_party/s2geometry/src/s2/util/units/length-units.h +135 -0
  467. package/third_party/s2geometry/src/s2/util/units/physical-units.h +313 -0
  468. package/third_party/s2geometry/src/s2/value_lexicon.h +234 -0
  469. package/third_party/s2geometry/src/s2/value_lexicon_test.cc +121 -0
  470. package/third_party/s2geometry/third_party/cmake/FindGFlags.cmake +48 -0
  471. package/third_party/s2geometry/third_party/cmake/FindGlog.cmake +48 -0
@@ -0,0 +1,135 @@
1
+ // Copyright 2003 Google Inc. All Rights Reserved.
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // http://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS-IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+ //
15
+
16
+
17
+ // Define common length units. New length units can be added as needed
18
+ // provided there is a direct, multiplicative scaling to meters.
19
+ //
20
+ // When adding new units, you should add an appropriate GetMyUnit accessor
21
+ // template and (optionally) define a shorthand typedef specialization for
22
+ // float. Also update the physical units unittest to check the conversion
23
+ // ratio.
24
+
25
+ #ifndef S2_UTIL_UNITS_LENGTH_UNITS_H_
26
+ #define S2_UTIL_UNITS_LENGTH_UNITS_H_
27
+
28
+ #include "s2/util/units/physical-units.h"
29
+
30
+ namespace util {
31
+
32
+ namespace units {
33
+
34
+ struct LengthBase {
35
+ // the base unit type is meters
36
+ static const char* const output_suffix;
37
+
38
+ template <typename ValueType, class Unit>
39
+ static ValueType GetInBaseUnit(
40
+ const PhysicalUnit<ValueType, LengthBase, Unit> u) {
41
+ return GetMeters(u);
42
+ }
43
+ };
44
+
45
+ template <typename Float>
46
+ class Length {
47
+ typedef UnitConversion<1, 1> MetersConversion;
48
+ typedef UnitConversion<1, 1000> KilometersConversion;
49
+ typedef UnitConversion<10000, 254> InchesConversion;
50
+ typedef UnitConversion<10000, 3048> FeetConversion;
51
+ typedef UnitConversion<1000, 1609344> MilesConversion;
52
+ typedef UnitConversion<1000, 1> MillimetersConversion;
53
+ typedef UnitConversion<1, 1852> NauticalMilesConversion;
54
+ typedef UnitConversion<10000, 9144> YardsConversion;
55
+
56
+ public:
57
+ typedef PhysicalUnit<Float, LengthBase, MetersConversion> Meters;
58
+ typedef PhysicalUnit<Float, LengthBase, KilometersConversion> Kilometers;
59
+ typedef PhysicalUnit<Float, LengthBase, InchesConversion> Inches;
60
+ typedef PhysicalUnit<Float, LengthBase, FeetConversion> Feet;
61
+ typedef PhysicalUnit<Float, LengthBase, MilesConversion> Miles;
62
+ typedef PhysicalUnit<Float, LengthBase, MillimetersConversion> Millimeters;
63
+ typedef PhysicalUnit<Float, LengthBase, NauticalMilesConversion>
64
+ NauticalMiles;
65
+ typedef PhysicalUnit<Float, LengthBase, YardsConversion> Yards;
66
+ };
67
+
68
+ // Define some shorthand, standard typenames. The standard length
69
+ // type is chosen to be float. If you need greater precision for
70
+ // a specific application, either use the fully qualified typename
71
+ // Length<double>::* or declare local typedefs. This would be an
72
+ // ideal place for a template typedef, if only C++ supported them.
73
+ // Note that units with different floating-point types do not
74
+ // support implicit conversion (use the precision_cast<...> method).
75
+ typedef Length<float>::Meters Meters;
76
+ typedef Length<float>::Kilometers Kilometers;
77
+ typedef Length<float>::Inches Inches;
78
+ typedef Length<float>::Feet Feet;
79
+ typedef Length<float>::Miles Miles;
80
+ typedef Length<float>::Millimeters Millimeters;
81
+ typedef Length<float>::NauticalMiles NauticalMiles;
82
+ typedef Length<float>::Yards Yards;
83
+
84
+ // Explicit unit accessors. In general these are safer than using
85
+ // the value() accessor, particularly in cases where the unit type
86
+ // may not be immediately obvious (such as function returns).
87
+
88
+ template <typename ValueType, class Unit>
89
+ inline ValueType GetMeters(const PhysicalUnit<ValueType, LengthBase, Unit> u) {
90
+ return typename Length<ValueType>::Meters(u).value();
91
+ }
92
+
93
+ template <typename ValueType, class Unit>
94
+ inline ValueType GetKilometers(
95
+ const PhysicalUnit<ValueType, LengthBase, Unit> u) {
96
+ return typename Length<ValueType>::Kilometers(u).value();
97
+ }
98
+
99
+ template <typename ValueType, class Unit>
100
+ inline ValueType GetInches(const PhysicalUnit<ValueType, LengthBase, Unit> u) {
101
+ return typename Length<ValueType>::Inches(u).value();
102
+ }
103
+
104
+ template <typename ValueType, class Unit>
105
+ inline ValueType GetFeet(const PhysicalUnit<ValueType, LengthBase, Unit> u) {
106
+ return typename Length<ValueType>::Feet(u).value();
107
+ }
108
+
109
+ template <typename ValueType, class Unit>
110
+ inline ValueType GetMiles(const PhysicalUnit<ValueType, LengthBase, Unit> u) {
111
+ return typename Length<ValueType>::Miles(u).value();
112
+ }
113
+
114
+ template <typename ValueType, class Unit>
115
+ inline ValueType GetMillimeters(
116
+ const PhysicalUnit<ValueType, LengthBase, Unit> u) {
117
+ return typename Length<ValueType>::Millimeters(u).value();
118
+ }
119
+
120
+ template <typename ValueType, class Unit>
121
+ inline ValueType GetNauticalMiles(
122
+ const PhysicalUnit<ValueType, LengthBase, Unit> u) {
123
+ return typename Length<ValueType>::NauticalMiles(u).value();
124
+ }
125
+
126
+ template <typename ValueType, class Unit>
127
+ inline ValueType GetYards(const PhysicalUnit<ValueType, LengthBase, Unit> u) {
128
+ return typename Length<ValueType>::Yards(u).value();
129
+ }
130
+
131
+ } // end namespace units
132
+
133
+ } // end namespace util
134
+
135
+ #endif // S2_UTIL_UNITS_LENGTH_UNITS_H_
@@ -0,0 +1,313 @@
1
+ // Copyright 2003 Google Inc. All Rights Reserved.
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // http://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS-IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+ //
15
+
16
+
17
+ // Basic physical unit classes. These classes are not as fancy as
18
+ // some general purpose physical unit libraries, but provide a
19
+ // simple and efficient interface for unit tracking and conversion.
20
+ // In particular, compound units cannot be automatically constructed
21
+ // from or decomposed into simpler units (e.g. velocity = distance /
22
+ // time), but can be defined explicitly as opaque types.
23
+ //
24
+ // These classes define overloaded operators and non-explicit single
25
+ // argument ctors, which breaks the style guidelines, but an exception
26
+ // has been allowed in this case.
27
+ // - Douglas Greiman <dgreiman@google.com>
28
+ //
29
+ // Specific types of physical units are defined in other headers
30
+ // (e.g. angle-units.h). Each unit type can be specialized to either
31
+ // float or double. Non-floating-point types are disallowed, since
32
+ // the implicit conversion logic generally fails for integer division.
33
+ // Attempting to declare integer-based units results in a fairly
34
+ // informative compiler error.
35
+ //
36
+ // All units share common functionality, as demonstrated in this
37
+ // example:
38
+ //
39
+ // #include "angle-units.h"
40
+ //
41
+ // class Nomad {
42
+ // Radians latitude_;
43
+ // ...
44
+ // // With -O2 optimization, the use of Radians in this method is
45
+ // // completely equivalent to using float, but prevents unitless
46
+ // // angles from being passed.
47
+ // void SetLatitude(Radians angle) {
48
+ // S2_CHECK(angle.abs() < Degrees(90.0));
49
+ // latitude_ = angle;
50
+ // latitude_radius_ = EARTH_RADIUS * cos(angle.value());
51
+ // }
52
+ //
53
+ // // This method contains an implicit unit conversion from degrees
54
+ // // to radians. In practice it would make more sense to use
55
+ // // Radians as the argument type to avoid this extra work if
56
+ // // possible (see the two calls of this method below).
57
+ // void MoveNorth(Degrees angle) {
58
+ // SetLatitude(latitude_ + angle);
59
+ // }
60
+ // };
61
+ //
62
+ // void do_tests(float degrees_to_move, float radians_to_move) {
63
+ // Nomad joe;
64
+ //
65
+ // // The use of Degrees(30.0) to set the latitude in radians requires
66
+ // // no runtime conversion.
67
+ // joe.SetLatitude(Degrees(30.0));
68
+ //
69
+ // // The Degrees(...) parameter will be converted to radians at
70
+ // // runtime prior to addition in Nomad::MoveNorth().
71
+ // joe.MoveNorth(Degrees(degrees_to_move));
72
+ //
73
+ // // This is ok, but due to the poor choice of units for the MoveNorth
74
+ // // method's argument, incurs two pointless multiply operations to
75
+ // // convert from radians to degrees and back to radians.
76
+ // joe.MoveNorth(Radians(radians_to_move));
77
+ //
78
+ // // Implicit conversions from unitless values generate errors at
79
+ // // compile time.
80
+ // // joe.MoveNorth(degrees_to_move); // compile ERROR!
81
+ // }
82
+ //
83
+
84
+ #ifndef S2_UTIL_UNITS_PHYSICAL_UNITS_H_
85
+ #define S2_UTIL_UNITS_PHYSICAL_UNITS_H_
86
+
87
+ #include <cmath>
88
+ #include <iosfwd>
89
+ #include <iostream>
90
+ #include <string>
91
+ #include <type_traits>
92
+
93
+ #include "s2/base/integral_types.h"
94
+ #include "s2/third_party/absl/base/macros.h"
95
+
96
+ namespace util {
97
+
98
+ namespace units {
99
+
100
+ // Static conversion scale and offset to convert from a standard base
101
+ // unit to a specific unit. The scale and offset is specified as a
102
+ // rational number to allow static construction at compile time.
103
+ template <int ScaleNumerator, int ScaleDenominator,
104
+ int OffsetNumerator = 0, int OffsetDenominator = 1>
105
+ struct UnitConversion {
106
+ static const int SCALE_NUMERATOR = ScaleNumerator;
107
+ static const int SCALE_DENOMINATOR = ScaleDenominator;
108
+ static const int OFFSET_NUMERATOR = OffsetNumerator;
109
+ static const int OFFSET_DENOMINATOR = OffsetDenominator;
110
+ };
111
+
112
+ template <class FromUnit, class ToUnit, typename Float>
113
+ struct UnitConverter {
114
+ // Linear unit conversion: A' = A * s + t, where
115
+ // - s is a static scale factor and
116
+ // - t is a static offset
117
+ // composed from two UnitConversion structs.
118
+ // Cast one multiplicand to 64 bit to ensure that the integer expression
119
+ // is computed in 64 bit. Otherwise Feet(Miles(x)) will overflow.
120
+ constexpr static inline Float Convert(Float value) {
121
+ // scaling and offset
122
+ return static_cast<Float>(
123
+ (static_cast<double>(value *
124
+ (static_cast<double>(static_cast<uint64>(ToUnit::SCALE_NUMERATOR) *
125
+ FromUnit::SCALE_DENOMINATOR) /
126
+ static_cast<double>(static_cast<uint64>(ToUnit::SCALE_DENOMINATOR) *
127
+ FromUnit::SCALE_NUMERATOR)))) -
128
+ (static_cast<double>(static_cast<uint64>(ToUnit::SCALE_NUMERATOR) *
129
+ FromUnit::SCALE_DENOMINATOR *
130
+ FromUnit::OFFSET_NUMERATOR) /
131
+ static_cast<double>(static_cast<uint64>(ToUnit::SCALE_DENOMINATOR) *
132
+ FromUnit::SCALE_NUMERATOR *
133
+ FromUnit::OFFSET_DENOMINATOR)) +
134
+ (static_cast<double>(ToUnit::OFFSET_NUMERATOR) /
135
+ static_cast<double>(ToUnit::OFFSET_DENOMINATOR)));
136
+ }
137
+ };
138
+
139
+ // Some unit operations are only defined for base units that have linear
140
+ // transformations, as in T(a+b) = T(a) + T(b). Temperatures units are
141
+ // an example of units that do not have linear transformations. By
142
+ // default unit transformations are assumed to be linear; see
143
+ // temperature-units.h for an example of how to override this default.
144
+ template <class Base>
145
+ struct is_linear_unit_transformation : std::true_type { };
146
+
147
+ // Template class holding a single value with an associated physical
148
+ // unit. The unit and conversion parameters are statically defined
149
+ // and optimized at compile time. With optimization (-O2), use of a
150
+ // single physical unit type is as efficient as using a native
151
+ // floating point type. Conversions between units are optimized to
152
+ // (typically) a single multiplication operation. Unit conversions
153
+ // for constants are done at compile time and incur no runtime
154
+ // overhead (again at -O2).
155
+ //
156
+ // Template parameters:
157
+ // Base is the base unit class, such as Angle or Length. If operator<<
158
+ // is used, it must have:
159
+ // - a public static field "output_suffix" and
160
+ // - a public static method Float Base::GetInBaseUnit(PhysicalUnit). An
161
+ // example can be found in length-units.h
162
+ // LengthBase::GetInBaseUnit.
163
+ // Unit is the UnitConversion class that defines a specific unit
164
+ // (such as degrees) in terms of a reference unit (such as radians).
165
+ template <class Float, class Base, class Unit>
166
+ class PhysicalUnit {
167
+ public:
168
+ typedef PhysicalUnit<Float, Base, Unit> Type;
169
+ typedef Float FloatType;
170
+
171
+ // Use 'explicit' to prevent unintentional construction from untyped (or
172
+ // mistyped) values. Note that this also prevents arguably reasonable
173
+ // constructs such as Unit unit = 10.0; use either Unit unit(10.0) or
174
+ // Unit unit = Unit(10.0) instead.
175
+ PhysicalUnit(): value_(static_cast<Float>(0.0)) {}
176
+ constexpr explicit PhysicalUnit(Float value): value_(value) {}
177
+
178
+ // Conversion from other units of the same Base type.
179
+ //
180
+ // Policy decision: not using 'explicit' allows much more natural
181
+ // conversions between units of a given base type. This can result in
182
+ // unintended implicit type conversions, but these incur very little
183
+ // overhead (inlined multiply at -O2) and should be inconsequential in
184
+ // most circumstances. Casts between different base types (including
185
+ // different underlying value types) require explicit handling. The ClangTidy
186
+ // warnings regarding this are therefore suppressed with NOLINT below.
187
+ template <class Unit2>
188
+ constexpr PhysicalUnit(PhysicalUnit<Float, Base, Unit2> other) // NOLINT
189
+ : value_(UnitConverter<Unit2, Unit, Float>::Convert(other.value())) {}
190
+
191
+ // Copy operation from other units of the same Base type.
192
+ template <class Unit2>
193
+ Type operator = (PhysicalUnit<Float, Base, Unit2> other) {
194
+ value_ = UnitConverter<Unit2, Unit, Float>::Convert(other.value());
195
+ return *this;
196
+ }
197
+
198
+ // Value accessor. Consider using an explicitly typed accessor whenever
199
+ // the unit type is not immediately obvious (such as function return
200
+ // values). For example:
201
+ // float x = myclass.GetAngle().value(); // what unit is x?
202
+ // float x = GetDegrees(myclass.GetAngle()); // much clearer.
203
+ // float x = Degrees(myclass.GetAngle()).value(); // ok too.
204
+ // Degrees degrees = myclass.GetAngle(); // using a temporary is
205
+ // float x = degrees.value(); // also good.
206
+ constexpr Float value() const { return value_; }
207
+
208
+ // Trivial arithematic operator wrapping.
209
+ Type operator - () const {
210
+ return Type(-value_);
211
+ }
212
+ Type operator * (const Float scale) const {
213
+ return Type(value_ * scale);
214
+ }
215
+ Type operator + (const Type other) const {
216
+ static_assert(is_linear_unit_transformation<Base>::value,
217
+ "operation not defined");
218
+ return Type(value_ + other.value());
219
+ }
220
+ Type operator - (const Type other) const {
221
+ static_assert(is_linear_unit_transformation<Base>::value,
222
+ "operation not defined");
223
+ return Type(value_ - other.value());
224
+ }
225
+ Float operator / (const Type other) const {
226
+ return value_ / other.value();
227
+ }
228
+ Type operator *= (const Float scale) {
229
+ value_ *= scale;
230
+ return *this;
231
+ }
232
+ Type operator += (const Type other) {
233
+ static_assert(is_linear_unit_transformation<Base>::value,
234
+ "operation not defined");
235
+ value_ += other.value();
236
+ return *this;
237
+ }
238
+ Type operator -= (const Type other) {
239
+ static_assert(is_linear_unit_transformation<Base>::value,
240
+ "operation not defined");
241
+ value_ -= other.value();
242
+ return *this;
243
+ }
244
+
245
+ // Simple comparisons. Overloaded equality is intentionally omitted;
246
+ // use equals() instead.
247
+ bool operator < (const Type other) const {
248
+ return value_ < other.value();
249
+ }
250
+ bool operator > (const Type other) const {
251
+ return value_ > other.value();
252
+ }
253
+ bool operator <= (const Type other) const {
254
+ return value_ <= other.value();
255
+ }
256
+ bool operator >= (const Type other) const {
257
+ return value_ >= other.value();
258
+ }
259
+
260
+ // Test equality to within some epsilon. Always false for
261
+ // epsilon < 0.
262
+ bool equals(const Type other,
263
+ const Type epsilon) const {
264
+ Float delta = value_ - other.value_;
265
+ if (delta < static_cast<Float>(0.0)) {
266
+ return -delta <= epsilon.value_;
267
+ }
268
+ return delta <= epsilon.value_;
269
+ }
270
+
271
+ // A little more sugar.
272
+ Type abs() const {
273
+ return (value_ < static_cast<Float>(0.0)) ? -(*this) : *this;
274
+ }
275
+
276
+ // Explicit precision casting within a base unit class.
277
+ template <typename OtherFloat>
278
+ PhysicalUnit<OtherFloat, Base, Unit> precision_cast() const {
279
+ typedef PhysicalUnit<OtherFloat, Base, Unit> CastType;
280
+ return CastType(static_cast<OtherFloat>(value_));
281
+ }
282
+
283
+ private:
284
+ Float value_;
285
+ // Enforce Float to be a floating point type, since unit conversions will
286
+ // generally fail with integers.
287
+ static_assert(std::is_floating_point<Float>::value,
288
+ "Only_use_floating_point_types");
289
+ };
290
+
291
+ // Allow 2*u (in addition to u*2).
292
+ template <typename Scale, typename Float, class Base, class Unit>
293
+ inline PhysicalUnit<Float, Base, Unit> operator * (
294
+ const Scale scale,
295
+ const PhysicalUnit<Float, Base, Unit> value) {
296
+ return value * static_cast<Float>(scale);
297
+ }
298
+
299
+ // we'll print the current value and the value converted to the natural
300
+ // base type
301
+ template <typename Float, typename Base, typename Unit>
302
+ std::ostream& operator<<(std::ostream& os,
303
+ PhysicalUnit<Float, Base, Unit> value) {
304
+ return os << value.value()
305
+ << " (" << Base::GetInBaseUnit(value)
306
+ << Base::output_suffix << ")";
307
+ }
308
+
309
+ } // end namespace units
310
+
311
+ } // end namespace util
312
+
313
+ #endif // S2_UTIL_UNITS_PHYSICAL_UNITS_H_
@@ -0,0 +1,234 @@
1
+ // Copyright 2016 Google Inc. All Rights Reserved.
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // http://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS-IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+ //
15
+
16
+ // Author: ericv@google.com (Eric Veach)
17
+
18
+ #ifndef S2_VALUE_LEXICON_H_
19
+ #define S2_VALUE_LEXICON_H_
20
+
21
+ #include <functional>
22
+ #include <limits>
23
+ #include <vector>
24
+
25
+ #include "s2/base/integral_types.h"
26
+ #include "s2/util/gtl/dense_hash_set.h"
27
+
28
+ // ValueLexicon is a class that maps distinct values to sequentially numbered
29
+ // integer identifiers. It automatically eliminates duplicates and uses a
30
+ // compact representation. See also SequenceLexicon.
31
+ //
32
+ // Each distinct value is mapped to a 32-bit integer. The space used for each
33
+ // value is approximately 7 bytes plus the space needed for the value itself.
34
+ // For example, int64 values would need approximately 15 bytes each. Note
35
+ // also that values are referred to using 32-bit ids rather than 64-bit
36
+ // pointers.
37
+ //
38
+ // This class has the same thread-safety properties as "string": const methods
39
+ // are thread safe, and non-const methods are not thread safe.
40
+ //
41
+ // Example usage:
42
+ //
43
+ // ValueLexicon<string> lexicon;
44
+ // uint32 cat_id = lexicon.Add("cat");
45
+ // EXPECT_EQ(cat_id, lexicon.Add("cat"));
46
+ // EXPECT_EQ("cat", lexicon.value(cat_id));
47
+ //
48
+ template <class T,
49
+ class Hasher = std::hash<T>,
50
+ class KeyEqual = std::equal_to<T>>
51
+ class ValueLexicon {
52
+ public:
53
+ explicit ValueLexicon(const Hasher& hasher = Hasher(),
54
+ const KeyEqual& key_equal = KeyEqual());
55
+
56
+ // ValueLexicon is movable and copyable.
57
+ ValueLexicon(const ValueLexicon&);
58
+ ValueLexicon& operator=(const ValueLexicon&);
59
+ ValueLexicon(ValueLexicon&&);
60
+ ValueLexicon& operator=(ValueLexicon&&);
61
+
62
+ // Clears all data from the lexicon.
63
+ void Clear();
64
+
65
+ // Add the given value to the lexicon if it is not already present, and
66
+ // return its integer id. Ids are assigned sequentially starting from zero.
67
+ uint32 Add(const T& value);
68
+
69
+ // Return the number of values in the lexicon.
70
+ uint32 size() const;
71
+
72
+ // Return the value with the given id.
73
+ const T& value(uint32 id) const;
74
+
75
+ private:
76
+ friend class IdKeyEqual;
77
+ // Choose kEmptyKey to be the last key that will ever be generated.
78
+ static const uint32 kEmptyKey = std::numeric_limits<uint32>::max();
79
+
80
+ class IdHasher {
81
+ public:
82
+ IdHasher(const Hasher& hasher, const ValueLexicon* lexicon);
83
+ const Hasher& hasher() const;
84
+ size_t operator()(uint32 id) const;
85
+ private:
86
+ Hasher hasher_;
87
+ const ValueLexicon* lexicon_;
88
+ };
89
+
90
+ class IdKeyEqual {
91
+ public:
92
+ IdKeyEqual(const KeyEqual& key_equal, const ValueLexicon* lexicon);
93
+ bool operator()(uint32 id1, uint32 id2) const;
94
+ private:
95
+ KeyEqual key_equal_;
96
+ const ValueLexicon* lexicon_;
97
+ };
98
+
99
+ using IdSet = gtl::dense_hash_set<uint32, IdHasher, IdKeyEqual>;
100
+
101
+ KeyEqual key_equal_;
102
+ std::vector<T> values_;
103
+ IdSet id_set_;
104
+ };
105
+
106
+
107
+ ////////////////// Implementation details follow ////////////////////
108
+
109
+
110
+ template <class T, class Hasher, class KeyEqual>
111
+ const uint32 ValueLexicon<T, Hasher, KeyEqual>::kEmptyKey;
112
+
113
+ template <class T, class Hasher, class KeyEqual>
114
+ ValueLexicon<T, Hasher, KeyEqual>::IdHasher::IdHasher(
115
+ const Hasher& hasher, const ValueLexicon* lexicon)
116
+ : hasher_(hasher), lexicon_(lexicon) {
117
+ }
118
+
119
+ template <class T, class Hasher, class KeyEqual>
120
+ const Hasher& ValueLexicon<T, Hasher, KeyEqual>::IdHasher::hasher() const {
121
+ return hasher_;
122
+ }
123
+
124
+ template <class T, class Hasher, class KeyEqual>
125
+ inline size_t ValueLexicon<T, Hasher, KeyEqual>::IdHasher::operator()(
126
+ uint32 id) const {
127
+ return hasher_(lexicon_->value(id));
128
+ }
129
+
130
+ template <class T, class Hasher, class KeyEqual>
131
+ ValueLexicon<T, Hasher, KeyEqual>::IdKeyEqual::IdKeyEqual(
132
+ const KeyEqual& key_equal, const ValueLexicon* lexicon)
133
+ : key_equal_(key_equal), lexicon_(lexicon) {
134
+ }
135
+
136
+ template <class T, class Hasher, class KeyEqual>
137
+ inline bool ValueLexicon<T, Hasher, KeyEqual>::IdKeyEqual::operator()(
138
+ uint32 id1, uint32 id2) const {
139
+ if (id1 == id2) return true;
140
+ if (id1 == lexicon_->kEmptyKey || id2 == lexicon_->kEmptyKey) {
141
+ return false;
142
+ }
143
+ return key_equal_(lexicon_->value(id1), lexicon_->value(id2));
144
+ }
145
+
146
+ template <class T, class Hasher, class KeyEqual>
147
+ ValueLexicon<T, Hasher, KeyEqual>::ValueLexicon(const Hasher& hasher,
148
+ const KeyEqual& key_equal)
149
+ : key_equal_(key_equal),
150
+ id_set_(0, IdHasher(hasher, this),
151
+ IdKeyEqual(key_equal, this)) {
152
+ id_set_.set_empty_key(kEmptyKey);
153
+ }
154
+
155
+ template <class T, class Hasher, class KeyEqual>
156
+ ValueLexicon<T, Hasher, KeyEqual>::ValueLexicon(const ValueLexicon& x)
157
+ : key_equal_(x.key_equal_), values_(x.values_),
158
+ // Unfortunately we can't copy "id_set_" because we need to change the
159
+ // "this" pointers associated with hasher() and key_equal().
160
+ id_set_(x.id_set_.begin(), x.id_set_.end(), kEmptyKey, 0,
161
+ IdHasher(x.id_set_.hash_funct().hasher(), this),
162
+ IdKeyEqual(x.key_equal_, this)) {
163
+ }
164
+
165
+ template <class T, class Hasher, class KeyEqual>
166
+ ValueLexicon<T, Hasher, KeyEqual>::ValueLexicon(ValueLexicon&& x)
167
+ : key_equal_(std::move(x.key_equal_)), values_(std::move(x.values_)),
168
+ // Unfortunately we can't move "id_set_" because we need to change the
169
+ // "this" pointers associated with hasher() and key_equal().
170
+ id_set_(x.id_set_.begin(), x.id_set_.end(), kEmptyKey, 0,
171
+ IdHasher(x.id_set_.hash_funct().hasher(), this),
172
+ IdKeyEqual(x.key_equal_, this)) {
173
+ }
174
+
175
+ template <class T, class Hasher, class KeyEqual>
176
+ ValueLexicon<T, Hasher, KeyEqual>&
177
+ ValueLexicon<T, Hasher, KeyEqual>::operator=(const ValueLexicon& x) {
178
+ // Note that self-assignment is handled correctly by this code.
179
+ key_equal_ = x.key_equal_;
180
+ values_ = x.values_;
181
+ // Unfortunately we can't copy-assign "id_set_" because we need to change
182
+ // the "this" pointers associated with hasher() and key_equal().
183
+ id_set_ = IdSet(x.id_set_.begin(), x.id_set_.end(), kEmptyKey, 0,
184
+ IdHasher(x.id_set_.hash_funct().hasher(), this),
185
+ IdKeyEqual(x.key_equal_, this));
186
+ return *this;
187
+ }
188
+
189
+ template <class T, class Hasher, class KeyEqual>
190
+ ValueLexicon<T, Hasher, KeyEqual>&
191
+ ValueLexicon<T, Hasher, KeyEqual>::operator=(ValueLexicon&& x) {
192
+ // Note that move self-assignment has undefined behavior.
193
+ key_equal_ = std::move(x.key_equal_);
194
+ values_ = std::move(x.values_);
195
+ // Unfortunately we can't move-assign "id_set_" because we need to change
196
+ // the "this" pointers associated with hasher() and key_equal().
197
+ id_set_ = IdSet(x.id_set_.begin(), x.id_set_.end(), kEmptyKey, 0,
198
+ IdHasher(x.id_set_.hash_funct().hasher(), this),
199
+ IdKeyEqual(x.key_equal_, this));
200
+ return *this;
201
+ }
202
+
203
+ template <class T, class Hasher, class KeyEqual>
204
+ void ValueLexicon<T, Hasher, KeyEqual>::Clear() {
205
+ values_.clear();
206
+ id_set_.clear();
207
+ }
208
+
209
+ template <class T, class Hasher, class KeyEqual>
210
+ uint32 ValueLexicon<T, Hasher, KeyEqual>::Add(const T& value) {
211
+ if (!values_.empty() && key_equal_(value, values_.back())) {
212
+ return values_.size() - 1;
213
+ }
214
+ values_.push_back(value);
215
+ auto result = id_set_.insert(values_.size() - 1);
216
+ if (result.second) {
217
+ return values_.size() - 1;
218
+ } else {
219
+ values_.pop_back();
220
+ return *result.first;
221
+ }
222
+ }
223
+
224
+ template <class T, class Hasher, class KeyEqual>
225
+ inline uint32 ValueLexicon<T, Hasher, KeyEqual>::size() const {
226
+ return values_.size();
227
+ }
228
+
229
+ template <class T, class Hasher, class KeyEqual>
230
+ inline const T& ValueLexicon<T, Hasher, KeyEqual>::value(uint32 id) const {
231
+ return values_[id];
232
+ }
233
+
234
+ #endif // S2_VALUE_LEXICON_H_