@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,515 @@
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/s2cell_union.h"
19
+
20
+ #include <algorithm>
21
+ #include <vector>
22
+
23
+ #include "s2/base/integral_types.h"
24
+ #include "s2/base/logging.h"
25
+ #include "s2/s1angle.h"
26
+ #include "s2/s2cap.h"
27
+ #include "s2/s2cell.h"
28
+ #include "s2/s2cell_id.h"
29
+ #include "s2/s2latlng_rect.h"
30
+ #include "s2/s2metrics.h"
31
+ #include "s2/util/coding/coder.h"
32
+
33
+ using std::is_sorted;
34
+ using std::max;
35
+ using std::min;
36
+ using std::vector;
37
+
38
+ S2_DEFINE_int32(s2cell_union_decode_max_num_cells, 1000000,
39
+ "The maximum number of cells allowed by S2CellUnion::Decode");
40
+
41
+ static const unsigned char kCurrentLosslessEncodingVersionNumber = 1;
42
+
43
+ vector<S2CellId> S2CellUnion::ToS2CellIds(const vector<uint64>& ids) {
44
+ vector<S2CellId> cell_ids;
45
+ cell_ids.reserve(ids.size());
46
+ for (auto id : ids) cell_ids.push_back(S2CellId(id));
47
+ return cell_ids;
48
+ }
49
+
50
+ S2CellUnion::S2CellUnion(const vector<uint64>& cell_ids)
51
+ : cell_ids_(ToS2CellIds(cell_ids)) {
52
+ Normalize();
53
+ }
54
+
55
+ S2CellUnion S2CellUnion::WholeSphere() {
56
+ return S2CellUnion({S2CellId::FromFace(0), S2CellId::FromFace(1),
57
+ S2CellId::FromFace(2), S2CellId::FromFace(3),
58
+ S2CellId::FromFace(4), S2CellId::FromFace(5)});
59
+ }
60
+
61
+ S2CellUnion S2CellUnion::FromMinMax(S2CellId min_id, S2CellId max_id) {
62
+ S2CellUnion result;
63
+ result.InitFromMinMax(min_id, max_id);
64
+ return result;
65
+ }
66
+
67
+ S2CellUnion S2CellUnion::FromBeginEnd(S2CellId begin, S2CellId end) {
68
+ S2CellUnion result;
69
+ result.InitFromBeginEnd(begin, end);
70
+ return result;
71
+ }
72
+
73
+ void S2CellUnion::Init(const vector<uint64>& cell_ids) {
74
+ cell_ids_ = ToS2CellIds(cell_ids);
75
+ Normalize();
76
+ }
77
+
78
+ void S2CellUnion::InitFromMinMax(S2CellId min_id, S2CellId max_id) {
79
+ S2_DCHECK(max_id.is_valid());
80
+ InitFromBeginEnd(min_id, max_id.next());
81
+ }
82
+
83
+ void S2CellUnion::InitFromBeginEnd(S2CellId begin, S2CellId end) {
84
+ S2_DCHECK(begin.is_leaf());
85
+ S2_DCHECK(end.is_leaf());
86
+ S2_DCHECK_LE(begin, end);
87
+
88
+ // We repeatedly add the largest cell we can.
89
+ cell_ids_.clear();
90
+ for (S2CellId id = begin.maximum_tile(end);
91
+ id != end; id = id.next().maximum_tile(end)) {
92
+ cell_ids_.push_back(id);
93
+ }
94
+ // The output is already normalized.
95
+ S2_DCHECK(IsNormalized());
96
+ }
97
+
98
+ void S2CellUnion::Pack(int excess) {
99
+ if (cell_ids_.capacity() - cell_ids_.size() > excess) {
100
+ cell_ids_.shrink_to_fit();
101
+ }
102
+ }
103
+
104
+ S2CellUnion* S2CellUnion::Clone() const {
105
+ return new S2CellUnion(cell_ids_, VERBATIM);
106
+ }
107
+
108
+ // Returns true if the given four cells have a common parent.
109
+ // REQUIRES: The four cells are distinct.
110
+ inline static bool AreSiblings(S2CellId a, S2CellId b, S2CellId c, S2CellId d) {
111
+ // A necessary (but not sufficient) condition is that the XOR of the
112
+ // four cells must be zero. This is also very fast to test.
113
+ if ((a.id() ^ b.id() ^ c.id()) != d.id()) return false;
114
+
115
+ // Now we do a slightly more expensive but exact test. First, compute a
116
+ // mask that blocks out the two bits that encode the child position of
117
+ // "id" with respect to its parent, then check that the other three
118
+ // children all agree with "mask".
119
+ uint64 mask = d.lsb() << 1;
120
+ mask = ~(mask + (mask << 1));
121
+ uint64 id_masked = (d.id() & mask);
122
+ return ((a.id() & mask) == id_masked &&
123
+ (b.id() & mask) == id_masked &&
124
+ (c.id() & mask) == id_masked &&
125
+ !d.is_face());
126
+ }
127
+
128
+ bool S2CellUnion::IsValid() const {
129
+ if (num_cells() > 0 && !cell_id(0).is_valid()) return false;
130
+ for (int i = 1; i < num_cells(); ++i) {
131
+ if (!cell_id(i).is_valid()) return false;
132
+ if (cell_id(i - 1).range_max() >= cell_id(i).range_min()) return false;
133
+ }
134
+ return true;
135
+ }
136
+
137
+ bool S2CellUnion::IsNormalized() const {
138
+ if (num_cells() > 0 && !cell_id(0).is_valid()) return false;
139
+ for (int i = 1; i < num_cells(); ++i) {
140
+ if (!cell_id(i).is_valid()) return false;
141
+ if (cell_id(i - 1).range_max() >= cell_id(i).range_min()) return false;
142
+ if (i >= 3 && AreSiblings(cell_id(i - 3), cell_id(i - 2),
143
+ cell_id(i - 1), cell_id(i))) {
144
+ return false;
145
+ }
146
+ }
147
+ return true;
148
+ }
149
+
150
+ bool S2CellUnion::Normalize() {
151
+ return Normalize(&cell_ids_);
152
+ }
153
+
154
+ /*static*/ bool S2CellUnion::Normalize(vector<S2CellId>* ids) {
155
+ // Optimize the representation by discarding cells contained by other cells,
156
+ // and looking for cases where all subcells of a parent cell are present.
157
+
158
+ std::sort(ids->begin(), ids->end());
159
+ int out = 0;
160
+ for (S2CellId id : *ids) {
161
+ // Check whether this cell is contained by the previous cell.
162
+ if (out > 0 && (*ids)[out-1].contains(id)) continue;
163
+
164
+ // Discard any previous cells contained by this cell.
165
+ while (out > 0 && id.contains((*ids)[out-1])) --out;
166
+
167
+ // Check whether the last 3 elements plus "id" can be collapsed into a
168
+ // single parent cell.
169
+ while (out >= 3 && AreSiblings((*ids)[out - 3], (*ids)[out - 2],
170
+ (*ids)[out - 1], id)) {
171
+ // Replace four children by their parent cell.
172
+ id = id.parent();
173
+ out -= 3;
174
+ }
175
+ (*ids)[out++] = id;
176
+ }
177
+ if (ids->size() == out) return false;
178
+ ids->resize(out);
179
+ return true;
180
+ }
181
+
182
+ void S2CellUnion::Denormalize(int min_level, int level_mod,
183
+ vector<S2CellId>* out) const {
184
+ Denormalize(cell_ids_, min_level, level_mod, out);
185
+ }
186
+
187
+ void S2CellUnion::Denormalize(const vector<S2CellId>& in,
188
+ int min_level, int level_mod,
189
+ vector<S2CellId>* out) {
190
+ S2_DCHECK_GE(min_level, 0);
191
+ S2_DCHECK_LE(min_level, S2CellId::kMaxLevel);
192
+ S2_DCHECK_GE(level_mod, 1);
193
+ S2_DCHECK_LE(level_mod, 3);
194
+ S2_DCHECK_NE(out, &in);
195
+
196
+ out->clear();
197
+ out->reserve(in.size());
198
+ for (S2CellId id : in) {
199
+ int level = id.level();
200
+ int new_level = max(min_level, level);
201
+ if (level_mod > 1) {
202
+ // Round up so that (new_level - min_level) is a multiple of level_mod.
203
+ // (Note that S2CellId::kMaxLevel is a multiple of 1, 2, and 3.)
204
+ new_level += (S2CellId::kMaxLevel - (new_level - min_level)) % level_mod;
205
+ new_level = min(S2CellId::kMaxLevel, new_level);
206
+ }
207
+ if (new_level == level) {
208
+ out->push_back(id);
209
+ } else {
210
+ S2CellId end = id.child_end(new_level);
211
+ for (id = id.child_begin(new_level); id != end; id = id.next()) {
212
+ out->push_back(id);
213
+ }
214
+ }
215
+ }
216
+ }
217
+
218
+ S2Cap S2CellUnion::GetCapBound() const {
219
+ // Compute the approximate centroid of the region. This won't produce the
220
+ // bounding cap of minimal area, but it should be close enough.
221
+ if (cell_ids_.empty()) return S2Cap::Empty();
222
+ S2Point centroid(0, 0, 0);
223
+ for (S2CellId id : *this) {
224
+ double area = S2Cell::AverageArea(id.level());
225
+ centroid += area * id.ToPoint();
226
+ }
227
+ if (centroid == S2Point(0, 0, 0)) {
228
+ centroid = S2Point(1, 0, 0);
229
+ } else {
230
+ centroid = centroid.Normalize();
231
+ }
232
+
233
+ // Use the centroid as the cap axis, and expand the cap angle so that it
234
+ // contains the bounding caps of all the individual cells. Note that it is
235
+ // *not* sufficient to just bound all the cell vertices because the bounding
236
+ // cap may be concave (i.e. cover more than one hemisphere).
237
+ S2Cap cap = S2Cap::FromPoint(centroid);
238
+ for (S2CellId id : *this) {
239
+ cap.AddCap(S2Cell(id).GetCapBound());
240
+ }
241
+ return cap;
242
+ }
243
+
244
+ S2LatLngRect S2CellUnion::GetRectBound() const {
245
+ S2LatLngRect bound = S2LatLngRect::Empty();
246
+ for (S2CellId id : *this) {
247
+ bound = bound.Union(S2Cell(id).GetRectBound());
248
+ }
249
+ return bound;
250
+ }
251
+
252
+ bool S2CellUnion::Contains(S2CellId id) const {
253
+ // This is an exact test. Each cell occupies a linear span of the S2
254
+ // space-filling curve, and the cell id is simply the position at the center
255
+ // of this span. The cell union ids are sorted in increasing order along
256
+ // the space-filling curve. So we simply find the pair of cell ids that
257
+ // surround the given cell id (using binary search). There is containment
258
+ // if and only if one of these two cell ids contains this cell.
259
+
260
+ vector<S2CellId>::const_iterator i =
261
+ std::lower_bound(cell_ids_.begin(), cell_ids_.end(), id);
262
+ if (i != cell_ids_.end() && i->range_min() <= id) return true;
263
+ return i != cell_ids_.begin() && (--i)->range_max() >= id;
264
+ }
265
+
266
+ bool S2CellUnion::Intersects(S2CellId id) const {
267
+ // This is an exact test; see the comments for Contains() above.
268
+
269
+ vector<S2CellId>::const_iterator i =
270
+ std::lower_bound(cell_ids_.begin(), cell_ids_.end(), id);
271
+ if (i != cell_ids_.end() && i->range_min() <= id.range_max()) return true;
272
+ return i != cell_ids_.begin() && (--i)->range_max() >= id.range_min();
273
+ }
274
+
275
+ bool S2CellUnion::Contains(const S2CellUnion& y) const {
276
+ // TODO(ericv): A divide-and-conquer or alternating-skip-search
277
+ // approach may be sigificantly faster in both the average and worst case.
278
+
279
+ for (S2CellId y_id : y) {
280
+ if (!Contains(y_id)) return false;
281
+ }
282
+ return true;
283
+ }
284
+
285
+ bool S2CellUnion::Intersects(const S2CellUnion& y) const {
286
+ // TODO(ericv): A divide-and-conquer or alternating-skip-search
287
+ // approach may be sigificantly faster in both the average and worst case.
288
+
289
+ for (S2CellId y_id : y) {
290
+ if (Intersects(y_id)) return true;
291
+ }
292
+ return false;
293
+ }
294
+
295
+ S2CellUnion S2CellUnion::Union(const S2CellUnion& y) const {
296
+ vector<S2CellId> cell_ids;
297
+ cell_ids.reserve(num_cells() + y.num_cells());
298
+ cell_ids = cell_ids_;
299
+ cell_ids.insert(cell_ids.end(), y.cell_ids_.begin(), y.cell_ids_.end());
300
+ return S2CellUnion(std::move(cell_ids));
301
+ }
302
+
303
+ S2CellUnion S2CellUnion::Intersection(S2CellId id) const {
304
+ S2CellUnion result;
305
+ if (Contains(id)) {
306
+ result.cell_ids_.push_back(id);
307
+ } else {
308
+ vector<S2CellId>::const_iterator i = std::lower_bound(
309
+ cell_ids_.begin(), cell_ids_.end(), id.range_min());
310
+ S2CellId id_max = id.range_max();
311
+ while (i != cell_ids_.end() && *i <= id_max)
312
+ result.cell_ids_.push_back(*i++);
313
+ }
314
+ S2_DCHECK(result.IsNormalized() || !IsNormalized());
315
+ return result;
316
+ }
317
+
318
+ S2CellUnion S2CellUnion::Intersection(const S2CellUnion& y) const {
319
+ S2CellUnion result;
320
+ GetIntersection(cell_ids_, y.cell_ids_, &result.cell_ids_);
321
+ // The output is normalized as long as at least one input is normalized.
322
+ S2_DCHECK(result.IsNormalized() || (!IsNormalized() && !y.IsNormalized()));
323
+ return result;
324
+ }
325
+
326
+ /*static*/ void S2CellUnion::GetIntersection(const vector<S2CellId>& x,
327
+ const vector<S2CellId>& y,
328
+ vector<S2CellId>* out) {
329
+ S2_DCHECK_NE(out, &x);
330
+ S2_DCHECK_NE(out, &y);
331
+ S2_DCHECK(is_sorted(x.begin(), x.end()));
332
+ S2_DCHECK(is_sorted(y.begin(), y.end()));
333
+
334
+ // This is a fairly efficient calculation that uses binary search to skip
335
+ // over sections of both input vectors. It takes logarithmic time if all the
336
+ // cells of "x" come before or after all the cells of "y" in S2CellId order.
337
+
338
+ out->clear();
339
+ vector<S2CellId>::const_iterator i = x.begin();
340
+ vector<S2CellId>::const_iterator j = y.begin();
341
+ while (i != x.end() && j != y.end()) {
342
+ S2CellId imin = i->range_min();
343
+ S2CellId jmin = j->range_min();
344
+ if (imin > jmin) {
345
+ // Either j->contains(*i) or the two cells are disjoint.
346
+ if (*i <= j->range_max()) {
347
+ out->push_back(*i++);
348
+ } else {
349
+ // Advance "j" to the first cell possibly contained by *i.
350
+ j = std::lower_bound(j + 1, y.end(), imin);
351
+ // The previous cell *(j-1) may now contain *i.
352
+ if (*i <= (j - 1)->range_max()) --j;
353
+ }
354
+ } else if (jmin > imin) {
355
+ // Identical to the code above with "i" and "j" reversed.
356
+ if (*j <= i->range_max()) {
357
+ out->push_back(*j++);
358
+ } else {
359
+ i = std::lower_bound(i + 1, x.end(), jmin);
360
+ if (*j <= (i - 1)->range_max()) --i;
361
+ }
362
+ } else {
363
+ // "i" and "j" have the same range_min(), so one contains the other.
364
+ if (*i < *j)
365
+ out->push_back(*i++);
366
+ else
367
+ out->push_back(*j++);
368
+ }
369
+ }
370
+ // The output is generated in sorted order.
371
+ S2_DCHECK(is_sorted(out->begin(), out->end()));
372
+ }
373
+
374
+ static void GetDifferenceInternal(S2CellId cell,
375
+ const S2CellUnion& y,
376
+ vector<S2CellId>* cell_ids) {
377
+ // Add the difference between cell and y to cell_ids.
378
+ // If they intersect but the difference is non-empty, divide and conquer.
379
+ if (!y.Intersects(cell)) {
380
+ cell_ids->push_back(cell);
381
+ } else if (!y.Contains(cell)) {
382
+ S2CellId child = cell.child_begin();
383
+ for (int i = 0; ; ++i) {
384
+ GetDifferenceInternal(child, y, cell_ids);
385
+ if (i == 3) break; // Avoid unnecessary next() computation.
386
+ child = child.next();
387
+ }
388
+ }
389
+ }
390
+
391
+ S2CellUnion S2CellUnion::Difference(const S2CellUnion& y) const {
392
+ // TODO(ericv): this is approximately O(N*log(N)), but could probably
393
+ // use similar techniques as GetIntersection() to be more efficient.
394
+
395
+ S2CellUnion result;
396
+ for (S2CellId id : *this) {
397
+ GetDifferenceInternal(id, y, &result.cell_ids_);
398
+ }
399
+ // The output is normalized as long as the first argument is normalized.
400
+ S2_DCHECK(result.IsNormalized() || !IsNormalized());
401
+ return result;
402
+ }
403
+
404
+ void S2CellUnion::Expand(int expand_level) {
405
+ vector<S2CellId> output;
406
+ uint64 level_lsb = S2CellId::lsb_for_level(expand_level);
407
+ for (int i = num_cells(); --i >= 0; ) {
408
+ S2CellId id = cell_id(i);
409
+ if (id.lsb() < level_lsb) {
410
+ id = id.parent(expand_level);
411
+ // Optimization: skip over any cells contained by this one. This is
412
+ // especially important when very small regions are being expanded.
413
+ while (i > 0 && id.contains(cell_id(i - 1))) --i;
414
+ }
415
+ output.push_back(id);
416
+ id.AppendAllNeighbors(expand_level, &output);
417
+ }
418
+ Init(std::move(output));
419
+ }
420
+
421
+ void S2CellUnion::Expand(S1Angle min_radius, int max_level_diff) {
422
+ int min_level = S2CellId::kMaxLevel;
423
+ for (S2CellId id : *this) {
424
+ min_level = min(min_level, id.level());
425
+ }
426
+ // Find the maximum level such that all cells are at least "min_radius" wide.
427
+ int radius_level = S2::kMinWidth.GetLevelForMinValue(min_radius.radians());
428
+ if (radius_level == 0 && min_radius.radians() > S2::kMinWidth.GetValue(0)) {
429
+ // The requested expansion is greater than the width of a face cell.
430
+ // The easiest way to handle this is to expand twice.
431
+ Expand(0);
432
+ }
433
+ Expand(min(min_level + max_level_diff, radius_level));
434
+ }
435
+
436
+ uint64 S2CellUnion::LeafCellsCovered() const {
437
+ uint64 num_leaves = 0;
438
+ for (S2CellId id : *this) {
439
+ const int inverted_level = S2CellId::kMaxLevel - id.level();
440
+ num_leaves += (1ULL << (inverted_level << 1));
441
+ }
442
+ return num_leaves;
443
+ }
444
+
445
+ double S2CellUnion::AverageBasedArea() const {
446
+ return S2Cell::AverageArea(S2CellId::kMaxLevel) * LeafCellsCovered();
447
+ }
448
+
449
+ double S2CellUnion::ApproxArea() const {
450
+ double area = 0;
451
+ for (S2CellId id : *this) {
452
+ area += S2Cell(id).ApproxArea();
453
+ }
454
+ return area;
455
+ }
456
+
457
+ double S2CellUnion::ExactArea() const {
458
+ double area = 0;
459
+ for (S2CellId id : *this) {
460
+ area += S2Cell(id).ExactArea();
461
+ }
462
+ return area;
463
+ }
464
+
465
+ bool operator==(const S2CellUnion& x, const S2CellUnion& y) {
466
+ return x.cell_ids() == y.cell_ids();
467
+ }
468
+
469
+ bool operator!=(const S2CellUnion& x, const S2CellUnion& y) {
470
+ return x.cell_ids() != y.cell_ids();
471
+ }
472
+
473
+ bool S2CellUnion::Contains(const S2Cell& cell) const {
474
+ return Contains(cell.id());
475
+ }
476
+
477
+ bool S2CellUnion::MayIntersect(const S2Cell& cell) const {
478
+ return Intersects(cell.id());
479
+ }
480
+
481
+ void S2CellUnion::Encode(Encoder* const encoder) const {
482
+ // Unsigned char for version number, and N+1 uint64's for N cell_ids
483
+ // (1 for vector length, N for the ids).
484
+ encoder->Ensure(sizeof(unsigned char) +
485
+ sizeof(uint64) * (1 + cell_ids_.size()));
486
+
487
+ encoder->put8(kCurrentLosslessEncodingVersionNumber);
488
+ encoder->put64(uint64{cell_ids_.size()});
489
+ for (const S2CellId& cell_id : cell_ids_) {
490
+ cell_id.Encode(encoder);
491
+ }
492
+ }
493
+
494
+ bool S2CellUnion::Decode(Decoder* const decoder) {
495
+ // Should contain at least version and vector length.
496
+ if (decoder->avail() < sizeof(unsigned char) + sizeof(uint64)) return false;
497
+ unsigned char version = decoder->get8();
498
+ if (version > kCurrentLosslessEncodingVersionNumber) return false;
499
+
500
+ uint64 num_cells = decoder->get64();
501
+ if (num_cells > FLAGS_s2cell_union_decode_max_num_cells) {
502
+ return false;
503
+ }
504
+
505
+ vector<S2CellId> temp_cell_ids(num_cells);
506
+ for (int i = 0; i < num_cells; ++i) {
507
+ if (!temp_cell_ids[i].Decode(decoder)) return false;
508
+ }
509
+ cell_ids_.swap(temp_cell_ids);
510
+ return true;
511
+ }
512
+
513
+ bool S2CellUnion::Contains(const S2Point& p) const {
514
+ return Contains(S2CellId(p));
515
+ }