@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,164 @@
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_STRING_VECTOR_H_
19
+ #define S2_ENCODED_STRING_VECTOR_H_
20
+
21
+ #include <memory>
22
+ #include <string>
23
+ #include "s2/third_party/absl/strings/string_view.h"
24
+ #include "s2/third_party/absl/types/span.h"
25
+ #include "s2/encoded_uint_vector.h"
26
+
27
+ namespace s2coding {
28
+
29
+ // This class allows an EncodedStringVector to be created by adding strings
30
+ // incrementally. It also supports adding strings that are the output of
31
+ // another Encoder. For example, to create a vector of encoded S2Polygons,
32
+ // you can do this:
33
+ //
34
+ // void EncodePolygons(const vector<S2Polygon*>& polygons, Encoder* encoder) {
35
+ // StringVectorEncoder encoded_polygons;
36
+ // for (auto polygon : polygons) {
37
+ // polygon->Encode(encoded_polygons.AddViaEncoder());
38
+ // }
39
+ // encoded_polygons.Encode(encoder);
40
+ // }
41
+ class StringVectorEncoder {
42
+ public:
43
+ StringVectorEncoder();
44
+
45
+ // Adds a string to the encoded vector.
46
+ void Add(const string& str);
47
+
48
+ // Adds a string to the encoded vector by means of the given Encoder. The
49
+ // string consists of all output added to the encoder before the next call
50
+ // to any method of this class (after which the encoder is no longer valid).
51
+ Encoder* AddViaEncoder();
52
+
53
+ // Appends the EncodedStringVector representation to the given Encoder.
54
+ //
55
+ // REQUIRES: "encoder" uses the default constructor, so that its buffer
56
+ // can be enlarged as necessary by calling Ensure(int).
57
+ void Encode(Encoder* encoder);
58
+
59
+ // Encodes a vector of strings in a format that can later be decoded as an
60
+ // EncodedStringVector.
61
+ //
62
+ // REQUIRES: "encoder" uses the default constructor, so that its buffer
63
+ // can be enlarged as necessary by calling Ensure(int).
64
+ static void Encode(absl::Span<const string> v, Encoder* encoder);
65
+
66
+ private:
67
+ // A vector consisting of the starting offset of each string in the
68
+ // encoder's data buffer, plus a final entry pointing just past the end of
69
+ // the last string.
70
+ std::vector<uint64> offsets_;
71
+ Encoder data_;
72
+ };
73
+
74
+ // This class represents an encoded vector of strings. Values are decoded
75
+ // only when they are accessed. This allows for very fast initialization and
76
+ // no additional memory use beyond the encoded data. The encoded data is not
77
+ // owned by this class; typically it points into a large contiguous buffer
78
+ // that contains other encoded data as well.
79
+ //
80
+ // This is one of several helper classes that allow complex data structures to
81
+ // be initialized from an encoded format in constant time and then decoded on
82
+ // demand. This can be a big performance advantage when only a small part of
83
+ // the data structure is actually used.
84
+ class EncodedStringVector {
85
+ public:
86
+ // Constructs an uninitialized object; requires Init() to be called.
87
+ EncodedStringVector() {}
88
+
89
+ // Initializes the EncodedStringVector. Returns false on errors, leaving
90
+ // the vector in an unspecified state.
91
+ //
92
+ // REQUIRES: The Decoder data buffer must outlive this object.
93
+ bool Init(Decoder* decoder);
94
+
95
+ // Resets the vector to be empty.
96
+ void Clear();
97
+
98
+ // Returns the size of the original vector.
99
+ size_t size() const;
100
+
101
+ // Returns the string at the given index.
102
+ absl::string_view operator[](int i) const;
103
+
104
+ // Returns a Decoder initialized with the string at the given index.
105
+ Decoder GetDecoder(int i) const;
106
+
107
+ // Returns a pointer to the start of the string at the given index. This is
108
+ // faster than operator[] but returns an unbounded string.
109
+ const char* GetStart(int i) const;
110
+
111
+ // Returns the entire vector of original strings. Requires that the
112
+ // data buffer passed to the constructor persists until the result vector is
113
+ // no longer needed.
114
+ std::vector<absl::string_view> Decode() const;
115
+
116
+ private:
117
+ EncodedUintVector<uint64> offsets_;
118
+ const char* data_;
119
+ };
120
+
121
+
122
+ ////////////////// Implementation details follow ////////////////////
123
+
124
+
125
+ inline void StringVectorEncoder::Add(const string& str) {
126
+ offsets_.push_back(data_.length());
127
+ data_.Ensure(str.size());
128
+ data_.putn(str.data(), str.size());
129
+ }
130
+
131
+ inline Encoder* StringVectorEncoder::AddViaEncoder() {
132
+ offsets_.push_back(data_.length());
133
+ return &data_;
134
+ }
135
+
136
+ inline void EncodedStringVector::Clear() {
137
+ offsets_.Clear();
138
+ data_ = nullptr;
139
+ }
140
+
141
+ inline size_t EncodedStringVector::size() const {
142
+ return offsets_.size();
143
+ }
144
+
145
+ inline absl::string_view EncodedStringVector::operator[](int i) const {
146
+ uint64 start = (i == 0) ? 0 : offsets_[i - 1];
147
+ uint64 limit = offsets_[i];
148
+ return absl::string_view(data_ + start, limit - start);
149
+ }
150
+
151
+ inline Decoder EncodedStringVector::GetDecoder(int i) const {
152
+ uint64 start = (i == 0) ? 0 : offsets_[i - 1];
153
+ uint64 limit = offsets_[i];
154
+ return Decoder(data_ + start, limit - start);
155
+ }
156
+
157
+ inline const char* EncodedStringVector::GetStart(int i) const {
158
+ uint64 start = (i == 0) ? 0 : offsets_[i - 1];
159
+ return data_ + start;
160
+ }
161
+
162
+ } // namespace s2coding
163
+
164
+ #endif // S2_ENCODED_STRING_VECTOR_H_
@@ -0,0 +1,69 @@
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_string_vector.h"
19
+
20
+ #include <vector>
21
+ #include <gtest/gtest.h>
22
+ #include "s2/third_party/absl/strings/string_view.h"
23
+
24
+ using absl::string_view;
25
+ using std::vector;
26
+
27
+ namespace s2coding {
28
+
29
+ void TestEncodedStringVector(const vector<string>& input,
30
+ size_t expected_bytes) {
31
+ Encoder encoder;
32
+ StringVectorEncoder::Encode(input, &encoder);
33
+ EXPECT_EQ(expected_bytes, encoder.length());
34
+ Decoder decoder(encoder.base(), encoder.length());
35
+ EncodedStringVector actual;
36
+ ASSERT_TRUE(actual.Init(&decoder));
37
+ vector<string_view> expected;
38
+ for (const auto& str : input) {
39
+ expected.push_back(string_view(str));
40
+ }
41
+ EXPECT_EQ(actual.Decode(), expected);
42
+ }
43
+
44
+ TEST(EncodedStringVectorTest, Empty) {
45
+ TestEncodedStringVector({}, 1);
46
+ }
47
+
48
+ TEST(EncodedStringVectorTest, EmptyString) {
49
+ TestEncodedStringVector({""}, 2);
50
+ }
51
+
52
+ TEST(EncodedStringVectorTest, RepeatedEmptyStrings) {
53
+ TestEncodedStringVector({"", "", ""}, 4);
54
+ }
55
+
56
+ TEST(EncodedStringVectorTest, OneString) {
57
+ TestEncodedStringVector({"apples"}, 8);
58
+ }
59
+
60
+ TEST(EncodedStringVectorTest, TwoStrings) {
61
+ TestEncodedStringVector({"fuji", "mutsu"}, 12);
62
+ }
63
+
64
+ TEST(EncodedStringVectorTest, TwoBigStrings) {
65
+ TestEncodedStringVector({string(10000, 'x'), string(100000, 'y')},
66
+ 110007);
67
+ }
68
+
69
+ } // namespace s2coding
@@ -0,0 +1,299 @@
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_UINT_VECTOR_H_
19
+ #define S2_ENCODED_UINT_VECTOR_H_
20
+
21
+ #include <type_traits>
22
+ #include <vector>
23
+ #include "s2/third_party/absl/base/internal/unaligned_access.h"
24
+ #include "s2/third_party/absl/types/span.h"
25
+ #include "s2/util/coding/coder.h"
26
+
27
+ namespace s2coding {
28
+
29
+ // Encodes a vector of unsigned integers in a format that can later be
30
+ // decoded as an EncodedUintVector.
31
+ //
32
+ // REQUIRES: T is an unsigned integer type.
33
+ // REQUIRES: 2 <= sizeof(T) <= 8
34
+ // REQUIRES: "encoder" uses the default constructor, so that its buffer
35
+ // can be enlarged as necessary by calling Ensure(int).
36
+ template <class T>
37
+ void EncodeUintVector(absl::Span<const T> v, Encoder* encoder);
38
+
39
+ // This class represents an encoded vector of unsigned integers of type T.
40
+ // Values are decoded only when they are accessed. This allows for very fast
41
+ // initialization and no additional memory use beyond the encoded data.
42
+ // The encoded data is not owned by this class; typically it points into a
43
+ // large contiguous buffer that contains other encoded data as well.
44
+ //
45
+ // This is one of several helper classes that allow complex data structures to
46
+ // be initialized from an encoded format in constant time and then decoded on
47
+ // demand. This can be a big performance advantage when only a small part of
48
+ // the data structure is actually used.
49
+ //
50
+ // Values are encoded using a fixed number of bytes per value, where the
51
+ // number of bytes depends on the largest value present.
52
+ //
53
+ // REQUIRES: T is an unsigned integer type.
54
+ // REQUIRES: 2 <= sizeof(T) <= 8
55
+ template <class T>
56
+ class EncodedUintVector {
57
+ public:
58
+ static_assert(std::is_unsigned<T>::value, "Unsupported signed integer");
59
+ static_assert(sizeof(T) & 0xe, "Unsupported integer length");
60
+
61
+ // Constructs an uninitialized object; requires Init() to be called.
62
+ EncodedUintVector() {}
63
+
64
+ // Initializes the EncodedUintVector. Returns false on errors, leaving the
65
+ // vector in an unspecified state.
66
+ //
67
+ // REQUIRES: The Decoder data buffer must outlive this object.
68
+ bool Init(Decoder* decoder);
69
+
70
+ // Resets the vector to be empty.
71
+ void Clear();
72
+
73
+ // Returns the size of the original vector.
74
+ size_t size() const;
75
+
76
+ // Returns the element at the given index.
77
+ T operator[](int i) const;
78
+
79
+ // Returns the index of the first element x such that (x >= target), or
80
+ // size() if no such element exists.
81
+ //
82
+ // REQUIRES: The vector elements are sorted in non-decreasing order.
83
+ size_t lower_bound(T target) const;
84
+
85
+ // Decodes and returns the entire original vector.
86
+ std::vector<T> Decode() const;
87
+
88
+ private:
89
+ template <int length> size_t lower_bound(T target) const;
90
+
91
+ const char* data_;
92
+ uint32 size_;
93
+ uint8 len_;
94
+ };
95
+
96
+ // Encodes an unsigned integer in little-endian format using "length" bytes.
97
+ // (The client must ensure that the encoder's buffer is large enough.)
98
+ //
99
+ // REQUIRES: T is an unsigned integer type.
100
+ // REQUIRES: 2 <= sizeof(T) <= 8
101
+ // REQUIRES: 0 <= length <= sizeof(T)
102
+ // REQUIRES: value < 256 ** length
103
+ // REQUIRES: encoder->avail() >= length
104
+ template <class T>
105
+ void EncodeUintWithLength(T value, int length, Encoder* encoder);
106
+
107
+ // Decodes a variable-length integer consisting of "length" bytes starting at
108
+ // "ptr" in little-endian format.
109
+ //
110
+ // REQUIRES: T is an unsigned integer type.
111
+ // REQUIRES: 2 <= sizeof(T) <= 8
112
+ // REQUIRES: 0 <= length <= sizeof(T)
113
+ template <class T>
114
+ T GetUintWithLength(const void* ptr, int length);
115
+
116
+ // Decodes and consumes a variable-length integer consisting of "length" bytes
117
+ // in little-endian format. Returns false if not enough bytes are available.
118
+ //
119
+ // REQUIRES: T is an unsigned integer type.
120
+ // REQUIRES: 2 <= sizeof(T) <= 8
121
+ // REQUIRES: 0 <= length <= sizeof(T)
122
+ template <class T>
123
+ bool DecodeUintWithLength(int length, Decoder* decoder, T* result);
124
+
125
+
126
+ ////////////////// Implementation details follow ////////////////////
127
+
128
+
129
+ template <class T>
130
+ inline void EncodeUintWithLength(T value, int length, Encoder* encoder) {
131
+ static_assert(std::is_unsigned<T>::value, "Unsupported signed integer");
132
+ static_assert(sizeof(T) & 0xe, "Unsupported integer length");
133
+ S2_DCHECK(length >= 0 && length <= sizeof(T));
134
+ S2_DCHECK_GE(encoder->avail(), length);
135
+
136
+ while (--length >= 0) {
137
+ encoder->put8(value);
138
+ value >>= 8;
139
+ }
140
+ S2_DCHECK_EQ(value, 0);
141
+ }
142
+
143
+ template <class T>
144
+ inline T GetUintWithLength(const char* ptr, int length) {
145
+ static_assert(std::is_unsigned<T>::value, "Unsupported signed integer");
146
+ static_assert(sizeof(T) & 0xe, "Unsupported integer length");
147
+ S2_DCHECK(length >= 0 && length <= sizeof(T));
148
+
149
+ // Note that the following code is faster than any of the following:
150
+ //
151
+ // - A loop that repeatedly loads and shifts one byte.
152
+ // - memcpying "length" bytes to a local variable of type T.
153
+ // - A switch statement that handles each length optimally.
154
+ //
155
+ // The following code is slightly faster:
156
+ //
157
+ // T mask = (length == 0) ? 0 : ~T{0} >> 8 * (sizeof(T) - length);
158
+ // return *reinterpret_cast<const T*>(ptr) & mask;
159
+ //
160
+ // However this technique is unsafe because in extremely rare cases it might
161
+ // access out-of-bounds heap memory. (This can only happen if "ptr" is
162
+ // within (sizeof(T) - length) bytes of the end of a memory page and the
163
+ // following page in the address space is unmapped.)
164
+
165
+ if (length & sizeof(T)) {
166
+ if (sizeof(T) == 8) return ABSL_INTERNAL_UNALIGNED_LOAD64(ptr);
167
+ if (sizeof(T) == 4) return ABSL_INTERNAL_UNALIGNED_LOAD32(ptr);
168
+ if (sizeof(T) == 2) return ABSL_INTERNAL_UNALIGNED_LOAD16(ptr);
169
+ S2_DCHECK_EQ(sizeof(T), 1);
170
+ return *ptr;
171
+ }
172
+ T x = 0;
173
+ ptr += length;
174
+ if (sizeof(T) > 4 && (length & 4)) {
175
+ x = ABSL_INTERNAL_UNALIGNED_LOAD32(ptr -= sizeof(uint32));
176
+ }
177
+ if (sizeof(T) > 2 && (length & 2)) {
178
+ x = (x << 16) + ABSL_INTERNAL_UNALIGNED_LOAD16(ptr -= sizeof(uint16));
179
+ }
180
+ if (sizeof(T) > 1 && (length & 1)) {
181
+ x = (x << 8) + static_cast<uint8>(*--ptr);
182
+ }
183
+ return x;
184
+ }
185
+
186
+ template <class T>
187
+ bool DecodeUintWithLength(int length, Decoder* decoder, T* result) {
188
+ if (decoder->avail() < length) return false;
189
+ const char* ptr = reinterpret_cast<const char*>(decoder->ptr());
190
+ *result = GetUintWithLength<T>(ptr, length);
191
+ decoder->skip(length);
192
+ return true;
193
+ }
194
+
195
+ template <class T>
196
+ void EncodeUintVector(absl::Span<const T> v, Encoder* encoder) {
197
+ // The encoding is as follows:
198
+ //
199
+ // varint64: (v.size() * sizeof(T)) | (len - 1)
200
+ // array of v.size() elements ["len" bytes each]
201
+ //
202
+ // Note that we don't allow (len == 0) since this would require an extra bit
203
+ // to encode the length.
204
+
205
+ T one_bits = 1; // Ensures len >= 1.
206
+ for (auto x : v) one_bits |= x;
207
+ int len = (Bits::FindMSBSetNonZero64(one_bits) >> 3) + 1;
208
+ S2_DCHECK(len >= 1 && len <= 8);
209
+
210
+ // Note that the multiplication is optimized into a bit shift.
211
+ encoder->Ensure(Varint::kMax64 + v.size() * len);
212
+ uint64 size_len = (uint64{v.size()} * sizeof(T)) | (len - 1);
213
+ encoder->put_varint64(size_len);
214
+ for (auto x : v) {
215
+ EncodeUintWithLength(x, len, encoder);
216
+ }
217
+ }
218
+
219
+ template <class T>
220
+ bool EncodedUintVector<T>::Init(Decoder* decoder) {
221
+ uint64 size_len;
222
+ if (!decoder->get_varint64(&size_len)) return false;
223
+ size_ = size_len / sizeof(T); // Optimized into bit shift.
224
+ len_ = (size_len & (sizeof(T) - 1)) + 1;
225
+ if (size_ > std::numeric_limits<size_t>::max() / sizeof(T)) return false;
226
+ size_t bytes = size_ * len_;
227
+ if (decoder->avail() < bytes) return false;
228
+ data_ = reinterpret_cast<const char*>(decoder->ptr());
229
+ decoder->skip(bytes);
230
+ return true;
231
+ }
232
+
233
+ template <class T>
234
+ void EncodedUintVector<T>::Clear() {
235
+ size_ = 0;
236
+ data_ = nullptr;
237
+ }
238
+
239
+ template <class T>
240
+ inline size_t EncodedUintVector<T>::size() const {
241
+ return size_;
242
+ }
243
+
244
+ template <class T>
245
+ inline T EncodedUintVector<T>::operator[](int i) const {
246
+ S2_DCHECK(i >= 0 && i < size_);
247
+ return GetUintWithLength<T>(data_ + i * len_, len_);
248
+ }
249
+
250
+ template <class T>
251
+ size_t EncodedUintVector<T>::lower_bound(T target) const {
252
+ static_assert(sizeof(T) & 0xe, "Unsupported integer length");
253
+ S2_DCHECK(len_ >= 1 && len_ <= sizeof(T));
254
+
255
+ // TODO(ericv): Consider using the unused 28 bits of "len_" to store the
256
+ // last result of lower_bound() to be used as a hint. This should help in
257
+ // common situation where the same element is looked up repeatedly. This
258
+ // would require declaring the new field (length_lower_bound_hint_) as
259
+ // mutable std::atomic<uint32> (accessed using std::memory_order_relaxed)
260
+ // with a custom copy constructor that resets the hint component to zero.
261
+ switch (len_) {
262
+ case 1: return lower_bound<1>(target);
263
+ case 2: return lower_bound<2>(target);
264
+ case 3: return lower_bound<3>(target);
265
+ case 4: return lower_bound<4>(target);
266
+ case 5: return lower_bound<5>(target);
267
+ case 6: return lower_bound<6>(target);
268
+ case 7: return lower_bound<7>(target);
269
+ default: return lower_bound<8>(target);
270
+ }
271
+ }
272
+
273
+ template <class T> template <int length>
274
+ inline size_t EncodedUintVector<T>::lower_bound(T target) const {
275
+ size_t lo = 0, hi = size_;
276
+ while (lo < hi) {
277
+ size_t mid = (lo + hi) >> 1;
278
+ T value = GetUintWithLength<T>(data_ + mid * length, length);
279
+ if (value < target) {
280
+ lo = mid + 1;
281
+ } else {
282
+ hi = mid;
283
+ }
284
+ }
285
+ return lo;
286
+ }
287
+
288
+ template <class T>
289
+ std::vector<T> EncodedUintVector<T>::Decode() const {
290
+ std::vector<T> result(size_);
291
+ for (int i = 0; i < size_; ++i) {
292
+ result[i] = (*this)[i];
293
+ }
294
+ return result;
295
+ }
296
+
297
+ } // namespace s2coding
298
+
299
+ #endif // S2_ENCODED_UINT_VECTOR_H_
@@ -0,0 +1,124 @@
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_uint_vector.h"
19
+
20
+ #include <vector>
21
+ #include <gtest/gtest.h>
22
+
23
+ using std::vector;
24
+
25
+ namespace s2coding {
26
+
27
+ static_assert(sizeof(EncodedUintVector<uint64>) == 16, "too big");
28
+
29
+ template <class T>
30
+ void TestEncodedUintVector(const vector<T>& expected, size_t expected_bytes) {
31
+ Encoder encoder;
32
+ EncodeUintVector<T>(expected, &encoder);
33
+ EXPECT_EQ(expected_bytes, encoder.length());
34
+ Decoder decoder(encoder.base(), encoder.length());
35
+ EncodedUintVector<T> actual;
36
+ ASSERT_TRUE(actual.Init(&decoder));
37
+ EXPECT_EQ(actual.Decode(), expected);
38
+ }
39
+
40
+ TEST(EncodedUintVectorTest, Empty) {
41
+ TestEncodedUintVector(vector<uint32>{}, 1);
42
+ }
43
+
44
+ TEST(EncodedUintVectorTest, Zero) {
45
+ TestEncodedUintVector(vector<uint64>{0}, 2);
46
+ }
47
+
48
+ TEST(EncodedUintVectorTest, RepeatedZeros) {
49
+ TestEncodedUintVector(vector<uint16>{0, 0, 0}, 4);
50
+ }
51
+
52
+ TEST(EncodedUintVectorTest, MaxInt) {
53
+ TestEncodedUintVector(vector<uint64>{~0ULL}, 9);
54
+ }
55
+
56
+ TEST(EncodedUintVectorTest, OneByte) {
57
+ TestEncodedUintVector(vector<uint64>{0, 255, 1, 254}, 5);
58
+ }
59
+
60
+ TEST(EncodedUintVectorTest, TwoBytes) {
61
+ TestEncodedUintVector(vector<uint64>{0, 255, 256, 254}, 9);
62
+ }
63
+
64
+ TEST(EncodedUintVectorTest, ThreeBytes) {
65
+ TestEncodedUintVector(vector<uint64>{0xffffff, 0x0102, 0, 0x050403}, 13);
66
+ }
67
+
68
+ TEST(EncodedUintVectorTest, EightBytes) {
69
+ TestEncodedUintVector(vector<uint64>{~0ULL, 0, 0x0102030405060708}, 25);
70
+ }
71
+
72
+ template <class T>
73
+ vector<T> MakeSortedTestVector(int bytes_per_value, int num_values) {
74
+ S2_DCHECK_LE(bytes_per_value, sizeof(T));
75
+ T limit_value = ~T{0} >> (8 * (sizeof(T) - bytes_per_value));
76
+ vector<T> values;
77
+ for (int i = 0; i + 1 < num_values; ++i) {
78
+ values.push_back(limit_value * (static_cast<double>(i) / (num_values - 1)));
79
+ }
80
+ // The last value needs special handling since casting it to "double" loses
81
+ // precision when T == uint64.
82
+ values.push_back(limit_value);
83
+ S2_CHECK(std::is_sorted(values.begin(), values.end()));
84
+ return values;
85
+ }
86
+
87
+ template <class T>
88
+ EncodedUintVector<T> MakeEncodedVector(const vector<T>& values,
89
+ Encoder* encoder) {
90
+ EncodeUintVector<T>(values, encoder);
91
+ Decoder decoder(encoder->base(), encoder->length());
92
+ EncodedUintVector<T> actual;
93
+ S2_CHECK(actual.Init(&decoder));
94
+ return actual;
95
+ }
96
+
97
+ template <class T>
98
+ void TestLowerBound(int bytes_per_value, int num_values) {
99
+ auto v = MakeSortedTestVector<T>(bytes_per_value, num_values);
100
+ Encoder encoder;
101
+ auto actual = MakeEncodedVector(v, &encoder);
102
+ for (T x : v) {
103
+ EXPECT_EQ(std::lower_bound(v.begin(), v.end(), x) - v.begin(),
104
+ actual.lower_bound(x));
105
+ if (x > 0) {
106
+ EXPECT_EQ(std::lower_bound(v.begin(), v.end(), x - 1) - v.begin(),
107
+ actual.lower_bound(x - 1));
108
+ }
109
+ }
110
+ }
111
+
112
+ TEST(EncodedUintVector, LowerBound) {
113
+ for (int bytes_per_value = 8; bytes_per_value <= 8; ++bytes_per_value) {
114
+ TestLowerBound<uint64>(bytes_per_value, 10);
115
+ if (bytes_per_value <= 4) {
116
+ TestLowerBound<uint32>(bytes_per_value, 500);
117
+ if (bytes_per_value <= 2) {
118
+ TestLowerBound<uint16>(bytes_per_value, 100);
119
+ }
120
+ }
121
+ }
122
+ }
123
+
124
+ } // namespace s2coding