@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,312 @@
1
+ // Copyright 2016 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_s2polygon_layer.h"
19
+
20
+ #include <algorithm>
21
+ #include <map>
22
+ #include <memory>
23
+ #include <set>
24
+ #include <string>
25
+ #include "s2/base/casts.h"
26
+ #include "s2/base/integral_types.h"
27
+ #include <gtest/gtest.h>
28
+ #include "s2/third_party/absl/memory/memory.h"
29
+ #include "s2/mutable_s2shape_index.h"
30
+ #include "s2/s2debug.h"
31
+ #include "s2/s2text_format.h"
32
+
33
+ using absl::make_unique;
34
+ using s2builderutil::IndexedS2PolygonLayer;
35
+ using s2builderutil::S2PolygonLayer;
36
+ using s2textformat::MakePolylineOrDie;
37
+ using std::map;
38
+ using std::set;
39
+ using std::unique_ptr;
40
+ using std::vector;
41
+
42
+ using EdgeType = S2Builder::EdgeType;
43
+
44
+ namespace {
45
+
46
+ void TestS2Polygon(const vector<const char*>& input_strs,
47
+ const char* expected_str, EdgeType edge_type) {
48
+ SCOPED_TRACE(edge_type == EdgeType::DIRECTED ? "DIRECTED" : "UNDIRECTED");
49
+ S2Builder builder{S2Builder::Options()};
50
+ S2Polygon output;
51
+ builder.StartLayer(make_unique<S2PolygonLayer>(
52
+ &output, S2PolygonLayer::Options(edge_type)));
53
+ bool is_full = false;
54
+ for (auto input_str : input_strs) {
55
+ if (string(input_str) == "full") is_full = true;
56
+ builder.AddPolygon(*s2textformat::MakeVerbatimPolygonOrDie(input_str));
57
+ }
58
+ builder.AddIsFullPolygonPredicate(S2Builder::IsFullPolygon(is_full));
59
+ S2Error error;
60
+ ASSERT_TRUE(builder.Build(&error));
61
+ // The input strings in tests may not be in normalized form, so we build an
62
+ // S2Polygon and convert it back to a string.
63
+ unique_ptr<S2Polygon> expected(s2textformat::MakePolygon(expected_str));
64
+ EXPECT_EQ(s2textformat::ToString(*expected),
65
+ s2textformat::ToString(output));
66
+ }
67
+
68
+ void TestS2Polygon(const vector<const char*>& input_strs,
69
+ const char* expected_str) {
70
+ TestS2Polygon(input_strs, expected_str, EdgeType::DIRECTED);
71
+ TestS2Polygon(input_strs, expected_str, EdgeType::UNDIRECTED);
72
+ }
73
+
74
+ void TestS2PolygonUnchanged(const char* input_str) {
75
+ TestS2Polygon(vector<const char*>{input_str}, input_str);
76
+ }
77
+
78
+ // Unlike the methods above, the input consists of a set of *polylines*.
79
+ void TestS2PolygonError(const vector<const char*>& input_strs,
80
+ S2Error::Code expected_error, EdgeType edge_type) {
81
+ SCOPED_TRACE(edge_type == EdgeType::DIRECTED ? "DIRECTED" : "UNDIRECTED");
82
+ S2Builder builder{S2Builder::Options()};
83
+ S2Polygon output;
84
+ S2PolygonLayer::Options options(edge_type);
85
+ options.set_validate(true);
86
+ builder.StartLayer(make_unique<S2PolygonLayer>(&output, options));
87
+ for (auto input_str : input_strs) {
88
+ builder.AddPolyline(*s2textformat::MakePolyline(input_str));
89
+ }
90
+ S2Error error;
91
+ ASSERT_FALSE(builder.Build(&error));
92
+ EXPECT_EQ(expected_error, error.code());
93
+ }
94
+
95
+ void TestS2PolygonError(const vector<const char*>& input_strs,
96
+ S2Error::Code expected_error) {
97
+ TestS2PolygonError(input_strs, expected_error, EdgeType::DIRECTED);
98
+ TestS2PolygonError(input_strs, expected_error, EdgeType::UNDIRECTED);
99
+ }
100
+
101
+ TEST(S2PolygonLayer, Empty) {
102
+ TestS2PolygonUnchanged("");
103
+ }
104
+
105
+ TEST(S2PolygonLayer, Full) {
106
+ TestS2PolygonUnchanged("full");
107
+ }
108
+
109
+ TEST(S2PolygonLayer, SmallLoop) {
110
+ TestS2PolygonUnchanged("0:0, 0:1, 1:1");
111
+ }
112
+
113
+ TEST(S2PolygonLayer, ThreeLoops) {
114
+ // The second two loops are nested.
115
+ TestS2PolygonUnchanged("0:1, 1:1, 0:0; "
116
+ "3:3, 3:6, 6:6, 6:3; "
117
+ "4:4, 4:5, 5:5, 5:4");
118
+ }
119
+
120
+ TEST(S2PolygonLayer, PartialLoop) {
121
+ TestS2PolygonError({"0:1, 2:3, 4:5"},
122
+ S2Error::BUILDER_EDGES_DO_NOT_FORM_LOOPS);
123
+ }
124
+
125
+ TEST(S2PolygonLayer, InvalidPolygon) {
126
+ TestS2PolygonError({"0:0, 0:10, 10:0, 10:10, 0:0"},
127
+ S2Error::LOOP_SELF_INTERSECTION);
128
+ }
129
+
130
+ TEST(S2PolygonLayer, DuplicateInputEdges) {
131
+ // Check that S2PolygonLayer can assemble polygons even when there are
132
+ // duplicate edges (after sibling pairs are removed), and then report the
133
+ // duplicate edges as an error.
134
+ S2Builder builder{S2Builder::Options()};
135
+ S2Polygon output;
136
+ S2PolygonLayer::Options options;
137
+ options.set_validate(true);
138
+ builder.StartLayer(make_unique<S2PolygonLayer>(&output, options));
139
+ builder.AddPolyline(*MakePolylineOrDie(
140
+ "0:0, 0:2, 2:2, 1:1, 0:2, 2:2, 2:0, 0:0"));
141
+ S2Error error;
142
+ EXPECT_FALSE(builder.Build(&error));
143
+ EXPECT_EQ(S2Error::POLYGON_LOOPS_SHARE_EDGE, error.code());
144
+ ASSERT_EQ(2, output.num_loops());
145
+ unique_ptr<S2Loop> loop0(s2textformat::MakeLoop("0:0, 0:2, 2:2, 2:0"));
146
+ unique_ptr<S2Loop> loop1(s2textformat::MakeLoop("0:2, 2:2, 1:1"));
147
+ EXPECT_TRUE(loop0->Equals(output.loop(0)));
148
+ EXPECT_TRUE(loop1->Equals(output.loop(1)));
149
+ }
150
+
151
+ // Since we don't expect to have any crossing edges, the key for each edge is
152
+ // simply the sum of its endpoints. This key has the advantage of being
153
+ // unchanged when the endpoints of an edge are swapped.
154
+ using EdgeLabelMap = map<S2Point, set<int32>>;
155
+
156
+ void AddPolylineWithLabels(const S2Polyline& polyline, EdgeType edge_type,
157
+ int32 label_begin, S2Builder* builder,
158
+ EdgeLabelMap *edge_label_map) {
159
+ for (int i = 0; i + 1 < polyline.num_vertices(); ++i) {
160
+ int32 label = label_begin + i;
161
+ builder->set_label(label);
162
+ // With undirected edges, reverse the direction of every other input edge.
163
+ int dir = edge_type == EdgeType::DIRECTED ? 1 : (i & 1);
164
+ builder->AddEdge(polyline.vertex(i + (1 - dir)), polyline.vertex(i + dir));
165
+ S2Point key = polyline.vertex(i) + polyline.vertex(i + 1);
166
+ (*edge_label_map)[key].insert(label);
167
+ }
168
+ }
169
+
170
+ static void TestEdgeLabels(EdgeType edge_type) {
171
+ S2Builder builder{S2Builder::Options()};
172
+ S2Polygon output;
173
+ S2PolygonLayer::LabelSetIds label_set_ids;
174
+ IdSetLexicon label_set_lexicon;
175
+ builder.StartLayer(make_unique<S2PolygonLayer>(
176
+ &output, &label_set_ids, &label_set_lexicon,
177
+ S2PolygonLayer::Options(edge_type)));
178
+
179
+ // We use a polygon consisting of 3 loops. The loops are reordered and
180
+ // some of the loops are inverted during S2Polygon construction.
181
+ EdgeLabelMap edge_label_map;
182
+ AddPolylineWithLabels(*MakePolylineOrDie("0:0, 9:1, 1:9, 0:0, 2:8, 8:2, "
183
+ "0:0, 0:10, 10:10, 10:0, 0:0"),
184
+ edge_type, 0, &builder, &edge_label_map);
185
+ S2Error error;
186
+ ASSERT_TRUE(builder.Build(&error));
187
+ vector<int> expected_loop_sizes = { 4, 3, 3 };
188
+ ASSERT_EQ(expected_loop_sizes.size(), label_set_ids.size());
189
+ for (int i = 0; i < expected_loop_sizes.size(); ++i) {
190
+ ASSERT_EQ(expected_loop_sizes[i], label_set_ids[i].size());
191
+ for (int j = 0; j < label_set_ids[i].size(); ++j) {
192
+ S2Point key = output.loop(i)->vertex(j) + output.loop(i)->vertex(j + 1);
193
+ const set<int32>& expected_labels = edge_label_map[key];
194
+ ASSERT_EQ(expected_labels.size(),
195
+ label_set_lexicon.id_set(label_set_ids[i][j]).size());
196
+ EXPECT_TRUE(std::equal(
197
+ expected_labels.begin(), expected_labels.end(),
198
+ label_set_lexicon.id_set(label_set_ids[i][j]).begin()));
199
+ }
200
+ }
201
+ }
202
+
203
+ TEST(S2PolygonLayer, DirectedEdgeLabels) {
204
+ TestEdgeLabels(EdgeType::DIRECTED);
205
+ }
206
+
207
+ TEST(S2PolygonLayer, UndirectedEdgeLabels) {
208
+ TestEdgeLabels(EdgeType::UNDIRECTED);
209
+ }
210
+
211
+ TEST(S2PolygonLayer, ThreeLoopsIntoOne) {
212
+ // Three loops (two shells and one hole) that combine into one.
213
+ TestS2Polygon(
214
+ {"10:0, 0:0, 0:10, 5:10, 10:10, 10:5",
215
+ "0:10, 0:15, 5:15, 5:10",
216
+ "10:10, 5:10, 5:5, 10:5"},
217
+ "10:5, 10:0, 0:0, 0:10, 0:15, 5:15, 5:10, 5:5");
218
+ }
219
+
220
+ TEST(S2PolygonLayer, TrianglePyramid) {
221
+ // A big CCW triangle containing 3 CW triangular holes. The whole thing
222
+ // looks like a pyramid of nine triangles. The output consists of 6
223
+ // positive triangles with no holes.
224
+ TestS2Polygon(
225
+ {"0:0, 0:2, 0:4, 0:6, 1:5, 2:4, 3:3, 2:2, 1:1",
226
+ "0:2, 1:1, 1:3",
227
+ "0:4, 1:3, 1:5",
228
+ "1:3, 2:2, 2:4"},
229
+ "0:4, 0:6, 1:5; 2:4, 3:3, 2:2; 2:2, 1:1, 1:3; "
230
+ "1:1, 0:0, 0:2; 1:3, 0:2, 0:4; 1:3, 1:5, 2:4");
231
+ }
232
+
233
+ TEST(S2PolygonLayer, ComplexNesting) {
234
+ // A complex set of nested polygons, with the loops in random order and the
235
+ // vertices in random cyclic order within each loop. This test checks that
236
+ // the order (after S2Polygon::InitNested is called) is preserved exactly,
237
+ // whether directed or undirected edges are used.
238
+ TestS2PolygonUnchanged(
239
+ "47:15, 47:5, 5:5, 5:15; "
240
+ "35:12, 35:7, 27:7, 27:12; "
241
+ "1:50, 50:50, 50:1, 1:1; "
242
+ "42:22, 10:22, 10:25, 42:25; "
243
+ "47:30, 47:17, 5:17, 5:30; "
244
+ "7:27, 45:27, 45:20, 7:20; "
245
+ "37:7, 37:12, 45:12, 45:7; "
246
+ "47:47, 47:32, 5:32, 5:47; "
247
+ "50:60, 50:55, 1:55, 1:60; "
248
+ "25:7, 17:7, 17:12, 25:12; "
249
+ "7:7, 7:12, 15:12, 15:7");
250
+ }
251
+
252
+ TEST(S2PolygonLayer, FiveLoopsTouchingAtOneCommonPoint) {
253
+ // Five nested loops that touch at one common point.
254
+ TestS2PolygonUnchanged("0:0, 0:10, 10:10, 10:0; "
255
+ "0:0, 1:9, 9:9, 9:1; "
256
+ "0:0, 2:8, 8:8, 8:2; "
257
+ "0:0, 3:7, 7:7, 7:3; "
258
+ "0:0, 4:6, 6:6, 6:4");
259
+ }
260
+
261
+ TEST(S2PolygonLayer, FourNestedDiamondsTouchingAtTwoPointsPerPair) {
262
+ // Four diamonds nested inside each other, where each diamond shares two
263
+ // vertices with the diamond inside it and shares its other two vertices
264
+ // with the diamond that contains it. The resulting shape looks vaguely
265
+ // like an eye made out of chevrons.
266
+ TestS2Polygon(
267
+ {"0:10, -10:0, 0:-10, 10:0",
268
+ "0:-20, -10:0, 0:20, 10:0",
269
+ "0:-10, -5:0, 0:10, 5:0",
270
+ "0:5, -5:0, 0:-5, 5:0"},
271
+ "10:0, 0:10, -10:0, 0:20; "
272
+ "0:-20, -10:0, 0:-10, 10:0; "
273
+ "5:0, 0:-10, -5:0, 0:-5; "
274
+ "0:5, -5:0, 0:10, 5:0");
275
+ }
276
+
277
+ TEST(S2PolygonLayer, SevenDiamondsTouchingAtOnePointPerPair) {
278
+ // Seven diamonds nested within each other touching at one
279
+ // point between each nested pair.
280
+ TestS2PolygonUnchanged("0:-70, -70:0, 0:70, 70:0; "
281
+ "0:-70, -60:0, 0:60, 60:0; "
282
+ "0:-50, -60:0, 0:50, 50:0; "
283
+ "0:-40, -40:0, 0:50, 40:0; "
284
+ "0:-30, -30:0, 0:30, 40:0; "
285
+ "0:-20, -20:0, 0:30, 20:0; "
286
+ "0:-10, -20:0, 0:10, 10:0");
287
+ }
288
+
289
+ TEST(IndexedS2PolygonLayer, AddsShape) {
290
+ S2Builder builder{S2Builder::Options()};
291
+ MutableS2ShapeIndex index;
292
+ builder.StartLayer(make_unique<IndexedS2PolygonLayer>(&index));
293
+ const string& polygon_str = "0:0, 0:10, 10:0";
294
+ builder.AddPolygon(*s2textformat::MakePolygon(polygon_str));
295
+ S2Error error;
296
+ ASSERT_TRUE(builder.Build(&error));
297
+ EXPECT_EQ(1, index.num_shape_ids());
298
+ const S2Polygon* polygon = down_cast<const S2Polygon::Shape*>(
299
+ index.shape(0))->polygon();
300
+ EXPECT_EQ(polygon_str, s2textformat::ToString(*polygon));
301
+ }
302
+
303
+ TEST(IndexedS2PolygonLayer, IgnoresEmptyShape) {
304
+ S2Builder builder{S2Builder::Options()};
305
+ MutableS2ShapeIndex index;
306
+ builder.StartLayer(make_unique<IndexedS2PolygonLayer>(&index));
307
+ S2Error error;
308
+ ASSERT_TRUE(builder.Build(&error));
309
+ EXPECT_EQ(0, index.num_shape_ids());
310
+ }
311
+
312
+ } // namespace
@@ -0,0 +1,105 @@
1
+ // Copyright 2016 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_s2polyline_layer.h"
19
+
20
+ #include "s2/s2debug.h"
21
+
22
+ using std::vector;
23
+
24
+ using EdgeType = S2Builder::EdgeType;
25
+ using Graph = S2Builder::Graph;
26
+ using GraphOptions = S2Builder::GraphOptions;
27
+ using Label = S2Builder::Label;
28
+
29
+ using DegenerateEdges = GraphOptions::DegenerateEdges;
30
+ using DuplicateEdges = GraphOptions::DuplicateEdges;
31
+ using SiblingPairs = GraphOptions::SiblingPairs;
32
+
33
+ using EdgeId = Graph::EdgeId;
34
+ using PolylineType = Graph::PolylineType;
35
+
36
+ namespace s2builderutil {
37
+
38
+ S2PolylineLayer::S2PolylineLayer(S2Polyline* polyline,
39
+ const S2PolylineLayer::Options& options) {
40
+ Init(polyline, nullptr, nullptr, options);
41
+ }
42
+
43
+ S2PolylineLayer::S2PolylineLayer(
44
+ S2Polyline* polyline, LabelSetIds* label_set_ids,
45
+ IdSetLexicon* label_set_lexicon, const Options& options) {
46
+ Init(polyline, label_set_ids, label_set_lexicon, options);
47
+ }
48
+
49
+ void S2PolylineLayer::Init(S2Polyline* polyline, LabelSetIds* label_set_ids,
50
+ IdSetLexicon* label_set_lexicon,
51
+ const Options& options) {
52
+ S2_DCHECK_EQ(label_set_ids == nullptr, label_set_lexicon == nullptr);
53
+ polyline_ = polyline;
54
+ label_set_ids_ = label_set_ids;
55
+ label_set_lexicon_ = label_set_lexicon;
56
+ options_ = options;
57
+
58
+ if (options_.validate()) {
59
+ polyline_->set_s2debug_override(S2Debug::DISABLE);
60
+ }
61
+ }
62
+
63
+ GraphOptions S2PolylineLayer::graph_options() const {
64
+ // Remove edges that collapse to a single vertex, but keep duplicate and
65
+ // sibling edges, since merging duplicates or discarding siblings can make
66
+ // it impossible to assemble the edges into a single polyline.
67
+ return GraphOptions(options_.edge_type(), DegenerateEdges::DISCARD,
68
+ DuplicateEdges::KEEP, SiblingPairs::KEEP);
69
+ }
70
+
71
+ void S2PolylineLayer::Build(const Graph& g, S2Error* error) {
72
+ if (g.num_edges() == 0) {
73
+ polyline_->Init(vector<S2Point>{});
74
+ return;
75
+ }
76
+ vector<Graph::EdgePolyline> edge_polylines =
77
+ g.GetPolylines(PolylineType::WALK);
78
+ if (edge_polylines.size() != 1) {
79
+ error->Init(S2Error::BUILDER_EDGES_DO_NOT_FORM_POLYLINE,
80
+ "Input edges cannot be assembled into polyline");
81
+ return;
82
+ }
83
+ const Graph::EdgePolyline& edge_polyline = edge_polylines[0];
84
+ vector<S2Point> vertices; // Temporary storage for vertices.
85
+ vertices.reserve(edge_polyline.size());
86
+ vertices.push_back(g.vertex(g.edge(edge_polyline[0]).first));
87
+ for (EdgeId e : edge_polyline) {
88
+ vertices.push_back(g.vertex(g.edge(e).second));
89
+ }
90
+ if (label_set_ids_) {
91
+ Graph::LabelFetcher fetcher(g, options_.edge_type());
92
+ vector<Label> labels; // Temporary storage for labels.
93
+ label_set_ids_->reserve(edge_polyline.size());
94
+ for (EdgeId e : edge_polyline) {
95
+ fetcher.Fetch(e, &labels);
96
+ label_set_ids_->push_back(label_set_lexicon_->Add(labels));
97
+ }
98
+ }
99
+ polyline_->Init(vertices);
100
+ if (options_.validate()) {
101
+ polyline_->FindValidationError(error);
102
+ }
103
+ }
104
+
105
+ } // namespace s2builderutil
@@ -0,0 +1,174 @@
1
+ // Copyright 2016 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_S2POLYLINE_LAYER_H_
19
+ #define S2_S2BUILDERUTIL_S2POLYLINE_LAYER_H_
20
+
21
+ #include <memory>
22
+ #include <vector>
23
+ #include "s2/base/logging.h"
24
+ #include "s2/third_party/absl/memory/memory.h"
25
+ #include "s2/id_set_lexicon.h"
26
+ #include "s2/mutable_s2shape_index.h"
27
+ #include "s2/s2builder.h"
28
+ #include "s2/s2builder_graph.h"
29
+ #include "s2/s2builder_layer.h"
30
+ #include "s2/s2error.h"
31
+ #include "s2/s2polyline.h"
32
+
33
+ namespace s2builderutil {
34
+
35
+ // A layer type that assembles edges (directed or undirected) into an
36
+ // S2Polyline. Returns an error if the edges cannot be assembled into a
37
+ // single unbroken polyline.
38
+ //
39
+ // Duplicate edges are handled correctly (e.g., if a polyline backtracks on
40
+ // itself, or loops around and retraces some of its previous edges.) The
41
+ // implementation attempts to preserve the order of directed input edges
42
+ // whenever possible, so that if the input is a polyline and it is not
43
+ // modified by S2Builder, then the output will be the same polyline (even if
44
+ // the polyline backtracks on itself or forms a loop). With undirected edges,
45
+ // there are no such guarantees; for example, even if the input consists of a
46
+ // single undirected edge, then either directed edge may be returned.
47
+ //
48
+ // S2PolylineLayer does not support options such as discarding sibling pairs
49
+ // or merging duplicate edges because these options can split the polyline
50
+ // into several pieces. Use S2PolylineVectorLayer if you need these features.
51
+ class S2PolylineLayer : public S2Builder::Layer {
52
+ public:
53
+ class Options {
54
+ public:
55
+ // Constructor that uses the default options (listed below).
56
+ Options();
57
+
58
+ // Constructor that specifies the edge type.
59
+ explicit Options(S2Builder::EdgeType edge_type);
60
+
61
+ // Indicates whether the input edges provided to S2Builder are directed or
62
+ // undirected. Directed edges should be used whenever possible to avoid
63
+ // ambiguity.
64
+ //
65
+ // DEFAULT: S2Builder::EdgeType::DIRECTED
66
+ S2Builder::EdgeType edge_type() const;
67
+ void set_edge_type(S2Builder::EdgeType edge_type);
68
+
69
+ // If true, calls FindValidationError() on the output polyline. If any
70
+ // error is found, it will be returned by S2Builder::Build().
71
+ //
72
+ // Note that this option calls set_s2debug_override(S2Debug::DISABLE) in
73
+ // order to turn off the default error checking in debug builds.
74
+ //
75
+ // DEFAULT: false
76
+ bool validate() const;
77
+ void set_validate(bool validate);
78
+
79
+ private:
80
+ S2Builder::EdgeType edge_type_;
81
+ bool validate_;
82
+ };
83
+
84
+ // Specifies that a polyline should be constructed using the given options.
85
+ explicit S2PolylineLayer(S2Polyline* polyline,
86
+ const Options& options = Options());
87
+
88
+ // Specifies that a polyline should be constructed using the given options,
89
+ // and that any labels attached to the input edges should be returned in
90
+ // "label_set_ids" and "label_set_lexicion".
91
+ //
92
+ // The labels associated with the edge "polyline.vertex({j, j+1})" can be
93
+ // retrieved as follows:
94
+ //
95
+ // for (int32 label : label_set_lexicon.id_set(label_set_ids[j])) {...}
96
+ using LabelSetIds = std::vector<LabelSetId>;
97
+ S2PolylineLayer(S2Polyline* polyline, LabelSetIds* label_set_ids,
98
+ IdSetLexicon* label_set_lexicon,
99
+ const Options& options = Options());
100
+
101
+ // Layer interface:
102
+ GraphOptions graph_options() const override;
103
+ void Build(const Graph& g, S2Error* error) override;
104
+
105
+ private:
106
+ void Init(S2Polyline* polyline, LabelSetIds* label_set_ids,
107
+ IdSetLexicon* label_set_lexicon, const Options& options);
108
+
109
+ S2Polyline* polyline_;
110
+ LabelSetIds* label_set_ids_;
111
+ IdSetLexicon* label_set_lexicon_;
112
+ Options options_;
113
+ };
114
+
115
+ // Like S2PolylineLayer, but adds the polyline to a MutableS2ShapeIndex (if the
116
+ // polyline is non-empty).
117
+ class IndexedS2PolylineLayer : public S2Builder::Layer {
118
+ public:
119
+ using Options = S2PolylineLayer::Options;
120
+ explicit IndexedS2PolylineLayer(MutableS2ShapeIndex* index,
121
+ const Options& options = Options())
122
+ : index_(index), polyline_(new S2Polyline),
123
+ layer_(polyline_.get(), options) {}
124
+
125
+ GraphOptions graph_options() const override {
126
+ return layer_.graph_options();
127
+ }
128
+
129
+ void Build(const Graph& g, S2Error* error) override {
130
+ layer_.Build(g, error);
131
+ if (error->ok() && polyline_->num_vertices() > 0) {
132
+ index_->Add(
133
+ absl::make_unique<S2Polyline::OwningShape>(std::move(polyline_)));
134
+ }
135
+ }
136
+
137
+ private:
138
+ MutableS2ShapeIndex* index_;
139
+ std::unique_ptr<S2Polyline> polyline_;
140
+ S2PolylineLayer layer_;
141
+ };
142
+
143
+
144
+ ////////////////// Implementation details follow ////////////////////
145
+
146
+
147
+ inline S2PolylineLayer::Options::Options()
148
+ : edge_type_(S2Builder::EdgeType::DIRECTED), validate_(false) {
149
+ }
150
+
151
+ inline S2PolylineLayer::Options::Options(S2Builder::EdgeType edge_type)
152
+ : edge_type_(edge_type), validate_(false) {
153
+ }
154
+
155
+ inline S2Builder::EdgeType S2PolylineLayer::Options::edge_type() const {
156
+ return edge_type_;
157
+ }
158
+
159
+ inline void S2PolylineLayer::Options::set_edge_type(
160
+ S2Builder::EdgeType edge_type) {
161
+ edge_type_ = edge_type;
162
+ }
163
+
164
+ inline bool S2PolylineLayer::Options::validate() const {
165
+ return validate_;
166
+ }
167
+
168
+ inline void S2PolylineLayer::Options::set_validate(bool validate) {
169
+ validate_ = validate;
170
+ }
171
+
172
+ } // namespace s2builderutil
173
+
174
+ #endif // S2_S2BUILDERUTIL_S2POLYLINE_LAYER_H_