@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,299 @@
1
+ // Copyright 2017 The Abseil Authors.
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
+ // This header file contains C++11 versions of standard <utility> header
16
+ // abstractions available within C++14 and C++17, and are designed to be drop-in
17
+ // replacement for code compliant with C++14 and C++17.
18
+ //
19
+ // The following abstractions are defined:
20
+ //
21
+ // * integer_sequence<T, Ints...> == std::integer_sequence<T, Ints...>
22
+ // * index_sequence<Ints...> == std::index_sequence<Ints...>
23
+ // * make_integer_sequence<T, N> == std::make_integer_sequence<T, N>
24
+ // * make_index_sequence<N> == std::make_index_sequence<N>
25
+ // * index_sequence_for<Ts...> == std::index_sequence_for<Ts...>
26
+ // * apply<Functor, Tuple> == std::apply<Functor, Tuple>
27
+ // * exchange<T> == std::exchange<T>
28
+ //
29
+ // This header file also provides the tag types `in_place_t`, `in_place_type_t`,
30
+ // and `in_place_index_t`, as well as the constant `in_place`, and
31
+ // `constexpr` `std::move()` and `std::forward()` implementations in C++11.
32
+ //
33
+ // References:
34
+ //
35
+ // http://en.cppreference.com/w/cpp/utility/integer_sequence
36
+ // http://en.cppreference.com/w/cpp/utility/apply
37
+ // http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3658.html
38
+ //
39
+
40
+ #ifndef S2_THIRD_PARTY_ABSL_UTILITY_UTILITY_H_
41
+ #define S2_THIRD_PARTY_ABSL_UTILITY_UTILITY_H_
42
+
43
+ #include <cstddef>
44
+ #include <cstdlib>
45
+ #include <tuple>
46
+ #include <utility>
47
+
48
+ #include "s2/third_party/absl/base/config.h"
49
+ #include "s2/third_party/absl/base/internal/inline_variable.h"
50
+ #include "s2/third_party/absl/base/internal/invoke.h"
51
+ #include "s2/third_party/absl/meta/type_traits.h"
52
+
53
+ namespace absl {
54
+
55
+ // integer_sequence
56
+ //
57
+ // Class template representing a compile-time integer sequence. An instantiation
58
+ // of `integer_sequence<T, Ints...>` has a sequence of integers encoded in its
59
+ // type through its template arguments (which is a common need when
60
+ // working with C++11 variadic templates). `absl::integer_sequence` is designed
61
+ // to be a drop-in replacement for C++14's `std::integer_sequence`.
62
+ //
63
+ // Example:
64
+ //
65
+ // template< class T, T... Ints >
66
+ // void user_function(integer_sequence<T, Ints...>);
67
+ //
68
+ // int main()
69
+ // {
70
+ // // user_function's `T` will be deduced to `int` and `Ints...`
71
+ // // will be deduced to `0, 1, 2, 3, 4`.
72
+ // user_function(make_integer_sequence<int, 5>());
73
+ // }
74
+ template <typename T, T... Ints>
75
+ struct integer_sequence {
76
+ using value_type = T;
77
+ static constexpr size_t size() noexcept { return sizeof...(Ints); }
78
+ };
79
+
80
+ // index_sequence
81
+ //
82
+ // A helper template for an `integer_sequence` of `size_t`,
83
+ // `absl::index_sequence` is designed to be a drop-in replacement for C++14's
84
+ // `std::index_sequence`.
85
+ template <size_t... Ints>
86
+ using index_sequence = integer_sequence<size_t, Ints...>;
87
+
88
+ namespace utility_internal {
89
+
90
+ template <typename Seq, size_t SeqSize, size_t Rem>
91
+ struct Extend;
92
+
93
+ // Note that SeqSize == sizeof...(Ints). It's passed explicitly for efficiency.
94
+ template <typename T, T... Ints, size_t SeqSize>
95
+ struct Extend<integer_sequence<T, Ints...>, SeqSize, 0> {
96
+ using type = integer_sequence<T, Ints..., (Ints + SeqSize)...>;
97
+ };
98
+
99
+ template <typename T, T... Ints, size_t SeqSize>
100
+ struct Extend<integer_sequence<T, Ints...>, SeqSize, 1> {
101
+ using type = integer_sequence<T, Ints..., (Ints + SeqSize)..., 2 * SeqSize>;
102
+ };
103
+
104
+ // Recursion helper for 'make_integer_sequence<T, N>'.
105
+ // 'Gen<T, N>::type' is an alias for 'integer_sequence<T, 0, 1, ... N-1>'.
106
+ template <typename T, size_t N>
107
+ struct Gen {
108
+ using type =
109
+ typename Extend<typename Gen<T, N / 2>::type, N / 2, N % 2>::type;
110
+ };
111
+
112
+ template <typename T>
113
+ struct Gen<T, 0> {
114
+ using type = integer_sequence<T>;
115
+ };
116
+
117
+ } // namespace utility_internal
118
+
119
+ // Compile-time sequences of integers
120
+
121
+ // make_integer_sequence
122
+ //
123
+ // This template alias is equivalent to
124
+ // `integer_sequence<int, 0, 1, ..., N-1>`, and is designed to be a drop-in
125
+ // replacement for C++14's `std::make_integer_sequence`.
126
+ template <typename T, T N>
127
+ using make_integer_sequence = typename utility_internal::Gen<T, N>::type;
128
+
129
+ // make_index_sequence
130
+ //
131
+ // This template alias is equivalent to `index_sequence<0, 1, ..., N-1>`,
132
+ // and is designed to be a drop-in replacement for C++14's
133
+ // `std::make_index_sequence`.
134
+ template <size_t N>
135
+ using make_index_sequence = make_integer_sequence<size_t, N>;
136
+
137
+ // index_sequence_for
138
+ //
139
+ // Converts a typename pack into an index sequence of the same length, and
140
+ // is designed to be a drop-in replacement for C++14's
141
+ // `std::index_sequence_for()`
142
+ template <typename... Ts>
143
+ using index_sequence_for = make_index_sequence<sizeof...(Ts)>;
144
+
145
+ // Tag types
146
+
147
+ #ifdef ABSL_HAVE_STD_OPTIONAL
148
+
149
+ using std::in_place_t;
150
+ using std::in_place;
151
+
152
+ #else // ABSL_HAVE_STD_OPTIONAL
153
+
154
+ // in_place_t
155
+ //
156
+ // Tag type used to specify in-place construction, such as with
157
+ // `absl::optional`, designed to be a drop-in replacement for C++17's
158
+ // `std::in_place_t`.
159
+ struct in_place_t {};
160
+
161
+ ABSL_INTERNAL_INLINE_CONSTEXPR(in_place_t, in_place, {});
162
+
163
+ #endif // ABSL_HAVE_STD_OPTIONAL
164
+
165
+ #if defined(ABSL_HAVE_STD_ANY) || defined(ABSL_HAVE_STD_VARIANT)
166
+ using std::in_place_type_t;
167
+ #else
168
+
169
+ // in_place_type_t
170
+ //
171
+ // Tag type used for in-place construction when the type to construct needs to
172
+ // be specified, such as with `absl::any`, designed to be a drop-in replacement
173
+ // for C++17's `std::in_place_type_t`.
174
+ template <typename T>
175
+ struct in_place_type_t {};
176
+ #endif // ABSL_HAVE_STD_ANY || ABSL_HAVE_STD_VARIANT
177
+
178
+ #ifdef ABSL_HAVE_STD_VARIANT
179
+ using std::in_place_index_t;
180
+ #else
181
+
182
+ // in_place_index_t
183
+ //
184
+ // Tag type used for in-place construction when the type to construct needs to
185
+ // be specified, such as with `absl::any`, designed to be a drop-in replacement
186
+ // for C++17's `std::in_place_index_t`.
187
+ template <size_t I>
188
+ struct in_place_index_t {};
189
+ #endif // ABSL_HAVE_STD_VARIANT
190
+
191
+ // Constexpr move and forward
192
+
193
+ // move()
194
+ //
195
+ // A constexpr version of `std::move()`, designed to be a drop-in replacement
196
+ // for C++14's `std::move()`.
197
+ template <typename T>
198
+ constexpr absl::remove_reference_t<T>&& move(T&& t) noexcept {
199
+ return static_cast<absl::remove_reference_t<T>&&>(t);
200
+ }
201
+
202
+ // forward()
203
+ //
204
+ // A constexpr version of `std::forward()`, designed to be a drop-in replacement
205
+ // for C++14's `std::forward()`.
206
+ template <typename T>
207
+ constexpr T&& forward(
208
+ absl::remove_reference_t<T>& t) noexcept { // NOLINT(runtime/references)
209
+ return static_cast<T&&>(t);
210
+ }
211
+
212
+ namespace utility_internal {
213
+ // Helper method for expanding tuple into a called method.
214
+ template <typename Functor, typename Tuple, std::size_t... Indexes>
215
+ auto apply_helper(Functor&& functor, Tuple&& t, index_sequence<Indexes...>)
216
+ -> decltype(absl::base_internal::Invoke(
217
+ absl::forward<Functor>(functor),
218
+ std::get<Indexes>(absl::forward<Tuple>(t))...)) {
219
+ return absl::base_internal::Invoke(
220
+ absl::forward<Functor>(functor),
221
+ std::get<Indexes>(absl::forward<Tuple>(t))...);
222
+ }
223
+
224
+ } // namespace utility_internal
225
+
226
+ // apply
227
+ //
228
+ // Invokes a Callable using elements of a tuple as its arguments.
229
+ // Each element of the tuple corresponds to an argument of the call (in order).
230
+ // Both the Callable argument and the tuple argument are perfect-forwarded.
231
+ // For member-function Callables, the first tuple element acts as the `this`
232
+ // pointer. `absl::apply` is designed to be a drop-in replacement for C++17's
233
+ // `std::apply`. Unlike C++17's `std::apply`, this is not currently `constexpr`.
234
+ //
235
+ // Example:
236
+ //
237
+ // class Foo {
238
+ // public:
239
+ // void Bar(int);
240
+ // };
241
+ // void user_function1(int, string);
242
+ // void user_function2(std::unique_ptr<Foo>);
243
+ // auto user_lambda = [](int, int) {};
244
+ //
245
+ // int main()
246
+ // {
247
+ // std::tuple<int, string> tuple1(42, "bar");
248
+ // // Invokes the first user function on int, string.
249
+ // absl::apply(&user_function1, tuple1);
250
+ //
251
+ // std::tuple<std::unique_ptr<Foo>> tuple2(absl::make_unique<Foo>());
252
+ // // Invokes the user function that takes ownership of the unique
253
+ // // pointer.
254
+ // absl::apply(&user_function2, std::move(tuple2));
255
+ //
256
+ // auto foo = absl::make_unique<Foo>();
257
+ // std::tuple<Foo*, int> tuple3(foo.get(), 42);
258
+ // // Invokes the method Bar on foo with one argument, 42.
259
+ // absl::apply(&Foo::Bar, tuple3);
260
+ //
261
+ // std::tuple<int, int> tuple4(8, 9);
262
+ // // Invokes a lambda.
263
+ // absl::apply(user_lambda, tuple4);
264
+ // }
265
+ template <typename Functor, typename Tuple>
266
+ auto apply(Functor&& functor, Tuple&& t)
267
+ -> decltype(utility_internal::apply_helper(
268
+ absl::forward<Functor>(functor), absl::forward<Tuple>(t),
269
+ absl::make_index_sequence<std::tuple_size<
270
+ typename std::remove_reference<Tuple>::type>::value>{})) {
271
+ return utility_internal::apply_helper(
272
+ absl::forward<Functor>(functor), absl::forward<Tuple>(t),
273
+ absl::make_index_sequence<std::tuple_size<
274
+ typename std::remove_reference<Tuple>::type>::value>{});
275
+ }
276
+
277
+ // exchange
278
+ //
279
+ // Replaces the value of `obj` with `new_value` and returns the old value of
280
+ // `obj`. `absl::exchange` is designed to be a drop-in replacement for C++14's
281
+ // `std::exchange`.
282
+ //
283
+ // Example:
284
+ //
285
+ // Foo& operator=(Foo&& other) {
286
+ // ptr1_ = absl::exchange(other.ptr1_, nullptr);
287
+ // int1_ = absl::exchange(other.int1_, -1);
288
+ // return *this;
289
+ // }
290
+ template <typename T, typename U = T>
291
+ T exchange(T& obj, U&& new_value) {
292
+ T old_value = absl::move(obj);
293
+ obj = absl::forward<U>(new_value);
294
+ return old_value;
295
+ }
296
+
297
+ } // namespace absl
298
+
299
+ #endif // S2_THIRD_PARTY_ABSL_UTILITY_UTILITY_H_
@@ -0,0 +1,274 @@
1
+ // Copyright 2009 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: jyrki@google.com (Jyrki Alakuijala)
17
+ //
18
+ // Performance notes:
19
+ // 2009-01-16: hendrie@google.com microbenchmarked InterleaveUint32 against
20
+ // two table-free implementations from "Hacker's Delight" section 7-2.
21
+ // This implementation was substantially faster: 8 ns vs 17 ns, even
22
+ // without subtracting the time taken in the test harness itself.
23
+ // Test environment: workstation w/ 2.4 GHz Core 2 Duo, compiler target
24
+ // gcc-4.3.1-glibc-2.3.6-grte-k8.
25
+ // TODO(user): Inlining InterleaveUint32 yields a measurable speedup (5
26
+ // ns vs. 8 ns). Consider cost/benefit of moving implementations inline.
27
+
28
+ #include "s2/util/bits/bit-interleave.h"
29
+
30
+ #include "s2/base/integral_types.h"
31
+
32
+ namespace util_bits {
33
+
34
+ static const uint16 kInterleaveLut[256] = {
35
+ 0x0000, 0x0001, 0x0004, 0x0005, 0x0010, 0x0011, 0x0014, 0x0015,
36
+ 0x0040, 0x0041, 0x0044, 0x0045, 0x0050, 0x0051, 0x0054, 0x0055,
37
+ 0x0100, 0x0101, 0x0104, 0x0105, 0x0110, 0x0111, 0x0114, 0x0115,
38
+ 0x0140, 0x0141, 0x0144, 0x0145, 0x0150, 0x0151, 0x0154, 0x0155,
39
+ 0x0400, 0x0401, 0x0404, 0x0405, 0x0410, 0x0411, 0x0414, 0x0415,
40
+ 0x0440, 0x0441, 0x0444, 0x0445, 0x0450, 0x0451, 0x0454, 0x0455,
41
+ 0x0500, 0x0501, 0x0504, 0x0505, 0x0510, 0x0511, 0x0514, 0x0515,
42
+ 0x0540, 0x0541, 0x0544, 0x0545, 0x0550, 0x0551, 0x0554, 0x0555,
43
+
44
+ 0x1000, 0x1001, 0x1004, 0x1005, 0x1010, 0x1011, 0x1014, 0x1015,
45
+ 0x1040, 0x1041, 0x1044, 0x1045, 0x1050, 0x1051, 0x1054, 0x1055,
46
+ 0x1100, 0x1101, 0x1104, 0x1105, 0x1110, 0x1111, 0x1114, 0x1115,
47
+ 0x1140, 0x1141, 0x1144, 0x1145, 0x1150, 0x1151, 0x1154, 0x1155,
48
+ 0x1400, 0x1401, 0x1404, 0x1405, 0x1410, 0x1411, 0x1414, 0x1415,
49
+ 0x1440, 0x1441, 0x1444, 0x1445, 0x1450, 0x1451, 0x1454, 0x1455,
50
+ 0x1500, 0x1501, 0x1504, 0x1505, 0x1510, 0x1511, 0x1514, 0x1515,
51
+ 0x1540, 0x1541, 0x1544, 0x1545, 0x1550, 0x1551, 0x1554, 0x1555,
52
+
53
+ 0x4000, 0x4001, 0x4004, 0x4005, 0x4010, 0x4011, 0x4014, 0x4015,
54
+ 0x4040, 0x4041, 0x4044, 0x4045, 0x4050, 0x4051, 0x4054, 0x4055,
55
+ 0x4100, 0x4101, 0x4104, 0x4105, 0x4110, 0x4111, 0x4114, 0x4115,
56
+ 0x4140, 0x4141, 0x4144, 0x4145, 0x4150, 0x4151, 0x4154, 0x4155,
57
+ 0x4400, 0x4401, 0x4404, 0x4405, 0x4410, 0x4411, 0x4414, 0x4415,
58
+ 0x4440, 0x4441, 0x4444, 0x4445, 0x4450, 0x4451, 0x4454, 0x4455,
59
+ 0x4500, 0x4501, 0x4504, 0x4505, 0x4510, 0x4511, 0x4514, 0x4515,
60
+ 0x4540, 0x4541, 0x4544, 0x4545, 0x4550, 0x4551, 0x4554, 0x4555,
61
+
62
+ 0x5000, 0x5001, 0x5004, 0x5005, 0x5010, 0x5011, 0x5014, 0x5015,
63
+ 0x5040, 0x5041, 0x5044, 0x5045, 0x5050, 0x5051, 0x5054, 0x5055,
64
+ 0x5100, 0x5101, 0x5104, 0x5105, 0x5110, 0x5111, 0x5114, 0x5115,
65
+ 0x5140, 0x5141, 0x5144, 0x5145, 0x5150, 0x5151, 0x5154, 0x5155,
66
+ 0x5400, 0x5401, 0x5404, 0x5405, 0x5410, 0x5411, 0x5414, 0x5415,
67
+ 0x5440, 0x5441, 0x5444, 0x5445, 0x5450, 0x5451, 0x5454, 0x5455,
68
+ 0x5500, 0x5501, 0x5504, 0x5505, 0x5510, 0x5511, 0x5514, 0x5515,
69
+ 0x5540, 0x5541, 0x5544, 0x5545, 0x5550, 0x5551, 0x5554, 0x5555,
70
+ };
71
+
72
+ uint16 InterleaveUint8(const uint8 val0, const uint8 val1) {
73
+ return kInterleaveLut[val0] | (kInterleaveLut[val1] << 1);
74
+ }
75
+
76
+ uint32 InterleaveUint16(const uint16 val0, const uint16 val1) {
77
+ return kInterleaveLut[val0 & 0xff] |
78
+ (kInterleaveLut[val0 >> 8] << 16) |
79
+ (kInterleaveLut[val1 & 0xff] << 1) |
80
+ (kInterleaveLut[val1 >> 8] << 17);
81
+ }
82
+
83
+ uint64 InterleaveUint32(const uint32 val0, const uint32 val1) {
84
+ return
85
+ (static_cast<uint64>(kInterleaveLut[val0 & 0xff])) |
86
+ (static_cast<uint64>(kInterleaveLut[(val0 >> 8) & 0xff]) << 16) |
87
+ (static_cast<uint64>(kInterleaveLut[(val0 >> 16) & 0xff]) << 32) |
88
+ (static_cast<uint64>(kInterleaveLut[val0 >> 24]) << 48) |
89
+ (static_cast<uint64>(kInterleaveLut[val1 & 0xff]) << 1) |
90
+ (static_cast<uint64>(kInterleaveLut[(val1 >> 8) & 0xff]) << 17) |
91
+ (static_cast<uint64>(kInterleaveLut[(val1 >> 16) & 0xff]) << 33) |
92
+ (static_cast<uint64>(kInterleaveLut[val1 >> 24]) << 49);
93
+ }
94
+
95
+ // The lookup table below can convert a sequence of interleaved 8 bits into
96
+ // non-interleaved 4 bits. The table can convert both odd and even bits at the
97
+ // same time, and lut[x & 0x55] converts the even bits (bits 0, 2, 4 and 6),
98
+ // while lut[x & 0xaa] converts the odd bits (bits 1, 3, 5 and 7).
99
+ //
100
+ // The lookup table below was generated using the following python code:
101
+ //
102
+ // def deinterleave(bits):
103
+ // if bits == 0: return 0
104
+ // if bits < 4: return 1
105
+ // return deinterleave(bits / 4) * 2 + deinterleave(bits & 3)
106
+ //
107
+ // for i in range(256): print "0x%x," % deinterleave(i),
108
+ //
109
+ static const uint8 kDeinterleaveLut[256] = {
110
+ 0x0, 0x1, 0x1, 0x1, 0x2, 0x3, 0x3, 0x3,
111
+ 0x2, 0x3, 0x3, 0x3, 0x2, 0x3, 0x3, 0x3,
112
+ 0x4, 0x5, 0x5, 0x5, 0x6, 0x7, 0x7, 0x7,
113
+ 0x6, 0x7, 0x7, 0x7, 0x6, 0x7, 0x7, 0x7,
114
+ 0x4, 0x5, 0x5, 0x5, 0x6, 0x7, 0x7, 0x7,
115
+ 0x6, 0x7, 0x7, 0x7, 0x6, 0x7, 0x7, 0x7,
116
+ 0x4, 0x5, 0x5, 0x5, 0x6, 0x7, 0x7, 0x7,
117
+ 0x6, 0x7, 0x7, 0x7, 0x6, 0x7, 0x7, 0x7,
118
+
119
+ 0x8, 0x9, 0x9, 0x9, 0xa, 0xb, 0xb, 0xb,
120
+ 0xa, 0xb, 0xb, 0xb, 0xa, 0xb, 0xb, 0xb,
121
+ 0xc, 0xd, 0xd, 0xd, 0xe, 0xf, 0xf, 0xf,
122
+ 0xe, 0xf, 0xf, 0xf, 0xe, 0xf, 0xf, 0xf,
123
+ 0xc, 0xd, 0xd, 0xd, 0xe, 0xf, 0xf, 0xf,
124
+ 0xe, 0xf, 0xf, 0xf, 0xe, 0xf, 0xf, 0xf,
125
+ 0xc, 0xd, 0xd, 0xd, 0xe, 0xf, 0xf, 0xf,
126
+ 0xe, 0xf, 0xf, 0xf, 0xe, 0xf, 0xf, 0xf,
127
+
128
+ 0x8, 0x9, 0x9, 0x9, 0xa, 0xb, 0xb, 0xb,
129
+ 0xa, 0xb, 0xb, 0xb, 0xa, 0xb, 0xb, 0xb,
130
+ 0xc, 0xd, 0xd, 0xd, 0xe, 0xf, 0xf, 0xf,
131
+ 0xe, 0xf, 0xf, 0xf, 0xe, 0xf, 0xf, 0xf,
132
+ 0xc, 0xd, 0xd, 0xd, 0xe, 0xf, 0xf, 0xf,
133
+ 0xe, 0xf, 0xf, 0xf, 0xe, 0xf, 0xf, 0xf,
134
+ 0xc, 0xd, 0xd, 0xd, 0xe, 0xf, 0xf, 0xf,
135
+ 0xe, 0xf, 0xf, 0xf, 0xe, 0xf, 0xf, 0xf,
136
+
137
+ 0x8, 0x9, 0x9, 0x9, 0xa, 0xb, 0xb, 0xb,
138
+ 0xa, 0xb, 0xb, 0xb, 0xa, 0xb, 0xb, 0xb,
139
+ 0xc, 0xd, 0xd, 0xd, 0xe, 0xf, 0xf, 0xf,
140
+ 0xe, 0xf, 0xf, 0xf, 0xe, 0xf, 0xf, 0xf,
141
+ 0xc, 0xd, 0xd, 0xd, 0xe, 0xf, 0xf, 0xf,
142
+ 0xe, 0xf, 0xf, 0xf, 0xe, 0xf, 0xf, 0xf,
143
+ 0xc, 0xd, 0xd, 0xd, 0xe, 0xf, 0xf, 0xf,
144
+ 0xe, 0xf, 0xf, 0xf, 0xe, 0xf, 0xf, 0xf,
145
+ };
146
+
147
+ void DeinterleaveUint8(uint16 val, uint8 *val0, uint8 *val1) {
148
+ *val0 = ((kDeinterleaveLut[val & 0x55]) |
149
+ (kDeinterleaveLut[(val >> 8) & 0x55] << 4));
150
+ *val1 = ((kDeinterleaveLut[val & 0xaa]) |
151
+ (kDeinterleaveLut[(val >> 8) & 0xaa] << 4));
152
+ }
153
+
154
+ void DeinterleaveUint16(uint32 code, uint16 *val0, uint16 *val1) {
155
+ *val0 = ((kDeinterleaveLut[code & 0x55]) |
156
+ (kDeinterleaveLut[(code >> 8) & 0x55] << 4) |
157
+ (kDeinterleaveLut[(code >> 16) & 0x55] << 8) |
158
+ (kDeinterleaveLut[(code >> 24) & 0x55] << 12));
159
+ *val1 = ((kDeinterleaveLut[code & 0xaa]) |
160
+ (kDeinterleaveLut[(code >> 8) & 0xaa] << 4) |
161
+ (kDeinterleaveLut[(code >> 16) & 0xaa] << 8) |
162
+ (kDeinterleaveLut[(code >> 24) & 0xaa] << 12));
163
+ }
164
+
165
+ void DeinterleaveUint32(uint64 code, uint32 *val0, uint32 *val1) {
166
+ *val0 = ((kDeinterleaveLut[code & 0x55]) |
167
+ (kDeinterleaveLut[(code >> 8) & 0x55] << 4) |
168
+ (kDeinterleaveLut[(code >> 16) & 0x55] << 8) |
169
+ (kDeinterleaveLut[(code >> 24) & 0x55] << 12) |
170
+ (kDeinterleaveLut[(code >> 32) & 0x55] << 16) |
171
+ (kDeinterleaveLut[(code >> 40) & 0x55] << 20) |
172
+ (kDeinterleaveLut[(code >> 48) & 0x55] << 24) |
173
+ (kDeinterleaveLut[(code >> 56) & 0x55] << 28));
174
+ *val1 = ((kDeinterleaveLut[code & 0xaa]) |
175
+ (kDeinterleaveLut[(code >> 8) & 0xaa] << 4) |
176
+ (kDeinterleaveLut[(code >> 16) & 0xaa] << 8) |
177
+ (kDeinterleaveLut[(code >> 24) & 0xaa] << 12) |
178
+ (kDeinterleaveLut[(code >> 32) & 0xaa] << 16) |
179
+ (kDeinterleaveLut[(code >> 40) & 0xaa] << 20) |
180
+ (kDeinterleaveLut[(code >> 48) & 0xaa] << 24) |
181
+ (kDeinterleaveLut[(code >> 56) & 0xaa] << 28));
182
+ }
183
+
184
+ // Derivation of the multiplication based interleave algorithm:
185
+ // 1. Original value, bit positions shown:
186
+ // x = --------------------------------------------------------87654321
187
+ // 2. Replicate the byte and select the bits we want:
188
+ // * 0b0000000100000001000000010000000100000001000000010000000100000001
189
+ // 0x 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1
190
+ // => 8765432187654321876543218765432187654321876543218765432187654321
191
+ // & 0b0000000000000000000000001100000000001100000000000011000000000011
192
+ // 0x 0 0 0 0 0 0 C 0 0 C 0 0 3 0 0 3
193
+ // => ------------------------87----------43------------65----------21
194
+ // 3. Use multiplication to perform additions at different offsets:
195
+ // * 0b0000000000000000000000000000000000000000010100000000000000000101
196
+ // 0x 0 0 0 0 0 0 0 0 0 0 5 0 0 0 0 5
197
+ // =>
198
+ // ------------------------87----------43------------65----------21
199
+ // + ----------------------87----------43------------65----------21
200
+ // + ----87----------43------------65----------21
201
+ // + --87----------43------------65----------21
202
+ // => --8787--------4343----8787--6565--4343--2121----6565--------2121
203
+ // 4. Notice the bits never collide. Select the bits we want.
204
+ // & 0b0000000000000000000000100100100100100100100100000000000000000000
205
+ // 0x 0 0 0 0 0 2 4 9 2 4 9 0 0 0 0 0
206
+ // => ----------------------8--7--6--5--4--3--2--1--------------------
207
+ // 5. To produce the final result, we bitwise OR the 3 split integers and shift
208
+ // back to the LSB. To save instructions, we use template<N> to have steps
209
+ // 3 and 4 produce results shifted over N bits.
210
+ // Benchmark Time(ns) CPU(ns) Iterations
211
+ // -------------------------------------------------------------
212
+ // BM_3_InterleaveUint8 5 5 141967960
213
+ // BM_3_ReferenceBitInterleave3 58 58 10000000
214
+ // BM_3_InterleaveUint8_NoTemplate 11 11 61082024
215
+ template<int kShift>
216
+ static uint64 SplitFor3(uint8 x) {
217
+ return
218
+ ((((x * 0x0101010101010101ULL)
219
+ & 0x000000C00C003003ULL)
220
+ * (0x0000000000500005ULL << kShift))
221
+ & (0x0000024924900000ULL << kShift));
222
+ }
223
+
224
+ uint32 InterleaveUint8(uint8 val0, uint8 val1, uint8 val2) {
225
+ return static_cast<uint32>(
226
+ (SplitFor3<0>(val0) | SplitFor3<1>(val1) | SplitFor3<2>(val2)) >> 20);
227
+ }
228
+
229
+ // Multiplication based de-interleave algorithm:
230
+ // 1. Original value, bit positions shown:
231
+ // --------xx8xx7xx6xx5xx4xx3xx2xx1
232
+ // & 0x 0 0 2 4 9 2 4 9
233
+ // => ----------8--7--6--5--4--3--2--1
234
+ // 2. Use multiplication to perform additions at different offsets:
235
+ // * 0b00000000000000000000000000010101
236
+ // 0x 0 0 0 0 0 0 1 5
237
+ // =>
238
+ // ----------8--7--6--5--4--3--2--1
239
+ // + --------8--7--6--5--4--3--2--1
240
+ // + ------8--7--6--5--4--3--2--1
241
+ // => ------8-8787676565454343232121-1
242
+ // 3. Select the bits we need
243
+ // & 0b00000000001110000001110000001100
244
+ // 0x 0 0 3 8 1 C 0 C
245
+ // => ----------876------543------21--
246
+ // 4. Multiply again to make the additions we need
247
+ // * 0b00000000000000000001000001000001
248
+ // 0x 0 0 0 0 1 0 4 1
249
+ // =>
250
+ // ----------876------543------21--
251
+ // + ----876------543------21--
252
+ // + 6------543------21--
253
+ // => ----------87654321--------------
254
+ // 5. Shift down so it lives at the lower 8 bits.
255
+ // Benchmark Time(ns) CPU(ns) Iterations
256
+ // ----------------------------------------------------------------
257
+ // BM_3_DeinterleaveUint8 8 8 88136788
258
+ // BM_3_DeinterleaveUint8_Using_Template 10 10 67385445
259
+ // BM_3_DeinterleaveUint8_Uint64_Param 10 10 70838731
260
+ // BM_3_ReferenceDeinterleaveUint8 79 79 8712211
261
+ static inline uint8 UnsplitFor3(uint32 x) {
262
+ return ((((x & 0x00249249U)
263
+ * 0x00000015U)
264
+ & 0x00381C0CU)
265
+ * 0x00001041U) >> 14;
266
+ }
267
+
268
+ void DeinterleaveUint8(uint32 x, uint8* a, uint8* b, uint8* c) {
269
+ *a = UnsplitFor3(x);
270
+ *b = UnsplitFor3(x >> 1);
271
+ *c = UnsplitFor3(x >> 2);
272
+ }
273
+
274
+ } // namespace util_bits
@@ -0,0 +1,53 @@
1
+ // Copyright 2009 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: jyrki@google.com (Jyrki Alakuijala)
17
+ //
18
+ // Interleaving bits quickly by table lookup.
19
+
20
+ #ifndef S2_UTIL_BITS_BIT_INTERLEAVE_H_
21
+ #define S2_UTIL_BITS_BIT_INTERLEAVE_H_
22
+
23
+ #include "s2/base/integral_types.h"
24
+
25
+ namespace util_bits {
26
+
27
+ // These functions interleave the given arguments into the return value.
28
+ //
29
+ // The 0-bit in val0 will be the 0-bit in the return value.
30
+ // The 0-bit in val1 will be the 1-bit in the return value.
31
+ // The 1-bit of val0 will be the 2-bit in the return value, and so on.
32
+ uint16 InterleaveUint8(uint8 val0, uint8 val1);
33
+ uint32 InterleaveUint16(uint16 val0, uint16 val1);
34
+ uint64 InterleaveUint32(uint32 val0, uint32 val1);
35
+
36
+ // These functions will decode the interleaved values.
37
+ void DeinterleaveUint8(uint16 code, uint8 *val0, uint8 *val1);
38
+ void DeinterleaveUint16(uint32 code, uint16 *val0, uint16 *val1);
39
+ void DeinterleaveUint32(uint64 code, uint32 *val0, uint32 *val1);
40
+
41
+ // These functions interleave three arguments into the return value.
42
+ // The 0-bit in val0 will be the 0-bit in the return value.
43
+ // The 0-bit in val1 will be the 1-bit in the return value.
44
+ // The 0-bit in val2 will be the 2-bit in the return value.
45
+ // The 1-bit of val0 will be the 3-bit in the return value, and so on.
46
+ uint32 InterleaveUint8(uint8 val0, uint8 val1, uint8 val2);
47
+
48
+ // These functions will decode the interleaved values.
49
+ void DeinterleaveUint8(uint32 code, uint8 *val0, uint8* val1, uint8* val2);
50
+
51
+ } // namespace util_bits
52
+
53
+ #endif // S2_UTIL_BITS_BIT_INTERLEAVE_H_