@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,646 @@
1
+ // Copyright 2009 Google Inc. All Rights Reserved.
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // http://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS-IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+ //
15
+
16
+ // Author: ericv@google.com (Eric Veach)
17
+ //
18
+ // ExactFloat is a multiple-precision floating point type based on the OpenSSL
19
+ // Bignum library. It has the same interface as the built-in "float" and
20
+ // "double" types, but only supports the subset of operators and intrinsics
21
+ // where it is possible to compute the result exactly. So for example,
22
+ // ExactFloat supports addition and multiplication but not division (since in
23
+ // general, the quotient of two floating-point numbers cannot be represented
24
+ // exactly). Exact arithmetic is useful for geometric algorithms, especially
25
+ // for disambiguating cases where ordinary double-precision arithmetic yields
26
+ // an uncertain result.
27
+ //
28
+ // ExactFloat is a subset of the faster and more capable MPFloat class (which
29
+ // is based on the GNU MPFR library). The main reason to use this class
30
+ // rather than MPFloat is that it is subject to a BSD-style license rather
31
+ // than the much more restrictive LGPL license.
32
+ //
33
+ // It has the following features:
34
+ //
35
+ // - ExactFloat uses the same syntax as the built-in "float" and "double"
36
+ // types, for example: x += 4 + fabs(2*y*y - z*z). There are a few
37
+ // differences (see below), but the syntax is compatible enough so that
38
+ // ExactFloat can be used as a template argument to templatized classes
39
+ // such as Vector2, VectorN, Matrix3x3, etc.
40
+ //
41
+ // - Results are not rounded; instead, precision is increased so that the
42
+ // result can be represented exactly. An inexact result is returned only
43
+ // in the case of underflow or overflow (yielding signed zero or infinity
44
+ // respectively), or if the maximum allowed precision is exceeded (yielding
45
+ // NaN). ExactFloat uses IEEE 754-2008 rules for handling infinities, NaN,
46
+ // rounding to integers, etc.
47
+ //
48
+ // - ExactFloat only supports calculations where the result can be
49
+ // represented exactly. Therefore it supports intrinsics such as fabs()
50
+ // but not transcendentals such as sin(), sqrt(), etc.
51
+ //
52
+ // Syntax Compatibility with "float" and "double"
53
+ // ----------------------------------------------
54
+ //
55
+ // ExactFloat supports a subset of the operators and intrinsics for the
56
+ // built-in "double" type. (Thus it supports fabs() but not fabsf(), for
57
+ // example.) The syntax is different only in the following cases:
58
+ //
59
+ // - Casts and implicit conversions to built-in types (including "bool") are
60
+ // not supported. So for example, the following will not compile:
61
+ //
62
+ // ExactFloat x = 7.5;
63
+ // double y = x; // ERROR: use x.ToDouble() instead
64
+ // long z = x; // ERROR: use x.ToDouble() or lround(trunc(x))
65
+ // q = static_cast<int>(x); // ERROR: use x.ToDouble() or lround(trunc(x))
66
+ // if (x) { ... } // ERROR: use (x != 0) instead
67
+ //
68
+ // - The glibc floating-point classification macros (fpclassify, isfinite,
69
+ // isnormal, isnan, isinf) are not supported. Instead there are
70
+ // zero-argument methods:
71
+ //
72
+ // ExactFloat x;
73
+ // if (isnan(x)) { ... } // ERROR: use (x.is_nan()) instead
74
+ // if (isinf(x)) { ... } // ERROR: use (x.is_inf()) instead
75
+ //
76
+ // Using ExactFloat with Vector3, etc.
77
+ // -----------------------------------
78
+ //
79
+ // ExactFloat can be used with templatized classes such as Vector2 and Vector3
80
+ // (see "util/math/vector.h"), with the following limitations:
81
+ //
82
+ // - Cast() can be used to convert other vector types to an ExactFloat vector
83
+ // type, but not the other way around. This is because there are no
84
+ // implicit conversions from ExactFloat to built-in types. You can work
85
+ // around this by calling an explicit conversion method such as
86
+ // ToDouble(). For example:
87
+ //
88
+ // typedef Vector3<ExactFloat> Vector3_xf;
89
+ // Vector3_xf x;
90
+ // Vector3_d y;
91
+ // x = Vector3_xf::Cast(y); // This works.
92
+ // y = Vector3_d::Cast(x); // This doesn't.
93
+ // y = Vector3_d(x[0].ToDouble(), x[1].ToDouble(), x[2].ToDouble()); // OK
94
+ //
95
+ // - IsNaN() is not supported because it calls isnan(), which is defined as a
96
+ // macro in <math.h> and therefore can't easily be overrided.
97
+ //
98
+ // Precision Semantics
99
+ // -------------------
100
+ //
101
+ // Unlike MPFloat, ExactFloat does not allow a maximum precision to be
102
+ // specified (it is always unbounded). Therefore it does not have any of the
103
+ // corresponding constructors.
104
+ //
105
+ // The current precision of an ExactFloat (i.e., the number of bits in its
106
+ // mantissa) is returned by prec(). The precision is increased as necessary
107
+ // so that the result of every operation can be represented exactly.
108
+
109
+ #ifndef S2_UTIL_MATH_EXACTFLOAT_EXACTFLOAT_H_
110
+ #define S2_UTIL_MATH_EXACTFLOAT_EXACTFLOAT_H_
111
+
112
+ #include <algorithm>
113
+ #include <climits>
114
+ #include <cmath>
115
+ #include <algorithm>
116
+ #include <iostream>
117
+ #include <string>
118
+
119
+ #include <openssl/bn.h>
120
+
121
+ #include "s2/base/integral_types.h"
122
+ #include "s2/base/logging.h"
123
+ #include "s2/base/port.h"
124
+
125
+ class ExactFloat {
126
+ public:
127
+ // The following limits are imposed by OpenSSL.
128
+
129
+ // The maximum exponent supported. If a value has an exponent larger than
130
+ // this, it is replaced by infinity (with the appropriate sign).
131
+ static const int kMaxExp = 200*1000*1000; // About 10**(60 million)
132
+
133
+ // The minimum exponent supported. If a value has an exponent less than
134
+ // this, it is replaced by zero (with the appropriate sign).
135
+ static const int kMinExp = -kMaxExp; // About 10**(-60 million)
136
+
137
+ // The maximum number of mantissa bits supported. If a value has more
138
+ // mantissa bits than this, it is replaced with NaN. (It is expected that
139
+ // users of this class will never want this much precision.)
140
+ static const int kMaxPrec = 64 << 20; // About 20 million digits
141
+
142
+ // Rounding modes. kRoundTiesToEven and kRoundTiesAwayFromZero both round
143
+ // to the nearest representable value unless two values are equally close.
144
+ // In that case kRoundTiesToEven rounds to the nearest even value, while
145
+ // kRoundTiesAwayFromZero always rounds away from zero.
146
+ enum RoundingMode {
147
+ kRoundTiesToEven,
148
+ kRoundTiesAwayFromZero,
149
+ kRoundTowardZero,
150
+ kRoundAwayFromZero,
151
+ kRoundTowardPositive,
152
+ kRoundTowardNegative
153
+ };
154
+
155
+ /////////////////////////////////////////////////////////////////////////////
156
+ // Constructors
157
+
158
+ // The default constructor initializes the value to zero. (The initial
159
+ // value must be zero rather than NaN for compatibility with the built-in
160
+ // float types.)
161
+ inline ExactFloat();
162
+
163
+ // Construct an ExactFloat from a "double". The constructor is implicit so
164
+ // that this class can be used as a replacement for "float" or "double" in
165
+ // templatized libraries. (With an explicit constructor, code such as
166
+ // "ExactFloat f = 2.5;" would not compile.) All double-precision values are
167
+ // supported, including denormalized numbers, infinities, and NaNs.
168
+ ExactFloat(double v);
169
+
170
+ // Construct an ExactFloat from an "int". Note that in general, ints are
171
+ // automatically converted to doubles and so would be handled by the
172
+ // constructor above. However, the particular argument (0) would be
173
+ // ambiguous; the compiler wouldn't know whether to treat it as a "double" or
174
+ // "const char*" (since 0 is a valid null pointer constant). Adding an "int"
175
+ // constructor solves this problem.
176
+ //
177
+ // We do not provide constructors for "unsigned", "long", "unsigned long",
178
+ // "long long", or "unsigned long long", since these types are not typically
179
+ // used in floating-point calculations and it is safer to require them to be
180
+ // explicitly cast.
181
+ ExactFloat(int v);
182
+
183
+ // Construct an ExactFloat from a string (such as "1.2e50"). Requires that
184
+ // the value is exactly representable as a floating-point number (so for
185
+ // example, "0.125" is allowed but "0.1" is not).
186
+ explicit ExactFloat(const char* s) { Unimplemented(); }
187
+
188
+ // Copy constructor.
189
+ ExactFloat(const ExactFloat& b);
190
+
191
+ // The destructor is not virtual for efficiency reasons. Therefore no
192
+ // subclass should declare additional fields that require destruction.
193
+ inline ~ExactFloat() = default;
194
+
195
+ /////////////////////////////////////////////////////////////////////
196
+ // Constants
197
+ //
198
+ // As an alternative to the constants below, you can also just use the
199
+ // constants defined in <math.h>, for example:
200
+ //
201
+ // ExactFloat x = NAN, y = -INFINITY;
202
+
203
+ // Return an ExactFloat equal to positive zero (if sign >= 0) or
204
+ // negative zero (if sign < 0).
205
+ static ExactFloat SignedZero(int sign);
206
+
207
+ // Return an ExactFloat equal to positive infinity (if sign >= 0) or
208
+ // negative infinity (if sign < 0).
209
+ static ExactFloat Infinity(int sign);
210
+
211
+ // Return an ExactFloat that is NaN (Not-a-Number).
212
+ static ExactFloat NaN();
213
+
214
+ /////////////////////////////////////////////////////////////////////////////
215
+ // Accessor Methods
216
+
217
+ // Return the maximum precision of the ExactFloat. This method exists only
218
+ // for compatibility with MPFloat.
219
+ int max_prec() const { return kMaxPrec; }
220
+
221
+ // Return the actual precision of this ExactFloat (the current number of
222
+ // bits in its mantissa). Returns 0 for non-normal numbers such as NaN.
223
+ int prec() const;
224
+
225
+ // Return the exponent of this ExactFloat given that the mantissa is in the
226
+ // range [0.5, 1). It is an error to call this method if the value is zero,
227
+ // infinity, or NaN.
228
+ int exp() const;
229
+
230
+ // Set the value of the ExactFloat to +0 (if sign >= 0) or -0 (if sign < 0).
231
+ void set_zero(int sign);
232
+
233
+ // Set the value of the ExactFloat to positive infinity (if sign >= 0) or
234
+ // negative infinity (if sign < 0).
235
+ void set_inf(int sign);
236
+
237
+ // Set the value of the ExactFloat to NaN (Not-a-Number).
238
+ void set_nan();
239
+
240
+ // Unfortunately, isinf(x), isnan(x), isnormal(x), and isfinite(x) are
241
+ // defined as macros in <math.h>. Therefore we can't easily extend them
242
+ // here. Instead we provide methods with underscores in their names that do
243
+ // the same thing: x.is_inf(), etc.
244
+ //
245
+ // These macros are not implemented: signbit(x), fpclassify(x).
246
+
247
+ // Return true if this value is zero (including negative zero).
248
+ inline bool is_zero() const;
249
+
250
+ // Return true if this value is infinity (positive or negative).
251
+ inline bool is_inf() const;
252
+
253
+ // Return true if this value is NaN (Not-a-Number).
254
+ inline bool is_nan() const;
255
+
256
+ // Return true if this value is a normal floating-point number. Non-normal
257
+ // values (zero, infinity, and NaN) often need to be handled separately
258
+ // because they are represented using special exponent values and their
259
+ // mantissa is not defined.
260
+ inline bool is_normal() const;
261
+
262
+ // Return true if this value is a normal floating-point number or zero,
263
+ // i.e. it is not infinity or NaN.
264
+ inline bool is_finite() const;
265
+
266
+ // Return true if the sign bit is set (this includes negative zero).
267
+ inline bool sign_bit() const;
268
+
269
+ // Return +1 if this ExactFloat is positive, -1 if it is negative, and 0
270
+ // if it is zero or NaN. Note that unlike sign_bit(), sgn() returns 0 for
271
+ // both positive and negative zero.
272
+ inline int sgn() const;
273
+
274
+ /////////////////////////////////////////////////////////////////////////////
275
+ // Conversion Methods
276
+ //
277
+ // Note that some conversions are defined as functions further below,
278
+ // e.g. to convert to an integer you can use lround(), llrint(), etc.
279
+
280
+ // Round to double precision. Note that since doubles have a much smaller
281
+ // exponent range than ExactFloats, very small values may be rounded to
282
+ // (positive or negative) zero, and very large values may be rounded to
283
+ // infinity.
284
+ //
285
+ // It is very important to make this a named method rather than an implicit
286
+ // conversion, because otherwise there would be a silent loss of precision
287
+ // whenever some desired operator or function happens not to be implemented.
288
+ // For example, if fabs() were not implemented and "x" and "y" were
289
+ // ExactFloats, then x = fabs(y) would silently convert "y" to a "double",
290
+ // take its absolute value, and convert it back to an ExactFloat.
291
+ double ToDouble() const;
292
+
293
+ // Return a human-readable string such that if two values with the same
294
+ // precision are different, then their string representations are different.
295
+ // The format is similar to printf("%g"), except that the number of
296
+ // significant digits depends on the precision (with a minimum of 10).
297
+ // Trailing zeros are stripped (just like "%g").
298
+ //
299
+ // Note that if two values have different precisions, they may have the same
300
+ // ToString() value even though their values are slightly different. If you
301
+ // need to distinguish such values, use ToUniqueString() intead.
302
+ string ToString() const;
303
+
304
+ // Return a string formatted according to printf("%Ng") where N is the given
305
+ // maximum number of significant digits.
306
+ string ToStringWithMaxDigits(int max_digits) const;
307
+
308
+ // Return a human-readable string such that if two ExactFloats have different
309
+ // values, then their string representations are always different. This
310
+ // method is useful for debugging. The string has the form "value<prec>",
311
+ // where "prec" is the actual precision of the ExactFloat (e.g., "0.215<50>").
312
+ string ToUniqueString() const;
313
+
314
+ // Return an upper bound on the number of significant digits required to
315
+ // distinguish any two floating-point numbers with the given precision when
316
+ // they are formatted as decimal strings in exponential format.
317
+ static int NumSignificantDigitsForPrec(int prec);
318
+
319
+ // Output the ExactFloat in human-readable format, e.g. for logging.
320
+ friend std::ostream& operator<<(std::ostream& o, ExactFloat const& f) {
321
+ return o << f.ToString();
322
+ }
323
+
324
+ /////////////////////////////////////////////////////////////////////////////
325
+ // Other Methods
326
+
327
+ // Round the ExactFloat so that its mantissa has at most "max_prec" bits
328
+ // using the given rounding mode. Requires "max_prec" to be at least 2
329
+ // (since kRoundTiesToEven doesn't make sense with fewer bits than this).
330
+ ExactFloat RoundToMaxPrec(int max_prec, RoundingMode mode) const;
331
+
332
+ /////////////////////////////////////////////////////////////////////////////
333
+ // Operators
334
+
335
+ // Assignment operator.
336
+ ExactFloat& operator=(const ExactFloat& b);
337
+
338
+ // Unary plus.
339
+ ExactFloat operator+() const { return *this; }
340
+
341
+ // Unary minus.
342
+ ExactFloat operator-() const;
343
+
344
+ // Addition.
345
+ friend ExactFloat operator+(const ExactFloat& a, const ExactFloat& b);
346
+
347
+ // Subtraction.
348
+ friend ExactFloat operator-(const ExactFloat& a, const ExactFloat& b);
349
+
350
+ // Multiplication.
351
+ friend ExactFloat operator*(const ExactFloat& a, const ExactFloat& b);
352
+
353
+ // Division is not implemented because the result cannot be represented
354
+ // exactly in general. Doing this properly would require extending all the
355
+ // operations to support rounding to a specified precision.
356
+
357
+ // Arithmetic assignment operators (+=, -=, *=).
358
+ ExactFloat& operator+=(const ExactFloat& b) { return (*this = *this + b); }
359
+ ExactFloat& operator-=(const ExactFloat& b) { return (*this = *this - b); }
360
+ ExactFloat& operator*=(const ExactFloat& b) { return (*this = *this * b); }
361
+
362
+ // Comparison operators (==, !=, <, <=, >, >=).
363
+ friend bool operator==(const ExactFloat& a, const ExactFloat& b);
364
+ friend bool operator<(const ExactFloat& a, const ExactFloat& b);
365
+ // These don't need to be friends but are declared here for completeness.
366
+ inline friend bool operator!=(const ExactFloat& a, const ExactFloat& b);
367
+ inline friend bool operator<=(const ExactFloat& a, const ExactFloat& b);
368
+ inline friend bool operator>(const ExactFloat& a, const ExactFloat& b);
369
+ inline friend bool operator>=(const ExactFloat& a, const ExactFloat& b);
370
+
371
+ /////////////////////////////////////////////////////////////////////
372
+ // Math Intrinsics
373
+ //
374
+ // The math intrinsics currently supported by ExactFloat are listed below.
375
+ // Except as noted, they behave identically to the usual glibc intrinsics
376
+ // except that they have greater precision. See the man pages for more
377
+ // information.
378
+
379
+ //////// Miscellaneous simple arithmetic functions.
380
+
381
+ // Absolute value.
382
+ friend ExactFloat fabs(const ExactFloat& a);
383
+ friend ExactFloat abs(const ExactFloat& a);
384
+
385
+ // Maximum of two values.
386
+ friend ExactFloat fmax(const ExactFloat& a, const ExactFloat& b);
387
+
388
+ // Minimum of two values.
389
+ friend ExactFloat fmin(const ExactFloat& a, const ExactFloat& b);
390
+
391
+ // Positive difference: max(a - b, 0).
392
+ friend ExactFloat fdim(const ExactFloat& a, const ExactFloat& b);
393
+
394
+ //////// Integer rounding functions that return ExactFloat values.
395
+
396
+ // Round up to the nearest integer.
397
+ friend ExactFloat ceil(const ExactFloat& a);
398
+
399
+ // Round down to the nearest integer.
400
+ friend ExactFloat floor(const ExactFloat& a);
401
+
402
+ // Round to the nearest integer not larger in absolute value.
403
+ // For example: f(-1.9) = -1, f(2.9) = 2.
404
+ friend ExactFloat trunc(const ExactFloat& a);
405
+
406
+ // Round to the nearest integer, rounding halfway cases away from zero.
407
+ // For example: f(-0.5) = -1, f(0.5) = 1, f(1.5) = 2, f(2.5) = 3.
408
+ friend ExactFloat round(const ExactFloat& a);
409
+
410
+ // Round to the nearest integer, rounding halfway cases to an even integer.
411
+ // For example: f(-0.5) = 0, f(0.5) = 0, f(1.5) = 2, f(2.5) = 2.
412
+ friend ExactFloat rint(const ExactFloat& a);
413
+
414
+ // A synonym for rint().
415
+ friend ExactFloat nearbyint(const ExactFloat& a) { return rint(a); }
416
+
417
+ //////// Integer rounding functions that return C++ integer types.
418
+
419
+ // Like rint(), but rounds to the nearest "long" value. Returns the
420
+ // minimum/maximum possible integer if the value is out of range.
421
+ friend long lrint(const ExactFloat& a);
422
+
423
+ // Like rint(), but rounds to the nearest "long long" value. Returns the
424
+ // minimum/maximum possible integer if the value is out of range.
425
+ friend long long llrint(const ExactFloat& a);
426
+
427
+ // Like round(), but rounds to the nearest "long" value. Returns the
428
+ // minimum/maximum possible integer if the value is out of range.
429
+ friend long lround(const ExactFloat& a);
430
+
431
+ // Like round(), but rounds to the nearest "long long" value. Returns the
432
+ // minimum/maximum possible integer if the value is out of range.
433
+ friend long long llround(const ExactFloat& a);
434
+
435
+ //////// Remainder functions.
436
+
437
+ // The remainder of dividing "a" by "b", where the quotient is rounded toward
438
+ // zero to the nearest integer. Similar to (a - trunc(a / b) * b).
439
+ friend ExactFloat fmod(const ExactFloat& a, const ExactFloat& b) {
440
+ // Note that it is possible to implement this operation exactly, it just
441
+ // hasn't been done.
442
+ return Unimplemented();
443
+ }
444
+
445
+ // The remainder of dividing "a" by "b", where the quotient is rounded to the
446
+ // nearest integer, rounding halfway cases to an even integer. Similar to
447
+ // (a - rint(a / b) * b).
448
+ friend ExactFloat remainder(const ExactFloat& a, const ExactFloat& b) {
449
+ // Note that it is possible to implement this operation exactly, it just
450
+ // hasn't been done.
451
+ return Unimplemented();
452
+ }
453
+
454
+ // A synonym for remainder().
455
+ friend ExactFloat drem(const ExactFloat& a, const ExactFloat& b) {
456
+ return remainder(a, b);
457
+ }
458
+
459
+ // Break the argument "a" into integer and fractional parts, each of which
460
+ // has the same sign as "a". The fractional part is returned, and the
461
+ // integer part is stored in the output parameter "i_ptr". Both output
462
+ // values are set to have the same maximum precision as "a".
463
+ friend ExactFloat modf(const ExactFloat& a, ExactFloat* i_ptr) {
464
+ // Note that it is possible to implement this operation exactly, it just
465
+ // hasn't been done.
466
+ return Unimplemented();
467
+ }
468
+
469
+ //////// Floating-point manipulation functions.
470
+
471
+ // Return an ExactFloat with the magnitude of "a" and the sign bit of "b".
472
+ // (Note that an IEEE zero can be either positive or negative.)
473
+ friend ExactFloat copysign(const ExactFloat& a, const ExactFloat& b);
474
+
475
+ // Convert "a" to a normalized fraction in the range [0.5, 1) times a power
476
+ // of two. Return the fraction and set "exp" to the exponent. If "a" is
477
+ // zero, infinity, or NaN then return "a" and set "exp" to zero.
478
+ friend ExactFloat frexp(const ExactFloat& a, int* exp);
479
+
480
+ // Return "a" multiplied by 2 raised to the power "exp".
481
+ friend ExactFloat ldexp(const ExactFloat& a, int exp);
482
+
483
+ // A synonym for ldexp().
484
+ friend ExactFloat scalbn(const ExactFloat& a, int exp) {
485
+ return ldexp(a, exp);
486
+ }
487
+
488
+ // A version of ldexp() where "exp" is a long integer.
489
+ friend ExactFloat scalbln(const ExactFloat& a, long exp);
490
+
491
+ // Convert "a" to a normalized fraction in the range [1,2) times a power of
492
+ // two, and return the exponent value as an integer. This is equivalent to
493
+ // lrint(floor(log2(fabs(a)))) but it is computed more efficiently. Returns
494
+ // the constants documented in the man page for zero, infinity, or NaN.
495
+ friend int ilogb(const ExactFloat& a);
496
+
497
+ // Convert "a" to a normalized fraction in the range [1,2) times a power of
498
+ // two, and return the exponent value as an ExactFloat. This is equivalent to
499
+ // floor(log2(fabs(a))) but it is computed more efficiently.
500
+ friend ExactFloat logb(const ExactFloat& a);
501
+
502
+ protected:
503
+ // OpenSSL >= 1.1 does not have BN_init, and does not support stack-
504
+ // allocated BIGNUMS. We use BN_init when possible, but BN_new otherwise.
505
+ // If the performance penalty is too high, an object pool can be added
506
+ // in the future.
507
+ #if defined(OPENSSL_IS_BORINGSSL) || OPENSSL_VERSION_NUMBER < 0x10100000L
508
+ // BoringSSL and OpenSSL < 1.1 support stack allocated BIGNUMs and BN_init.
509
+ class BigNum {
510
+ public:
511
+ BigNum() { BN_init(&bn_); }
512
+ // Prevent accidental, expensive, copying.
513
+ BigNum(const BigNum&) = delete;
514
+ BigNum& operator=(const BigNum&) = delete;
515
+ ~BigNum() { BN_free(&bn_); }
516
+ BIGNUM* get() { return &bn_; }
517
+ const BIGNUM* get() const { return &bn_; }
518
+ private:
519
+ BIGNUM bn_;
520
+ };
521
+ #else
522
+ class BigNum {
523
+ public:
524
+ BigNum() : bn_(BN_new()) {}
525
+ BigNum(const BigNum&) = delete;
526
+ BigNum& operator=(const BigNum&) = delete;
527
+ ~BigNum() { BN_free(bn_); }
528
+ BIGNUM* get() { return bn_; }
529
+ const BIGNUM* get() const { return bn_; }
530
+ private:
531
+ BIGNUM* bn_;
532
+ };
533
+ #endif
534
+
535
+ // Non-normal numbers are represented using special exponent values and a
536
+ // mantissa of zero. Do not change these values; methods such as
537
+ // is_normal() make assumptions about their ordering. Non-normal numbers
538
+ // can have either a positive or negative sign (including zero and NaN).
539
+ static const int32 kExpNaN = INT_MAX;
540
+ static const int32 kExpInfinity = INT_MAX - 1;
541
+ static const int32 kExpZero = INT_MAX - 2;
542
+
543
+ // Normal numbers are represented as (sign_ * bn_ * (2 ** bn_exp_)), where:
544
+ // - sign_ is either +1 or -1
545
+ // - bn_ is a BIGNUM with a positive value
546
+ // - bn_exp_ is the base-2 exponent applied to bn_.
547
+ int32 sign_;
548
+ int32 bn_exp_;
549
+ BigNum bn_;
550
+
551
+ // A standard IEEE "double" has a 53-bit mantissa consisting of a 52-bit
552
+ // fraction plus an implicit leading "1" bit.
553
+ static const int kDoubleMantissaBits = 53;
554
+
555
+ // Convert an ExactFloat with no more than 53 bits in its mantissa to a
556
+ // "double". This method handles non-normal values (NaN, etc).
557
+ double ToDoubleHelper() const;
558
+
559
+ // Round an ExactFloat so that it is a multiple of (2 ** bit_exp), using the
560
+ // given rounding mode.
561
+ ExactFloat RoundToPowerOf2(int bit_exp, RoundingMode mode) const;
562
+
563
+ // Convert the ExactFloat to a decimal value of the form 0.ddd * (10 ** x),
564
+ // with at most "max_digits" significant digits (trailing zeros are removed).
565
+ // Set (*digits) to the ASCII digits and return the decimal exponent "x".
566
+ int GetDecimalDigits(int max_digits, string* digits) const;
567
+
568
+ // Return a_sign * fabs(a) + b_sign * fabs(b). Used to implement addition
569
+ // and subtraction.
570
+ static ExactFloat SignedSum(int a_sign, const ExactFloat* a,
571
+ int b_sign, const ExactFloat* b);
572
+
573
+ // Convert an ExactFloat to its canonical form. Underflow results in signed
574
+ // zero, overflow results in signed infinity, and precision overflow results
575
+ // in NaN. A zero mantissa is converted to the canonical zero value with
576
+ // the given sign; otherwise the mantissa is normalized so that its low bit
577
+ // is 1. Non-normal numbers are left unchanged.
578
+ void Canonicalize();
579
+
580
+ // Scale the mantissa of this ExactFloat so that it has the same bn_exp_ as
581
+ // "b", then return -1, 0, or 1 according to whether the scaled mantissa is
582
+ // less, equal, or greater than the mantissa of "b". Requires that both
583
+ // values are normal.
584
+ int ScaleAndCompare(const ExactFloat& b) const;
585
+
586
+ // Return true if the magnitude of this ExactFloat is less than the
587
+ // magnitude of "b". Requires that neither value is NaN.
588
+ bool UnsignedLess(const ExactFloat& b) const;
589
+
590
+ // Return an ExactFloat with the magnitude of this ExactFloat and the given
591
+ // sign. (Similar to copysign, except that the sign is given explicitly
592
+ // rather than being copied from another ExactFloat.)
593
+ inline ExactFloat CopyWithSign(int sign) const;
594
+
595
+ // Convert an ExactFloat to an integer of type "T" using the given rounding
596
+ // mode. The type "T" must be signed. Returns the largest possible integer
597
+ // for NaN, and clamps out of range values to the largest or smallest
598
+ // possible values.
599
+ template <class T> T ToInteger(RoundingMode mode) const;
600
+
601
+ // Log a fatal error message (used for unimplemented methods).
602
+ static ExactFloat Unimplemented();
603
+ };
604
+
605
+ /////////////////////////////////////////////////////////////////////////
606
+ // Implementation details follow:
607
+
608
+ inline ExactFloat::ExactFloat() : sign_(1), bn_exp_(kExpZero) {
609
+ }
610
+
611
+ inline bool ExactFloat::is_zero() const { return bn_exp_ == kExpZero; }
612
+ inline bool ExactFloat::is_inf() const { return bn_exp_ == kExpInfinity; }
613
+ inline bool ExactFloat::is_nan() const { return bn_exp_ == kExpNaN; }
614
+ inline bool ExactFloat::is_normal() const { return bn_exp_ < kExpZero; }
615
+ inline bool ExactFloat::is_finite() const { return bn_exp_ <= kExpZero; }
616
+ inline bool ExactFloat::sign_bit() const { return sign_ < 0; }
617
+
618
+ inline int ExactFloat::sgn() const {
619
+ return (is_nan() || is_zero()) ? 0 : sign_;
620
+ }
621
+
622
+ inline bool operator!=(const ExactFloat& a, const ExactFloat& b) {
623
+ return !(a == b);
624
+ }
625
+
626
+ inline bool operator<=(const ExactFloat& a, const ExactFloat& b) {
627
+ // NaN is unordered compared to everything, including itself.
628
+ if (a.is_nan() || b.is_nan()) return false;
629
+ return !(b < a);
630
+ }
631
+
632
+ inline bool operator>(const ExactFloat& a, const ExactFloat& b) {
633
+ return b < a;
634
+ }
635
+
636
+ inline bool operator>=(const ExactFloat& a, const ExactFloat& b) {
637
+ return b <= a;
638
+ }
639
+
640
+ inline ExactFloat ExactFloat::CopyWithSign(int sign) const {
641
+ ExactFloat r = *this;
642
+ r.sign_ = sign;
643
+ return r;
644
+ }
645
+
646
+ #endif // S2_UTIL_MATH_EXACTFLOAT_EXACTFLOAT_H_