@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,589 @@
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
+ #include "s2/mutable_s2shape_index.h"
19
+
20
+ #include <functional>
21
+ #include <memory>
22
+ #include <numeric>
23
+ #include <string>
24
+ #include <thread>
25
+ #include <vector>
26
+
27
+ #include <gtest/gtest.h>
28
+
29
+ #include "s2/base/commandlineflags.h"
30
+ #include "s2/base/logging.h"
31
+ #include "s2/base/mutex.h"
32
+ #include "s2/r2.h"
33
+ #include "s2/r2rect.h"
34
+ #include "s2/s1angle.h"
35
+ #include "s2/s2cap.h"
36
+ #include "s2/s2cell.h"
37
+ #include "s2/s2cell_id.h"
38
+ #include "s2/s2cell_union.h"
39
+ #include "s2/s2debug.h"
40
+ #include "s2/s2edge_clipping.h"
41
+ #include "s2/s2edge_crosser.h"
42
+ #include "s2/s2edge_vector_shape.h"
43
+ #include "s2/s2error.h"
44
+ #include "s2/s2loop.h"
45
+ #include "s2/s2pointutil.h"
46
+ #include "s2/s2polygon.h"
47
+ #include "s2/s2shapeutil_coding.h"
48
+ #include "s2/s2shapeutil_contains_brute_force.h"
49
+ #include "s2/s2shapeutil_testing.h"
50
+ #include "s2/s2shapeutil_visit_crossing_edge_pairs.h"
51
+ #include "s2/s2testing.h"
52
+ #include "s2/s2text_format.h"
53
+ #include "s2/third_party/absl/memory/memory.h"
54
+
55
+ using absl::WrapUnique;
56
+ using absl::make_unique;
57
+ using s2textformat::MakePolyline;
58
+ using std::unique_ptr;
59
+ using std::vector;
60
+
61
+ class MutableS2ShapeIndexTest : public ::testing::Test {
62
+ protected:
63
+ // This test harness owns a MutableS2ShapeIndex for convenience.
64
+
65
+ MutableS2ShapeIndex index_;
66
+
67
+ // Verifies that that every cell of the index contains the correct edges, and
68
+ // that no cells are missing from the index. The running time of this
69
+ // function is quadratic in the number of edges.
70
+ void QuadraticValidate();
71
+
72
+ // Given an edge and a cell id, determines whether or not the edge should be
73
+ // present in that cell and verify that this matches "index_has_edge".
74
+ void ValidateEdge(const S2Point& a, const S2Point& b,
75
+ S2CellId id, bool index_has_edge);
76
+
77
+ // Given a shape and a cell id, determines whether or not the shape contains
78
+ // the cell center and verify that this matches "index_contains_center".
79
+ void ValidateInterior(const S2Shape* shape, S2CellId id,
80
+ bool index_contains_center);
81
+
82
+ // Verifies that the index can be encoded and decoded without change.
83
+ void TestEncodeDecode();
84
+ };
85
+
86
+ void MutableS2ShapeIndexTest::QuadraticValidate() {
87
+ // Iterate through a sequence of nonoverlapping cell ids that cover the
88
+ // sphere and include as a subset all the cell ids used in the index. For
89
+ // each cell id, verify that the expected set of edges is present.
90
+
91
+ // "min_cellid" is the first S2CellId that has not been validated yet.
92
+ S2CellId min_cellid = S2CellId::Begin(S2CellId::kMaxLevel);
93
+ for (MutableS2ShapeIndex::Iterator it(&index_, S2ShapeIndex::BEGIN);
94
+ ; it.Next()) {
95
+ // Generate a list of S2CellIds ("skipped cells") that cover the gap
96
+ // between the last cell we validated and the next cell in the index.
97
+ S2CellUnion skipped;
98
+ if (!it.done()) {
99
+ S2CellId cellid = it.id();
100
+ EXPECT_GE(cellid, min_cellid);
101
+ skipped.InitFromBeginEnd(min_cellid, cellid.range_min());
102
+ min_cellid = cellid.range_max().next();
103
+ } else {
104
+ // Validate the empty cells beyond the last cell in the index.
105
+ skipped.InitFromBeginEnd(min_cellid, S2CellId::End(S2CellId::kMaxLevel));
106
+ }
107
+ // Iterate through all the shapes, simultaneously validating the current
108
+ // index cell and all the skipped cells.
109
+ int short_edges = 0; // number of edges counted toward subdivision
110
+ for (int id = 0; id < index_.num_shape_ids(); ++id) {
111
+ const S2Shape* shape = index_.shape(id);
112
+ const S2ClippedShape* clipped = nullptr;
113
+ if (!it.done()) clipped = it.cell().find_clipped(id);
114
+
115
+ // First check that contains_center() is set correctly.
116
+ for (S2CellId skipped_id : skipped) {
117
+ ValidateInterior(shape, skipped_id, false);
118
+ }
119
+ if (!it.done()) {
120
+ bool contains_center = clipped && clipped->contains_center();
121
+ ValidateInterior(shape, it.id(), contains_center);
122
+ }
123
+ // If this shape has been released, it should not be present at all.
124
+ if (shape == nullptr) {
125
+ EXPECT_EQ(nullptr, clipped);
126
+ continue;
127
+ }
128
+ // Otherwise check that the appropriate edges are present.
129
+ for (int e = 0; e < shape->num_edges(); ++e) {
130
+ auto edge = shape->edge(e);
131
+ for (int j = 0; j < skipped.num_cells(); ++j) {
132
+ ValidateEdge(edge.v0, edge.v1, skipped.cell_id(j), false);
133
+ }
134
+ if (!it.done()) {
135
+ bool has_edge = clipped && clipped->ContainsEdge(e);
136
+ ValidateEdge(edge.v0, edge.v1, it.id(), has_edge);
137
+ int max_level = index_.GetEdgeMaxLevel(edge);
138
+ if (has_edge && it.id().level() < max_level) {
139
+ ++short_edges;
140
+ }
141
+ }
142
+ }
143
+ }
144
+ EXPECT_LE(short_edges, index_.options().max_edges_per_cell());
145
+ if (it.done()) break;
146
+ }
147
+ }
148
+
149
+ // Verify that "index_has_edge" is true if and only if the edge AB intersects
150
+ // the given cell id.
151
+ void MutableS2ShapeIndexTest::ValidateEdge(const S2Point& a, const S2Point& b,
152
+ S2CellId id, bool index_has_edge) {
153
+ // Expand or shrink the padding slightly to account for errors in the
154
+ // function we use to test for intersection (IntersectsRect).
155
+ double padding = MutableS2ShapeIndex::kCellPadding;
156
+ padding += (index_has_edge ? 1 : -1) * S2::kIntersectsRectErrorUVDist;
157
+ R2Rect bound = id.GetBoundUV().Expanded(padding);
158
+ R2Point a_uv, b_uv;
159
+ EXPECT_EQ(S2::ClipToPaddedFace(a, b, id.face(), padding, &a_uv, &b_uv)
160
+ && S2::IntersectsRect(a_uv, b_uv, bound),
161
+ index_has_edge);
162
+ }
163
+
164
+ void MutableS2ShapeIndexTest::ValidateInterior(
165
+ const S2Shape* shape, S2CellId id, bool index_contains_center) {
166
+ if (shape == nullptr) {
167
+ EXPECT_FALSE(index_contains_center);
168
+ } else {
169
+ EXPECT_EQ(s2shapeutil::ContainsBruteForce(*shape, id.ToPoint()),
170
+ index_contains_center);
171
+ }
172
+ }
173
+
174
+ void MutableS2ShapeIndexTest::TestEncodeDecode() {
175
+ Encoder encoder;
176
+ index_.Encode(&encoder);
177
+ Decoder decoder(encoder.base(), encoder.length());
178
+ MutableS2ShapeIndex index2;
179
+ ASSERT_TRUE(index2.Init(&decoder, s2shapeutil::WrappedShapeFactory(&index_)));
180
+ s2testing::ExpectEqual(index_, index2);
181
+ }
182
+
183
+ namespace {
184
+
185
+ void TestIteratorMethods(const MutableS2ShapeIndex& index) {
186
+ MutableS2ShapeIndex::Iterator it(&index, S2ShapeIndex::BEGIN);
187
+ EXPECT_FALSE(it.Prev());
188
+ it.Finish();
189
+ EXPECT_TRUE(it.done());
190
+ vector<S2CellId> ids;
191
+ MutableS2ShapeIndex::Iterator it2(&index);
192
+ S2CellId min_cellid = S2CellId::Begin(S2CellId::kMaxLevel);
193
+ for (it.Begin(); !it.done(); it.Next()) {
194
+ S2CellId cellid = it.id();
195
+ auto skipped = S2CellUnion::FromBeginEnd(min_cellid, cellid.range_min());
196
+ for (S2CellId skipped_id : skipped) {
197
+ EXPECT_FALSE(it2.Locate(skipped_id.ToPoint()));
198
+ EXPECT_EQ(S2ShapeIndex::DISJOINT, it2.Locate(skipped_id));
199
+ it2.Begin();
200
+ it2.Seek(skipped_id);
201
+ EXPECT_EQ(cellid, it2.id());
202
+ }
203
+ if (!ids.empty()) {
204
+ it2 = it;
205
+ EXPECT_TRUE(it2.Prev());
206
+ EXPECT_EQ(ids.back(), it2.id());
207
+ it2.Next();
208
+ EXPECT_EQ(cellid, it2.id());
209
+ it2.Seek(ids.back());
210
+ EXPECT_EQ(ids.back(), it2.id());
211
+ }
212
+ it2.Begin();
213
+ EXPECT_EQ(cellid.ToPoint(), it.center());
214
+ EXPECT_TRUE(it2.Locate(it.center()));
215
+ EXPECT_EQ(cellid, it2.id());
216
+ it2.Begin();
217
+ EXPECT_EQ(S2ShapeIndex::INDEXED, it2.Locate(cellid));
218
+ EXPECT_EQ(cellid, it2.id());
219
+ if (!cellid.is_face()) {
220
+ it2.Begin();
221
+ EXPECT_EQ(S2ShapeIndex::SUBDIVIDED, it2.Locate(cellid.parent()));
222
+ EXPECT_LE(it2.id(), cellid);
223
+ EXPECT_GE(it2.id(), cellid.parent().range_min());
224
+ }
225
+ if (!cellid.is_leaf()) {
226
+ for (int i = 0; i < 4; ++i) {
227
+ it2.Begin();
228
+ EXPECT_EQ(S2ShapeIndex::INDEXED, it2.Locate(cellid.child(i)));
229
+ EXPECT_EQ(cellid, it2.id());
230
+ }
231
+ }
232
+ ids.push_back(cellid);
233
+ min_cellid = cellid.range_max().next();
234
+ }
235
+ }
236
+
237
+ TEST_F(MutableS2ShapeIndexTest, SpaceUsed) {
238
+ index_.Add(make_unique<S2EdgeVectorShape>(S2Point(1, 0, 0),
239
+ S2Point(0, 1, 0)));
240
+ EXPECT_FALSE(index_.is_fresh());
241
+ size_t size_before = index_.SpaceUsed();
242
+ EXPECT_FALSE(index_.is_fresh());
243
+
244
+ QuadraticValidate();
245
+ size_t size_after = index_.SpaceUsed();
246
+
247
+ EXPECT_TRUE(index_.is_fresh());
248
+
249
+ EXPECT_TRUE(size_after > size_before);
250
+ }
251
+
252
+ TEST_F(MutableS2ShapeIndexTest, NoEdges) {
253
+ MutableS2ShapeIndex::Iterator it(&index_, S2ShapeIndex::BEGIN);
254
+ EXPECT_TRUE(it.done());
255
+ TestIteratorMethods(index_);
256
+ TestEncodeDecode();
257
+ }
258
+
259
+ TEST_F(MutableS2ShapeIndexTest, OneEdge) {
260
+ EXPECT_EQ(0, index_.Add(make_unique<S2EdgeVectorShape>(S2Point(1, 0, 0),
261
+ S2Point(0, 1, 0))));
262
+ QuadraticValidate();
263
+ TestIteratorMethods(index_);
264
+ TestEncodeDecode();
265
+ }
266
+
267
+ TEST_F(MutableS2ShapeIndexTest, ShrinkToFitOptimization) {
268
+ // This used to trigger a bug in the ShrinkToFit optimization. The loop
269
+ // below contains almost all of face 0 except for a small region in the
270
+ // 0/00000 subcell. That subcell is the only one that contains any edges.
271
+ // This caused the index to be built only in that subcell. However, all the
272
+ // other cells on that face should also have index entries, in order to
273
+ // indicate that they are contained by the loop.
274
+ unique_ptr<S2Loop> loop(S2Loop::MakeRegularLoop(
275
+ S2Point(1, 0.5, 0.5).Normalize(), S1Angle::Degrees(89), 100));
276
+ index_.Add(make_unique<S2Loop::Shape>(loop.get()));
277
+ QuadraticValidate();
278
+ TestEncodeDecode();
279
+ }
280
+
281
+ TEST_F(MutableS2ShapeIndexTest, LoopsSpanningThreeFaces) {
282
+ S2Polygon polygon;
283
+ const int kNumEdges = 100; // Validation is quadratic
284
+ // Construct two loops consisting of kNumEdges vertices each, centered
285
+ // around the cube vertex at the start of the Hilbert curve.
286
+ S2Testing::ConcentricLoopsPolygon(S2Point(1, -1, -1).Normalize(), 2,
287
+ kNumEdges, &polygon);
288
+ vector<unique_ptr<S2Loop>> loops = polygon.Release();
289
+ for (auto& loop : loops) {
290
+ index_.Add(make_unique<S2Loop::Shape>(&*loop));
291
+ }
292
+ QuadraticValidate();
293
+ TestIteratorMethods(index_);
294
+ TestEncodeDecode();
295
+ }
296
+
297
+ TEST_F(MutableS2ShapeIndexTest, ManyIdenticalEdges) {
298
+ const int kNumEdges = 100; // Validation is quadratic
299
+ S2Point a = S2Point(0.99, 0.99, 1).Normalize();
300
+ S2Point b = S2Point(-0.99, -0.99, 1).Normalize();
301
+ for (int i = 0; i < kNumEdges; ++i) {
302
+ EXPECT_EQ(i, index_.Add(make_unique<S2EdgeVectorShape>(a, b)));
303
+ }
304
+ QuadraticValidate();
305
+ TestIteratorMethods(index_);
306
+ TestEncodeDecode();
307
+ // Since all edges span the diagonal of a face, no subdivision should
308
+ // have occurred (with the default index options).
309
+ for (MutableS2ShapeIndex::Iterator it(&index_, S2ShapeIndex::BEGIN);
310
+ !it.done(); it.Next()) {
311
+ EXPECT_EQ(0, it.id().level());
312
+ }
313
+ }
314
+
315
+ TEST_F(MutableS2ShapeIndexTest, DegenerateEdge) {
316
+ // This test verifies that degenerate edges are supported. The following
317
+ // point is a cube face vertex, and so it should be indexed in 3 cells.
318
+ S2Point a = S2Point(1, 1, 1).Normalize();
319
+ auto shape = make_unique<S2EdgeVectorShape>();
320
+ shape->Add(a, a);
321
+ index_.Add(std::move(shape));
322
+ QuadraticValidate();
323
+ TestEncodeDecode();
324
+ // Check that exactly 3 index cells contain the degenerate edge.
325
+ int count = 0;
326
+ for (MutableS2ShapeIndex::Iterator it(&index_, S2ShapeIndex::BEGIN);
327
+ !it.done(); it.Next(), ++count) {
328
+ EXPECT_TRUE(it.id().is_leaf());
329
+ EXPECT_EQ(1, it.cell().num_clipped());
330
+ EXPECT_EQ(1, it.cell().clipped(0).num_edges());
331
+ }
332
+ EXPECT_EQ(3, count);
333
+ }
334
+
335
+ TEST_F(MutableS2ShapeIndexTest, ManyTinyEdges) {
336
+ // This test adds many edges to a single leaf cell, to check that
337
+ // subdivision stops when no further subdivision is possible.
338
+ const int kNumEdges = 100; // Validation is quadratic
339
+ // Construct two points in the same leaf cell.
340
+ S2Point a = S2CellId(S2Point(1, 0, 0)).ToPoint();
341
+ S2Point b = (a + S2Point(0, 1e-12, 0)).Normalize();
342
+ auto shape = make_unique<S2EdgeVectorShape>();
343
+ for (int i = 0; i < kNumEdges; ++i) {
344
+ shape->Add(a, b);
345
+ }
346
+ index_.Add(std::move(shape));
347
+ QuadraticValidate();
348
+ TestEncodeDecode();
349
+ // Check that there is exactly one index cell and that it is a leaf cell.
350
+ MutableS2ShapeIndex::Iterator it(&index_, S2ShapeIndex::BEGIN);
351
+ ASSERT_TRUE(!it.done());
352
+ EXPECT_TRUE(it.id().is_leaf());
353
+ it.Next();
354
+ EXPECT_TRUE(it.done());
355
+ }
356
+
357
+ TEST_F(MutableS2ShapeIndexTest, SimpleUpdates) {
358
+ // Add 5 loops one at a time, then release them one at a time,
359
+ // validating the index at each step.
360
+ S2Polygon polygon;
361
+ S2Testing::ConcentricLoopsPolygon(S2Point(1, 0, 0), 5, 20, &polygon);
362
+ for (int i = 0; i < polygon.num_loops(); ++i) {
363
+ index_.Add(make_unique<S2Loop::Shape>(polygon.loop(i)));
364
+ QuadraticValidate();
365
+ }
366
+ for (int id = 0; id < polygon.num_loops(); ++id) {
367
+ index_.Release(id);
368
+ QuadraticValidate();
369
+ TestEncodeDecode();
370
+ }
371
+ }
372
+
373
+ TEST_F(MutableS2ShapeIndexTest, RandomUpdates) {
374
+ // Allow the seed to be varied from the command line.
375
+ S2Testing::rnd.Reset(FLAGS_s2_random_seed);
376
+
377
+ // A few polylines.
378
+ index_.Add(make_unique<S2Polyline::OwningShape>(
379
+ MakePolyline("0:0, 2:1, 0:2, 2:3, 0:4, 2:5, 0:6")));
380
+ index_.Add(make_unique<S2Polyline::OwningShape>(
381
+ MakePolyline("1:0, 3:1, 1:2, 3:3, 1:4, 3:5, 1:6")));
382
+ index_.Add(make_unique<S2Polyline::OwningShape>(
383
+ MakePolyline("2:0, 4:1, 2:2, 4:3, 2:4, 4:5, 2:6")));
384
+
385
+ // A loop that used to trigger an indexing bug.
386
+ index_.Add(make_unique<S2Loop::OwningShape>(S2Loop::MakeRegularLoop(
387
+ S2Point(1, 0.5, 0.5).Normalize(), S1Angle::Degrees(89), 20)));
388
+
389
+ // Five concentric loops.
390
+ S2Polygon polygon5;
391
+ S2Testing::ConcentricLoopsPolygon(S2Point(1, -1, -1).Normalize(),
392
+ 5, 20, &polygon5);
393
+ for (int i = 0; i < polygon5.num_loops(); ++i) {
394
+ index_.Add(make_unique<S2Loop::Shape>(polygon5.loop(i)));
395
+ }
396
+
397
+ // Two clockwise loops around S2Cell cube vertices.
398
+ index_.Add(make_unique<S2Loop::OwningShape>(S2Loop::MakeRegularLoop(
399
+ S2Point(-1, 1, 1).Normalize(), S1Angle::Radians(M_PI - 0.001), 10)));
400
+ index_.Add(make_unique<S2Loop::OwningShape>(S2Loop::MakeRegularLoop(
401
+ S2Point(-1, -1, -1).Normalize(), S1Angle::Radians(M_PI - 0.001), 10)));
402
+
403
+ // A shape with no edges and no interior.
404
+ index_.Add(make_unique<S2Loop::OwningShape>(
405
+ make_unique<S2Loop>(S2Loop::kEmpty())));
406
+
407
+ // A shape with no edges that covers the entire sphere.
408
+ index_.Add(make_unique<S2Loop::OwningShape>(
409
+ make_unique<S2Loop>(S2Loop::kFull())));
410
+
411
+ vector<unique_ptr<S2Shape>> released;
412
+ vector<int> added(index_.num_shape_ids());
413
+ std::iota(added.begin(), added.end(), 0);
414
+ QuadraticValidate();
415
+ TestEncodeDecode();
416
+ for (int iter = 0; iter < 100; ++iter) {
417
+ S2_VLOG(1) << "Iteration: " << iter;
418
+ // Choose some shapes to add and release.
419
+ int num_updates = 1 + S2Testing::rnd.Skewed(5);
420
+ for (int n = 0; n < num_updates; ++n) {
421
+ if (S2Testing::rnd.OneIn(2) && !added.empty()) {
422
+ int i = S2Testing::rnd.Uniform(added.size());
423
+ S2_VLOG(1) << " Released shape " << added[i]
424
+ << " (" << index_.shape(added[i]) << ")";
425
+ released.push_back(index_.Release(added[i]));
426
+ added.erase(added.begin() + i);
427
+ } else if (!released.empty()) {
428
+ int i = S2Testing::rnd.Uniform(released.size());
429
+ S2Shape* shape = released[i].get();
430
+ index_.Add(std::move(released[i])); // Changes shape->id().
431
+ released.erase(released.begin() + i);
432
+ added.push_back(shape->id());
433
+ S2_VLOG(1) << " Added shape " << shape->id()
434
+ << " (" << shape << ")";
435
+ }
436
+ }
437
+ QuadraticValidate();
438
+ TestEncodeDecode();
439
+ }
440
+ }
441
+
442
+ // A test that repeatedly updates "index_" in one thread and attempts to
443
+ // concurrently read the index_ from several other threads. When all threads
444
+ // have finished reading, the first thread makes another update.
445
+ //
446
+ // Note that we only test concurrent read access, since MutableS2ShapeIndex
447
+ // requires all updates to be single-threaded and not concurrent with any
448
+ // reads.
449
+ class LazyUpdatesTest : public ::testing::Test {
450
+ public:
451
+ LazyUpdatesTest() : num_updates_(0), num_readers_left_(0) {
452
+ }
453
+
454
+ // The function executed by each reader thread.
455
+ void ReaderThread();
456
+
457
+ protected:
458
+ class ReaderThreadPool {
459
+ public:
460
+ ReaderThreadPool(LazyUpdatesTest* test, int num_threads)
461
+ : threads_(make_unique<std::thread[]>(num_threads)),
462
+ num_threads_(num_threads) {
463
+ for (int i = 0; i < num_threads_; ++i) {
464
+ threads_[i] = std::thread(&LazyUpdatesTest::ReaderThread, test);
465
+ }
466
+ }
467
+ ~ReaderThreadPool() {
468
+ for (int i = 0; i < num_threads_; ++i) threads_[i].join();
469
+ }
470
+
471
+ private:
472
+ unique_ptr<std::thread[]> threads_;
473
+ int num_threads_;
474
+ };
475
+
476
+ MutableS2ShapeIndex index_;
477
+ // The following fields are guarded by lock_.
478
+ absl::Mutex lock_;
479
+ int num_updates_;
480
+ int num_readers_left_;
481
+
482
+ // Signalled when a new update is ready to be processed.
483
+ absl::CondVar update_ready_;
484
+ // Signalled when all readers have processed the latest update.
485
+ absl::CondVar all_readers_done_;
486
+ };
487
+
488
+ void LazyUpdatesTest::ReaderThread() {
489
+ lock_.Lock();
490
+ for (int last_update = 0; ; last_update = num_updates_) {
491
+ while (num_updates_ == last_update) {
492
+ update_ready_.Wait(&lock_);
493
+ }
494
+ if (num_updates_ < 0) break;
495
+
496
+ // The index is built on demand the first time we attempt to use it.
497
+ // We intentionally release the lock so that many threads have a chance
498
+ // to access the MutableS2ShapeIndex in parallel.
499
+ lock_.Unlock();
500
+ for (MutableS2ShapeIndex::Iterator it(&index_, S2ShapeIndex::BEGIN);
501
+ !it.done(); it.Next()) {
502
+ continue; // NOLINT
503
+ }
504
+ lock_.Lock();
505
+ if (--num_readers_left_ == 0) {
506
+ all_readers_done_.Signal();
507
+ }
508
+ }
509
+ lock_.Unlock();
510
+ }
511
+
512
+ TEST_F(LazyUpdatesTest, ConstMethodsThreadSafe) {
513
+ // Ensure that lazy updates are thread-safe. In other words, make sure that
514
+ // nothing bad happens when multiple threads call "const" methods that
515
+ // cause pending updates to be applied.
516
+
517
+ // The number of readers should be large enough so that it is likely that
518
+ // several readers will be running at once (with a multiple-core CPU).
519
+ const int kNumReaders = 8;
520
+ ReaderThreadPool pool(this, kNumReaders);
521
+ lock_.Lock();
522
+ const int kIters = 100;
523
+ for (int iter = 0; iter < kIters; ++iter) {
524
+ // Loop invariant: lock_ is held and num_readers_left_ == 0.
525
+ S2_DCHECK_EQ(0, num_readers_left_);
526
+ // Since there are no readers, it is safe to modify the index.
527
+ index_.Clear();
528
+ int num_vertices = 4 * S2Testing::rnd.Skewed(10); // Up to 4K vertices
529
+ unique_ptr<S2Loop> loop(S2Loop::MakeRegularLoop(
530
+ S2Testing::RandomPoint(), S2Testing::KmToAngle(5), num_vertices));
531
+ index_.Add(make_unique<S2Loop::Shape>(loop.get()));
532
+ num_readers_left_ = kNumReaders;
533
+ ++num_updates_;
534
+ update_ready_.SignalAll();
535
+ while (num_readers_left_ > 0) {
536
+ all_readers_done_.Wait(&lock_);
537
+ }
538
+ }
539
+ // Signal the readers to exit.
540
+ num_updates_ = -1;
541
+ update_ready_.SignalAll();
542
+ lock_.Unlock();
543
+ // ReaderThreadPool destructor waits for all threads to complete.
544
+ }
545
+
546
+ TEST(MutableS2ShapeIndex, MixedGeometry) {
547
+ // This test used to trigger a bug where the presence of a shape with an
548
+ // interior could cause shapes that don't have an interior to suddenly
549
+ // acquire one. This would cause extra S2ShapeIndex cells to be created
550
+ // that are outside the bounds of the given geometry.
551
+ vector<unique_ptr<S2Polyline>> polylines;
552
+ polylines.push_back(MakePolyline("0:0, 2:1, 0:2, 2:3, 0:4, 2:5, 0:6"));
553
+ polylines.push_back(MakePolyline("1:0, 3:1, 1:2, 3:3, 1:4, 3:5, 1:6"));
554
+ polylines.push_back(MakePolyline("2:0, 4:1, 2:2, 4:3, 2:4, 4:5, 2:6"));
555
+ MutableS2ShapeIndex index;
556
+ for (auto& polyline : polylines) {
557
+ index.Add(make_unique<S2Polyline::OwningShape>(std::move(polyline)));
558
+ }
559
+ S2Loop loop(S2Cell(S2CellId::Begin(S2CellId::kMaxLevel)));
560
+ index.Add(make_unique<S2Loop::Shape>(&loop));
561
+ MutableS2ShapeIndex::Iterator it(&index);
562
+ // No geometry intersects face 1, so there should be no index cells there.
563
+ EXPECT_EQ(S2ShapeIndex::DISJOINT, it.Locate(S2CellId::FromFace(1)));
564
+ }
565
+
566
+ TEST(S2Shape, user_data) {
567
+ struct MyData {
568
+ int x, y;
569
+ MyData(int _x, int _y) : x(_x), y(_y) {}
570
+ };
571
+ class MyEdgeVectorShape : public S2EdgeVectorShape {
572
+ public:
573
+ explicit MyEdgeVectorShape(const MyData& data)
574
+ : S2EdgeVectorShape(), data_(data) {
575
+ }
576
+ const void* user_data() const override { return &data_; }
577
+ void* mutable_user_data() override { return &data_; }
578
+
579
+ private:
580
+ MyData data_;
581
+ };
582
+ MyEdgeVectorShape shape(MyData(3, 5));
583
+ MyData* data = static_cast<MyData*>(shape.mutable_user_data());
584
+ S2_DCHECK_EQ(3, data->x);
585
+ data->y = 10;
586
+ S2_DCHECK_EQ(10, static_cast<const MyData*>(shape.user_data())->y);
587
+ }
588
+
589
+ } // namespace