@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,600 @@
1
+ // Copyright 2012 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_MUTABLE_S2SHAPE_INDEX_H_
19
+ #define S2_MUTABLE_S2SHAPE_INDEX_H_
20
+
21
+ #include <array>
22
+ #include <atomic>
23
+ #include <cstddef>
24
+ #include <memory>
25
+ #include <utility>
26
+ #include <vector>
27
+
28
+
29
+ #include "s2/base/integral_types.h"
30
+ #include "s2/base/logging.h"
31
+ #include "s2/base/mutex.h"
32
+ #include "s2/base/spinlock.h"
33
+ #include "s2/_fp_contract_off.h"
34
+ #include "s2/s2cell_id.h"
35
+ #include "s2/s2pointutil.h"
36
+ #include "s2/s2shape.h"
37
+ #include "s2/s2shape_index.h"
38
+ #include "s2/third_party/absl/base/macros.h"
39
+ #include "s2/third_party/absl/base/thread_annotations.h"
40
+ #include "s2/third_party/absl/memory/memory.h"
41
+ #include "s2/util/gtl/btree_map.h"
42
+
43
+ // MutableS2ShapeIndex is a class for in-memory indexing of polygonal geometry.
44
+ // The objects in the index are known as "shapes", and may consist of points,
45
+ // polylines, and/or polygons, possibly overlapping. The index makes it very
46
+ // fast to answer queries such as finding nearby shapes, measuring distances,
47
+ // testing for intersection and containment, etc.
48
+ //
49
+ // MutableS2ShapeIndex allows not only building an index, but also updating it
50
+ // incrementally by adding or removing shapes (hence its name). It is one of
51
+ // several implementations of the S2ShapeIndex interface. MutableS2ShapeIndex
52
+ // is designed to be compact; usually it is smaller than the underlying
53
+ // geometry being indexed. It is capable of indexing up to hundreds of
54
+ // millions of edges. The index is also fast to construct.
55
+ //
56
+ // There are a number of built-in classes that work with S2ShapeIndex objects.
57
+ // Generally these classes accept any collection of geometry that can be
58
+ // represented by an S2ShapeIndex, i.e. any combination of points, polylines,
59
+ // and polygons. Such classes include:
60
+ //
61
+ // - S2ContainsPointQuery: returns the shape(s) that contain a given point.
62
+ //
63
+ // - S2ClosestEdgeQuery: returns the closest edge(s) to a given point, edge,
64
+ // S2CellId, or S2ShapeIndex.
65
+ //
66
+ // - S2CrossingEdgeQuery: returns the edge(s) that cross a given edge.
67
+ //
68
+ // - S2BooleanOperation: computes boolean operations such as union,
69
+ // and boolean predicates such as containment.
70
+ //
71
+ // - S2ShapeIndexRegion: computes approximations for a collection of geometry.
72
+ //
73
+ // - S2ShapeIndexBufferedRegion: computes approximations that have been
74
+ // expanded by a given radius.
75
+ //
76
+ // Here is an example showing how to build an index for a set of polygons, and
77
+ // then then determine which polygon(s) contain each of a set of query points:
78
+ //
79
+ // void TestContainment(const vector<S2Point>& points,
80
+ // const vector<S2Polygon*>& polygons) {
81
+ // MutableS2ShapeIndex index;
82
+ // for (auto polygon : polygons) {
83
+ // index.Add(absl::make_unique<S2Polygon::Shape>(polygon));
84
+ // }
85
+ // auto query = MakeS2ContainsPointQuery(&index);
86
+ // for (const auto& point : points) {
87
+ // for (S2Shape* shape : query.GetContainingShapes(point)) {
88
+ // S2Polygon* polygon = polygons[shape->id()];
89
+ // ... do something with (point, polygon) ...
90
+ // }
91
+ // }
92
+ // }
93
+ //
94
+ // This example uses S2Polygon::Shape, which is one example of an S2Shape
95
+ // object. S2Polyline and S2Loop also have nested Shape classes, and there are
96
+ // additional S2Shape types defined in *_shape.h.
97
+ //
98
+ // Internally, MutableS2ShapeIndex is essentially a map from S2CellIds to the
99
+ // set of shapes that intersect each S2CellId. It is adaptively refined to
100
+ // ensure that no cell contains more than a small number of edges.
101
+ //
102
+ // For efficiency, updates are batched together and applied lazily on the
103
+ // first subsequent query. Locking is used to ensure that MutableS2ShapeIndex
104
+ // has the same thread-safety properties as "vector": const methods are
105
+ // thread-safe, while non-const methods are not thread-safe. This means that
106
+ // if one thread updates the index, you must ensure that no other thread is
107
+ // reading or updating the index at the same time.
108
+ //
109
+ // TODO(ericv): MutableS2ShapeIndex has an Encode() method that allows the
110
+ // index to be serialized. An encoded S2ShapeIndex can be decoded either into
111
+ // its original form (MutableS2ShapeIndex) or into an EncodedS2ShapeIndex.
112
+ // The key property of EncodedS2ShapeIndex is that it can be constructed
113
+ // instantaneously, since the index is kept in its original encoded form.
114
+ // Data is decoded only when an operation needs it. For example, to determine
115
+ // which shapes(s) contain a given query point only requires decoding the data
116
+ // in the S2ShapeIndexCell that contains that point.
117
+ class MutableS2ShapeIndex final : public S2ShapeIndex {
118
+ private:
119
+ using CellMap = gtl::btree_map<S2CellId, S2ShapeIndexCell*>;
120
+
121
+ public:
122
+ // Options that affect construction of the MutableS2ShapeIndex.
123
+ class Options {
124
+ public:
125
+ Options();
126
+
127
+ // The maximum number of edges per cell. If a cell has more than this
128
+ // many edges that are not considered "long" relative to the cell size,
129
+ // then it is subdivided. (Whether an edge is considered "long" is
130
+ // controlled by --s2shape_index_cell_size_to_long_edge_ratio flag.)
131
+ //
132
+ // Values between 10 and 50 represent a reasonable balance between memory
133
+ // usage, construction time, and query time. Small values make queries
134
+ // faster, while large values make construction faster and use less memory.
135
+ // Values higher than 50 do not save significant additional memory, and
136
+ // query times can increase substantially, especially for algorithms that
137
+ // visit all pairs of potentially intersecting edges (such as polygon
138
+ // validation), since this is quadratic in the number of edges per cell.
139
+ //
140
+ // Note that the *average* number of edges per cell is generally slightly
141
+ // less than half of the maximum value defined here.
142
+ //
143
+ // Defaults to value given by --s2shape_index_default_max_edges_per_cell.
144
+ int max_edges_per_cell() const { return max_edges_per_cell_; }
145
+ void set_max_edges_per_cell(int max_edges_per_cell);
146
+
147
+ private:
148
+ int max_edges_per_cell_;
149
+ };
150
+
151
+ // Creates a MutableS2ShapeIndex that uses the default option settings.
152
+ // Option values may be changed by calling Init().
153
+ MutableS2ShapeIndex();
154
+
155
+ // Create a MutableS2ShapeIndex with the given options.
156
+ explicit MutableS2ShapeIndex(const Options& options);
157
+
158
+ ~MutableS2ShapeIndex() override;
159
+
160
+ // Initialize a MutableS2ShapeIndex with the given options. This method may
161
+ // only be called when the index is empty (i.e. newly created or Reset() has
162
+ // just been called).
163
+ void Init(const Options& options);
164
+
165
+ const Options& options() const { return options_; }
166
+
167
+ // The number of distinct shape ids that have been assigned. This equals
168
+ // the number of shapes in the index provided that no shapes have ever been
169
+ // removed. (Shape ids are not reused.)
170
+ int num_shape_ids() const override {
171
+ return static_cast<int>(shapes_.size());
172
+ }
173
+
174
+ // Returns a pointer to the shape with the given id, or nullptr if the shape
175
+ // has been removed from the index.
176
+ S2Shape* shape(int id) const override { return shapes_[id].get(); }
177
+
178
+ // Minimizes memory usage by requesting that any data structures that can be
179
+ // rebuilt should be discarded. This method invalidates all iterators.
180
+ //
181
+ // Like all non-const methods, this method is not thread-safe.
182
+ void Minimize() override;
183
+
184
+ // Appends an encoded representation of the S2ShapeIndex to "encoder".
185
+ //
186
+ // This method does not encode the S2Shapes in the index; it is the client's
187
+ // responsibility to encode them separately. For example:
188
+ //
189
+ // s2shapeutil::CompactEncodeTaggedShapes(index, encoder);
190
+ // index.Encode(encoder);
191
+ //
192
+ // REQUIRES: "encoder" uses the default constructor, so that its buffer
193
+ // can be enlarged as necessary by calling Ensure(int).
194
+ void Encode(Encoder* encoder) const;
195
+
196
+ // Decodes an S2ShapeIndex, returning true on success.
197
+ //
198
+ // This method does not decode the S2Shape objects in the index; this is
199
+ // the responsibility of the client-provided function "shape_factory"
200
+ // (see s2shapeutil_coding.h). Example usage:
201
+ //
202
+ // index.Init(decoder, s2shapeutil::LazyDecodeShapeFactory(decoder));
203
+ //
204
+ // Note that the S2Shape vector must be encoded *before* the S2ShapeIndex in
205
+ // this example.
206
+ bool Init(Decoder* decoder, const ShapeFactory& shape_factory);
207
+
208
+ class Iterator final : public IteratorBase {
209
+ public:
210
+ // Default constructor; must be followed by a call to Init().
211
+ Iterator();
212
+
213
+ // Constructs an iterator positioned as specified. By default iterators
214
+ // are unpositioned, since this avoids an extra seek in this situation
215
+ // where one of the seek methods (such as Locate) is immediately called.
216
+ //
217
+ // If you want to position the iterator at the beginning, e.g. in order to
218
+ // loop through the entire index, do this instead:
219
+ //
220
+ // for (MutableS2ShapeIndex::Iterator it(&index, S2ShapeIndex::BEGIN);
221
+ // !it.done(); it.Next()) { ... }
222
+ explicit Iterator(const MutableS2ShapeIndex* index,
223
+ InitialPosition pos = UNPOSITIONED);
224
+
225
+ // Initializes an iterator for the given MutableS2ShapeIndex. This method
226
+ // may also be called in order to restore an iterator to a valid state
227
+ // after the underlying index has been updated (although it is usually
228
+ // easier just to declare a new iterator whenever required, since iterator
229
+ // construction is cheap).
230
+ void Init(const MutableS2ShapeIndex* index,
231
+ InitialPosition pos = UNPOSITIONED);
232
+
233
+ // Initialize an iterator for the given MutableS2ShapeIndex without
234
+ // applying any pending updates. This can be used to observe the actual
235
+ // current state of the index without modifying it in any way.
236
+ void InitStale(const MutableS2ShapeIndex* index,
237
+ InitialPosition pos = UNPOSITIONED);
238
+
239
+ // Inherited non-virtual methods:
240
+ // S2CellId id() const;
241
+ // bool done() const;
242
+ // S2Point center() const;
243
+ const S2ShapeIndexCell& cell() const;
244
+
245
+ // IteratorBase API:
246
+ void Begin() override;
247
+ void Finish() override;
248
+ void Next() override;
249
+ bool Prev() override;
250
+ void Seek(S2CellId target) override;
251
+ bool Locate(const S2Point& target) override;
252
+ CellRelation Locate(S2CellId target) override;
253
+
254
+ protected:
255
+ const S2ShapeIndexCell* GetCell() const override;
256
+ std::unique_ptr<IteratorBase> Clone() const override;
257
+ void Copy(const IteratorBase& other) override;
258
+
259
+ private:
260
+ void Refresh(); // Updates the IteratorBase fields.
261
+ const MutableS2ShapeIndex* index_;
262
+ CellMap::const_iterator iter_, end_;
263
+ };
264
+
265
+ // Takes ownership of the given shape and adds it to the index. Also
266
+ // assigns a unique id to the shape (shape->id()) and returns that id.
267
+ // Shape ids are assigned sequentially starting from 0 in the order shapes
268
+ // are added. Invalidates all iterators and their associated data.
269
+ int Add(std::unique_ptr<S2Shape> shape);
270
+
271
+ // Removes the given shape from the index and return ownership to the caller.
272
+ // Invalidates all iterators and their associated data.
273
+ std::unique_ptr<S2Shape> Release(int shape_id);
274
+
275
+ // Resets the index to its original state and returns ownership of all
276
+ // shapes to the caller. This method is much more efficient than removing
277
+ // all shapes one at a time.
278
+ std::vector<std::unique_ptr<S2Shape>> ReleaseAll();
279
+
280
+ // Resets the index to its original state and deletes all shapes. Any
281
+ // options specified via Init() are preserved.
282
+ void Clear();
283
+
284
+ // Returns the number of bytes currently occupied by the index (including any
285
+ // unused space at the end of vectors, etc). It has the same thread safety
286
+ // as the other "const" methods (see introduction).
287
+ size_t SpaceUsed() const override;
288
+
289
+ // Calls to Add() and Release() are normally queued and processed on the
290
+ // first subsequent query (in a thread-safe way). This has many advantages,
291
+ // the most important of which is that sometimes there *is* no subsequent
292
+ // query, which lets us avoid building the index completely.
293
+ //
294
+ // This method forces any pending updates to be applied immediately.
295
+ // Calling this method is rarely a good idea. (One valid reason is to
296
+ // exclude the cost of building the index from benchmark results.)
297
+ void ForceBuild();
298
+
299
+ // Returns true if there are no pending updates that need to be applied.
300
+ // This can be useful to avoid building the index unnecessarily, or for
301
+ // choosing between two different algorithms depending on whether the index
302
+ // is available.
303
+ //
304
+ // The returned index status may be slightly out of date if the index was
305
+ // built in a different thread. This is fine for the intended use (as an
306
+ // efficiency hint), but it should not be used by internal methods (see
307
+ // MaybeApplyUpdates).
308
+ bool is_fresh() const;
309
+
310
+ protected:
311
+ std::unique_ptr<IteratorBase> NewIterator(InitialPosition pos) const override;
312
+
313
+ private:
314
+ friend class EncodedS2ShapeIndex;
315
+ friend class Iterator;
316
+ friend class MutableS2ShapeIndexTest;
317
+ friend class S2Stats;
318
+
319
+ struct BatchDescriptor;
320
+ struct ClippedEdge;
321
+ class EdgeAllocator;
322
+ struct FaceEdge;
323
+ class InteriorTracker;
324
+ struct RemovedShape;
325
+
326
+ using ShapeIdSet = std::vector<int>;
327
+
328
+ // When adding a new encoding, be aware that old binaries will not be able
329
+ // to decode it.
330
+ static const unsigned char kCurrentEncodingVersionNumber = 0;
331
+
332
+ // Internal methods are documented with their definitions.
333
+ bool is_first_update() const;
334
+ bool is_shape_being_removed(int shape_id) const;
335
+ void MaybeApplyUpdates() const;
336
+ void ApplyUpdatesThreadSafe();
337
+ void ApplyUpdatesInternal();
338
+ void GetUpdateBatches(std::vector<BatchDescriptor>* batches) const;
339
+ static void GetBatchSizes(int num_items, int max_batches,
340
+ double final_bytes_per_item,
341
+ double high_water_bytes_per_item,
342
+ double preferred_max_bytes_per_batch,
343
+ std::vector<int>* batch_sizes);
344
+ void ReserveSpace(const BatchDescriptor& batch,
345
+ std::vector<FaceEdge> all_edges[6]) const;
346
+ void AddShape(int id, std::vector<FaceEdge> all_edges[6],
347
+ InteriorTracker* tracker) const;
348
+ void RemoveShape(const RemovedShape& removed,
349
+ std::vector<FaceEdge> all_edges[6],
350
+ InteriorTracker* tracker) const;
351
+ void AddFaceEdge(FaceEdge* edge, std::vector<FaceEdge> all_edges[6]) const;
352
+ void UpdateFaceEdges(int face, const std::vector<FaceEdge>& face_edges,
353
+ InteriorTracker* tracker);
354
+ S2CellId ShrinkToFit(const S2PaddedCell& pcell, const R2Rect& bound) const;
355
+ void SkipCellRange(S2CellId begin, S2CellId end, InteriorTracker* tracker,
356
+ EdgeAllocator* alloc, bool disjoint_from_index);
357
+ void UpdateEdges(const S2PaddedCell& pcell,
358
+ std::vector<const ClippedEdge*>* edges,
359
+ InteriorTracker* tracker, EdgeAllocator* alloc,
360
+ bool disjoint_from_index);
361
+ void AbsorbIndexCell(const S2PaddedCell& pcell,
362
+ const Iterator& iter,
363
+ std::vector<const ClippedEdge*>* edges,
364
+ InteriorTracker* tracker,
365
+ EdgeAllocator* alloc);
366
+ int GetEdgeMaxLevel(const S2Shape::Edge& edge) const;
367
+ static int CountShapes(const std::vector<const ClippedEdge*>& edges,
368
+ const ShapeIdSet& cshape_ids);
369
+ bool MakeIndexCell(const S2PaddedCell& pcell,
370
+ const std::vector<const ClippedEdge*>& edges,
371
+ InteriorTracker* tracker);
372
+ static void TestAllEdges(const std::vector<const ClippedEdge*>& edges,
373
+ InteriorTracker* tracker);
374
+ inline static const ClippedEdge* UpdateBound(const ClippedEdge* edge,
375
+ int u_end, double u,
376
+ int v_end, double v,
377
+ EdgeAllocator* alloc);
378
+ static const ClippedEdge* ClipUBound(const ClippedEdge* edge,
379
+ int u_end, double u,
380
+ EdgeAllocator* alloc);
381
+ static const ClippedEdge* ClipVBound(const ClippedEdge* edge,
382
+ int v_end, double v,
383
+ EdgeAllocator* alloc);
384
+ static void ClipVAxis(const ClippedEdge* edge, const R1Interval& middle,
385
+ std::vector<const ClippedEdge*> child_edges[2],
386
+ EdgeAllocator* alloc);
387
+
388
+ // The amount by which cells are "padded" to compensate for numerical errors
389
+ // when clipping line segments to cell boundaries.
390
+ static const double kCellPadding;
391
+
392
+ // The shapes in the index, accessed by their shape id. Removed shapes are
393
+ // replaced by nullptr pointers.
394
+ std::vector<std::unique_ptr<S2Shape>> shapes_;
395
+
396
+ // A map from S2CellId to the set of clipped shapes that intersect that
397
+ // cell. The cell ids cover a set of non-overlapping regions on the
398
+ // sphere. Note that this field is updated lazily (see below). Const
399
+ // methods *must* call MaybeApplyUpdates() before accessing this field.
400
+ // (The easiest way to achieve this is simply to use an Iterator.)
401
+ CellMap cell_map_;
402
+
403
+ // The options supplied for this index.
404
+ Options options_;
405
+
406
+ // The id of the first shape that has been queued for addition but not
407
+ // processed yet.
408
+ int pending_additions_begin_ = 0;
409
+
410
+ // The representation of an edge that has been queued for removal.
411
+ struct RemovedShape {
412
+ int32 shape_id;
413
+ bool has_interior; // Belongs to a shape of dimension 2.
414
+ bool contains_tracker_origin;
415
+ std::vector<S2Shape::Edge> edges;
416
+ };
417
+
418
+ // The set of shapes that have been queued for removal but not processed
419
+ // yet. Note that we need to copy the edge data since the caller is free to
420
+ // destroy the shape once Release() has been called. This field is present
421
+ // only when there are removed shapes to process (to save memory).
422
+ std::unique_ptr<std::vector<RemovedShape>> pending_removals_;
423
+
424
+ // Additions and removals are queued and processed on the first subsequent
425
+ // query. There are several reasons to do this:
426
+ //
427
+ // - It is significantly more efficient to process updates in batches.
428
+ // - Often the index will never be queried, in which case we can save both
429
+ // the time and memory required to build it. Examples:
430
+ // + S2Loops that are created simply to pass to an S2Polygon. (We don't
431
+ // need the S2Loop index, because S2Polygon builds its own index.)
432
+ // + Applications that load a database of geometry and then query only
433
+ // a small fraction of it.
434
+ // + Applications that only read and write geometry (Decode/Encode).
435
+ //
436
+ // The main drawback is that we need to go to some extra work to ensure that
437
+ // "const" methods are still thread-safe. Note that the goal is *not* to
438
+ // make this class thread-safe in general, but simply to hide the fact that
439
+ // we defer some of the indexing work until query time.
440
+ //
441
+ // The textbook approach to this problem would be to use a mutex and a
442
+ // condition variable. Unfortunately pthread mutexes are huge (40 bytes).
443
+ // Instead we use spinlock (which is only 4 bytes) to guard a few small
444
+ // fields representing the current update status, and only create additional
445
+ // state while the update is actually occurring.
446
+ mutable SpinLock lock_;
447
+
448
+ enum IndexStatus {
449
+ STALE, // There are pending updates.
450
+ UPDATING, // Updates are currently being applied.
451
+ FRESH, // There are no pending updates.
452
+ };
453
+ // Reads and writes to this field are guarded by "lock_".
454
+ std::atomic<IndexStatus> index_status_;
455
+
456
+ // UpdateState holds temporary data related to thread synchronization. It
457
+ // is only allocated while updates are being applied.
458
+ struct UpdateState {
459
+ // This mutex is used as a condition variable. It is locked by the
460
+ // updating thread for the entire duration of the update; other threads
461
+ // lock it in order to wait until the update is finished.
462
+ absl::Mutex wait_mutex;
463
+
464
+ // The number of threads currently waiting on "wait_mutex_". The
465
+ // UpdateState can only be freed when this number reaches zero.
466
+ //
467
+ // Reads and writes to this field are guarded by "lock_".
468
+ int num_waiting;
469
+
470
+ UpdateState() : num_waiting(0) {
471
+ }
472
+
473
+ ~UpdateState() {
474
+ S2_DCHECK_EQ(0, num_waiting);
475
+ }
476
+ };
477
+ std::unique_ptr<UpdateState> update_state_;
478
+
479
+ // Documented in the .cc file.
480
+ void UnlockAndSignal()
481
+ UNLOCK_FUNCTION(lock_)
482
+ UNLOCK_FUNCTION(update_state_->wait_mutex);
483
+
484
+ MutableS2ShapeIndex(const MutableS2ShapeIndex&) = delete;
485
+ void operator=(const MutableS2ShapeIndex&) = delete;
486
+ };
487
+
488
+
489
+ ////////////////// Implementation details follow ////////////////////
490
+
491
+
492
+ inline MutableS2ShapeIndex::Iterator::Iterator() : index_(nullptr) {
493
+ }
494
+
495
+ inline MutableS2ShapeIndex::Iterator::Iterator(
496
+ const MutableS2ShapeIndex* index, InitialPosition pos) {
497
+ Init(index, pos);
498
+ }
499
+
500
+ inline void MutableS2ShapeIndex::Iterator::Init(
501
+ const MutableS2ShapeIndex* index, InitialPosition pos) {
502
+ index->MaybeApplyUpdates();
503
+ InitStale(index, pos);
504
+ }
505
+
506
+ inline void MutableS2ShapeIndex::Iterator::InitStale(
507
+ const MutableS2ShapeIndex* index, InitialPosition pos) {
508
+ index_ = index;
509
+ end_ = index_->cell_map_.end();
510
+ if (pos == BEGIN) {
511
+ iter_ = index_->cell_map_.begin();
512
+ } else {
513
+ iter_ = end_;
514
+ }
515
+ Refresh();
516
+ }
517
+
518
+ inline const S2ShapeIndexCell& MutableS2ShapeIndex::Iterator::cell() const {
519
+ // Since MutableS2ShapeIndex always sets the "cell_" field, we can skip the
520
+ // logic in the base class that conditionally calls GetCell().
521
+ return *raw_cell();
522
+ }
523
+
524
+ inline void MutableS2ShapeIndex::Iterator::Refresh() {
525
+ if (iter_ == end_) {
526
+ set_finished();
527
+ } else {
528
+ set_state(iter_->first, iter_->second);
529
+ }
530
+ }
531
+
532
+ inline void MutableS2ShapeIndex::Iterator::Begin() {
533
+ // Make sure that the index has not been modified since Init() was called.
534
+ S2_DCHECK(index_->is_fresh());
535
+ iter_ = index_->cell_map_.begin();
536
+ Refresh();
537
+ }
538
+
539
+ inline void MutableS2ShapeIndex::Iterator::Finish() {
540
+ iter_ = end_;
541
+ Refresh();
542
+ }
543
+
544
+ inline void MutableS2ShapeIndex::Iterator::Next() {
545
+ S2_DCHECK(!done());
546
+ ++iter_;
547
+ Refresh();
548
+ }
549
+
550
+ inline bool MutableS2ShapeIndex::Iterator::Prev() {
551
+ if (iter_ == index_->cell_map_.begin()) return false;
552
+ --iter_;
553
+ Refresh();
554
+ return true;
555
+ }
556
+
557
+ inline void MutableS2ShapeIndex::Iterator::Seek(S2CellId target) {
558
+ iter_ = index_->cell_map_.lower_bound(target);
559
+ Refresh();
560
+ }
561
+
562
+ inline std::unique_ptr<MutableS2ShapeIndex::IteratorBase>
563
+ MutableS2ShapeIndex::NewIterator(InitialPosition pos) const {
564
+ return absl::make_unique<Iterator>(this, pos);
565
+ }
566
+
567
+ inline bool MutableS2ShapeIndex::is_fresh() const {
568
+ return index_status_.load(std::memory_order_relaxed) == FRESH;
569
+ }
570
+
571
+ // Return true if this is the first update to the index.
572
+ inline bool MutableS2ShapeIndex::is_first_update() const {
573
+ // Note that it is not sufficient to check whether cell_map_ is empty, since
574
+ // entries are added during the update process.
575
+ return pending_additions_begin_ == 0;
576
+ }
577
+
578
+ // Given that the given shape is being updated, return true if it is being
579
+ // removed (as opposed to being added).
580
+ inline bool MutableS2ShapeIndex::is_shape_being_removed(int shape_id) const {
581
+ // All shape ids being removed are less than all shape ids being added.
582
+ return shape_id < pending_additions_begin_;
583
+ }
584
+
585
+ // Ensure that any pending updates have been applied. This method must be
586
+ // called before accessing the cell_map_ field, even if the index_status_
587
+ // appears to be FRESH, because a memory barrier is required in order to
588
+ // ensure that all the index updates are visible if the updates were done in
589
+ // another thread.
590
+ inline void MutableS2ShapeIndex::MaybeApplyUpdates() const {
591
+ // To avoid acquiring and releasing the spinlock on every query, we use
592
+ // atomic operations when testing whether the status is FRESH and when
593
+ // updating the status to be FRESH. This guarantees that any thread that
594
+ // sees a status of FRESH will also see the corresponding index updates.
595
+ if (index_status_.load(std::memory_order_acquire) != FRESH) {
596
+ const_cast<MutableS2ShapeIndex*>(this)->ApplyUpdatesThreadSafe();
597
+ }
598
+ }
599
+
600
+ #endif // S2_MUTABLE_S2SHAPE_INDEX_H_