@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,305 @@
1
+ // Copyright 2011 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
+
17
+ #include "s2/s2point_compression.h"
18
+
19
+ #include <cstddef>
20
+ #include <string>
21
+ #include <vector>
22
+
23
+ #include "s2/base/commandlineflags.h"
24
+ #include "s2/base/logging.h"
25
+ #include <gtest/gtest.h>
26
+
27
+ #include "s2/s1angle.h"
28
+ #include "s2/s2cell_id.h"
29
+ #include "s2/s2coords.h"
30
+ #include "s2/s2testing.h"
31
+ #include "s2/s2text_format.h"
32
+ #include "s2/third_party/absl/container/fixed_array.h"
33
+ #include "s2/third_party/absl/types/span.h"
34
+ #include "s2/util/coding/coder.h"
35
+
36
+ using absl::FixedArray;
37
+ using absl::MakeSpan;
38
+ using absl::Span;
39
+ using std::vector;
40
+
41
+ S2_DEFINE_int32(s2point_compression_bm_level, 30,
42
+ "Level to encode at for benchmarks.");
43
+ S2_DEFINE_double(s2point_compression_bm_radius_km, 1000.0,
44
+ "Radius to use for loop for benchmarks.");
45
+
46
+ namespace {
47
+
48
+ S2Point SnapPointToLevel(const S2Point& point, int level) {
49
+ return S2CellId(point).parent(level).ToPoint();
50
+ }
51
+
52
+ vector<S2Point> SnapPointsToLevel(const vector<S2Point>& points,
53
+ int level) {
54
+ vector<S2Point> snapped_points(points.size());
55
+ for (int i = 0; i < points.size(); ++i) {
56
+ snapped_points[i] = SnapPointToLevel(points[i], level);
57
+ }
58
+ return snapped_points;
59
+ }
60
+
61
+ // Make a regular loop around the corner of faces 0, 1, and 2 with the
62
+ // specified radius in meters (on the earth) and number of vertices.
63
+ vector<S2Point> MakeRegularPoints(int num_vertices,
64
+ double radius_km,
65
+ int level) {
66
+ const S2Point center = S2Point(1.0, 1.0, 1.0).Normalize();
67
+ const S1Angle radius_angle = S2Testing::KmToAngle(radius_km);
68
+
69
+ const vector<S2Point> unsnapped_points =
70
+ S2Testing::MakeRegularPoints(center, radius_angle, num_vertices);
71
+
72
+ return SnapPointsToLevel(unsnapped_points, level);
73
+ }
74
+
75
+ void MakeXYZFaceSiTiPoints(Span<const S2Point> points,
76
+ Span<S2XYZFaceSiTi> result) {
77
+ S2_CHECK_EQ(points.size(), result.size());
78
+ for (int i = 0; i < points.size(); ++i) {
79
+ result[i].xyz = points[i];
80
+ result[i].cell_level = S2::XYZtoFaceSiTi(points[i], &result[i].face,
81
+ &result[i].si, &result[i].ti);
82
+ }
83
+ }
84
+
85
+ class S2PointCompressionTest : public ::testing::Test {
86
+ protected:
87
+ void SetUp() override {
88
+ loop_4_ = MakeRegularPoints(4, 0.1, S2::kMaxCellLevel);
89
+
90
+ const S2Point center = S2Point(1.0, 1.0, 1.0).Normalize();
91
+ const S1Angle radius = S2Testing::KmToAngle(0.1);
92
+ loop_4_unsnapped_ = S2Testing::MakeRegularPoints(center, radius, 4);
93
+
94
+ // Radius is 100m, so points are about 141 meters apart.
95
+ // Snapping to level 14 will move them by < 47m.
96
+ loop_4_level_14_ = MakeRegularPoints(4, 0.1, 14);
97
+
98
+ loop_100_ = MakeRegularPoints(100, 0.1, S2::kMaxCellLevel);
99
+
100
+ loop_100_unsnapped_ = S2Testing::MakeRegularPoints(center, radius, 100);
101
+
102
+ loop_100_mixed_15_ = S2Testing::MakeRegularPoints(center, radius, 100);
103
+ for (int i = 0; i < 15; ++i) {
104
+ loop_100_mixed_15_[3 * i] = SnapPointToLevel(loop_100_mixed_15_[3 * i],
105
+ S2::kMaxCellLevel);
106
+ }
107
+
108
+ loop_100_mixed_25_ = S2Testing::MakeRegularPoints(center, radius, 100);
109
+ for (int i = 0; i < 25; ++i) {
110
+ loop_100_mixed_25_[4 * i] = SnapPointToLevel(loop_100_mixed_25_[4 * i],
111
+ S2::kMaxCellLevel);
112
+ }
113
+
114
+ // Circumference is 628m, so points are about 6 meters apart.
115
+ // Snapping to level 22 will move them by < 2m.
116
+ loop_100_level_22_ = MakeRegularPoints(100, 0.1, 22);
117
+
118
+ vector<S2Point> multi_face_points(6);
119
+ multi_face_points[0] = S2::FaceUVtoXYZ(0, -0.5, 0.5).Normalize();
120
+ multi_face_points[1] = S2::FaceUVtoXYZ(1, -0.5, 0.5).Normalize();
121
+ multi_face_points[2] = S2::FaceUVtoXYZ(1, 0.5, -0.5).Normalize();
122
+ multi_face_points[3] = S2::FaceUVtoXYZ(2, -0.5, 0.5).Normalize();
123
+ multi_face_points[4] = S2::FaceUVtoXYZ(2, 0.5, -0.5).Normalize();
124
+ multi_face_points[5] = S2::FaceUVtoXYZ(2, 0.5, 0.5).Normalize();
125
+ loop_multi_face_ = SnapPointsToLevel(multi_face_points, S2::kMaxCellLevel);
126
+
127
+ vector<S2Point> line_points(100);
128
+ for (int i = 0; i < line_points.size(); ++i) {
129
+ const double s = 0.01 + 0.005 * i;
130
+ const double t = 0.01 + 0.009 * i;
131
+ const double u = S2::STtoUV(s);
132
+ const double v = S2::STtoUV(t);
133
+ line_points[i] = S2::FaceUVtoXYZ(0, u, v).Normalize();
134
+ }
135
+ line_ = SnapPointsToLevel(line_points, S2::kMaxCellLevel);
136
+ }
137
+
138
+ void Encode(Span<const S2Point> points, int level) {
139
+ FixedArray<S2XYZFaceSiTi> pts(points.size());
140
+ MakeXYZFaceSiTiPoints(points, MakeSpan(pts));
141
+ S2EncodePointsCompressed(pts, level, &encoder_);
142
+ }
143
+
144
+ void Decode(int level, Span<S2Point> points) {
145
+ decoder_.reset(encoder_.base(), encoder_.length());
146
+ EXPECT_TRUE(S2DecodePointsCompressed(&decoder_, level, points));
147
+ }
148
+
149
+ void Roundtrip(const vector<S2Point>& loop, int level) {
150
+ Encode(loop, level);
151
+ vector<S2Point> points(loop.size());
152
+ Decode(level, MakeSpan(points));
153
+
154
+ EXPECT_TRUE(loop == points)
155
+ << "Decoded points\n" << s2textformat::ToString(points)
156
+ << "\ndo not match original points\n"
157
+ << s2textformat::ToString(loop);
158
+ }
159
+
160
+ Encoder encoder_;
161
+ Decoder decoder_;
162
+
163
+ // Four vertex loop near the corner of faces 0, 1, and 2.
164
+ vector<S2Point> loop_4_;
165
+ // Four vertex loop near the corner of faces 0, 1, and 2;
166
+ // unsnapped.
167
+ vector<S2Point> loop_4_unsnapped_;
168
+ // Four vertex loop near the corner of faces 0, 1, and 2;
169
+ // snapped to level 14.
170
+ vector<S2Point> loop_4_level_14_;
171
+ // 100 vertex loop near the corner of faces 0, 1, and 2.
172
+ vector<S2Point> loop_100_;
173
+ // 100 vertex loop near the corner of faces 0, 1, and 2;
174
+ // unsnapped.
175
+ vector<S2Point> loop_100_unsnapped_;
176
+ // 100 vertex loop near the corner of faces 0, 1, and 2;
177
+ // 15 points snapped to kMakCellLevel, the others not snapped.
178
+ vector<S2Point> loop_100_mixed_15_;
179
+ // 100 vertex loop near the corner of faces 0, 1, and 2;
180
+ // 25 points snapped to kMakCellLevel, the others not snapped.
181
+ vector<S2Point> loop_100_mixed_25_;
182
+ // 100 vertex loop near the corner of faces 0, 1, and 2;
183
+ // snapped to level 22.
184
+ vector<S2Point> loop_100_level_22_;
185
+ // A loop with two vertices on each of three faces.
186
+ vector<S2Point> loop_multi_face_;
187
+ // A straight line of 100 vertices on face 0 that should compress well.
188
+ vector<S2Point> line_;
189
+ };
190
+
191
+ TEST_F(S2PointCompressionTest, RoundtripsEmpty) {
192
+ // Just check this doesn't crash.
193
+ Encode(Span<S2Point>(), S2::kMaxCellLevel);
194
+ Decode(S2::kMaxCellLevel, Span<S2Point>());
195
+ }
196
+
197
+ TEST_F(S2PointCompressionTest, RoundtripsFourVertexLoop) {
198
+ Roundtrip(loop_4_, S2::kMaxCellLevel);
199
+ }
200
+
201
+ TEST_F(S2PointCompressionTest, RoundtripsFourVertexLoopUnsnapped) {
202
+ Roundtrip(loop_4_unsnapped_, S2::kMaxCellLevel);
203
+ }
204
+
205
+ TEST_F(S2PointCompressionTest, FourVertexLoopSize) {
206
+ Encode(loop_4_, S2::kMaxCellLevel);
207
+ // It would take 32 bytes uncompressed.
208
+ EXPECT_EQ(39, encoder_.length());
209
+ }
210
+
211
+ TEST_F(S2PointCompressionTest, RoundtripsFourVertexLevel14Loop) {
212
+ const int level = 14;
213
+ Roundtrip(loop_4_level_14_, level);
214
+ }
215
+
216
+ TEST_F(S2PointCompressionTest, FourVertexLevel14LoopSize) {
217
+ const int level = 14;
218
+ Encode(loop_4_level_14_, level);
219
+ // It would take 4 bytes per vertex without compression.
220
+ EXPECT_EQ(23, encoder_.length());
221
+ }
222
+
223
+ TEST_F(S2PointCompressionTest, Roundtrips100VertexLoop) {
224
+ Roundtrip(loop_100_, S2::kMaxCellLevel);
225
+ }
226
+
227
+ TEST_F(S2PointCompressionTest, Roundtrips100VertexLoopUnsnapped) {
228
+ Roundtrip(loop_100_unsnapped_, S2::kMaxCellLevel);
229
+ }
230
+
231
+ TEST_F(S2PointCompressionTest, Roundtrips100VertexLoopMixed15) {
232
+ Roundtrip(loop_100_mixed_15_, S2::kMaxCellLevel);
233
+ EXPECT_EQ(2381, encoder_.length());
234
+ }
235
+
236
+ TEST_F(S2PointCompressionTest, Roundtrips100VertexLoopMixed25) {
237
+ Roundtrip(loop_100_mixed_25_, S2::kMaxCellLevel);
238
+ EXPECT_EQ(2131, encoder_.length());
239
+ }
240
+
241
+ TEST_F(S2PointCompressionTest, OneHundredVertexLoopSize) {
242
+ Encode(loop_100_, S2::kMaxCellLevel);
243
+ EXPECT_EQ(257, encoder_.length());
244
+ }
245
+
246
+ TEST_F(S2PointCompressionTest, OneHundredVertexLoopUnsnappedSize) {
247
+ Encode(loop_100_unsnapped_, S2::kMaxCellLevel);
248
+ EXPECT_EQ(2756, encoder_.length());
249
+ }
250
+
251
+ TEST_F(S2PointCompressionTest, Roundtrips100VertexLevel22Loop) {
252
+ const int level = 22;
253
+ Roundtrip(loop_100_level_22_, level);
254
+ }
255
+
256
+ TEST_F(S2PointCompressionTest, OneHundredVertexLoopLevel22Size) {
257
+ Encode(loop_100_level_22_, 22);
258
+ EXPECT_EQ(148, encoder_.length());
259
+ }
260
+
261
+ TEST_F(S2PointCompressionTest, MultiFaceLoop) {
262
+ Roundtrip(loop_multi_face_, S2::kMaxCellLevel);
263
+ }
264
+
265
+ TEST_F(S2PointCompressionTest, StraightLineCompressesWell) {
266
+ Roundtrip(line_, S2::kMaxCellLevel);
267
+ // About 1 byte / vertex.
268
+ EXPECT_EQ(line_.size() + 17, encoder_.length());
269
+ }
270
+
271
+ TEST_F(S2PointCompressionTest, FirstPointOnFaceEdge) {
272
+ // This test used to trigger a bug in which EncodeFirstPointFixedLength()
273
+ // tried to encode a pi/qi value of (2**level) in "level" bits (which did
274
+ // not work out so well). The fix is documented in SiTitoPiQi().
275
+ //
276
+ // The test data consists of two points, where the first point is exactly on
277
+ // an S2Cell face edge (with ti == S2::kMaxSiTi), and the second point is
278
+ // encodable at snap level 8. This used to cause the code to try encoding
279
+ // qi = 256 in 8 bits.
280
+ S2XYZFaceSiTi points[] = {
281
+ {
282
+ S2Point(0.054299323861222645, -0.70606358900180299,
283
+ 0.70606358900180299),
284
+ 2, // face
285
+ 956301312, 2147483648, // si, ti
286
+ -1 // level
287
+ },
288
+ {
289
+ S2Point(0.056482651436986935, -0.70781701406865505,
290
+ 0.70413406726388494),
291
+ 4, // face
292
+ 4194304, 1195376640, // si, ti
293
+ 8 // level
294
+ }};
295
+
296
+ Encoder encoder;
297
+ S2EncodePointsCompressed(points, 8, &encoder);
298
+ Decoder decoder(encoder.base(), encoder.length());
299
+ S2Point result[2];
300
+ S2DecodePointsCompressed(&decoder, 8, result);
301
+ S2_CHECK(result[0] == points[0].xyz);
302
+ S2_CHECK(result[1] == points[1].xyz);
303
+ }
304
+
305
+ } // namespace
@@ -0,0 +1,345 @@
1
+ // Copyright 2015 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_S2POINT_INDEX_H_
19
+ #define S2_S2POINT_INDEX_H_
20
+
21
+ #include <tuple>
22
+ #include <type_traits>
23
+ #include "s2/util/gtl/btree_map.h"
24
+ #include "s2/s2cell_id.h"
25
+
26
+ // S2PointIndex maintains an index of points sorted by leaf S2CellId. Each
27
+ // point can optionally store auxiliary data such as an integer or pointer.
28
+ // This can be used to map results back to client data structures.
29
+ //
30
+ // The class supports adding or removing points dynamically, and provides a
31
+ // seekable iterator interface for navigating the index.
32
+ //
33
+ // You can use this class in conjuction with S2ClosestPointQuery to find the
34
+ // closest index points to a given query point. For example:
35
+ //
36
+ // void Test(const vector<S2Point>& index_points,
37
+ // const vector<S2Point>& target_points) {
38
+ // // The template argument allows auxiliary data to be attached to each
39
+ // // point (in this case, the array index).
40
+ // S2PointIndex<int> index;
41
+ // for (int i = 0; i < index_points.size(); ++i) {
42
+ // index.Add(index_points[i], i);
43
+ // }
44
+ // S2ClosestPointQuery<int> query(&index);
45
+ // query.mutable_options()->set_max_results(5);
46
+ // for (const S2Point& target_point : target_points) {
47
+ // S2ClosestPointQueryPointTarget target(target_point);
48
+ // for (const auto& result : query.FindClosestPoints(&target)) {
49
+ // // The Result class contains the following methods:
50
+ // // distance() is the distance to the target.
51
+ // // point() is the indexed point.
52
+ // // data() is the auxiliary data.
53
+ // DoSomething(target_point, result);
54
+ // }
55
+ // }
56
+ // }
57
+ //
58
+ // The Data argument defaults to an empty class, which uses no additional
59
+ // space beyond the S2Point itself. In this case the Data argument is
60
+ // required. For example:
61
+ //
62
+ // S2PointIndex<> index;
63
+ // index.Add(point);
64
+ //
65
+ // Points can be added or removed from the index at any time by calling Add()
66
+ // or Remove(). However when the index is modified, you must call Init() on
67
+ // each iterator before using it again (or simply create a new iterator).
68
+ //
69
+ // index.Add(new_point, 123456);
70
+ // it.Init(&index);
71
+ // it.Seek(target.range_min());
72
+ //
73
+ // You can also access the index directly using the iterator interface. For
74
+ // example, here is how to iterate through all the points in a given S2CellId
75
+ // "target_id":
76
+ //
77
+ // S2PointIndex<int>::Iterator it(&index);
78
+ // it.Seek(target_id.range_min());
79
+ // for (; !it.done() && it.id() <= target_id.range_max(); it.Next()) {
80
+ // DoSomething(it.id(), it.point(), it.data());
81
+ // }
82
+ //
83
+ // TODO(ericv): Consider adding an S2PointIndexRegion class, which could be
84
+ // used to efficiently compute coverings of a collection of S2Points.
85
+ //
86
+ // REQUIRES: "Data" has default and copy constructors.
87
+ // REQUIRES: "Data" has operator== and operator<.
88
+ template <class Data = std::tuple<> /*empty class*/>
89
+ class S2PointIndex {
90
+ public:
91
+ // PointData is essentially std::pair with named fields. It stores an
92
+ // S2Point and its associated data, taking advantage of the "empty base
93
+ // optimization" to ensure that no extra space is used when Data is empty.
94
+ class PointData {
95
+ public:
96
+ PointData() {} // Needed by STL
97
+ PointData(const S2Point& point, const Data& data) : tuple_(point, data) {}
98
+
99
+ const S2Point& point() const { return std::get<0>(tuple_); }
100
+ const Data& data() const { return std::get<1>(tuple_); }
101
+
102
+ friend bool operator==(const PointData& x, const PointData& y) {
103
+ return x.tuple_ == y.tuple_;
104
+ }
105
+ friend bool operator<(const PointData& x, const PointData& y) {
106
+ return x.tuple_ < y.tuple_;
107
+ }
108
+
109
+ private:
110
+ // Note that std::tuple has special template magic to ensure that Data
111
+ // doesn't take up any space when it is empty. (This is not true if you
112
+ // simply declare a member of type Data.)
113
+ std::tuple<S2Point, Data> tuple_;
114
+ };
115
+
116
+ // Default constructor.
117
+ S2PointIndex();
118
+
119
+ // Returns the number of points in the index.
120
+ int num_points() const;
121
+
122
+ // Adds the given point to the index. Invalidates all iterators.
123
+ void Add(const S2Point& point, const Data& data);
124
+ void Add(const PointData& point_data);
125
+
126
+ // Convenience function for the case when Data is an empty class.
127
+ void Add(const S2Point& point);
128
+
129
+ // Removes the given point from the index. Both the "point" and "data"
130
+ // fields must match the point to be removed. Returns false if the given
131
+ // point was not present. Invalidates all iterators.
132
+ bool Remove(const S2Point& point, const Data& data);
133
+ bool Remove(const PointData& point_data);
134
+
135
+ // Convenience function for the case when Data is an empty class.
136
+ void Remove(const S2Point& point);
137
+
138
+ // Resets the index to its original empty state. Invalidates all iterators.
139
+ void Clear();
140
+
141
+ private:
142
+ // Defined here because the Iterator class below uses it.
143
+ using Map = gtl::btree_multimap<S2CellId, PointData>;
144
+
145
+ public:
146
+ class Iterator {
147
+ public:
148
+ // Default constructor; must be followed by a call to Init().
149
+ Iterator();
150
+
151
+ // Convenience constructor that calls Init().
152
+ explicit Iterator(const S2PointIndex* index);
153
+
154
+ // Initializes an iterator for the given S2PointIndex. If the index is
155
+ // non-empty, the iterator is positioned at the first cell.
156
+ //
157
+ // This method may be called multiple times, e.g. to make an iterator
158
+ // valid again after the index is modified.
159
+ void Init(const S2PointIndex* index);
160
+
161
+ // The S2CellId for the current index entry.
162
+ // REQUIRES: !done()
163
+ S2CellId id() const;
164
+
165
+ // The point associated with the current index entry.
166
+ // REQUIRES: !done()
167
+ const S2Point& point() const;
168
+
169
+ // The client-supplied data associated with the current index entry.
170
+ // REQUIRES: !done()
171
+ const Data& data() const;
172
+
173
+ // The (S2Point, data) pair associated with the current index entry.
174
+ const PointData& point_data() const;
175
+
176
+ // Returns true if the iterator is positioned past the last index entry.
177
+ bool done() const;
178
+
179
+ // Positions the iterator at the first index entry (if any).
180
+ void Begin();
181
+
182
+ // Positions the iterator so that done() is true.
183
+ void Finish();
184
+
185
+ // Advances the iterator to the next index entry.
186
+ // REQUIRES: !done()
187
+ void Next();
188
+
189
+ // If the iterator is already positioned at the beginning, returns false.
190
+ // Otherwise positions the iterator at the previous entry and returns true.
191
+ bool Prev();
192
+
193
+ // Positions the iterator at the first entry with id() >= target, or at the
194
+ // end of the index if no such entry exists.
195
+ void Seek(S2CellId target);
196
+
197
+ private:
198
+ const Map* map_;
199
+ typename Map::const_iterator iter_, end_;
200
+ };
201
+
202
+ private:
203
+ friend class Iterator;
204
+ Map map_;
205
+
206
+ S2PointIndex(const S2PointIndex&) = delete;
207
+ void operator=(const S2PointIndex&) = delete;
208
+ };
209
+
210
+
211
+ ////////////////// Implementation details follow ////////////////////
212
+
213
+
214
+ template <class Data>
215
+ S2PointIndex<Data>::S2PointIndex() {
216
+ }
217
+
218
+ template <class Data>
219
+ inline int S2PointIndex<Data>::num_points() const {
220
+ return map_.size();
221
+ }
222
+
223
+ template <class Data>
224
+ void S2PointIndex<Data>::Add(const PointData& point_data) {
225
+ S2CellId id(point_data.point());
226
+ map_.insert(std::make_pair(id, point_data));
227
+ }
228
+
229
+ template <class Data>
230
+ void S2PointIndex<Data>::Add(const S2Point& point, const Data& data) {
231
+ Add(PointData(point, data));
232
+ }
233
+
234
+ template <class Data>
235
+ void S2PointIndex<Data>::Add(const S2Point& point) {
236
+ static_assert(std::is_empty<Data>::value, "Data must be empty");
237
+ Add(point, {});
238
+ }
239
+
240
+ template <class Data>
241
+ bool S2PointIndex<Data>::Remove(const PointData& point_data) {
242
+ S2CellId id(point_data.point());
243
+ for (typename Map::iterator it = map_.lower_bound(id), end = map_.end();
244
+ it != end && it->first == id; ++it) {
245
+ if (it->second == point_data) {
246
+ map_.erase(it);
247
+ return true;
248
+ }
249
+ }
250
+ return false;
251
+ }
252
+
253
+ template <class Data>
254
+ bool S2PointIndex<Data>::Remove(const S2Point& point, const Data& data) {
255
+ return Remove(PointData(point, data));
256
+ }
257
+
258
+ template <class Data>
259
+ void S2PointIndex<Data>::Remove(const S2Point& point) {
260
+ static_assert(std::is_empty<Data>::value, "Data must be empty");
261
+ Remove(point, {});
262
+ }
263
+
264
+ template <class Data>
265
+ void S2PointIndex<Data>::Clear() {
266
+ map_.clear();
267
+ }
268
+
269
+ template <class Data>
270
+ inline S2PointIndex<Data>::Iterator::Iterator() : map_(nullptr) {
271
+ }
272
+
273
+ template <class Data>
274
+ inline S2PointIndex<Data>::Iterator::Iterator(
275
+ const S2PointIndex<Data>* index) {
276
+ Init(index);
277
+ }
278
+
279
+ template <class Data>
280
+ inline void S2PointIndex<Data>::Iterator::Init(
281
+ const S2PointIndex<Data>* index) {
282
+ map_ = &index->map_;
283
+ iter_ = map_->begin();
284
+ end_ = map_->end();
285
+ }
286
+
287
+ template <class Data>
288
+ inline S2CellId S2PointIndex<Data>::Iterator::id() const {
289
+ S2_DCHECK(!done());
290
+ return iter_->first;
291
+ }
292
+
293
+ template <class Data>
294
+ inline const S2Point& S2PointIndex<Data>::Iterator::point() const {
295
+ S2_DCHECK(!done());
296
+ return iter_->second.point();
297
+ }
298
+
299
+ template <class Data>
300
+ inline const Data& S2PointIndex<Data>::Iterator::data() const {
301
+ S2_DCHECK(!done());
302
+ return iter_->second.data();
303
+ }
304
+
305
+ template <class Data>
306
+ inline const typename S2PointIndex<Data>::PointData&
307
+ S2PointIndex<Data>::Iterator::point_data() const {
308
+ S2_DCHECK(!done());
309
+ return iter_->second;
310
+ }
311
+
312
+ template <class Data>
313
+ inline bool S2PointIndex<Data>::Iterator::done() const {
314
+ return iter_ == end_;
315
+ }
316
+
317
+ template <class Data>
318
+ inline void S2PointIndex<Data>::Iterator::Begin() {
319
+ iter_ = map_->begin();
320
+ }
321
+
322
+ template <class Data>
323
+ inline void S2PointIndex<Data>::Iterator::Finish() {
324
+ iter_ = end_;
325
+ }
326
+
327
+ template <class Data>
328
+ inline void S2PointIndex<Data>::Iterator::Next() {
329
+ S2_DCHECK(!done());
330
+ ++iter_;
331
+ }
332
+
333
+ template <class Data>
334
+ inline bool S2PointIndex<Data>::Iterator::Prev() {
335
+ if (iter_ == map_->begin()) return false;
336
+ --iter_;
337
+ return true;
338
+ }
339
+
340
+ template <class Data>
341
+ inline void S2PointIndex<Data>::Iterator::Seek(S2CellId target) {
342
+ iter_ = map_->lower_bound(target);
343
+ }
344
+
345
+ #endif // S2_S2POINT_INDEX_H_