@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,218 @@
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
+ // Note that there are two supported output types for polygons: S2Polygon and
19
+ // S2LaxPolygonShape. Use S2Polygon if you need the full range of operations
20
+ // that S2Polygon implements. Use S2LaxPolygonShape if you want to represent
21
+ // polygons with zero-area degenerate regions, or if you need a type that has
22
+ // low memory overhead and fast initialization. However, be aware that to
23
+ // convert from S2LaxPolygonShape to S2Polygon you will need to use S2Builder
24
+ // again.
25
+ //
26
+ // Similarly, there are two supported output formats for polygon meshes:
27
+ // S2PolygonMesh and S2LaxPolygonShapeVector. Use S2PolygonMesh if you need
28
+ // to be able to determine which polygons are adjacent to each edge or vertex;
29
+ // otherwise use S2LaxPolygonShapeVector, which uses less memory and is faster
30
+ // to construct.
31
+
32
+ #ifndef S2_S2BUILDERUTIL_LAX_POLYGON_LAYER_H_
33
+ #define S2_S2BUILDERUTIL_LAX_POLYGON_LAYER_H_
34
+
35
+ #include <memory>
36
+ #include <vector>
37
+ #include "s2/base/logging.h"
38
+ #include "s2/third_party/absl/memory/memory.h"
39
+ #include "s2/id_set_lexicon.h"
40
+ #include "s2/mutable_s2shape_index.h"
41
+ #include "s2/s2builder.h"
42
+ #include "s2/s2builder_graph.h"
43
+ #include "s2/s2builder_layer.h"
44
+ #include "s2/s2error.h"
45
+ #include "s2/s2lax_polygon_shape.h"
46
+
47
+ namespace s2builderutil {
48
+
49
+ // A layer type that assembles edges (directed or undirected) into an
50
+ // S2LaxPolygonShape. Returns an error if the edges cannot be assembled into
51
+ // loops.
52
+ //
53
+ // If the input edges are directed, they must be oriented such that the
54
+ // polygon interior is to the left of all edges. Directed edges are always
55
+ // preferred (see S2Builder::EdgeType).
56
+ //
57
+ // LaxPolygonLayer is implemented such that if the input to S2Builder is a
58
+ // polygon and is not modified, then the output has the same cyclic ordering
59
+ // of loop vertices and the same loop ordering as the input polygon.
60
+ //
61
+ // If the given edge graph is degenerate (i.e., it consists entirely of
62
+ // degenerate edges and sibling pairs), then the IsFullPolygonPredicate
63
+ // associated with the edge graph is called to determine whether the output
64
+ // polygon should be empty (possibly with degenerate shells) or full (possibly
65
+ // with degenerate holes). This predicate can be specified as part of the
66
+ // S2Builder input geometry.
67
+ class LaxPolygonLayer : public S2Builder::Layer {
68
+ public:
69
+ class Options {
70
+ public:
71
+ // Constructor that uses the default options (listed below).
72
+ Options();
73
+
74
+ // Constructor that specifies the edge type.
75
+ explicit Options(S2Builder::EdgeType edge_type);
76
+
77
+ // Indicates whether the input edges provided to S2Builder are directed or
78
+ // undirected. Directed edges should be used whenever possible (see
79
+ // S2Builder::EdgeType for details).
80
+ //
81
+ // If the input edges are directed, they should be oriented so that the
82
+ // polygon interior is to the left of all edges. This means that for a
83
+ // polygon with holes, the outer loops ("shells") should be directed
84
+ // counter-clockwise while the inner loops ("holes") should be directed
85
+ // clockwise. Note that S2Builder::AddPolygon() does this automatically.
86
+ //
87
+ // DEFAULT: S2Builder::EdgeType::DIRECTED
88
+ S2Builder::EdgeType edge_type() const;
89
+ void set_edge_type(S2Builder::EdgeType edge_type);
90
+
91
+ // Specifies whether degenerate boundaries should be discarded or kept.
92
+ // (A degenerate boundary consists of either a sibling edge pair or an
93
+ // edge from a vertex to itself.) Optionally, degenerate boundaries may
94
+ // be kept only if they represent shells, or only if they represent holes.
95
+ //
96
+ // This option is useful for normalizing polygons with various boundary
97
+ // conditions. For example, DISCARD_HOLES can be used to normalize closed
98
+ // polygons (those that include their boundary), since degenerate holes do
99
+ // not affect the set of points contained by such polygons. Similarly,
100
+ // DISCARD_SHELLS can be used to normalize polygons with open boundaries.
101
+ // DISCARD is used to normalize polygons with semi-open boundaries (since
102
+ // degenerate loops do not affect point containment in that case), and
103
+ // finally KEEP is useful for working with any type of polygon where
104
+ // degeneracies are assumed to contain an infinitesmal interior. (This
105
+ // last model is the most useful for working with simplified geometry,
106
+ // since it maintains the closest fidelity to the original geometry.)
107
+ //
108
+ // DEFAULT: DegenerateBoundaries::KEEP
109
+ enum class DegenerateBoundaries {
110
+ DISCARD, DISCARD_HOLES, DISCARD_SHELLS, KEEP
111
+ };
112
+ DegenerateBoundaries degenerate_boundaries() const;
113
+ void set_degenerate_boundaries(DegenerateBoundaries degenerate_boundaries);
114
+
115
+ private:
116
+ S2Builder::EdgeType edge_type_;
117
+ DegenerateBoundaries degenerate_boundaries_;
118
+ };
119
+
120
+ // Specifies that a polygon should be constructed using the given options.
121
+ explicit LaxPolygonLayer(S2LaxPolygonShape* polygon,
122
+ const Options& options = Options());
123
+
124
+ // Specifies that a polygon should be constructed using the given options,
125
+ // and that any labels attached to the input edges should be returned in
126
+ // "label_set_ids" and "label_set_lexicion".
127
+ //
128
+ // The labels associated with the edge "polygon.chain_edge(i, j)"
129
+ // can be retrieved as follows:
130
+ //
131
+ // for (int32 label : label_set_lexicon.id_set(label_set_ids[i][j])) {...}
132
+ using LabelSetIds = std::vector<std::vector<LabelSetId>>;
133
+ LaxPolygonLayer(S2LaxPolygonShape* polygon, LabelSetIds* label_set_ids,
134
+ IdSetLexicon* label_set_lexicon,
135
+ const Options& options = Options());
136
+
137
+ // Layer interface:
138
+ GraphOptions graph_options() const override;
139
+ void Build(const Graph& g, S2Error* error) override;
140
+
141
+ private:
142
+ void Init(S2LaxPolygonShape* polygon, LabelSetIds* label_set_ids,
143
+ IdSetLexicon* label_set_lexicon, const Options& options);
144
+ void AppendPolygonLoops(const Graph& g,
145
+ const std::vector<Graph::EdgeLoop>& edge_loops,
146
+ std::vector<std::vector<S2Point>>* loops) const;
147
+ void AppendEdgeLabels(const Graph& g,
148
+ const std::vector<Graph::EdgeLoop>& edge_loops);
149
+ void BuildDirected(Graph g, S2Error* error);
150
+
151
+ S2LaxPolygonShape* polygon_;
152
+ LabelSetIds* label_set_ids_;
153
+ IdSetLexicon* label_set_lexicon_;
154
+ Options options_;
155
+ };
156
+
157
+ // Like LaxPolygonLayer, but adds the polygon to a MutableS2ShapeIndex (if the
158
+ // polygon is non-empty).
159
+ class IndexedLaxPolygonLayer : public S2Builder::Layer {
160
+ public:
161
+ using Options = LaxPolygonLayer::Options;
162
+ explicit IndexedLaxPolygonLayer(MutableS2ShapeIndex* index,
163
+ const Options& options = Options())
164
+ : index_(index), polygon_(new S2LaxPolygonShape),
165
+ layer_(polygon_.get(), options) {}
166
+
167
+ GraphOptions graph_options() const override {
168
+ return layer_.graph_options();
169
+ }
170
+
171
+ void Build(const Graph& g, S2Error* error) override {
172
+ layer_.Build(g, error);
173
+ if (error->ok() && !polygon_->is_empty()) {
174
+ index_->Add(std::move(polygon_));
175
+ }
176
+ }
177
+
178
+ private:
179
+ MutableS2ShapeIndex* index_;
180
+ std::unique_ptr<S2LaxPolygonShape> polygon_;
181
+ LaxPolygonLayer layer_;
182
+ };
183
+
184
+
185
+ ////////////////// Implementation details follow ////////////////////
186
+
187
+
188
+ inline LaxPolygonLayer::Options::Options()
189
+ : Options(S2Builder::EdgeType::DIRECTED) {
190
+ }
191
+
192
+ inline LaxPolygonLayer::Options::Options(S2Builder::EdgeType edge_type)
193
+ : edge_type_(edge_type),
194
+ degenerate_boundaries_(DegenerateBoundaries::KEEP) {
195
+ }
196
+
197
+ inline S2Builder::EdgeType LaxPolygonLayer::Options::edge_type() const {
198
+ return edge_type_;
199
+ }
200
+
201
+ inline void LaxPolygonLayer::Options::set_edge_type(
202
+ S2Builder::EdgeType edge_type) {
203
+ edge_type_ = edge_type;
204
+ }
205
+
206
+ inline LaxPolygonLayer::Options::DegenerateBoundaries
207
+ LaxPolygonLayer::Options::degenerate_boundaries() const {
208
+ return degenerate_boundaries_;
209
+ }
210
+
211
+ inline void LaxPolygonLayer::Options::set_degenerate_boundaries(
212
+ DegenerateBoundaries degenerate_boundaries) {
213
+ degenerate_boundaries_ = degenerate_boundaries;
214
+ }
215
+
216
+ } // namespace s2builderutil
217
+
218
+ #endif // S2_S2BUILDERUTIL_LAX_POLYGON_LAYER_H_
@@ -0,0 +1,367 @@
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 <map>
22
+ #include <memory>
23
+ #include <set>
24
+ #include <string>
25
+ #include <gtest/gtest.h>
26
+ #include "s2/base/integral_types.h"
27
+ #include "s2/third_party/absl/memory/memory.h"
28
+ #include "s2/third_party/absl/strings/string_view.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 absl::string_view;
35
+ using s2builderutil::IndexedLaxPolygonLayer;
36
+ using s2builderutil::LaxPolygonLayer;
37
+ using s2textformat::MakeLaxPolygonOrDie;
38
+ using s2textformat::MakePointOrDie;
39
+ using s2textformat::MakePolylineOrDie;
40
+ using std::map;
41
+ using std::set;
42
+ using std::vector;
43
+
44
+ using EdgeType = S2Builder::EdgeType;
45
+ using DegenerateBoundaries = LaxPolygonLayer::Options::DegenerateBoundaries;
46
+
47
+ namespace {
48
+
49
+ string ToString(DegenerateBoundaries degenerate_boundaries) {
50
+ switch (degenerate_boundaries) {
51
+ case DegenerateBoundaries::DISCARD: return "DISCARD";
52
+ case DegenerateBoundaries::DISCARD_HOLES: return "DISCARD_HOLES";
53
+ case DegenerateBoundaries::DISCARD_SHELLS: return "DISCARD_SHELLS";
54
+ case DegenerateBoundaries::KEEP: return "KEEP";
55
+ }
56
+ // Cases are exhaustive, but some compilers don't know that and emit a
57
+ // warning.
58
+ S2_LOG(FATAL) << "Unknown DegenerateBoundaries value: "
59
+ << static_cast<int>(degenerate_boundaries);
60
+ }
61
+
62
+ void TestLaxPolygon(string_view input_str, string_view expected_str,
63
+ EdgeType edge_type,
64
+ DegenerateBoundaries degenerate_boundaries) {
65
+ SCOPED_TRACE(edge_type == EdgeType::DIRECTED ? "DIRECTED" : "UNDIRECTED");
66
+ SCOPED_TRACE(ToString(degenerate_boundaries));
67
+ S2Builder builder{S2Builder::Options()};
68
+ S2LaxPolygonShape output;
69
+ LaxPolygonLayer::Options options;
70
+ options.set_edge_type(edge_type);
71
+ options.set_degenerate_boundaries(degenerate_boundaries);
72
+ builder.StartLayer(make_unique<LaxPolygonLayer>(&output, options));
73
+
74
+ auto polygon = MakeLaxPolygonOrDie(input_str);
75
+ builder.AddShape(*polygon);
76
+
77
+ // In order to construct polygons that are full except possibly for a
78
+ // collection of degenerate holes, we must supply S2Builder with a predicate
79
+ // that distinguishes empty polygons from full ones (modulo degeneracies).
80
+ bool has_full_loop = false;
81
+ for (int i = 0; i < polygon->num_loops(); ++i) {
82
+ if (polygon->num_loop_vertices(i) == 0) has_full_loop = true;
83
+ }
84
+ builder.AddIsFullPolygonPredicate(S2Builder::IsFullPolygon(has_full_loop));
85
+ S2Error error;
86
+ ASSERT_TRUE(builder.Build(&error));
87
+ string actual_str = s2textformat::ToString(output, "; ");
88
+ EXPECT_EQ(expected_str, actual_str);
89
+ }
90
+
91
+ void TestLaxPolygon(string_view input_str,
92
+ string_view expected_str,
93
+ DegenerateBoundaries degenerate_boundaries) {
94
+ TestLaxPolygon(input_str, expected_str, EdgeType::DIRECTED,
95
+ degenerate_boundaries);
96
+ #if 0
97
+ // TODO(ericv): Implement.
98
+ TestLaxPolygon(input_str, expected_str, EdgeType::UNDIRECTED,
99
+ degenerate_boundaries);
100
+ #endif
101
+ }
102
+
103
+ void TestLaxPolygonUnchanged(string_view input_str,
104
+ DegenerateBoundaries degenerate_boundaries) {
105
+ TestLaxPolygon(input_str, input_str, degenerate_boundaries);
106
+ }
107
+
108
+ vector<DegenerateBoundaries> kAllDegenerateBoundaries() {
109
+ return {DegenerateBoundaries::DISCARD, DegenerateBoundaries::DISCARD_HOLES,
110
+ DegenerateBoundaries::DISCARD_SHELLS, DegenerateBoundaries::KEEP};
111
+ }
112
+
113
+ TEST(LaxPolygonLayer, Empty) {
114
+ for (auto db : kAllDegenerateBoundaries()) {
115
+ TestLaxPolygonUnchanged("", db);
116
+ }
117
+ }
118
+
119
+ TEST(LaxPolygonLayer, Full) {
120
+ for (auto db : kAllDegenerateBoundaries()) {
121
+ TestLaxPolygonUnchanged("full", db);
122
+ }
123
+ }
124
+
125
+ TEST(LaxPolygonLayer, OneNormalShell) {
126
+ for (auto db : kAllDegenerateBoundaries()) {
127
+ TestLaxPolygonUnchanged("0:0, 0:1, 1:1", db);
128
+ }
129
+ }
130
+
131
+ TEST(LaxPolygonLayer, IsFullPolygonPredicateNotCalled) {
132
+ // Test that the IsFullPolygonPredicate is not called when at least one
133
+ // non-degenerate loop is present.
134
+ for (auto degenerate_boundaries : kAllDegenerateBoundaries()) {
135
+ S2Builder builder{S2Builder::Options()};
136
+ S2LaxPolygonShape output;
137
+ LaxPolygonLayer::Options options;
138
+ options.set_edge_type(EdgeType::DIRECTED);
139
+ options.set_degenerate_boundaries(degenerate_boundaries);
140
+ builder.StartLayer(make_unique<LaxPolygonLayer>(&output, options));
141
+ auto polygon = MakeLaxPolygonOrDie("0:0, 0:1, 1:1");
142
+ builder.AddShape(*polygon);
143
+ // If the predicate is called, it will return an error.
144
+ builder.AddIsFullPolygonPredicate(S2Builder::IsFullPolygonUnspecified);
145
+ S2Error error;
146
+ ASSERT_TRUE(builder.Build(&error));
147
+ }
148
+ }
149
+
150
+ TEST(LaxPolygonLayer, TwoNormalShellsOneNormalHole) {
151
+ // The second two loops are nested. Note that S2LaxPolygon and S2Polygon
152
+ // require opposite vertex orderings for holes.
153
+ for (auto db : kAllDegenerateBoundaries()) {
154
+ TestLaxPolygonUnchanged("0:1, 1:1, 0:0; "
155
+ "3:3, 3:6, 6:6, 6:3; "
156
+ "4:4, 5:4, 5:5, 4:5", db);
157
+ }
158
+ }
159
+
160
+ TEST(LaxPolygonLayer, AllDegenerateShells) {
161
+ for (auto db : {DegenerateBoundaries::KEEP,
162
+ DegenerateBoundaries::DISCARD_HOLES}) {
163
+ TestLaxPolygonUnchanged("1:1; 2:2, 3:3", db);
164
+ }
165
+ for (auto db : {DegenerateBoundaries::DISCARD,
166
+ DegenerateBoundaries::DISCARD_SHELLS}) {
167
+ TestLaxPolygon("1:1; 2:2, 3:3", "", db);
168
+ }
169
+ }
170
+
171
+ TEST(LaxPolygonLayer, AllDegenerateHoles) {
172
+ for (auto db : {DegenerateBoundaries::KEEP,
173
+ DegenerateBoundaries::DISCARD_SHELLS}) {
174
+ TestLaxPolygonUnchanged("full; 1:1; 2:2, 3:3", db);
175
+ }
176
+ for (auto db : {DegenerateBoundaries::DISCARD,
177
+ DegenerateBoundaries::DISCARD_HOLES}) {
178
+ TestLaxPolygon("full; 1:1; 2:2, 3:3", "full", db);
179
+ }
180
+ }
181
+
182
+ TEST(LaxPolygonLayer, SomeDegenerateShells) {
183
+ const string kNormal = "0:0, 0:9, 9:0; 1:1, 7:1, 1:7";
184
+ const string kInput = kNormal + "; 3:2; 2:2, 2:3";
185
+ TestLaxPolygonUnchanged(kInput, DegenerateBoundaries::KEEP);
186
+ TestLaxPolygonUnchanged(kInput, DegenerateBoundaries::DISCARD_HOLES);
187
+ TestLaxPolygon(kInput, kNormal, DegenerateBoundaries::DISCARD);
188
+ TestLaxPolygon(kInput, kNormal, DegenerateBoundaries::DISCARD_SHELLS);
189
+ }
190
+
191
+ TEST(LaxPolygonLayer, SomeDegenerateHoles) {
192
+ for (auto db : {DegenerateBoundaries::KEEP,
193
+ DegenerateBoundaries::DISCARD_SHELLS}) {
194
+ TestLaxPolygonUnchanged("0:0, 0:9, 9:0; 1:1; 2:2, 3:3", db);
195
+ }
196
+ for (auto db : {DegenerateBoundaries::DISCARD,
197
+ DegenerateBoundaries::DISCARD_HOLES}) {
198
+ TestLaxPolygon("0:0, 0:9, 9:0; 1:1; 2:2, 3:3", "0:0, 0:9, 9:0", db);
199
+ }
200
+ }
201
+
202
+ TEST(LaxPolygonLayer, NormalAndDegenerateShellsAndHoles) {
203
+ // We start with two normal shells and one normal hole.
204
+ const string kNormal = "0:0, 0:9, 9:9, 9:0; "
205
+ "0:10, 0:19, 9:19, 9:10; 1:11, 8:11, 8:18, 1:18";
206
+ // These are the same loops augmented with degenerate interior filaments
207
+ // (holes). Note that one filament connects the second shell and hole
208
+ // above, transforming them into a single loop.
209
+ const string kNormalWithDegenHoles =
210
+ "0:0, 0:9, 1:8, 1:7, 1:8, 0:9, 9:9, 9:0; "
211
+ "0:10, 0:19, 9:19, 9:10, 0:10, 1:11, 8:11, 8:18, 1:18, 1:11";
212
+ // Then we add other degenerate shells and holes, including a sibling pair
213
+ // that connects the two shells above.
214
+ const string kDegenShells = "0:9, 0:10; 2:12; 3:13, 3:14; 20:20; 10:0, 10:1";
215
+ const string kDegenHoles = "2:5; 3:6, 3:7; 8:8";
216
+ const string kInput = kNormalWithDegenHoles + "; " +
217
+ kDegenShells + "; " + kDegenHoles;
218
+ TestLaxPolygon(kInput, kNormal, DegenerateBoundaries::DISCARD);
219
+ TestLaxPolygon(kInput, kNormal + "; " + kDegenShells,
220
+ DegenerateBoundaries::DISCARD_HOLES);
221
+ TestLaxPolygon(kInput, kNormalWithDegenHoles + "; " + kDegenHoles,
222
+ DegenerateBoundaries::DISCARD_SHELLS);
223
+ TestLaxPolygon(kInput, kInput, DegenerateBoundaries::KEEP);
224
+ }
225
+
226
+ TEST(LaxPolygonLayer, PartialLoop) {
227
+ S2Builder builder{S2Builder::Options()};
228
+ S2LaxPolygonShape output;
229
+ builder.StartLayer(make_unique<LaxPolygonLayer>(&output));
230
+ builder.AddPolyline(*MakePolylineOrDie("0:1, 2:3, 4:5"));
231
+ S2Error error;
232
+ EXPECT_FALSE(builder.Build(&error));
233
+ EXPECT_EQ(S2Error::BUILDER_EDGES_DO_NOT_FORM_LOOPS, error.code());
234
+ EXPECT_TRUE(output.is_empty());
235
+ }
236
+
237
+ #if 0
238
+ // TODO(ericv): Implement validation of S2LaxPolygonShape.
239
+ TEST(LaxPolygonLayer, InvalidPolygon) {
240
+ S2Builder builder{S2Builder::Options()};
241
+ S2LaxPolygonShape output;
242
+ LaxPolygonLayer::Options options;
243
+ options.set_validate(true);
244
+ builder.StartLayer(make_unique<LaxPolygonLayer>(&output, options));
245
+ builder.AddPolyline(*MakePolylineOrDie("0:0, 0:10, 10:0, 10:10, 0:0"));
246
+ S2Error error;
247
+ EXPECT_FALSE(builder.Build(&error));
248
+ EXPECT_EQ(S2Error::LOOP_SELF_INTERSECTION, error.code());
249
+ }
250
+ #endif
251
+
252
+ TEST(LaxPolygonLayer, DuplicateInputEdges) {
253
+ // Check that LaxPolygonLayer removes duplicate edges in such a way that
254
+ // degeneracies are not lost.
255
+ S2Builder builder{S2Builder::Options()};
256
+ S2LaxPolygonShape output;
257
+ LaxPolygonLayer::Options options;
258
+ options.set_degenerate_boundaries(DegenerateBoundaries::KEEP);
259
+ builder.StartLayer(make_unique<LaxPolygonLayer>(&output, options));
260
+ builder.AddShape(*MakeLaxPolygonOrDie("0:0, 0:5, 5:5, 5:0"));
261
+ builder.AddPoint(MakePointOrDie("0:0"));
262
+ builder.AddPoint(MakePointOrDie("1:1"));
263
+ builder.AddPoint(MakePointOrDie("1:1"));
264
+ builder.AddShape(*MakeLaxPolygonOrDie("2:2, 2:3"));
265
+ builder.AddShape(*MakeLaxPolygonOrDie("2:2, 2:3"));
266
+ S2Error error;
267
+ EXPECT_TRUE(builder.Build(&error));
268
+ EXPECT_EQ("0:0, 0:5, 5:5, 5:0; 1:1; 2:2, 2:3",
269
+ s2textformat::ToString(output, "; "));
270
+ }
271
+
272
+ using EdgeLabelMap = map<S2Shape::Edge, set<int32>>;
273
+
274
+ inline S2Shape::Edge GetKey(S2Shape::Edge edge, EdgeType edge_type) {
275
+ // For undirected edges, sort the vertices in lexicographic order.
276
+ if (edge_type == EdgeType::UNDIRECTED && edge.v0 > edge.v1) {
277
+ std::swap(edge.v0, edge.v1);
278
+ }
279
+ return edge;
280
+ }
281
+
282
+ void AddShapeWithLabels(const S2Shape& shape, EdgeType edge_type,
283
+ S2Builder* builder, EdgeLabelMap *edge_label_map) {
284
+ static int const kLabelBegin = 1234; // Arbitrary.
285
+ for (int e = 0; e < shape.num_edges(); ++e) {
286
+ int32 label = kLabelBegin + e;
287
+ builder->set_label(label);
288
+ // For undirected edges, reverse the direction of every other input edge.
289
+ S2Shape::Edge edge = shape.edge(e);
290
+ if (edge_type == EdgeType::UNDIRECTED && (e & 1)) {
291
+ std::swap(edge.v0, edge.v1);
292
+ }
293
+ builder->AddEdge(edge.v0, edge.v1);
294
+ (*edge_label_map)[GetKey(edge, edge_type)].insert(label);
295
+ }
296
+ }
297
+
298
+ // Converts "input_str" to an S2LaxPolygonShape, assigns labels to its edges,
299
+ // then uses LaxPolygonLayer with the given arguments to build a new
300
+ // S2LaxPolygonShape and verifies that all edges have the expected labels.
301
+ // (This function does not test whether the output edges are correct.)
302
+ static void TestEdgeLabels(string_view input_str, EdgeType edge_type,
303
+ DegenerateBoundaries degenerate_boundaries) {
304
+ S2Builder builder{S2Builder::Options()};
305
+ S2LaxPolygonShape output;
306
+ LaxPolygonLayer::LabelSetIds label_set_ids;
307
+ IdSetLexicon label_set_lexicon;
308
+ LaxPolygonLayer::Options options;
309
+ options.set_edge_type(edge_type);
310
+ options.set_degenerate_boundaries(degenerate_boundaries);
311
+ builder.StartLayer(make_unique<LaxPolygonLayer>(
312
+ &output, &label_set_ids, &label_set_lexicon, options));
313
+
314
+ EdgeLabelMap edge_label_map;
315
+ AddShapeWithLabels(*MakeLaxPolygonOrDie(input_str), edge_type,
316
+ &builder, &edge_label_map);
317
+ S2Error error;
318
+ ASSERT_TRUE(builder.Build(&error));
319
+ for (int i = 0; i < output.num_chains(); ++i) {
320
+ for (int j = 0; j < output.chain(i).length; ++j) {
321
+ S2Shape::Edge edge = output.chain_edge(i, j);
322
+ const auto& expected_labels = edge_label_map[GetKey(edge, edge_type)];
323
+ ASSERT_EQ(expected_labels.size(),
324
+ label_set_lexicon.id_set(label_set_ids[i][j]).size());
325
+ EXPECT_TRUE(std::equal(
326
+ expected_labels.begin(), expected_labels.end(),
327
+ label_set_lexicon.id_set(label_set_ids[i][j]).begin()));
328
+ }
329
+ }
330
+ }
331
+
332
+ TEST(LaxPolygonLayer, EdgeLabels) {
333
+ // TODO(ericv): Implement EdgeType::UNDIRECTED.
334
+ for (auto edge_type : {EdgeType::DIRECTED}) {
335
+ for (auto db : kAllDegenerateBoundaries()) {
336
+ // Test a polygon with normal and degenerate shells and holes. Note
337
+ // that this S2LaxPolygonShape has duplicate edges and is therefore not
338
+ // valid in most contexts.
339
+ TestEdgeLabels("1:1, 1:2; 0:0, 0:9, 9:9, 9:0; 1:2, 1:1; "
340
+ "3:3, 8:3, 8:8, 3:8; 4:4; 4:5, 5:5; 4:4", edge_type, db);
341
+ }
342
+ }
343
+ }
344
+
345
+ TEST(IndexedLaxPolygonLayer, AddsShape) {
346
+ S2Builder builder{S2Builder::Options()};
347
+ MutableS2ShapeIndex index;
348
+ builder.StartLayer(make_unique<IndexedLaxPolygonLayer>(&index));
349
+ const string& polygon_str = "0:0, 0:10, 10:0";
350
+ builder.AddPolygon(*s2textformat::MakePolygon(polygon_str));
351
+ S2Error error;
352
+ ASSERT_TRUE(builder.Build(&error));
353
+ EXPECT_EQ(1, index.num_shape_ids());
354
+ auto polygon = down_cast<const S2LaxPolygonShape*>(index.shape(0));
355
+ EXPECT_EQ(polygon_str, s2textformat::ToString(*polygon));
356
+ }
357
+
358
+ TEST(IndexedLaxPolygonLayer, IgnoresEmptyShape) {
359
+ S2Builder builder{S2Builder::Options()};
360
+ MutableS2ShapeIndex index;
361
+ builder.StartLayer(make_unique<IndexedLaxPolygonLayer>(&index));
362
+ S2Error error;
363
+ ASSERT_TRUE(builder.Build(&error));
364
+ EXPECT_EQ(0, index.num_shape_ids());
365
+ }
366
+
367
+ } // namespace
@@ -0,0 +1,74 @@
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_s2point_vector_layer.h"
19
+
20
+ #include "s2/s2builder_graph.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
+
35
+ namespace s2builderutil {
36
+
37
+ S2PointVectorLayer::S2PointVectorLayer(vector<S2Point>* points,
38
+ const Options& options)
39
+ : S2PointVectorLayer(points, nullptr, nullptr, options) {}
40
+
41
+ S2PointVectorLayer::S2PointVectorLayer(vector<S2Point>* points,
42
+ LabelSetIds* label_set_ids,
43
+ IdSetLexicon* label_set_lexicon,
44
+ const Options& options)
45
+ : points_(points),
46
+ label_set_ids_(label_set_ids),
47
+ label_set_lexicon_(label_set_lexicon),
48
+ options_(options) {}
49
+
50
+ void S2PointVectorLayer::Build(const Graph& g, S2Error* error) {
51
+ Graph::LabelFetcher fetcher(g, EdgeType::DIRECTED);
52
+
53
+ vector<Label> labels; // Temporary storage for labels.
54
+ for (EdgeId edge_id = 0; edge_id < g.edges().size(); edge_id++) {
55
+ auto& edge = g.edge(edge_id);
56
+ if (edge.first != edge.second) {
57
+ error->Init(S2Error::INVALID_ARGUMENT, "Found non-degenerate edges");
58
+ continue;
59
+ }
60
+ points_->push_back(g.vertex(edge.first));
61
+ if (label_set_ids_) {
62
+ fetcher.Fetch(edge_id, &labels);
63
+ int set_id = label_set_lexicon_->Add(labels);
64
+ label_set_ids_->push_back(set_id);
65
+ }
66
+ }
67
+ }
68
+
69
+ GraphOptions S2PointVectorLayer::graph_options() const {
70
+ return GraphOptions(EdgeType::DIRECTED, DegenerateEdges::KEEP,
71
+ options_.duplicate_edges(), SiblingPairs::KEEP);
72
+ }
73
+
74
+ } // namespace s2builderutil