@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,142 @@
1
+ // Copyright 2005 Google Inc. All Rights Reserved.
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // http://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS-IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+ //
15
+
16
+ // Author: ericv@google.com (Eric Veach)
17
+
18
+ #ifndef S2_S2REGION_H_
19
+ #define S2_S2REGION_H_
20
+
21
+ #include <vector>
22
+
23
+ #include "s2/_fp_contract_off.h"
24
+ #include "s2/s1angle.h"
25
+
26
+ class Decoder;
27
+ class Encoder;
28
+
29
+ class S2Cap;
30
+ class S2Cell;
31
+ class S2CellId;
32
+ class S2LatLngRect;
33
+
34
+ // An S2Region represents a two-dimensional region over the unit sphere.
35
+ // It is an abstract interface with various concrete subtypes.
36
+ //
37
+ // The main purpose of this interface is to allow complex regions to be
38
+ // approximated as simpler regions. So rather than having a wide variety
39
+ // of virtual methods that are implemented by all subtypes, the interface
40
+ // is restricted to methods that are useful for computing approximations.
41
+ class S2Region {
42
+ public:
43
+ S2Region() = default;
44
+ S2Region(const S2Region& other) = default;
45
+ S2Region& operator=(const S2Region&) = default;
46
+ virtual ~S2Region() {}
47
+
48
+ // Returns a deep copy of the region.
49
+ //
50
+ // Note that each subtype of S2Region returns a pointer to an object of its
51
+ // own type (e.g., S2Cap::Clone() returns an S2Cap*).
52
+ virtual S2Region* Clone() const = 0;
53
+
54
+ // Returns a bounding spherical cap that contains the region. The bound may
55
+ // not be tight.
56
+ virtual S2Cap GetCapBound() const = 0;
57
+
58
+ // Returns a bounding latitude-longitude rectangle that contains the region.
59
+ // The bound may not be tight.
60
+ virtual S2LatLngRect GetRectBound() const = 0;
61
+
62
+ // Returns a small collection of S2CellIds whose union covers the region.
63
+ // The cells are not sorted, may have redundancies (such as cells that
64
+ // contain other cells), and may cover much more area than necessary.
65
+ //
66
+ // This method is not intended for direct use by client code. Clients
67
+ // should typically use S2RegionCoverer::GetCovering, which has options to
68
+ // control the size and accuracy of the covering. Alternatively, if you
69
+ // want a fast covering and don't care about accuracy, consider calling
70
+ // S2RegionCoverer::GetFastCovering (which returns a cleaned-up version of
71
+ // the covering computed by this method).
72
+ //
73
+ // GetCellUnionBound() implementations should attempt to return a small
74
+ // covering (ideally 4 cells or fewer) that covers the region and can be
75
+ // computed quickly. The result is used by S2RegionCoverer as a starting
76
+ // point for further refinement.
77
+ //
78
+ // TODO(ericv): Remove the default implementation.
79
+ virtual void GetCellUnionBound(std::vector<S2CellId> *cell_ids) const;
80
+
81
+ // Returns true if the region completely contains the given cell, otherwise
82
+ // returns false.
83
+ virtual bool Contains(const S2Cell& cell) const = 0;
84
+
85
+ // If this method returns false, the region does not intersect the given
86
+ // cell. Otherwise, either region intersects the cell, or the intersection
87
+ // relationship could not be determined.
88
+ //
89
+ // Note that there is currently exactly one implementation of this method
90
+ // (S2LatLngRect::MayIntersect) that takes advantage of the semantics above
91
+ // to be more efficient. For all other S2Region subtypes, this method
92
+ // returns true if the region intersect the cell and false otherwise.
93
+ virtual bool MayIntersect(const S2Cell& cell) const = 0;
94
+
95
+ // Returns true if and only if the given point is contained by the region.
96
+ // The point 'p' is generally required to be unit length, although some
97
+ // subtypes may relax this restriction.
98
+ virtual bool Contains(const S2Point& p) const = 0;
99
+
100
+ //////////////////////////////////////////////////////////////////////////
101
+ // Many S2Region subtypes also define the following non-virtual methods.
102
+ //////////////////////////////////////////////////////////////////////////
103
+
104
+ // Appends a serialized representation of the region to "encoder".
105
+ //
106
+ // The representation chosen is left up to the sub-classes but it should
107
+ // satisfy the following constraints:
108
+ // - It should encode a version number.
109
+ // - It should be deserializable using the corresponding Decode method.
110
+ // - Performance, not space, should be the chief consideration. Encode() and
111
+ // Decode() should be implemented such that the combination is equivalent
112
+ // to calling Clone().
113
+ //
114
+ // REQUIRES: "encoder" uses the default constructor, so that its buffer
115
+ // can be enlarged as necessary by calling Ensure(int).
116
+ //
117
+ // void Encode(Encoder* const encoder) const;
118
+
119
+ // Decodes an S2Region encoded with Encode(). Note that this method
120
+ // requires that an S2Region object of the appropriate concrete type has
121
+ // already been constructed. It is not possible to decode regions of
122
+ // unknown type.
123
+ //
124
+ // Whenever the Decode method is changed to deal with new serialized
125
+ // representations, it should be done so in a manner that allows for
126
+ // older versions to be decoded i.e. the version number in the serialized
127
+ // representation should be used to decide how to decode the data.
128
+ //
129
+ // Returns true on success.
130
+ //
131
+ // bool Decode(Decoder* const decoder);
132
+
133
+ // Provides the same functionality as Decode, except that decoded regions
134
+ // are allowed to point directly into the Decoder's memory buffer rather
135
+ // than copying the data. This method can be much faster for regions that
136
+ // have a lot of data (such as polygons), but the decoded region is only
137
+ // valid within the scope (lifetime) of the Decoder's memory buffer.
138
+ //
139
+ // bool DecodeWithinScope(Decoder* const decoder);
140
+ };
141
+
142
+ #endif // S2_S2REGION_H_
@@ -0,0 +1,514 @@
1
+ // Copyright 2005 Google Inc. All Rights Reserved.
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // http://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS-IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+ //
15
+
16
+ // Author: ericv@google.com (Eric Veach)
17
+
18
+ #include "s2/s2region_coverer.h"
19
+
20
+ #include <algorithm>
21
+ #include <cstddef>
22
+ #include <cstdlib>
23
+ #include <cstring>
24
+ #include <functional>
25
+ #include <queue>
26
+ #include <unordered_set>
27
+ #include <vector>
28
+
29
+ #include "s2/base/logging.h"
30
+ #include "s2/s1angle.h"
31
+ #include "s2/s2cap.h"
32
+ #include "s2/s2cell_union.h"
33
+ #include "s2/s2metrics.h"
34
+ #include "s2/s2region.h"
35
+ #include "s2/third_party/absl/base/casts.h"
36
+
37
+ using std::is_sorted;
38
+ using std::max;
39
+ using std::min;
40
+ using std::unordered_set;
41
+ using std::vector;
42
+
43
+ // Define storage for header file constants (the values are not needed here).
44
+ constexpr int S2RegionCoverer::Options::kDefaultMaxCells;
45
+
46
+ S2RegionCoverer::S2RegionCoverer(const S2RegionCoverer::Options& options) :
47
+ options_(options) {
48
+ S2_DCHECK_LE(options.min_level(), options.max_level());
49
+ }
50
+
51
+ // Defaulted in the implementation to prevent inline bloat.
52
+ S2RegionCoverer::S2RegionCoverer() = default;
53
+ S2RegionCoverer::~S2RegionCoverer() = default;
54
+ S2RegionCoverer::S2RegionCoverer(S2RegionCoverer&&) = default;
55
+ S2RegionCoverer& S2RegionCoverer::operator=(S2RegionCoverer&&) = default;
56
+
57
+ void S2RegionCoverer::Options::set_max_cells(int max_cells) {
58
+ max_cells_ = max_cells;
59
+ }
60
+
61
+ void S2RegionCoverer::Options::set_min_level(int min_level) {
62
+ S2_DCHECK_GE(min_level, 0);
63
+ S2_DCHECK_LE(min_level, S2CellId::kMaxLevel);
64
+ // min_level() <= max_level() is checked by S2RegionCoverer.
65
+ min_level_ = max(0, min(S2CellId::kMaxLevel, min_level));
66
+ }
67
+
68
+ void S2RegionCoverer::Options::set_max_level(int max_level) {
69
+ S2_DCHECK_GE(max_level, 0);
70
+ S2_DCHECK_LE(max_level, S2CellId::kMaxLevel);
71
+ // min_level() <= max_level() is checked by S2RegionCoverer.
72
+ max_level_ = max(0, min(S2CellId::kMaxLevel, max_level));
73
+ }
74
+
75
+ void S2RegionCoverer::Options::set_fixed_level(int level) {
76
+ set_min_level(level);
77
+ set_max_level(level);
78
+ }
79
+
80
+ void S2RegionCoverer::Options::set_level_mod(int level_mod) {
81
+ S2_DCHECK_GE(level_mod, 1);
82
+ S2_DCHECK_LE(level_mod, 3);
83
+ level_mod_ = max(1, min(3, level_mod));
84
+ }
85
+
86
+ int S2RegionCoverer::Options::true_max_level() const {
87
+ if (level_mod_ == 1) return max_level_;
88
+ return max_level_ - (max_level_ - min_level_) % level_mod_;
89
+ }
90
+
91
+ S2RegionCoverer::Candidate* S2RegionCoverer::NewCandidate(const S2Cell& cell) {
92
+ if (!region_->MayIntersect(cell)) return nullptr;
93
+
94
+ bool is_terminal = false;
95
+ if (cell.level() >= options_.min_level()) {
96
+ if (interior_covering_) {
97
+ if (region_->Contains(cell)) {
98
+ is_terminal = true;
99
+ } else if (cell.level() + options_.level_mod() > options_.max_level()) {
100
+ return nullptr;
101
+ }
102
+ } else {
103
+ if (cell.level() + options_.level_mod() > options_.max_level() ||
104
+ region_->Contains(cell)) {
105
+ is_terminal = true;
106
+ }
107
+ }
108
+ }
109
+ ++candidates_created_counter_;
110
+ const std::size_t max_children = is_terminal ? 0 : 1 << max_children_shift();
111
+ return new (max_children) Candidate(cell, max_children);
112
+ }
113
+
114
+ void S2RegionCoverer::DeleteCandidate(Candidate* candidate,
115
+ bool delete_children) {
116
+ if (delete_children) {
117
+ for (int i = 0; i < candidate->num_children; ++i)
118
+ DeleteCandidate(candidate->children[i], true);
119
+ }
120
+ delete candidate;
121
+ }
122
+
123
+ int S2RegionCoverer::ExpandChildren(Candidate* candidate,
124
+ const S2Cell& cell, int num_levels) {
125
+ num_levels--;
126
+ S2Cell child_cells[4];
127
+ cell.Subdivide(child_cells);
128
+ int num_terminals = 0;
129
+ for (int i = 0; i < 4; ++i) {
130
+ if (num_levels > 0) {
131
+ if (region_->MayIntersect(child_cells[i])) {
132
+ num_terminals += ExpandChildren(candidate, child_cells[i], num_levels);
133
+ }
134
+ continue;
135
+ }
136
+ Candidate* child = NewCandidate(child_cells[i]);
137
+ if (child) {
138
+ candidate->children[candidate->num_children++] = child;
139
+ if (child->is_terminal) ++num_terminals;
140
+ }
141
+ }
142
+ return num_terminals;
143
+ }
144
+
145
+ void S2RegionCoverer::AddCandidate(Candidate* candidate) {
146
+ if (candidate == nullptr) return;
147
+
148
+ if (candidate->is_terminal) {
149
+ result_.push_back(candidate->cell.id());
150
+ DeleteCandidate(candidate, true);
151
+ return;
152
+ }
153
+ S2_DCHECK_EQ(0, candidate->num_children);
154
+
155
+ // Expand one level at a time until we hit min_level() to ensure that we
156
+ // don't skip over it.
157
+ int num_levels = ((candidate->cell.level() < options_.min_level()) ?
158
+ 1 : options_.level_mod());
159
+ int num_terminals = ExpandChildren(candidate, candidate->cell, num_levels);
160
+
161
+ if (candidate->num_children == 0) {
162
+ DeleteCandidate(candidate, false);
163
+
164
+ } else if (!interior_covering_ &&
165
+ num_terminals == 1 << max_children_shift() &&
166
+ candidate->cell.level() >= options_.min_level()) {
167
+ // Optimization: add the parent cell rather than all of its children.
168
+ // We can't do this for interior coverings, since the children just
169
+ // intersect the region, but may not be contained by it - we need to
170
+ // subdivide them further.
171
+ candidate->is_terminal = true;
172
+ AddCandidate(candidate);
173
+
174
+ } else {
175
+ // We negate the priority so that smaller absolute priorities are returned
176
+ // first. The heuristic is designed to refine the largest cells first,
177
+ // since those are where we have the largest potential gain. Among cells
178
+ // of the same size, we prefer the cells with the fewest children.
179
+ // Finally, among cells with equal numbers of children we prefer those
180
+ // with the smallest number of children that cannot be refined further.
181
+ int priority = -((((candidate->cell.level() << max_children_shift())
182
+ + candidate->num_children) << max_children_shift())
183
+ + num_terminals);
184
+ pq_.push(std::make_pair(priority, candidate));
185
+ S2_VLOG(2) << "Push: " << candidate->cell.id() << " (" << priority << ") ";
186
+ }
187
+ }
188
+
189
+ inline int S2RegionCoverer::AdjustLevel(int level) const {
190
+ if (options_.level_mod() > 1 && level > options_.min_level()) {
191
+ level -= (level - options_.min_level()) % options_.level_mod();
192
+ }
193
+ return level;
194
+ }
195
+
196
+ void S2RegionCoverer::AdjustCellLevels(vector<S2CellId>* cells) const {
197
+ S2_DCHECK(is_sorted(cells->begin(), cells->end()));
198
+ if (options_.level_mod() == 1) return;
199
+
200
+ int out = 0;
201
+ for (S2CellId id : *cells) {
202
+ int level = id.level();
203
+ int new_level = AdjustLevel(level);
204
+ if (new_level != level) id = id.parent(new_level);
205
+ if (out > 0 && (*cells)[out-1].contains(id)) continue;
206
+ while (out > 0 && id.contains((*cells)[out-1])) --out;
207
+ (*cells)[out++] = id;
208
+ }
209
+ cells->resize(out);
210
+ }
211
+
212
+ void S2RegionCoverer::GetInitialCandidates() {
213
+ // Optimization: start with a small (usually 4 cell) covering of the
214
+ // region's bounding cap.
215
+ S2RegionCoverer tmp_coverer;
216
+ tmp_coverer.mutable_options()->set_max_cells(min(4, options_.max_cells()));
217
+ tmp_coverer.mutable_options()->set_max_level(options_.max_level());
218
+ vector<S2CellId> cells;
219
+ tmp_coverer.GetFastCovering(*region_, &cells);
220
+ AdjustCellLevels(&cells);
221
+ for (S2CellId cell_id : cells) {
222
+ AddCandidate(NewCandidate(S2Cell(cell_id)));
223
+ }
224
+ }
225
+
226
+ void S2RegionCoverer::GetCoveringInternal(const S2Region& region) {
227
+ // We check this on each call because of mutable_options().
228
+ S2_DCHECK_LE(options_.min_level(), options_.max_level());
229
+
230
+ // Strategy: Start with the 6 faces of the cube. Discard any
231
+ // that do not intersect the shape. Then repeatedly choose the
232
+ // largest cell that intersects the shape and subdivide it.
233
+ //
234
+ // result_ contains the cells that will be part of the output, while pq_
235
+ // contains cells that we may still subdivide further. Cells that are
236
+ // entirely contained within the region are immediately added to the output,
237
+ // while cells that do not intersect the region are immediately discarded.
238
+ // Therefore pq_ only contains cells that partially intersect the region.
239
+ // Candidates are prioritized first according to cell size (larger cells
240
+ // first), then by the number of intersecting children they have (fewest
241
+ // children first), and then by the number of fully contained children
242
+ // (fewest children first).
243
+
244
+ S2_DCHECK(pq_.empty());
245
+ S2_DCHECK(result_.empty());
246
+ region_ = &region;
247
+ candidates_created_counter_ = 0;
248
+
249
+ GetInitialCandidates();
250
+ while (!pq_.empty() &&
251
+ (!interior_covering_ || result_.size() < options_.max_cells())) {
252
+ Candidate* candidate = pq_.top().second;
253
+ pq_.pop();
254
+ S2_VLOG(2) << "Pop: " << candidate->cell.id();
255
+ // For interior coverings we keep subdividing no matter how many children
256
+ // the candidate has. If we reach max_cells() before expanding all
257
+ // children, we will just use some of them. For exterior coverings we
258
+ // cannot do this, because the result has to cover the whole region, so
259
+ // all children have to be used. The (candidate->num_children == 1) case
260
+ // takes care of the situation when we already have more than max_cells()
261
+ // in results (min_level is too high). Subdividing the candidate with one
262
+ // child does no harm in this case.
263
+ if (interior_covering_ ||
264
+ candidate->cell.level() < options_.min_level() ||
265
+ candidate->num_children == 1 ||
266
+ (result_.size() + pq_.size() + candidate->num_children <=
267
+ options_.max_cells())) {
268
+ // Expand this candidate into its children.
269
+ for (int i = 0; i < candidate->num_children; ++i) {
270
+ if (interior_covering_ && result_.size() >= options_.max_cells()) {
271
+ DeleteCandidate(candidate->children[i], true);
272
+ } else {
273
+ AddCandidate(candidate->children[i]);
274
+ }
275
+ }
276
+ DeleteCandidate(candidate, false);
277
+ } else {
278
+ candidate->is_terminal = true;
279
+ AddCandidate(candidate);
280
+ }
281
+ }
282
+ S2_VLOG(2) << "Created " << result_.size() << " cells, " <<
283
+ candidates_created_counter_ << " candidates created, " <<
284
+ pq_.size() << " left";
285
+ while (!pq_.empty()) {
286
+ DeleteCandidate(pq_.top().second, true);
287
+ pq_.pop();
288
+ }
289
+ region_ = nullptr;
290
+
291
+ // Rather than just returning the raw list of cell ids, we construct a cell
292
+ // union and then denormalize it. This has the effect of replacing four
293
+ // child cells with their parent whenever this does not violate the covering
294
+ // parameters specified (min_level, level_mod, etc). This significantly
295
+ // reduces the number of cells returned in many cases, and it is cheap
296
+ // compared to computing the covering in the first place.
297
+ S2CellUnion::Normalize(&result_);
298
+ if (options_.min_level() > 0 || options_.level_mod() > 1) {
299
+ auto result_copy = result_;
300
+ S2CellUnion::Denormalize(result_copy, options_.min_level(),
301
+ options_.level_mod(), &result_);
302
+ }
303
+ S2_DCHECK(IsCanonical(result_));
304
+ }
305
+
306
+ void S2RegionCoverer::GetCovering(const S2Region& region,
307
+ vector<S2CellId>* covering) {
308
+ interior_covering_ = false;
309
+ GetCoveringInternal(region);
310
+ *covering = std::move(result_);
311
+ }
312
+
313
+ void S2RegionCoverer::GetInteriorCovering(const S2Region& region,
314
+ vector<S2CellId>* interior) {
315
+ interior_covering_ = true;
316
+ GetCoveringInternal(region);
317
+ *interior = std::move(result_);
318
+ }
319
+
320
+ S2CellUnion S2RegionCoverer::GetCovering(const S2Region& region) {
321
+ interior_covering_ = false;
322
+ GetCoveringInternal(region);
323
+ return S2CellUnion::FromVerbatim(std::move(result_));
324
+ }
325
+
326
+ S2CellUnion S2RegionCoverer::GetInteriorCovering(const S2Region& region) {
327
+ interior_covering_ = true;
328
+ GetCoveringInternal(region);
329
+ return S2CellUnion::FromVerbatim(std::move(result_));
330
+ }
331
+
332
+ void S2RegionCoverer::GetFastCovering(const S2Region& region,
333
+ vector<S2CellId>* covering) {
334
+ region.GetCellUnionBound(covering);
335
+ CanonicalizeCovering(covering);
336
+ }
337
+
338
+ bool S2RegionCoverer::IsCanonical(const S2CellUnion& covering) const {
339
+ return IsCanonical(covering.cell_ids());
340
+ }
341
+
342
+ bool S2RegionCoverer::IsCanonical(const vector<S2CellId>& covering) const {
343
+ // We check this on each call because of mutable_options().
344
+ S2_DCHECK_LE(options_.min_level(), options_.max_level());
345
+
346
+ const int min_level = options_.min_level();
347
+ const int max_level = options_.true_max_level();
348
+ const int level_mod = options_.level_mod();
349
+ const bool too_many_cells = covering.size() > options_.max_cells();
350
+ int same_parent_count = 1;
351
+ S2CellId prev_id = S2CellId::None();
352
+ for (const S2CellId id : covering) {
353
+ if (!id.is_valid()) return false;
354
+
355
+ // Check that the S2CellId level is acceptable.
356
+ const int level = id.level();
357
+ if (level < min_level || level > max_level) return false;
358
+ if (level_mod > 1 && (level - min_level) % level_mod != 0) return false;
359
+
360
+ if (prev_id != S2CellId::None()) {
361
+ // Check that cells are sorted and non-overlapping.
362
+ if (prev_id.range_max() >= id.range_min()) return false;
363
+
364
+ // If there are too many cells, check that no pair of adjacent cells
365
+ // could be replaced by an ancestor.
366
+ if (too_many_cells && id.GetCommonAncestorLevel(prev_id) >= min_level) {
367
+ return false;
368
+ }
369
+
370
+ // Check that there are no sequences of (4 ** level_mod) cells that all
371
+ // have the same parent (considering only multiples of "level_mod").
372
+ int plevel = level - level_mod;
373
+ if (plevel < min_level || level != prev_id.level() ||
374
+ id.parent(plevel) != prev_id.parent(plevel)) {
375
+ same_parent_count = 1;
376
+ } else if (++same_parent_count == (1 << (2 * level_mod))) {
377
+ return false;
378
+ }
379
+ }
380
+ prev_id = id;
381
+ }
382
+ return true;
383
+ }
384
+
385
+ bool S2RegionCoverer::ContainsAllChildren(const vector<S2CellId>& covering,
386
+ S2CellId id) const {
387
+ auto it = std::lower_bound(covering.begin(), covering.end(), id.range_min());
388
+ int level = id.level() + options_.level_mod();
389
+ for (S2CellId child = id.child_begin(level);
390
+ child != id.child_end(level); ++it, child = child.next()) {
391
+ if (it == covering.end() || *it != child) return false;
392
+ }
393
+ return true;
394
+ }
395
+
396
+ // Replaces all descendants of "id" in "covering" with "id".
397
+ // REQUIRES: "covering" contains at least one descendant of "id".
398
+ void S2RegionCoverer::ReplaceCellsWithAncestor(vector<S2CellId>* covering,
399
+ S2CellId id) const {
400
+ auto begin = std::lower_bound(covering->begin(), covering->end(),
401
+ id.range_min());
402
+ auto end = std::upper_bound(covering->begin(), covering->end(),
403
+ id.range_max());
404
+ S2_DCHECK(begin != end);
405
+ covering->erase(begin + 1, end);
406
+ *begin = id;
407
+ }
408
+
409
+ S2CellUnion S2RegionCoverer::CanonicalizeCovering(const S2CellUnion& covering) {
410
+ vector<S2CellId> ids = covering.cell_ids();
411
+ CanonicalizeCovering(&ids);
412
+ return S2CellUnion(std::move(ids));
413
+ }
414
+
415
+ void S2RegionCoverer::CanonicalizeCovering(vector<S2CellId>* covering) {
416
+ // We check this on each call because of mutable_options().
417
+ S2_DCHECK_LE(options_.min_level(), options_.max_level());
418
+
419
+ // Note that when the covering parameters have their default values, almost
420
+ // all of the code in this function is skipped.
421
+
422
+ // If any cells are too small, or don't satisfy level_mod(), then replace
423
+ // them with ancestors.
424
+ if (options_.max_level() < S2CellId::kMaxLevel || options_.level_mod() > 1) {
425
+ for (S2CellId& id : *covering) {
426
+ int level = id.level();
427
+ int new_level = AdjustLevel(min(level, options_.max_level()));
428
+ if (new_level != level) {
429
+ id = id.parent(new_level);
430
+ }
431
+ }
432
+ }
433
+
434
+ // Sort the cells and simplify them.
435
+ S2CellUnion::Normalize(covering);
436
+
437
+ // Make sure that the covering satisfies min_level() and level_mod(),
438
+ // possibly at the expense of satisfying max_cells().
439
+ if (options_.min_level() > 0 || options_.level_mod() > 1) {
440
+ S2CellUnion::Denormalize(*covering, options_.min_level(),
441
+ options_.level_mod(), &result_);
442
+ *covering = std::move(result_);
443
+ }
444
+
445
+ // If there are too many cells and the covering is very large, use the
446
+ // S2RegionCoverer to compute a new covering. (This avoids possible O(n^2)
447
+ // behavior of the simpler algorithm below.)
448
+ int64 excess = covering->size() - options_.max_cells();
449
+ if (excess <= 0 || IsCanonical(*covering)) {
450
+ return;
451
+ }
452
+ if (excess * covering->size() > 10000) {
453
+ GetCovering(S2CellUnion(std::move(*covering)), covering);
454
+ } else {
455
+ // Repeatedly replace two adjacent cells in S2CellId order by their lowest
456
+ // common ancestor until the number of cells is acceptable.
457
+ while (covering->size() > options_.max_cells()) {
458
+ int best_index = -1, best_level = -1;
459
+ for (int i = 0; i + 1 < covering->size(); ++i) {
460
+ int level = (*covering)[i].GetCommonAncestorLevel((*covering)[i+1]);
461
+ level = AdjustLevel(level);
462
+ if (level > best_level) {
463
+ best_level = level;
464
+ best_index = i;
465
+ }
466
+ }
467
+ if (best_level < options_.min_level()) break;
468
+
469
+ // Replace all cells contained by the new ancestor cell.
470
+ S2CellId id = (*covering)[best_index].parent(best_level);
471
+ ReplaceCellsWithAncestor(covering, id);
472
+
473
+ // Now repeatedly check whether all children of the parent cell are
474
+ // present, in which case we can replace those cells with their parent.
475
+ while (best_level > options_.min_level()) {
476
+ best_level -= options_.level_mod();
477
+ id = id.parent(best_level);
478
+ if (!ContainsAllChildren(*covering, id)) break;
479
+ ReplaceCellsWithAncestor(covering, id);
480
+ }
481
+ }
482
+ }
483
+ S2_DCHECK(IsCanonical(*covering));
484
+ }
485
+
486
+ void S2RegionCoverer::FloodFill(const S2Region& region, S2CellId start,
487
+ vector<S2CellId>* output) {
488
+ unordered_set<S2CellId, S2CellIdHash> all;
489
+ vector<S2CellId> frontier;
490
+ output->clear();
491
+ all.insert(start);
492
+ frontier.push_back(start);
493
+ while (!frontier.empty()) {
494
+ S2CellId id = frontier.back();
495
+ frontier.pop_back();
496
+ if (!region.MayIntersect(S2Cell(id))) continue;
497
+ output->push_back(id);
498
+
499
+ S2CellId neighbors[4];
500
+ id.GetEdgeNeighbors(neighbors);
501
+ for (int edge = 0; edge < 4; ++edge) {
502
+ S2CellId nbr = neighbors[edge];
503
+ if (all.insert(nbr).second) {
504
+ frontier.push_back(nbr);
505
+ }
506
+ }
507
+ }
508
+ }
509
+
510
+ void S2RegionCoverer::GetSimpleCovering(
511
+ const S2Region& region, const S2Point& start,
512
+ int level, vector<S2CellId>* output) {
513
+ return FloodFill(region, S2CellId(start).parent(level), output);
514
+ }