@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,86 @@
1
+ // Copyright 2017 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_S2BUILDERUTIL_FIND_POLYGON_DEGENERACIES_H_
19
+ #define S2_S2BUILDERUTIL_FIND_POLYGON_DEGENERACIES_H_
20
+
21
+ #include <vector>
22
+
23
+ #include "s2/base/integral_types.h"
24
+ #include "s2/s2builder_graph.h"
25
+ #include "s2/s2error.h"
26
+
27
+ namespace s2builderutil {
28
+
29
+ // A polygon degeneracy is either a degenerate edge (an edge from a vertex to
30
+ // itself) or a sibling edge pair (consisting of an edge and its corresponding
31
+ // reverse edge). "is_hole" indicates whether the degeneracy corresponds to a
32
+ // polygon hole (as opposed to a polygon shell).
33
+ //
34
+ // Degeneracies are not allowed to coincide with any non-degenerate portions
35
+ // of the polygon's boundary (since that would make it impossible to classify
36
+ // the degeneracy as a shell or hole). Specifically, degenerate edges must
37
+ // coincide only with other degenerate edges, and sibling pairs must coincide
38
+ // only with other sibling pairs. (Below we require a slightly stronger
39
+ // condition, namely that sibling pairs cannot coincide with any other edges.)
40
+ struct PolygonDegeneracy {
41
+ uint32 edge_id : 31;
42
+ uint32 is_hole : 1;
43
+
44
+ PolygonDegeneracy() : edge_id(0), is_hole(false) {}
45
+ PolygonDegeneracy(S2Builder::Graph::EdgeId _edge_id, bool _is_hole)
46
+ : edge_id(_edge_id), is_hole(_is_hole) {
47
+ }
48
+ bool operator==(PolygonDegeneracy y) const {
49
+ return edge_id == y.edge_id && is_hole == y.is_hole;
50
+ }
51
+ bool operator<(PolygonDegeneracy y) const {
52
+ return edge_id < y.edge_id || (edge_id == y.edge_id && is_hole < y.is_hole);
53
+ }
54
+ };
55
+
56
+ // Given a graph representing a polygon, finds all degenerate edges and
57
+ // sibling pairs and classifies them as being either shells or holes. The
58
+ // result vector is sorted by edge id.
59
+ //
60
+ // REQUIRES: g.options().edge_type() == DIRECTED
61
+ // REQUIRES: g.options().sibling_pairs() == DISCARD_EXCESS (or DISCARD)
62
+ // REQUIRES: g.options().degenerate_edges() == DISCARD_EXCESS (or DISCARD)
63
+ //
64
+ // Usually callers will want to specify SiblingPairs::DISCARD_EXCESS and
65
+ // DegenerateEdges::DISCARD_EXCESS in order to remove all redundant
66
+ // degeneracies. DISCARD is also allowed in case you want to keep only one
67
+ // type of degeneracy (i.e., degenerate edges or sibling pairs).
68
+ //
69
+ // If the graph edges cannot be assembled into loops, the result is undefined.
70
+ // (An error may or may not be returned.)
71
+ std::vector<PolygonDegeneracy> FindPolygonDegeneracies(
72
+ const S2Builder::Graph& g, S2Error* error);
73
+
74
+ // Given a graph representing a polygon, returns true the graph consists
75
+ // entirely of degenerate edges and/or sibling pairs. Such a graph represents
76
+ // either the empty polygon together with a collection of degenerate shells,
77
+ // or the full polygon together with a collection of degenerate holes.
78
+ //
79
+ // REQUIRES: g.options().edge_type() == DIRECTED
80
+ // REQUIRES: g.options().sibling_pairs() == DISCARD_EXCESS (or DISCARD)
81
+ // REQUIRES: g.options().degenerate_edges() == DISCARD_EXCESS (or DISCARD)
82
+ bool IsFullyDegenerate(const S2Builder::Graph& g);
83
+
84
+ } // namespace s2builderutil
85
+
86
+ #endif // S2_S2BUILDERUTIL_FIND_POLYGON_DEGENERACIES_H_
@@ -0,0 +1,182 @@
1
+ // Copyright 2017 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/s2builderutil_find_polygon_degeneracies.h"
19
+
20
+ #include <iosfwd>
21
+ #include <memory>
22
+ #include <vector>
23
+
24
+ #include <gtest/gtest.h>
25
+ #include "s2/third_party/absl/memory/memory.h"
26
+ #include "s2/s2builder.h"
27
+ #include "s2/s2builder_graph.h"
28
+ #include "s2/s2builder_layer.h"
29
+ #include "s2/s2cap.h"
30
+ #include "s2/s2lax_polygon_shape.h"
31
+ #include "s2/s2pointutil.h"
32
+ #include "s2/s2testing.h"
33
+ #include "s2/s2text_format.h"
34
+
35
+ using absl::make_unique;
36
+ using std::vector;
37
+
38
+ using EdgeType = S2Builder::EdgeType;
39
+ using Graph = S2Builder::Graph;
40
+ using GraphOptions = S2Builder::GraphOptions;
41
+
42
+ using DegenerateEdges = GraphOptions::DegenerateEdges;
43
+ using DuplicateEdges = GraphOptions::DuplicateEdges;
44
+ using SiblingPairs = GraphOptions::SiblingPairs;
45
+
46
+ namespace s2builderutil {
47
+
48
+ struct TestDegeneracy {
49
+ string edge_str;
50
+ bool is_hole;
51
+ TestDegeneracy(string _edge_str, bool _is_hole)
52
+ : edge_str(_edge_str), is_hole(_is_hole) {
53
+ }
54
+ };
55
+
56
+ bool operator<(const TestDegeneracy& x, const TestDegeneracy& y) {
57
+ if (x.edge_str < y.edge_str) return true;
58
+ if (y.edge_str < x.edge_str) return false;
59
+ return x.is_hole < y.is_hole;
60
+ }
61
+
62
+ bool operator==(const TestDegeneracy& x, const TestDegeneracy& y) {
63
+ return x.edge_str == y.edge_str && x.is_hole == y.is_hole;
64
+ }
65
+
66
+ class DegeneracyCheckingLayer : public S2Builder::Layer {
67
+ public:
68
+ explicit DegeneracyCheckingLayer(const vector<TestDegeneracy>& expected)
69
+ : expected_(expected) {
70
+ }
71
+ GraphOptions graph_options() const override {
72
+ return GraphOptions(EdgeType::DIRECTED, DegenerateEdges::DISCARD_EXCESS,
73
+ DuplicateEdges::KEEP, SiblingPairs::DISCARD_EXCESS);
74
+ }
75
+ void Build(const Graph& g, S2Error* error) override;
76
+
77
+ private:
78
+ vector<TestDegeneracy> expected_;
79
+ };
80
+
81
+ std::ostream& operator<<(std::ostream& os, const vector<TestDegeneracy>& v) {
82
+ for (const auto& degeneracy : v) {
83
+ os << (degeneracy.is_hole ? "Hole(" : "Shell(");
84
+ os << degeneracy.edge_str + ") ";
85
+ }
86
+ return os;
87
+ }
88
+
89
+ void DegeneracyCheckingLayer::Build(const Graph& g, S2Error* error) {
90
+ auto degeneracies = FindPolygonDegeneracies(g, error);
91
+ // Convert the output into a human-readable format.
92
+ vector<TestDegeneracy> actual;
93
+ for (const auto& degeneracy : degeneracies) {
94
+ Graph::Edge edge = g.edge(degeneracy.edge_id);
95
+ vector<S2Point> points { g.vertex(edge.first), g.vertex(edge.second) };
96
+ actual.push_back(TestDegeneracy(s2textformat::ToString(points),
97
+ degeneracy.is_hole));
98
+ }
99
+ std::sort(actual.begin(), actual.end());
100
+ std::sort(expected_.begin(), expected_.end());
101
+ EXPECT_TRUE(expected_ == actual) << "\nExpected: " << expected_
102
+ << "\nActual: " << actual;
103
+ EXPECT_EQ(IsFullyDegenerate(g), degeneracies.size() == g.num_edges());
104
+ }
105
+
106
+ void ExpectDegeneracies(const string& polygon_str,
107
+ const vector<TestDegeneracy>& expected) {
108
+ S2Builder builder{S2Builder::Options()};
109
+ builder.StartLayer(make_unique<DegeneracyCheckingLayer>(expected));
110
+ auto polygon = s2textformat::MakeLaxPolygonOrDie(polygon_str);
111
+ builder.AddIsFullPolygonPredicate(
112
+ [&polygon](const Graph& graph, S2Error* error) {
113
+ return polygon->GetReferencePoint().contained;
114
+ });
115
+ for (int i = 0; i < polygon->num_edges(); ++i) {
116
+ auto edge = polygon->edge(i);
117
+ builder.AddEdge(edge.v0, edge.v1);
118
+ }
119
+ S2Error error;
120
+ EXPECT_TRUE(builder.Build(&error)) << error;
121
+ }
122
+
123
+ TEST(FindPolygonDegeneracies, EmptyPolygon) {
124
+ ExpectDegeneracies("", {});
125
+ }
126
+
127
+ TEST(FindPolygonDegeneracies, NoDegeneracies) {
128
+ ExpectDegeneracies("0:0, 0:1, 1:0", {});
129
+ }
130
+
131
+ TEST(FindPolygonDegeneracies, PointShell) {
132
+ ExpectDegeneracies("0:0", {{"0:0, 0:0", false}});
133
+ }
134
+
135
+ TEST(FindPolygonDegeneracies, SiblingPairShells) {
136
+ ExpectDegeneracies("0:0, 0:1, 1:0; 1:0, 0:1, 0:0", {
137
+ {"0:0, 0:1", false}, {"0:1, 0:0", false}, {"0:1, 1:0", false},
138
+ {"1:0, 0:1", false}, {"0:0, 1:0", false}, {"1:0, 0:0", false}
139
+ });
140
+ }
141
+
142
+ TEST(FindPolygonDegeneracies, AttachedSiblingPairShells) {
143
+ ExpectDegeneracies("0:0, 0:1, 1:0; 1:0, 2:0",
144
+ {{"1:0, 2:0", false}, {"2:0, 1:0", false}});
145
+ }
146
+
147
+ TEST(FindPolygonDegeneracies, AttachedSiblingPairHoles) {
148
+ ExpectDegeneracies("0:0, 0:3, 3:0; 0:0, 1:1",
149
+ {{"0:0, 1:1", true}, {"1:1, 0:0", true}});
150
+ }
151
+
152
+ TEST(FindPolygonDegeneracies, AttachedSiblingPairShellsAndHoles) {
153
+ ExpectDegeneracies("0:0, 0:3, 3:0; 3:0, 1:1; 3:0, 5:5", {
154
+ {"3:0, 1:1", true}, {"1:1, 3:0", true},
155
+ {"3:0, 5:5", false}, {"5:5, 3:0", false},
156
+ });
157
+ }
158
+
159
+ TEST(FindPolygonDegeneracies, DegenerateShellsOutsideLoop) {
160
+ ExpectDegeneracies("0:0, 0:3, 3:3, 3:0; 4:4, 5:5; 6:6", {
161
+ {"4:4, 5:5", false}, {"5:5, 4:4", false}, {"6:6, 6:6", false}
162
+ });
163
+ }
164
+
165
+ TEST(FindPolygonDegeneracies, DegenerateHolesWithinLoop) {
166
+ ExpectDegeneracies("0:0, 0:5, 5:5, 5:0; 1:1, 2:2; 3:3", {
167
+ {"1:1, 2:2", true}, {"2:2, 1:1", true}, {"3:3, 3:3", true}
168
+ });
169
+ }
170
+
171
+ TEST(FindPolygonDegeneracies, PointHoleWithinFull) {
172
+ ExpectDegeneracies("full; 0:0", {{"0:0, 0:0", true}});
173
+ }
174
+
175
+ TEST(FindPolygonDegeneracies, SiblingPairHolesWithinFull) {
176
+ ExpectDegeneracies("full; 0:0, 0:1, 1:0; 1:0, 0:1, 0:0", {
177
+ {"0:0, 0:1", true}, {"0:1, 0:0", true}, {"0:1, 1:0", true},
178
+ {"1:0, 0:1", true}, {"0:0, 1:0", true}, {"1:0, 0:0", true}
179
+ });
180
+ }
181
+
182
+ } // namespace s2builderutil
@@ -0,0 +1,57 @@
1
+ // Copyright 2017 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_S2BUILDERUTIL_GRAPH_SHAPE_H_
19
+ #define S2_S2BUILDERUTIL_GRAPH_SHAPE_H_
20
+
21
+ #include <vector>
22
+
23
+ #include "s2/s2builder_graph.h"
24
+
25
+ namespace s2builderutil {
26
+
27
+ // An S2Shape representing the edges in an S2Builder::Graph.
28
+ class GraphShape final : public S2Shape {
29
+ public:
30
+ using Graph = S2Builder::Graph;
31
+ explicit GraphShape(const Graph* g) : g_(*g) {}
32
+ int num_edges() const override { return g_.num_edges(); }
33
+ Edge edge(int e) const override {
34
+ Graph::Edge g_edge = g_.edge(e);
35
+ return Edge(g_.vertex(g_edge.first), g_.vertex(g_edge.second));
36
+ }
37
+ int dimension() const override { return 1; }
38
+ ReferencePoint GetReferencePoint() const override {
39
+ return ReferencePoint::Contained(false);
40
+ }
41
+ int num_chains() const override { return g_.num_edges(); }
42
+ Chain chain(int i) const override { return Chain(i, 1); }
43
+ Edge chain_edge(int i, int j) const override {
44
+ S2_DCHECK_EQ(j, 0);
45
+ return edge(i);
46
+ }
47
+ ChainPosition chain_position(int e) const override {
48
+ return ChainPosition(e, 0);
49
+ }
50
+
51
+ private:
52
+ const Graph& g_;
53
+ };
54
+
55
+ } // namespace s2builderutil
56
+
57
+ #endif // S2_S2BUILDERUTIL_GRAPH_SHAPE_H_
@@ -0,0 +1,212 @@
1
+ // Copyright 2018 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/s2builderutil_lax_polygon_layer.h"
19
+
20
+ #include <algorithm>
21
+ #include <memory>
22
+ #include "s2/third_party/absl/memory/memory.h"
23
+ #include "s2/s2builderutil_find_polygon_degeneracies.h"
24
+ #include "s2/s2debug.h"
25
+
26
+ using std::vector;
27
+
28
+ using EdgeType = S2Builder::EdgeType;
29
+ using Graph = S2Builder::Graph;
30
+ using GraphOptions = S2Builder::GraphOptions;
31
+ using Label = S2Builder::Label;
32
+
33
+ using DegenerateEdges = GraphOptions::DegenerateEdges;
34
+ using DuplicateEdges = GraphOptions::DuplicateEdges;
35
+ using SiblingPairs = GraphOptions::SiblingPairs;
36
+
37
+ using Edge = Graph::Edge;
38
+ using EdgeId = Graph::EdgeId;
39
+ using InputEdgeIdSetId = Graph::InputEdgeIdSetId;
40
+ using LoopType = Graph::LoopType;
41
+
42
+ namespace s2builderutil {
43
+
44
+ using DegenerateBoundaries = LaxPolygonLayer::Options::DegenerateBoundaries;
45
+
46
+ LaxPolygonLayer::LaxPolygonLayer(S2LaxPolygonShape* polygon,
47
+ const Options& options) {
48
+ Init(polygon, nullptr, nullptr, options);
49
+ }
50
+
51
+ LaxPolygonLayer::LaxPolygonLayer(
52
+ S2LaxPolygonShape* polygon, LabelSetIds* label_set_ids,
53
+ IdSetLexicon* label_set_lexicon, const Options& options) {
54
+ Init(polygon, label_set_ids, label_set_lexicon, options);
55
+ }
56
+
57
+ void LaxPolygonLayer::Init(
58
+ S2LaxPolygonShape* polygon, LabelSetIds* label_set_ids,
59
+ IdSetLexicon* label_set_lexicon, const Options& options) {
60
+ S2_DCHECK_EQ(label_set_ids == nullptr, label_set_lexicon == nullptr);
61
+ polygon_ = polygon;
62
+ label_set_ids_ = label_set_ids;
63
+ label_set_lexicon_ = label_set_lexicon;
64
+ options_ = options;
65
+ }
66
+
67
+ GraphOptions LaxPolygonLayer::graph_options() const {
68
+ if (options_.degenerate_boundaries() == DegenerateBoundaries::DISCARD) {
69
+ // There should not be any duplicate edges, but if there are then we keep
70
+ // them since this yields more comprehensible error messages.
71
+ return GraphOptions(options_.edge_type(), DegenerateEdges::DISCARD,
72
+ DuplicateEdges::KEEP, SiblingPairs::DISCARD);
73
+ } else {
74
+ // Keep at most one copy of each sibling pair and each isolated vertex.
75
+ // We need DuplicateEdges::MERGE because DegenerateEdges::DISCARD_EXCESS
76
+ // can still keep multiple copies (it only discards degenerate edges that
77
+ // are connected to non-degenerate edges).
78
+ return GraphOptions(options_.edge_type(), DegenerateEdges::DISCARD_EXCESS,
79
+ DuplicateEdges::MERGE, SiblingPairs::DISCARD_EXCESS);
80
+ }
81
+ }
82
+
83
+ void LaxPolygonLayer::AppendPolygonLoops(
84
+ const Graph& g, const vector<Graph::EdgeLoop>& edge_loops,
85
+ vector<vector<S2Point>>* loops) const {
86
+ for (const auto& edge_loop : edge_loops) {
87
+ vector<S2Point> vertices;
88
+ vertices.reserve(edge_loop.size());
89
+ for (auto edge_id : edge_loop) {
90
+ vertices.push_back(g.vertex(g.edge(edge_id).first));
91
+ }
92
+ loops->push_back(std::move(vertices));
93
+ }
94
+ }
95
+
96
+ void LaxPolygonLayer::AppendEdgeLabels(
97
+ const Graph& g,
98
+ const vector<Graph::EdgeLoop>& edge_loops) {
99
+ if (!label_set_ids_) return;
100
+
101
+ vector<Label> labels; // Temporary storage for labels.
102
+ Graph::LabelFetcher fetcher(g, options_.edge_type());
103
+ for (const auto& edge_loop : edge_loops) {
104
+ vector<LabelSetId> loop_label_set_ids;
105
+ loop_label_set_ids.reserve(edge_loop.size());
106
+ for (auto edge_id : edge_loop) {
107
+ fetcher.Fetch(edge_id, &labels);
108
+ loop_label_set_ids.push_back(label_set_lexicon_->Add(labels));
109
+ }
110
+ label_set_ids_->push_back(std::move(loop_label_set_ids));
111
+ }
112
+ }
113
+
114
+ // Returns all edges of "g" except for those identified by "edges_to_discard".
115
+ static void DiscardEdges(const Graph& g, const vector<EdgeId>& edges_to_discard,
116
+ vector<Edge>* new_edges,
117
+ vector<InputEdgeIdSetId>* new_input_edge_id_set_ids) {
118
+ S2_DCHECK(std::is_sorted(edges_to_discard.begin(), edges_to_discard.end()));
119
+ new_edges->clear();
120
+ new_input_edge_id_set_ids->clear();
121
+ new_edges->reserve(g.num_edges());
122
+ new_input_edge_id_set_ids->reserve(g.num_edges());
123
+ auto it = edges_to_discard.begin();
124
+ for (int e = 0; e < g.num_edges(); ++e) {
125
+ if (it != edges_to_discard.end() && e == *it) {
126
+ ++it;
127
+ } else {
128
+ new_edges->push_back(g.edge(e));
129
+ new_input_edge_id_set_ids->push_back(g.input_edge_id_set_id(e));
130
+ }
131
+ }
132
+ S2_DCHECK(it == edges_to_discard.end());
133
+ }
134
+
135
+ static void MaybeAddFullLoop(
136
+ const Graph& g, vector<vector<S2Point>>* loops, S2Error* error) {
137
+ if (g.IsFullPolygon(error)) {
138
+ loops->push_back({}); // Full loop.
139
+ }
140
+ }
141
+ void LaxPolygonLayer::BuildDirected(Graph g, S2Error* error) {
142
+ // Some cases are implemented by constructing a new graph with certain
143
+ // degenerate edges removed (overwriting "g"). "new_edges" is where the
144
+ // edges for the new graph are stored.
145
+ vector<Edge> new_edges;
146
+ vector<InputEdgeIdSetId> new_input_edge_id_set_ids;
147
+ vector<vector<S2Point>> loops;
148
+ auto degenerate_boundaries = options_.degenerate_boundaries();
149
+ if (degenerate_boundaries == DegenerateBoundaries::DISCARD) {
150
+ // This is the easiest case, since there are no degeneracies.
151
+ if (g.num_edges() == 0) MaybeAddFullLoop(g, &loops, error);
152
+ } else if (degenerate_boundaries == DegenerateBoundaries::KEEP) {
153
+ // S2LaxPolygonShape doesn't need to distinguish degenerate shells from
154
+ // holes except when the entire graph is degenerate, in which case we need
155
+ // to decide whether it represents an empty polygons possibly with
156
+ // degenerate shells, or a full polygon possibly with degenerate holes.
157
+ if (s2builderutil::IsFullyDegenerate(g)) {
158
+ MaybeAddFullLoop(g, &loops, error);
159
+ }
160
+ } else {
161
+ // For DISCARD_SHELLS and DISCARD_HOLES we first determine whether any
162
+ // degenerate loops of the given type exist, and if so we construct a new
163
+ // graph with those edges removed (overwriting "g").
164
+ bool discard_holes =
165
+ (degenerate_boundaries == DegenerateBoundaries::DISCARD_HOLES);
166
+ auto degeneracies = s2builderutil::FindPolygonDegeneracies(g, error);
167
+ if (!error->ok()) return;
168
+ if (degeneracies.size() == g.num_edges()) {
169
+ if (degeneracies.empty()) {
170
+ MaybeAddFullLoop(g, &loops, error);
171
+ } else if (degeneracies[0].is_hole) {
172
+ loops.push_back({}); // Full loop.
173
+ }
174
+ }
175
+ vector<EdgeId> edges_to_discard;
176
+ for (auto degeneracy : degeneracies) {
177
+ if (degeneracy.is_hole == discard_holes) {
178
+ edges_to_discard.push_back(degeneracy.edge_id);
179
+ }
180
+ }
181
+ if (!edges_to_discard.empty()) {
182
+ // Construct a new graph that discards the unwanted edges.
183
+ std::sort(edges_to_discard.begin(), edges_to_discard.end());
184
+ DiscardEdges(g, edges_to_discard, &new_edges, &new_input_edge_id_set_ids);
185
+ g = Graph(g.options(), &g.vertices(),
186
+ &new_edges, &new_input_edge_id_set_ids,
187
+ &g.input_edge_id_set_lexicon(), &g.label_set_ids(),
188
+ &g.label_set_lexicon(), g.is_full_polygon_predicate());
189
+ }
190
+ }
191
+ vector<Graph::EdgeLoop> edge_loops;
192
+ if (!g.GetDirectedLoops(LoopType::CIRCUIT, &edge_loops, error)) {
193
+ return;
194
+ }
195
+ AppendPolygonLoops(g, edge_loops, &loops);
196
+ AppendEdgeLabels(g, edge_loops);
197
+ vector<Graph::EdgeLoop>().swap(edge_loops); // Release memory
198
+ vector<Edge>().swap(new_edges);
199
+ vector<InputEdgeIdSetId>().swap(new_input_edge_id_set_ids);
200
+ polygon_->Init(loops);
201
+ }
202
+
203
+ void LaxPolygonLayer::Build(const Graph& g, S2Error* error) {
204
+ if (label_set_ids_) label_set_ids_->clear();
205
+ if (g.options().edge_type() == EdgeType::DIRECTED) {
206
+ BuildDirected(g, error);
207
+ } else {
208
+ error->Init(S2Error::UNIMPLEMENTED, "Undirected edges not supported yet");
209
+ }
210
+ }
211
+
212
+ } // namespace s2builderutil