@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,140 @@
1
+ // Copyright 2018 Google Inc. All Rights Reserved.
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // http://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS-IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+ //
15
+
16
+ // Author: ericv@google.com (Eric Veach)
17
+
18
+ #ifndef S2_ENCODED_S2POINT_VECTOR_H_
19
+ #define S2_ENCODED_S2POINT_VECTOR_H_
20
+
21
+ #include <atomic>
22
+ #include "s2/third_party/absl/types/span.h"
23
+ #include "s2/encoded_string_vector.h"
24
+ #include "s2/encoded_uint_vector.h"
25
+ #include "s2/s2point.h"
26
+
27
+ namespace s2coding {
28
+
29
+ // Controls whether to optimize for speed or size when encoding points. (Note
30
+ // that encoding is always lossless, and that currently compact encodings are
31
+ // only possible when points have been snapped to S2CellId centers.)
32
+ enum class CodingHint : uint8 { FAST, COMPACT };
33
+
34
+ // Encodes a vector of S2Points in a format that can later be decoded as an
35
+ // EncodedS2PointVector.
36
+ //
37
+ // REQUIRES: "encoder" uses the default constructor, so that its buffer
38
+ // can be enlarged as necessary by calling Ensure(int).
39
+ void EncodeS2PointVector(absl::Span<const S2Point> points, CodingHint hint,
40
+ Encoder* encoder);
41
+
42
+ // This class represents an encoded vector of S2Points. Values are decoded
43
+ // only when they are accessed. This allows for very fast initialization and
44
+ // no additional memory use beyond the encoded data. The encoded data is not
45
+ // owned by this class; typically it points into a large contiguous buffer
46
+ // that contains other encoded data as well.
47
+ //
48
+ // This is one of several helper classes that allow complex data structures to
49
+ // be initialized from an encoded format in constant time and then decoded on
50
+ // demand. This can be a big performance advantage when only a small part of
51
+ // the data structure is actually used.
52
+ class EncodedS2PointVector {
53
+ public:
54
+ // Constructs an uninitialized object; requires Init() to be called.
55
+ EncodedS2PointVector() {}
56
+
57
+ // Initializes the EncodedS2PointVector.
58
+ //
59
+ // REQUIRES: The Decoder data buffer must outlive this object.
60
+ bool Init(Decoder* decoder);
61
+
62
+ // Returns the size of the original vector.
63
+ size_t size() const;
64
+
65
+ // Returns the element at the given index.
66
+ S2Point operator[](int i) const;
67
+
68
+ // Decodes and returns the entire original vector.
69
+ std::vector<S2Point> Decode() const;
70
+
71
+ // TODO(ericv): Consider adding a method that returns an adjacent pair of
72
+ // points. This would save some decoding overhead.
73
+
74
+ private:
75
+ friend void EncodeS2PointVector(absl::Span<const S2Point>, CodingHint,
76
+ Encoder*);
77
+ friend void EncodeS2PointVectorFast(absl::Span<const S2Point>, Encoder*);
78
+ friend void EncodeS2PointVectorCompact(absl::Span<const S2Point>, Encoder*);
79
+
80
+ bool InitUncompressedFormat(Decoder* decoder);
81
+ bool InitCellIdsFormat(Decoder* decoder);
82
+ S2Point DecodeCellIdsFormat(int i) const;
83
+
84
+ // We use a tagged union to represent multiple formats, as opposed to an
85
+ // abstract base class or templating. This represents the best compromise
86
+ // between performance, space, and convenience. Note that the overhead of
87
+ // checking the tag is trivial and will typically be branch-predicted
88
+ // perfectly.
89
+ //
90
+ // TODO(ericv): Once additional formats have been implemented, consider
91
+ // using std::variant<> instead. It's unclear whether this would have
92
+ // better or worse performance than the current approach.
93
+ enum Format : uint8 {
94
+ UNCOMPRESSED = 0,
95
+ CELL_IDS = 1,
96
+ };
97
+ Format format_;
98
+ uint32 size_;
99
+ union {
100
+ struct {
101
+ const S2Point* points;
102
+ } uncompressed_;
103
+ struct {
104
+ EncodedStringVector blocks;
105
+ uint64 base;
106
+ uint8 level;
107
+ bool have_exceptions;
108
+
109
+ // TODO(ericv): Use std::atomic_flag to cache the last point decoded in
110
+ // a thread-safe way. This reduces benchmark times for actual polygon
111
+ // operations (e.g. S2ClosestEdgeQuery) by about 15%.
112
+ } cell_ids_;
113
+ };
114
+ };
115
+
116
+
117
+ ////////////////// Implementation details follow ////////////////////
118
+
119
+
120
+ inline size_t EncodedS2PointVector::size() const {
121
+ return size_;
122
+ }
123
+
124
+ inline S2Point EncodedS2PointVector::operator[](int i) const {
125
+ switch (format_) {
126
+ case Format::UNCOMPRESSED:
127
+ return uncompressed_.points[i];
128
+
129
+ case Format::CELL_IDS:
130
+ return DecodeCellIdsFormat(i);
131
+
132
+ default:
133
+ S2_LOG(DFATAL) << "Unrecognized format";
134
+ return S2Point();
135
+ }
136
+ }
137
+
138
+ } // namespace s2coding
139
+
140
+ #endif // S2_ENCODED_S2POINT_VECTOR_H_
@@ -0,0 +1,344 @@
1
+ // Copyright 2018 Google Inc. All Rights Reserved.
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // http://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS-IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+ //
15
+
16
+ // Author: ericv@google.com (Eric Veach)
17
+
18
+ #include "s2/encoded_s2point_vector.h"
19
+
20
+ #include <vector>
21
+ #include <gtest/gtest.h>
22
+ #include "s2/third_party/absl/strings/str_cat.h"
23
+ #include "s2/util/bits/bit-interleave.h"
24
+ #include "s2/s2loop.h"
25
+ #include "s2/s2polygon.h"
26
+ #include "s2/s2testing.h"
27
+ #include "s2/s2text_format.h"
28
+
29
+ using absl::make_unique;
30
+ using s2textformat::MakeCellIdOrDie;
31
+ using s2textformat::MakePointOrDie;
32
+ using std::vector;
33
+
34
+ namespace s2coding {
35
+
36
+ static int kBlockSize = 16; // Number of deltas per block in implementation.
37
+
38
+ size_t TestEncodedS2PointVector(const vector<S2Point>& expected,
39
+ CodingHint hint, int64 expected_bytes) {
40
+ Encoder encoder;
41
+ EncodeS2PointVector(expected, hint, &encoder);
42
+ if (expected_bytes >= 0) {
43
+ EXPECT_EQ(expected_bytes, encoder.length());
44
+ }
45
+ Decoder decoder(encoder.base(), encoder.length());
46
+ EncodedS2PointVector actual;
47
+ EXPECT_TRUE(actual.Init(&decoder));
48
+ EXPECT_EQ(actual.Decode(), expected);
49
+ return encoder.length();
50
+ }
51
+
52
+ // In order to make it easier to construct tests that encode particular
53
+ // values, this function duplicates the part of EncodedS2PointVector that
54
+ // converts an encoded 64-bit value back to an S2Point.
55
+ S2Point EncodedValueToPoint(uint64 value, int level) {
56
+ uint32 sj, tj;
57
+ util_bits::DeinterleaveUint32(value, &sj, &tj);
58
+ int shift = S2CellId::kMaxLevel - level;
59
+ int si = (((sj << 1) | 1) << shift) & 0x7fffffff;
60
+ int ti = (((tj << 1) | 1) << shift) & 0x7fffffff;
61
+ int face = ((sj << shift) >> 30) | (((tj << (shift + 1)) >> 29) & 4);
62
+ return S2::FaceUVtoXYZ(face, S2::STtoUV(S2::SiTitoST(si)),
63
+ S2::STtoUV(S2::SiTitoST(ti))).Normalize();
64
+ }
65
+
66
+ TEST(EncodedS2PointVectorTest, Empty) {
67
+ TestEncodedS2PointVector({}, CodingHint::FAST, 1);
68
+
69
+ // Test that an empty vector uses the UNCOMPRESSED encoding.
70
+ TestEncodedS2PointVector({}, CodingHint::COMPACT, 1);
71
+ }
72
+
73
+ TEST(EncodedS2PointVectorTest, OnePoint) {
74
+ TestEncodedS2PointVector({S2Point(1, 0, 0)}, CodingHint::FAST, 25);
75
+
76
+ // Encoding: header (2 bytes), block count (1 byte), block lengths (1 byte),
77
+ // block header (1 byte), delta (1 byte).
78
+ TestEncodedS2PointVector({S2Point(1, 0, 0)}, CodingHint::COMPACT, 6);
79
+ }
80
+
81
+ TEST(EncodedS2PointVectorTest, CellIdWithException) {
82
+ // Test one point encoded as an S2CellId with one point encoded as an
83
+ // exception.
84
+ //
85
+ // Encoding: header (2 bytes), block count (1 byte), block lengths (1 byte),
86
+ // block header (1 byte), two deltas (2 bytes), exception (24 bytes).
87
+ TestEncodedS2PointVector(
88
+ {MakeCellIdOrDie("1/23").ToPoint(), S2Point(0.1, 0.2, 0.3).Normalize()},
89
+ CodingHint::COMPACT, 31);
90
+ }
91
+
92
+ TEST(EncodedS2PointVectorTest, PointsAtMultipleLevels) {
93
+ // Test that when points at multiple levels are present, the level with the
94
+ // most points is chosen (preferring the smallest level in case of ties).
95
+ // (All other points are encoded as exceptions.)
96
+
97
+ // In this example, the two points at level 5 (on face 1) should be encoded.
98
+ // It is possible to tell which points are encoded by the length of the
99
+ // encoding (since different numbers of "base" bytes are encoded).
100
+ //
101
+ // Encoding: header (2 bytes), base (1 byte), block count (1 byte), block
102
+ // lengths (1 byte), block header (1 byte), 5 deltas (5 bytes), S2Point
103
+ // exceptions (72 bytes).
104
+ TestEncodedS2PointVector(
105
+ {MakeCellIdOrDie("2/11001310230102").ToPoint(),
106
+ MakeCellIdOrDie("1/23322").ToPoint(),
107
+ MakeCellIdOrDie("3/3").ToPoint(),
108
+ MakeCellIdOrDie("1/23323").ToPoint(),
109
+ MakeCellIdOrDie("2/12101023022012").ToPoint()},
110
+ CodingHint::COMPACT, 83);
111
+ }
112
+
113
+ TEST(EncodedS2PointVectorTest, NoOverlapOrExtraDeltaBitsNeeded) {
114
+ // This function tests the case in GetBlockCodes() where values can be
115
+ // encoded using the minimum number delta bits and no overlap. From the
116
+ // comments there:
117
+ //
118
+ // Example 1: d_min = 0x72, d_max = 0x7e. The range is 0x0c. This can be
119
+ // encoded using delta_bits = 4 and overlap_bits = 0, which allows us to
120
+ // represent an offset of 0x70 and a maximum delta of 0x0f, so that we can
121
+ // encode values up to 0x7f.
122
+ //
123
+ // To set up this test, we need at least two blocks: one to set the global
124
+ // minimum value, and the other to encode a specific range of deltas. To
125
+ // make things easier, the first block has a minimum value of zero.
126
+ //
127
+ // Encoding: header (2 bytes), block count (1 byte), block lengths (2 bytes)
128
+ // Block 0: header (1 byte), 8 deltas (8 bytes)
129
+ // Block 1: header (1 byte), offset (1 byte), 4 deltas (2 bytes)
130
+ const int level = 3;
131
+ vector<S2Point> points(kBlockSize, EncodedValueToPoint(0, level));
132
+ points.push_back(EncodedValueToPoint(0x72, level));
133
+ points.push_back(EncodedValueToPoint(0x74, level));
134
+ points.push_back(EncodedValueToPoint(0x75, level));
135
+ points.push_back(EncodedValueToPoint(0x7e, level));
136
+ TestEncodedS2PointVector(points, CodingHint::COMPACT, 10 + kBlockSize / 2);
137
+ }
138
+
139
+ TEST(EncodedS2PointVectorTest, OverlapNeeded) {
140
+ // Like the above, but tests the following case:
141
+ //
142
+ // Example 2: d_min = 0x78, d_max = 0x84. The range is 0x0c, but in this
143
+ // case it is not sufficient to use delta_bits = 4 and overlap_bits = 0
144
+ // because we can again only represent an offset of 0x70, so the maximum
145
+ // delta of 0x0f only lets us encode values up to 0x7f. However if we
146
+ // increase the overlap to 4 bits then we can represent an offset of 0x78,
147
+ // which lets us encode values up to 0x78 + 0x0f = 0x87.
148
+ //
149
+ // Encoding: header (2 bytes), block count (1 byte), block lengths (2 bytes)
150
+ // Block 0: header (1 byte), 8 deltas (8 bytes)
151
+ // Block 1: header (1 byte), offset (1 byte), 4 deltas (2 bytes)
152
+ const int level = 3;
153
+ vector<S2Point> points(kBlockSize, EncodedValueToPoint(0, level));
154
+ points.push_back(EncodedValueToPoint(0x78, level));
155
+ points.push_back(EncodedValueToPoint(0x7a, level));
156
+ points.push_back(EncodedValueToPoint(0x7c, level));
157
+ points.push_back(EncodedValueToPoint(0x84, level));
158
+ TestEncodedS2PointVector(points, CodingHint::COMPACT, 10 + kBlockSize / 2);
159
+ }
160
+
161
+ TEST(EncodedS2PointVectorTest, ExtraDeltaBitsNeeded) {
162
+ // Like the above, but tests the following case:
163
+ //
164
+ // Example 3: d_min = 0x08, d_max = 0x104. The range is 0xfc, so we should
165
+ // be able to use 8-bit deltas. But even with a 4-bit overlap, we can still
166
+ // only encode offset = 0 and a maximum value of 0xff. (We don't allow
167
+ // bigger overlaps because statistically they are not worthwhile.) Instead
168
+ // we increase the delta size to 12 bits, which handles this case easily.
169
+ //
170
+ // Encoding: header (2 bytes), block count (1 byte), block lengths (2 bytes)
171
+ // Block 0: header (1 byte), 8 deltas (8 bytes)
172
+ // Block 1: header (1 byte), 4 deltas (6 bytes)
173
+ const int level = 3;
174
+ vector<S2Point> points(kBlockSize, EncodedValueToPoint(0, level));
175
+ points.push_back(EncodedValueToPoint(0x08, level));
176
+ points.push_back(EncodedValueToPoint(0x4e, level));
177
+ points.push_back(EncodedValueToPoint(0x82, level));
178
+ points.push_back(EncodedValueToPoint(0x104, level));
179
+ TestEncodedS2PointVector(points, CodingHint::COMPACT, 13 + kBlockSize / 2);
180
+ }
181
+
182
+ TEST(EncodedS2PointVectorTest, ExtraDeltaBitsAndOverlapNeeded) {
183
+ // Like the above, but tests the following case:
184
+ //
185
+ // Example 4: d_min = 0xf08, d_max = 0x1004. The range is 0xfc, so we
186
+ // should be able to use 8-bit deltas. With 8-bit deltas and no overlap, we
187
+ // have offset = 0xf00 and a maximum encodable value of 0xfff. With 8-bit
188
+ // deltas and a 4-bit overlap, we still have offset = 0xf00 and a maximum
189
+ // encodable value of 0xfff. Even with 12-bit deltas, we have offset = 0
190
+ // and we can still only represent 0xfff. However with delta_bits = 12 and
191
+ // overlap_bits = 4, we can represent offset = 0xf00 and a maximum encodable
192
+ // value of 0xf00 + 0xfff = 0x1eff.
193
+ //
194
+ // Encoding: header (2 bytes), block count (1 byte), block lengths (2 bytes)
195
+ // Block 0: header (1 byte), 8 deltas (8 bytes)
196
+ // Block 1: header (1 byte), offset (1 byte), 4 deltas (6 bytes)
197
+ const int level = 5;
198
+ vector<S2Point> points(kBlockSize, EncodedValueToPoint(0, level));
199
+ points.push_back(EncodedValueToPoint(0xf08, level));
200
+ points.push_back(EncodedValueToPoint(0xf4e, level));
201
+ points.push_back(EncodedValueToPoint(0xf82, level));
202
+ points.push_back(EncodedValueToPoint(0x1004, level));
203
+ TestEncodedS2PointVector(points, CodingHint::COMPACT, 14 + kBlockSize / 2);
204
+ }
205
+
206
+ TEST(EncodedS2PointVectorTest, SixtyFourBitOffset) {
207
+ // Tests a case where a 64-bit block offset is needed.
208
+ //
209
+ // Encoding: header (2 bytes), block count (1 byte), block lengths (2 bytes)
210
+ // Block 0: header (1 byte), 8 deltas (8 bytes)
211
+ // Block 1: header (1 byte), offset (8 bytes), 2 deltas (1 byte)
212
+ const int level = S2CellId::kMaxLevel;
213
+ vector<S2Point> points(kBlockSize, S2CellId::Begin(level).ToPoint());
214
+ points.push_back(S2CellId::End(level).prev().ToPoint());
215
+ points.push_back(S2CellId::End(level).prev().prev().ToPoint());
216
+ TestEncodedS2PointVector(points, CodingHint::COMPACT, 16 + kBlockSize / 2);
217
+ }
218
+
219
+ TEST(EncodedS2PointVectorTest, AllExceptionsBlock) {
220
+ // The encoding consists of two blocks; the first contains 16 encodable
221
+ // values, while the second contains two exceptions.
222
+ vector<S2Point> points(kBlockSize,
223
+ EncodedValueToPoint(0, S2CellId::kMaxLevel));
224
+ points.push_back(S2Point(0.1, 0.2, 0.3).Normalize());
225
+ points.push_back(S2Point(0.3, 0.2, 0.1).Normalize());
226
+ // Encoding: header (2 bytes), block count (1 byte), block lengths (2 bytes).
227
+ // 1st block header (1 byte), 16 deltas (16 bytes).
228
+ // 2nd block header (1 byte), 2 deltas (1 byte), 2 exceptions (48 bytes).
229
+ TestEncodedS2PointVector(points, CodingHint::COMPACT, 72);
230
+
231
+ // Encoding: header (2 bytes), 18 S2Points (432 bytes).
232
+ TestEncodedS2PointVector(points, CodingHint::FAST, 434);
233
+ }
234
+
235
+ TEST(EncodedS2PointVectorTest, FirstAtAllLevels) {
236
+ // Test encoding the first S2CellId at each level (which also happens to have
237
+ // the maximum face, si, and ti values). All such S2CellIds can be encoded in
238
+ // 6 bytes because most of the bits are zero.
239
+ for (int level = 0; level <= S2CellId::kMaxLevel; ++level) {
240
+ SCOPED_TRACE(absl::StrCat("Level = ", level));
241
+ TestEncodedS2PointVector({S2CellId::Begin(level).ToPoint()},
242
+ CodingHint::COMPACT, 6);
243
+ }
244
+ }
245
+
246
+ TEST(EncodedS2PointVectorTest, LastAtAllLevels) {
247
+ // Test encoding the last S2CellId at each level. It turns out that such
248
+ // S2CellIds have the largest possible face and ti values, and the minimum
249
+ // possible si value at that level. Such S2CellIds can be encoded in 6 to 13
250
+ // bytes depending on the level.
251
+ for (int level = 0; level <= S2CellId::kMaxLevel; ++level) {
252
+ SCOPED_TRACE(absl::StrCat("Level = ", level));
253
+ // Note that 8 bit deltas are used to encode blocks of size 1, which
254
+ // reduces the size of "base" from ((level + 2) / 4) to (level / 4) bytes.
255
+ int expected_size = 6 + level / 4;
256
+ TestEncodedS2PointVector({S2CellId::End(level).prev().ToPoint()},
257
+ CodingHint::COMPACT, expected_size);
258
+ }
259
+ }
260
+
261
+ TEST(EncodedS2PointVectorTest, MaxFaceSiTiAtAllLevels) {
262
+ // Similar to the test above, but tests encoding the S2CellId at each level
263
+ // whose face, si, and ti values are all maximal. This turns out to be the
264
+ // S2CellId whose human-readable form is 5/222...22 (0xb555555555555555),
265
+ // however for clarity we consruct it using S2CellId::FromFaceIJ.
266
+ for (int level = 0; level <= S2CellId::kMaxLevel; ++level) {
267
+ SCOPED_TRACE(absl::StrCat("Level = ", level));
268
+ S2CellId id = S2CellId::FromFaceIJ(5, S2::kLimitIJ - 1, S2::kLimitIJ - 1)
269
+ .parent(level);
270
+
271
+ // This encoding is one byte bigger than the previous test at levels 7, 11,
272
+ // 15, 19, 23, and 27. This is because in the previous test, the
273
+ // odd-numbered value bits are all zero (except for the face number), which
274
+ // reduces the number of base bits needed by exactly 1. The encoding size
275
+ // at level==3 is unaffected because for singleton blocks, the lowest 8
276
+ // value bits are encoded in the delta.
277
+ int expected_size = (level < 4) ? 6 : 6 + (level + 1) / 4;
278
+ TestEncodedS2PointVector({id.ToPoint()},
279
+ CodingHint::COMPACT, expected_size);
280
+ }
281
+ }
282
+
283
+ TEST(EncodedS2PointVectorTest, LastTwoPointsAtAllLevels) {
284
+ // Test encoding the last two S2CellIds at each level.
285
+ for (int level = 0; level <= S2CellId::kMaxLevel; ++level) {
286
+ SCOPED_TRACE(absl::StrCat("Level = ", level));
287
+ S2CellId id = S2CellId::End(level).prev();
288
+ // Notice that this costs only 4 bits more than encoding the last S2CellId
289
+ // by itself (see LastAtAllLevels). This is because encoding a block of
290
+ // size 1 uses 8-bit deltas (which reduces the size of "base" by 4 bits),
291
+ // while this test uses two 4-bit deltas.
292
+ int expected_size = 6 + (level + 2) / 4;
293
+ TestEncodedS2PointVector({id.ToPoint(), id.prev().ToPoint()},
294
+ CodingHint::COMPACT, expected_size);
295
+ }
296
+ }
297
+
298
+ TEST(EncodedS2PointVectorTest, ManyDuplicatePointsAtAllLevels) {
299
+ // Test encoding 32 copies of the last S2CellId at each level. This uses
300
+ // between 27 and 38 bytes depending on the level. (Note that the encoding
301
+ // can use less than 1 byte per point in this situation.)
302
+ for (int level = 0; level <= S2CellId::kMaxLevel; ++level) {
303
+ SCOPED_TRACE(absl::StrCat("Level = ", level));
304
+ S2CellId id = S2CellId::End(level).prev();
305
+ // Encoding: header (2 bytes), base ((level + 2) / 4 bytes), block count
306
+ // (1 byte), block lengths (2 bytes), block headers (2 bytes), 32 deltas
307
+ // (16 bytes). At level 30 the encoding size goes up by 1 byte because
308
+ // we can't encode an 8 byte "base" value, so instead this case uses a
309
+ // base of 7 bytes plus a one-byte offset in each of the 2 blocks.
310
+ int expected_size = 23 + (level + 2) / 4;
311
+ if (level == 30) expected_size += 1;
312
+ vector<S2Point> points(32, id.ToPoint());
313
+ TestEncodedS2PointVector(points, CodingHint::COMPACT, expected_size);
314
+ }
315
+ }
316
+
317
+ TEST(EncodedS2PointVectorTest, SnappedFractalLoops) {
318
+ S2Testing::rnd.Reset(FLAGS_s2_random_seed);
319
+ int kMaxPoints = 3 << (google::DEBUG_MODE ? 10 : 14);
320
+ for (int num_points = 3; num_points <= kMaxPoints; num_points *= 4) {
321
+ size_t s2polygon_size = 0, lax_polygon_size = 0;
322
+ for (int i = 0; i < 10; ++i) {
323
+ S2Testing::Fractal fractal;
324
+ fractal.SetLevelForApproxMaxEdges(num_points);
325
+ auto frame = S2Testing::GetRandomFrame();
326
+ auto loop = fractal.MakeLoop(frame, S2Testing::KmToAngle(10));
327
+ std::vector<S2Point> points;
328
+ for (int j = 0; j < loop->num_vertices(); ++j) {
329
+ points.push_back(S2CellId(loop->vertex(j)).ToPoint());
330
+ }
331
+ S2Polygon s2polygon(make_unique<S2Loop>(points));
332
+ Encoder encoder;
333
+ s2polygon.Encode(&encoder);
334
+ s2polygon_size += encoder.length();
335
+ // S2LaxPolygonShape has 2 extra bytes of overhead to encode one loop.
336
+ lax_polygon_size +=
337
+ TestEncodedS2PointVector(points, CodingHint::COMPACT, -1) + 2;
338
+ }
339
+ printf("n=%5d s2=%9" PRIuS " lax=%9" PRIuS "\n",
340
+ num_points, s2polygon_size, lax_polygon_size);
341
+ }
342
+ }
343
+
344
+ } // namespace s2coding
@@ -0,0 +1,181 @@
1
+ // Copyright 2018 Google Inc. All Rights Reserved.
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // http://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS-IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+ //
15
+
16
+ // Author: ericv@google.com (Eric Veach)
17
+
18
+ #include "s2/encoded_s2shape_index.h"
19
+
20
+ #include <memory>
21
+ #include "s2/third_party/absl/memory/memory.h"
22
+ #include "s2/mutable_s2shape_index.h"
23
+
24
+ using absl::make_unique;
25
+ using std::unique_ptr;
26
+ using std::vector;
27
+
28
+ bool EncodedS2ShapeIndex::Iterator::Locate(const S2Point& target) {
29
+ return LocateImpl(target, this);
30
+ }
31
+
32
+ EncodedS2ShapeIndex::CellRelation EncodedS2ShapeIndex::Iterator::Locate(
33
+ S2CellId target) {
34
+ return LocateImpl(target, this);
35
+ }
36
+
37
+ unique_ptr<EncodedS2ShapeIndex::IteratorBase>
38
+ EncodedS2ShapeIndex::Iterator::Clone() const {
39
+ return make_unique<Iterator>(*this);
40
+ }
41
+
42
+ void EncodedS2ShapeIndex::Iterator::Copy(const IteratorBase& other) {
43
+ *this = *down_cast<const Iterator*>(&other);
44
+ }
45
+
46
+ S2Shape* EncodedS2ShapeIndex::GetShape(int id) const {
47
+ // This method is called when a shape has not been decoded yet.
48
+ unique_ptr<S2Shape> shape = (*shape_factory_)[id];
49
+ if (shape) shape->id_ = id;
50
+ S2Shape* expected = kUndecodedShape();
51
+ if (shapes_[id].compare_exchange_strong(expected, shape.get(),
52
+ std::memory_order_relaxed)) {
53
+ return shape.release(); // Ownership has been transferred to shapes_.
54
+ }
55
+ return shapes_[id].load(std::memory_order_relaxed);
56
+ }
57
+
58
+ inline const S2ShapeIndexCell* EncodedS2ShapeIndex::GetCell(int i) const {
59
+ if (cell_decoded(i)) {
60
+ auto cell = cells_[i].load(std::memory_order_acquire);
61
+ if (cell != nullptr) return cell;
62
+ }
63
+ // We decode the cell before acquiring the spinlock in order to minimize the
64
+ // time that the lock is held.
65
+ auto cell = make_unique<S2ShapeIndexCell>();
66
+ Decoder decoder = encoded_cells_.GetDecoder(i);
67
+ if (!cell->Decode(num_shape_ids(), &decoder)) {
68
+ return nullptr;
69
+ }
70
+ SpinLockHolder l(&cells_lock_);
71
+ if (test_and_set_cell_decoded(i)) {
72
+ // This cell has already been decoded.
73
+ return cells_[i].load(std::memory_order_relaxed);
74
+ }
75
+ if (cell_cache_.size() < max_cell_cache_size()) {
76
+ cell_cache_.push_back(i);
77
+ }
78
+ cells_[i].store(cell.get(), std::memory_order_relaxed);
79
+ return cell.release(); // Ownership has been transferred to cells_.
80
+ }
81
+
82
+ const S2ShapeIndexCell* EncodedS2ShapeIndex::Iterator::GetCell() const {
83
+ return index_->GetCell(cell_pos_);
84
+ }
85
+
86
+ EncodedS2ShapeIndex::EncodedS2ShapeIndex() {
87
+ }
88
+
89
+ EncodedS2ShapeIndex::~EncodedS2ShapeIndex() {
90
+ // Although Minimize() does slightly more than required for destruction
91
+ // (i.e., it resets vector elements to their default values), this does not
92
+ // affect benchmark times.
93
+ Minimize();
94
+ }
95
+
96
+ bool EncodedS2ShapeIndex::Init(Decoder* decoder,
97
+ const ShapeFactory& shape_factory) {
98
+ Minimize();
99
+ uint64 max_edges_version;
100
+ if (!decoder->get_varint64(&max_edges_version)) return false;
101
+ int version = max_edges_version & 3;
102
+ if (version != MutableS2ShapeIndex::kCurrentEncodingVersionNumber) {
103
+ return false;
104
+ }
105
+ options_.set_max_edges_per_cell(max_edges_version >> 2);
106
+
107
+ // AtomicShape is a subtype of std::atomic<S2Shape*> that changes the
108
+ // default constructor value to kUndecodedShape(). This saves the effort of
109
+ // initializing all the elements twice.
110
+ shapes_ = std::vector<AtomicShape>(shape_factory.size());
111
+ shape_factory_ = shape_factory.Clone();
112
+ if (!cell_ids_.Init(decoder)) return false;
113
+
114
+ // The cells_ elements are *uninitialized memory*. Instead we have bit
115
+ // vector (cells_decoded_) to indicate which elements of cells_ are valid.
116
+ // This reduces constructor times by more than a factor of 50, since rather
117
+ // than needing to initialize one 64-bit pointer per cell to zero, we only
118
+ // need to initialize one bit per cell to zero.
119
+ //
120
+ // For very large S2ShapeIndexes the internal memset() call to initialize
121
+ // cells_decoded_ still takes about 4 microseconds per million cells, but
122
+ // this seems reasonable relative to other likely costs (I/O, etc).
123
+ //
124
+ // NOTE(ericv): DO NOT use make_unique<> here! make_unique<> allocates memory
125
+ // using "new T[n]()", which initializes all elements of the array. This
126
+ // slows down some benchmarks by over 100x.
127
+ //
128
+ // cells_ = make_unique<std::atomic<S2ShapeIndexCell*>[]>(cell_ids_.size());
129
+ // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
130
+ // NO NO NO
131
+ cells_.reset(new std::atomic<S2ShapeIndexCell*>[cell_ids_.size()]);
132
+ cells_decoded_ = vector<std::atomic<uint64>>((cell_ids_.size() + 63) >> 6);
133
+
134
+ return encoded_cells_.Init(decoder);
135
+ }
136
+
137
+ void EncodedS2ShapeIndex::Minimize() {
138
+ if (cells_ == nullptr) return; // Not initialized yet.
139
+
140
+ for (auto& atomic_shape : shapes_) {
141
+ S2Shape* shape = atomic_shape.load(std::memory_order_relaxed);
142
+ if (shape != kUndecodedShape() && shape != nullptr) {
143
+ atomic_shape.store(kUndecodedShape(), std::memory_order_relaxed);
144
+ delete shape;
145
+ }
146
+ }
147
+ if (cell_cache_.size() < max_cell_cache_size()) {
148
+ // When only a tiny fraction of the cells are decoded, we keep track of
149
+ // those cells in cell_cache_ to avoid the cost of scanning the
150
+ // cells_decoded_ vector. (The cost is only about 1 cycle per 64 cells,
151
+ // but for a huge polygon with 1 million cells that's still 16000 cycles.)
152
+ for (int pos : cell_cache_) {
153
+ cells_decoded_[pos >> 6].store(0, std::memory_order_relaxed);
154
+ delete cells_[pos].load(std::memory_order_relaxed);
155
+ }
156
+ } else {
157
+ // Scan the cells_decoded_ vector looking for cells that must be deleted.
158
+ for (int i = cells_decoded_.size(), base = 0; --i >= 0; base += 64) {
159
+ uint64 bits = cells_decoded_[i].load(std::memory_order_relaxed);
160
+ if (bits == 0) continue;
161
+ do {
162
+ int offset = Bits::FindLSBSetNonZero64(bits);
163
+ delete cells_[(i << 6) + offset].load(std::memory_order_relaxed);
164
+ bits &= bits - 1;
165
+ } while (bits != 0);
166
+ cells_decoded_[i].store(0, std::memory_order_relaxed);
167
+ }
168
+ }
169
+ cell_cache_.clear();
170
+ }
171
+
172
+ size_t EncodedS2ShapeIndex::SpaceUsed() const {
173
+ // TODO(ericv): Add SpaceUsed() method to S2Shape base class,and Include
174
+ // memory owned by the allocated S2Shapes (here and in S2ShapeIndex).
175
+ size_t size = sizeof(*this);
176
+ size += shapes_.capacity() * sizeof(std::atomic<S2Shape*>);
177
+ size += cell_ids_.size() * sizeof(std::atomic<S2ShapeIndexCell*>); // cells_
178
+ size += cells_decoded_.capacity() * sizeof(std::atomic<uint64>);
179
+ size += cell_cache_.capacity() * sizeof(int);
180
+ return size;
181
+ }