@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,705 @@
1
+ // Copyright 2005 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_S2CELL_ID_H_
19
+ #define S2_S2CELL_ID_H_
20
+
21
+ #include <cstddef>
22
+ #include <functional>
23
+ #include <iostream>
24
+ #include <string>
25
+ #include <vector>
26
+
27
+ #include "s2/base/integral_types.h"
28
+ #include "s2/base/logging.h"
29
+ #include "s2/base/port.h"
30
+ #include "s2/_fp_contract_off.h"
31
+ #include "s2/r2.h"
32
+ #include "s2/r2rect.h"
33
+ #include "s2/s1angle.h"
34
+ #include "s2/s2coords.h"
35
+ #include "s2/third_party/absl/strings/string_view.h"
36
+ #include "s2/util/bits/bits.h"
37
+ #include "s2/util/coding/coder.h"
38
+
39
+ class S2LatLng;
40
+
41
+ #ifndef SWIG
42
+ #define IFNDEF_SWIG(x) x
43
+ #else
44
+ #define IFNDEF_SWIG(x)
45
+ #endif
46
+
47
+ // An S2CellId is a 64-bit unsigned integer that uniquely identifies a
48
+ // cell in the S2 cell decomposition. It has the following format:
49
+ //
50
+ // id = [face][face_pos]
51
+ //
52
+ // face: a 3-bit number (range 0..5) encoding the cube face.
53
+ //
54
+ // face_pos: a 61-bit number encoding the position of the center of this
55
+ // cell along the Hilbert curve over this face (see the Wiki
56
+ // pages for details).
57
+ //
58
+ // Sequentially increasing cell ids follow a continuous space-filling curve
59
+ // over the entire sphere. They have the following properties:
60
+ //
61
+ // - The id of a cell at level k consists of a 3-bit face number followed
62
+ // by k bit pairs that recursively select one of the four children of
63
+ // each cell. The next bit is always 1, and all other bits are 0.
64
+ // Therefore, the level of a cell is determined by the position of its
65
+ // lowest-numbered bit that is turned on (for a cell at level k, this
66
+ // position is 2 * (kMaxLevel - k).)
67
+ //
68
+ // - The id of a parent cell is at the midpoint of the range of ids spanned
69
+ // by its children (or by its descendants at any level).
70
+ //
71
+ // Leaf cells are often used to represent points on the unit sphere, and
72
+ // this class provides methods for converting directly between these two
73
+ // representations. For cells that represent 2D regions rather than
74
+ // discrete point, it is better to use the S2Cell class.
75
+ //
76
+ // This class is intended to be copied by value as desired. It uses
77
+ // the default copy constructor and assignment operator.
78
+ class S2CellId {
79
+ public:
80
+ // The extra position bit (61 rather than 60) let us encode each cell as its
81
+ // Hilbert curve position at the cell center (which is halfway along the
82
+ // portion of the Hilbert curve that fills that cell).
83
+ static const int kFaceBits = 3;
84
+ static const int kNumFaces = 6;
85
+ static const int kMaxLevel = S2::kMaxCellLevel; // Valid levels: 0..kMaxLevel
86
+ static const int kPosBits = 2 * kMaxLevel + 1;
87
+ static const int kMaxSize = 1 << kMaxLevel;
88
+
89
+ explicit IFNDEF_SWIG(constexpr) S2CellId(uint64 id) : id_(id) {}
90
+
91
+ // Construct a leaf cell containing the given point "p". Usually there is
92
+ // is exactly one such cell, but for points along the edge of a cell, any
93
+ // adjacent cell may be (deterministically) chosen. This is because
94
+ // S2CellIds are considered to be closed sets. The returned cell will
95
+ // always contain the given point, i.e.
96
+ //
97
+ // S2Cell(S2CellId(p)).Contains(p)
98
+ //
99
+ // is always true. The point "p" does not need to be normalized.
100
+ //
101
+ // If instead you want every point to be contained by exactly one S2Cell,
102
+ // you will need to convert the S2CellIds to S2Loops (which implement point
103
+ // containment this way).
104
+ explicit S2CellId(const S2Point& p);
105
+
106
+ // Construct a leaf cell containing the given normalized S2LatLng.
107
+ explicit S2CellId(const S2LatLng& ll);
108
+
109
+ // The default constructor returns an invalid cell id.
110
+ IFNDEF_SWIG(constexpr) S2CellId() : id_(0) {}
111
+ static constexpr S2CellId None() { return S2CellId(); }
112
+
113
+ // Returns an invalid cell id guaranteed to be larger than any
114
+ // valid cell id. Useful for creating indexes.
115
+ static constexpr S2CellId Sentinel() { return S2CellId(~uint64{0}); }
116
+
117
+ // Return the cell corresponding to a given S2 cube face.
118
+ static S2CellId FromFace(int face);
119
+
120
+ // Return a cell given its face (range 0..5), Hilbert curve position within
121
+ // that face (an unsigned integer with S2CellId::kPosBits bits), and level
122
+ // (range 0..kMaxLevel). The given position will be modified to correspond
123
+ // to the Hilbert curve position at the center of the returned cell. This
124
+ // is a static function rather than a constructor in order to indicate what
125
+ // the arguments represent.
126
+ static S2CellId FromFacePosLevel(int face, uint64 pos, int level);
127
+
128
+ // Return the direction vector corresponding to the center of the given
129
+ // cell. The vector returned by ToPointRaw is not necessarily unit length.
130
+ // This method returns the same result as S2Cell::GetCenter().
131
+ //
132
+ // The maximum directional error in ToPoint() (compared to the exact
133
+ // mathematical result) is 1.5 * DBL_EPSILON radians, and the maximum length
134
+ // error is 2 * DBL_EPSILON (the same as Normalize).
135
+ S2Point ToPoint() const { return ToPointRaw().Normalize(); }
136
+ S2Point ToPointRaw() const;
137
+
138
+ // Return the center of the cell in (s,t) coordinates (see s2coords.h).
139
+ R2Point GetCenterST() const;
140
+
141
+ // Return the edge length of this cell in (s,t)-space.
142
+ double GetSizeST() const;
143
+
144
+ // Return the edge length in (s,t)-space of cells at the given level.
145
+ static double GetSizeST(int level);
146
+
147
+ // Return the bounds of this cell in (s,t)-space.
148
+ R2Rect GetBoundST() const;
149
+
150
+ // Return the center of the cell in (u,v) coordinates (see s2coords.h).
151
+ // Note that the center of the cell is defined as the point at which it is
152
+ // recursively subdivided into four children; in general, it is not at the
153
+ // midpoint of the (u,v) rectangle covered by the cell.
154
+ R2Point GetCenterUV() const;
155
+
156
+ // Return the bounds of this cell in (u,v)-space.
157
+ R2Rect GetBoundUV() const;
158
+
159
+ // Expand a rectangle in (u,v)-space so that it contains all points within
160
+ // the given distance of the boundary, and return the smallest such
161
+ // rectangle. If the distance is negative, then instead shrink this
162
+ // rectangle so that it excludes all points within the given absolute
163
+ // distance of the boundary.
164
+ //
165
+ // Distances are measured *on the sphere*, not in (u,v)-space. For example,
166
+ // you can use this method to expand the (u,v)-bound of an S2CellId so that
167
+ // it contains all points within 5km of the original cell. You can then
168
+ // test whether a point lies within the expanded bounds like this:
169
+ //
170
+ // R2Point uv;
171
+ // if (S2::FaceXYZtoUV(face, point, &uv) && bound.Contains(uv)) { ... }
172
+ //
173
+ // Limitations:
174
+ //
175
+ // - Because the rectangle is drawn on one of the six cube-face planes
176
+ // (i.e., {x,y,z} = +/-1), it can cover at most one hemisphere. This
177
+ // limits the maximum amount that a rectangle can be expanded. For
178
+ // example, S2CellId bounds can be expanded safely by at most 45 degrees
179
+ // (about 5000 km on the Earth's surface).
180
+ //
181
+ // - The implementation is not exact for negative distances. The resulting
182
+ // rectangle will exclude all points within the given distance of the
183
+ // boundary but may be slightly smaller than necessary.
184
+ static R2Rect ExpandedByDistanceUV(const R2Rect& uv, S1Angle distance);
185
+
186
+ // Return the (face, si, ti) coordinates of the center of the cell. Note
187
+ // that although (si,ti) coordinates span the range [0,2**31] in general,
188
+ // the cell center coordinates are always in the range [1,2**31-1] and
189
+ // therefore can be represented using a signed 32-bit integer.
190
+ int GetCenterSiTi(int* psi, int* pti) const;
191
+
192
+ // Return the S2LatLng corresponding to the center of the given cell.
193
+ S2LatLng ToLatLng() const;
194
+
195
+ // The 64-bit unique identifier for this cell.
196
+ uint64 id() const { return id_; }
197
+
198
+ // Return true if id() represents a valid cell.
199
+ //
200
+ // All methods require is_valid() to be true unless otherwise specified
201
+ // (although not all methods enforce this).
202
+ bool is_valid() const;
203
+
204
+ // Which cube face this cell belongs to, in the range 0..5.
205
+ int face() const;
206
+
207
+ // The position of the cell center along the Hilbert curve over this face,
208
+ // in the range 0..(2**kPosBits-1).
209
+ uint64 pos() const;
210
+
211
+ // Return the subdivision level of the cell (range 0..kMaxLevel).
212
+ int level() const;
213
+
214
+ // Return the edge length of this cell in (i,j)-space.
215
+ int GetSizeIJ() const;
216
+
217
+ // Like the above, but return the size of cells at the given level.
218
+ static int GetSizeIJ(int level);
219
+
220
+ // Return true if this is a leaf cell (more efficient than checking
221
+ // whether level() == kMaxLevel).
222
+ bool is_leaf() const;
223
+
224
+ // Return true if this is a top-level face cell (more efficient than
225
+ // checking whether level() == 0).
226
+ bool is_face() const;
227
+
228
+ // Return the child position (0..3) of this cell within its parent.
229
+ // REQUIRES: level() >= 1.
230
+ int child_position() const;
231
+
232
+ // Return the child position (0..3) of this cell's ancestor at the given
233
+ // level within its parent. For example, child_position(1) returns the
234
+ // position of this cell's level-1 ancestor within its top-level face cell.
235
+ // REQUIRES: 1 <= level <= this->level().
236
+ int child_position(int level) const;
237
+
238
+ // These methods return the range of cell ids that are contained within this
239
+ // cell (including itself). The range is *inclusive* (i.e. test using >=
240
+ // and <=) and the return values of both methods are valid leaf cell ids.
241
+ // In other words, a.contains(b) if and only if
242
+ //
243
+ // (b >= a.range_min() && b <= a.range_max())
244
+ //
245
+ // If you want to iterate through all the descendants of this cell at a
246
+ // particular level, use child_begin(level) and child_end(level) instead.
247
+ // Also see maximum_tile(), which can be used to iterate through a range of
248
+ // cells using S2CellIds at different levels that are as large as possible.
249
+ //
250
+ // If you need to convert the range to a semi-open interval [min, limit)
251
+ // (e.g., in order to use a key-value store that only supports semi-open
252
+ // range queries), do not attempt to define "limit" as range_max.next().
253
+ // The problem is that leaf S2CellIds are 2 units apart, so the semi-open
254
+ // interval [min, limit) includes an additional value (range_max.id() + 1)
255
+ // which is happens to be a valid S2CellId about one-third of the time and
256
+ // is *never* contained by this cell. (It always correpsonds to a cell that
257
+ // is larger than this one.) You can define "limit" as (range_max.id() + 1)
258
+ // if necessary (which is not always a valid S2CellId but can still be used
259
+ // with FromToken/ToToken), or you can convert range_max() to the key space
260
+ // of your key-value store and define "limit" as Successor(key).
261
+ //
262
+ // Note that Sentinel().range_min() == Sentinel.range_max() == Sentinel().
263
+ S2CellId range_min() const;
264
+ S2CellId range_max() const;
265
+
266
+ // Return true if the given cell is contained within this one.
267
+ bool contains(S2CellId other) const;
268
+
269
+ // Return true if the given cell intersects this one.
270
+ bool intersects(S2CellId other) const;
271
+
272
+ // Return the cell at the previous level or at the given level (which must
273
+ // be less than or equal to the current level).
274
+ S2CellId parent() const;
275
+ S2CellId parent(int level) const;
276
+
277
+ // Return the immediate child of this cell at the given traversal order
278
+ // position (in the range 0 to 3). This cell must not be a leaf cell.
279
+ S2CellId child(int position) const;
280
+
281
+ // Iterator-style methods for traversing the immediate children of a cell or
282
+ // all of the children at a given level (greater than or equal to the current
283
+ // level). Note that the end value is exclusive, just like standard STL
284
+ // iterators, and may not even be a valid cell id. You should iterate using
285
+ // code like this:
286
+ //
287
+ // for(S2CellId c = id.child_begin(); c != id.child_end(); c = c.next())
288
+ // ...
289
+ //
290
+ // The convention for advancing the iterator is "c = c.next()" rather
291
+ // than "++c" to avoid possible confusion with incrementing the
292
+ // underlying 64-bit cell id.
293
+ S2CellId child_begin() const;
294
+ S2CellId child_begin(int level) const;
295
+ S2CellId child_end() const;
296
+ S2CellId child_end(int level) const;
297
+
298
+ // Return the next/previous cell at the same level along the Hilbert curve.
299
+ // Works correctly when advancing from one face to the next, but
300
+ // does *not* wrap around from the last face to the first or vice versa.
301
+ S2CellId next() const;
302
+ S2CellId prev() const;
303
+
304
+ // This method advances or retreats the indicated number of steps along the
305
+ // Hilbert curve at the current level, and returns the new position. The
306
+ // position is never advanced past End() or before Begin().
307
+ S2CellId advance(int64 steps) const;
308
+
309
+ // Returns the number of steps that this cell is from Begin(level()). The
310
+ // return value is always non-negative.
311
+ int64 distance_from_begin() const;
312
+
313
+ // Like next() and prev(), but these methods wrap around from the last face
314
+ // to the first and vice versa. They should *not* be used for iteration in
315
+ // conjunction with child_begin(), child_end(), Begin(), or End(). The
316
+ // input must be a valid cell id.
317
+ S2CellId next_wrap() const;
318
+ S2CellId prev_wrap() const;
319
+
320
+ // This method advances or retreats the indicated number of steps along the
321
+ // Hilbert curve at the current level, and returns the new position. The
322
+ // position wraps between the first and last faces as necessary. The input
323
+ // must be a valid cell id.
324
+ S2CellId advance_wrap(int64 steps) const;
325
+
326
+ // Return the largest cell with the same range_min() and such that
327
+ // range_max() < limit.range_min(). Returns "limit" if no such cell exists.
328
+ // This method can be used to generate a small set of S2CellIds that covers
329
+ // a given range (a "tiling"). This example shows how to generate a tiling
330
+ // for a semi-open range of leaf cells [start, limit):
331
+ //
332
+ // for (S2CellId id = start.maximum_tile(limit);
333
+ // id != limit; id = id.next().maximum_tile(limit)) { ... }
334
+ //
335
+ // Note that in general the cells in the tiling will be of different sizes;
336
+ // they gradually get larger (near the middle of the range) and then
337
+ // gradually get smaller (as "limit" is approached).
338
+ S2CellId maximum_tile(S2CellId limit) const;
339
+
340
+ // Returns the level of the lowest common ancestor of this cell and "other",
341
+ // that is, the maximum level such that parent(level) == other.parent(level).
342
+ // Returns -1 if the two cells do not have any common ancestor (i.e., they
343
+ // are from different faces).
344
+ int GetCommonAncestorLevel(S2CellId other) const;
345
+
346
+ // Iterator-style methods for traversing all the cells along the Hilbert
347
+ // curve at a given level (across all 6 faces of the cube). Note that the
348
+ // end value is exclusive (just like standard STL iterators), and is not a
349
+ // valid cell id.
350
+ static S2CellId Begin(int level);
351
+ static S2CellId End(int level);
352
+
353
+ // Methods to encode and decode cell ids to compact text strings suitable
354
+ // for display or indexing. Cells at lower levels (i.e. larger cells) are
355
+ // encoded into fewer characters. The maximum token length is 16.
356
+ //
357
+ // Tokens preserve ordering, i.e. ToToken(x) < ToToken(y) iff x < y.
358
+ //
359
+ // ToToken() returns a string by value for convenience; the compiler
360
+ // does this without intermediate copying in most cases.
361
+ //
362
+ // These methods guarantee that FromToken(ToToken(x)) == x even when
363
+ // "x" is an invalid cell id. All tokens are alphanumeric strings.
364
+ // FromToken() returns S2CellId::None() for malformed inputs.
365
+ string ToToken() const;
366
+ static S2CellId FromToken(const char* token, size_t length);
367
+ static S2CellId FromToken(const std::string& token);
368
+
369
+ // Use encoder to generate a serialized representation of this cell id.
370
+ // Can also encode an invalid cell.
371
+ void Encode(Encoder* const encoder) const;
372
+
373
+ // Decodes an S2CellId encoded by Encode(). Returns true on success.
374
+ bool Decode(Decoder* const decoder);
375
+
376
+ // Creates a human readable debug string. Used for << and available for
377
+ // direct usage as well. The format is "f/dd..d" where "f" is a digit in
378
+ // the range [0-5] representing the S2CellId face, and "dd..d" is a string
379
+ // of digits in the range [0-3] representing each child's position with
380
+ // respect to its parent. (Note that the latter string may be empty.)
381
+ //
382
+ // For example "4/" represents S2CellId::FromFace(4), and "3/02" represents
383
+ // S2CellId::FromFace(3).child(0).child(2).
384
+ string ToString() const;
385
+
386
+ // Converts a string in the format returned by ToString() to an S2CellId.
387
+ // Returns S2CellId::None() if the string could not be parsed.
388
+ //
389
+ // The method name includes "Debug" in order to avoid possible confusion
390
+ // with FromToken() above.
391
+ static S2CellId FromDebugString(absl::string_view str);
392
+
393
+ // Return the four cells that are adjacent across the cell's four edges.
394
+ // Neighbors are returned in the order defined by S2Cell::GetEdge. All
395
+ // neighbors are guaranteed to be distinct.
396
+ void GetEdgeNeighbors(S2CellId neighbors[4]) const;
397
+
398
+ // Return the neighbors of closest vertex to this cell at the given level,
399
+ // by appending them to "output". Normally there are four neighbors, but
400
+ // the closest vertex may only have three neighbors if it is one of the 8
401
+ // cube vertices.
402
+ //
403
+ // Requires: level < this->level(), so that we can determine which vertex is
404
+ // closest (in particular, level == kMaxLevel is not allowed).
405
+ void AppendVertexNeighbors(int level, std::vector<S2CellId>* output) const;
406
+
407
+ // Append all neighbors of this cell at the given level to "output". Two
408
+ // cells X and Y are neighbors if their boundaries intersect but their
409
+ // interiors do not. In particular, two cells that intersect at a single
410
+ // point are neighbors. Note that for cells adjacent to a face vertex, the
411
+ // same neighbor may be appended more than once.
412
+ //
413
+ // REQUIRES: nbr_level >= this->level().
414
+ void AppendAllNeighbors(int nbr_level, std::vector<S2CellId>* output) const;
415
+
416
+ /////////////////////////////////////////////////////////////////////
417
+ // Low-level methods.
418
+
419
+ // Return a leaf cell given its cube face (range 0..5) and
420
+ // i- and j-coordinates (see s2coords.h).
421
+ static S2CellId FromFaceIJ(int face, int i, int j);
422
+
423
+ // Return the (face, i, j) coordinates for the leaf cell corresponding to
424
+ // this cell id. Since cells are represented by the Hilbert curve position
425
+ // at the center of the cell, the returned (i,j) for non-leaf cells will be
426
+ // a leaf cell adjacent to the cell center. If "orientation" is non-nullptr,
427
+ // also return the Hilbert curve orientation for the current cell.
428
+ int ToFaceIJOrientation(int* pi, int* pj, int* orientation) const;
429
+
430
+ // Return the lowest-numbered bit that is on for this cell id, which is
431
+ // equal to (uint64{1} << (2 * (kMaxLevel - level))). So for example,
432
+ // a.lsb() <= b.lsb() if and only if a.level() >= b.level(), but the
433
+ // first test is more efficient.
434
+ uint64 lsb() const { return id_ & (~id_ + 1); }
435
+
436
+ // Return the lowest-numbered bit that is on for cells at the given level.
437
+ static uint64 lsb_for_level(int level) {
438
+ return uint64{1} << (2 * (kMaxLevel - level));
439
+ }
440
+
441
+ // Return the bound in (u,v)-space for the cell at the given level containing
442
+ // the leaf cell with the given (i,j)-coordinates.
443
+ static R2Rect IJLevelToBoundUV(int ij[2], int level);
444
+
445
+ // When S2CellId is used as a key in one of the btree container types
446
+ // (util/btree), indicate that linear rather than binary search should be
447
+ // used. This is much faster when the comparison function is cheap.
448
+ typedef std::true_type goog_btree_prefer_linear_node_search;
449
+
450
+ private:
451
+ // This is the offset required to wrap around from the beginning of the
452
+ // Hilbert curve to the end or vice versa; see next_wrap() and prev_wrap().
453
+ // SWIG doesn't understand uint64{}, so use static_cast.
454
+ static const uint64 kWrapOffset = static_cast<uint64>(kNumFaces) << kPosBits;
455
+
456
+ // Given a face and a point (i,j) where either i or j is outside the valid
457
+ // range [0..kMaxSize-1], this function first determines which neighboring
458
+ // face "contains" (i,j), and then returns the leaf cell on that face which
459
+ // is adjacent to the given face and whose distance from (i,j) is minimal.
460
+ static S2CellId FromFaceIJWrap(int face, int i, int j);
461
+
462
+ // Inline helper function that calls FromFaceIJ if "same_face" is true,
463
+ // or FromFaceIJWrap if "same_face" is false.
464
+ static S2CellId FromFaceIJSame(int face, int i, int j, bool same_face);
465
+
466
+ uint64 id_;
467
+ } ABSL_ATTRIBUTE_PACKED; // Necessary so that structures containing S2CellId's
468
+ // can be ABSL_ATTRIBUTE_PACKED.
469
+
470
+ inline bool operator==(S2CellId x, S2CellId y) {
471
+ return x.id() == y.id();
472
+ }
473
+
474
+ inline bool operator!=(S2CellId x, S2CellId y) {
475
+ return x.id() != y.id();
476
+ }
477
+
478
+ inline bool operator<(S2CellId x, S2CellId y) {
479
+ return x.id() < y.id();
480
+ }
481
+
482
+ inline bool operator>(S2CellId x, S2CellId y) {
483
+ return x.id() > y.id();
484
+ }
485
+
486
+ inline bool operator<=(S2CellId x, S2CellId y) {
487
+ return x.id() <= y.id();
488
+ }
489
+
490
+ inline bool operator>=(S2CellId x, S2CellId y) {
491
+ return x.id() >= y.id();
492
+ }
493
+
494
+ inline S2CellId S2CellId::FromFace(int face) {
495
+ return S2CellId((static_cast<uint64>(face) << kPosBits) + lsb_for_level(0));
496
+ }
497
+
498
+ inline S2CellId S2CellId::FromFacePosLevel(int face, uint64 pos, int level) {
499
+ S2CellId cell((static_cast<uint64>(face) << kPosBits) + (pos | 1));
500
+ return cell.parent(level);
501
+ }
502
+
503
+ inline int S2CellId::GetCenterSiTi(int* psi, int* pti) const {
504
+ // First we compute the discrete (i,j) coordinates of a leaf cell contained
505
+ // within the given cell. Given that cells are represented by the Hilbert
506
+ // curve position corresponding at their center, it turns out that the cell
507
+ // returned by ToFaceIJOrientation is always one of two leaf cells closest
508
+ // to the center of the cell (unless the given cell is a leaf cell itself,
509
+ // in which case there is only one possibility).
510
+ //
511
+ // Given a cell of size s >= 2 (i.e. not a leaf cell), and letting (imin,
512
+ // jmin) be the coordinates of its lower left-hand corner, the leaf cell
513
+ // returned by ToFaceIJOrientation() is either (imin + s/2, jmin + s/2)
514
+ // (imin + s/2 - 1, jmin + s/2 - 1). The first case is the one we want.
515
+ // We can distinguish these two cases by looking at the low bit of "i" or
516
+ // "j". In the second case the low bit is one, unless s == 2 (i.e. the
517
+ // level just above leaf cells) in which case the low bit is zero.
518
+ //
519
+ // In the code below, the expression ((i ^ (int(id_) >> 2)) & 1) is true
520
+ // if we are in the second case described above.
521
+ int i, j;
522
+ int face = ToFaceIJOrientation(&i, &j, nullptr);
523
+ int delta = is_leaf() ? 1 : ((i ^ (static_cast<int>(id_) >> 2)) & 1) ? 2 : 0;
524
+
525
+ // Note that (2 * {i,j} + delta) will never overflow a 32-bit integer.
526
+ *psi = 2 * i + delta;
527
+ *pti = 2 * j + delta;
528
+ return face;
529
+ }
530
+
531
+ inline bool S2CellId::is_valid() const {
532
+ return (face() < kNumFaces && (lsb() & 0x1555555555555555ULL));
533
+ }
534
+
535
+ inline int S2CellId::face() const {
536
+ return id_ >> kPosBits;
537
+ }
538
+
539
+ inline uint64 S2CellId::pos() const {
540
+ return id_ & (~uint64{0} >> kFaceBits);
541
+ }
542
+
543
+ inline int S2CellId::level() const {
544
+ // We can't just S2_DCHECK(is_valid()) because we want level() to be
545
+ // defined for end-iterators, i.e. S2CellId::End(kLevel). However there is
546
+ // no good way to define S2CellId::None().level(), so we do prohibit that.
547
+ S2_DCHECK(id_ != 0);
548
+
549
+ // A special case for leaf cells is not worthwhile.
550
+ return kMaxLevel - (Bits::FindLSBSetNonZero64(id_) >> 1);
551
+ }
552
+
553
+ inline int S2CellId::GetSizeIJ() const {
554
+ return GetSizeIJ(level());
555
+ }
556
+
557
+ inline double S2CellId::GetSizeST() const {
558
+ return GetSizeST(level());
559
+ }
560
+
561
+ inline int S2CellId::GetSizeIJ(int level) {
562
+ return 1 << (kMaxLevel - level);
563
+ }
564
+
565
+ inline double S2CellId::GetSizeST(int level) {
566
+ return S2::IJtoSTMin(GetSizeIJ(level));
567
+ }
568
+
569
+ inline bool S2CellId::is_leaf() const {
570
+ return int(id_) & 1;
571
+ }
572
+
573
+ inline bool S2CellId::is_face() const {
574
+ return (id_ & (lsb_for_level(0) - 1)) == 0;
575
+ }
576
+
577
+ inline int S2CellId::child_position() const {
578
+ // No need for a special implementation; the compiler optimizes this well.
579
+ return child_position(level());
580
+ }
581
+
582
+ inline int S2CellId::child_position(int level) const {
583
+ S2_DCHECK(is_valid());
584
+ S2_DCHECK_GE(level, 1);
585
+ S2_DCHECK_LE(level, this->level());
586
+ return static_cast<int>(id_ >> (2 * (kMaxLevel - level) + 1)) & 3;
587
+ }
588
+
589
+ inline S2CellId S2CellId::range_min() const {
590
+ return S2CellId(id_ - (lsb() - 1));
591
+ }
592
+
593
+ inline S2CellId S2CellId::range_max() const {
594
+ return S2CellId(id_ + (lsb() - 1));
595
+ }
596
+
597
+ inline bool S2CellId::contains(S2CellId other) const {
598
+ S2_DCHECK(is_valid());
599
+ S2_DCHECK(other.is_valid());
600
+ return other >= range_min() && other <= range_max();
601
+ }
602
+
603
+ inline bool S2CellId::intersects(S2CellId other) const {
604
+ S2_DCHECK(is_valid());
605
+ S2_DCHECK(other.is_valid());
606
+ return other.range_min() <= range_max() && other.range_max() >= range_min();
607
+ }
608
+
609
+ inline S2CellId S2CellId::parent(int level) const {
610
+ S2_DCHECK(is_valid());
611
+ S2_DCHECK_GE(level, 0);
612
+ S2_DCHECK_LE(level, this->level());
613
+ uint64 new_lsb = lsb_for_level(level);
614
+ return S2CellId((id_ & (~new_lsb + 1)) | new_lsb);
615
+ }
616
+
617
+ inline S2CellId S2CellId::parent() const {
618
+ S2_DCHECK(is_valid());
619
+ S2_DCHECK(!is_face());
620
+ uint64 new_lsb = lsb() << 2;
621
+ return S2CellId((id_ & (~new_lsb + 1)) | new_lsb);
622
+ }
623
+
624
+ inline S2CellId S2CellId::child(int position) const {
625
+ S2_DCHECK(is_valid());
626
+ S2_DCHECK(!is_leaf());
627
+ // To change the level, we need to move the least-significant bit two
628
+ // positions downward. We do this by subtracting (4 * new_lsb) and adding
629
+ // new_lsb. Then to advance to the given child cell, we add
630
+ // (2 * position * new_lsb).
631
+ uint64 new_lsb = lsb() >> 2;
632
+ return S2CellId(id_ + (2 * position + 1 - 4) * new_lsb);
633
+ }
634
+
635
+ inline S2CellId S2CellId::child_begin() const {
636
+ S2_DCHECK(is_valid());
637
+ S2_DCHECK(!is_leaf());
638
+ uint64 old_lsb = lsb();
639
+ return S2CellId(id_ - old_lsb + (old_lsb >> 2));
640
+ }
641
+
642
+ inline S2CellId S2CellId::child_begin(int level) const {
643
+ S2_DCHECK(is_valid());
644
+ S2_DCHECK_GE(level, this->level());
645
+ S2_DCHECK_LE(level, kMaxLevel);
646
+ return S2CellId(id_ - lsb() + lsb_for_level(level));
647
+ }
648
+
649
+ inline S2CellId S2CellId::child_end() const {
650
+ S2_DCHECK(is_valid());
651
+ S2_DCHECK(!is_leaf());
652
+ uint64 old_lsb = lsb();
653
+ return S2CellId(id_ + old_lsb + (old_lsb >> 2));
654
+ }
655
+
656
+ inline S2CellId S2CellId::child_end(int level) const {
657
+ S2_DCHECK(is_valid());
658
+ S2_DCHECK_GE(level, this->level());
659
+ S2_DCHECK_LE(level, kMaxLevel);
660
+ return S2CellId(id_ + lsb() + lsb_for_level(level));
661
+ }
662
+
663
+ inline S2CellId S2CellId::next() const {
664
+ return S2CellId(id_ + (lsb() << 1));
665
+ }
666
+
667
+ inline S2CellId S2CellId::prev() const {
668
+ return S2CellId(id_ - (lsb() << 1));
669
+ }
670
+
671
+ inline S2CellId S2CellId::next_wrap() const {
672
+ S2_DCHECK(is_valid());
673
+ S2CellId n = next();
674
+ if (n.id_ < kWrapOffset) return n;
675
+ return S2CellId(n.id_ - kWrapOffset);
676
+ }
677
+
678
+ inline S2CellId S2CellId::prev_wrap() const {
679
+ S2_DCHECK(is_valid());
680
+ S2CellId p = prev();
681
+ if (p.id_ < kWrapOffset) return p;
682
+ return S2CellId(p.id_ + kWrapOffset);
683
+ }
684
+
685
+ inline S2CellId S2CellId::Begin(int level) {
686
+ return FromFace(0).child_begin(level);
687
+ }
688
+
689
+ inline S2CellId S2CellId::End(int level) {
690
+ return FromFace(5).child_end(level);
691
+ }
692
+
693
+ std::ostream& operator<<(std::ostream& os, S2CellId id);
694
+
695
+ // Hasher for S2CellId.
696
+ // Example use: std::unordered_map<S2CellId, int, S2CellIdHash>.
697
+ struct S2CellIdHash {
698
+ size_t operator()(S2CellId id) const {
699
+ return std::hash<uint64>()(id.id());
700
+ }
701
+ };
702
+
703
+ #undef IFNDEF_SWIG
704
+
705
+ #endif // S2_S2CELL_ID_H_