@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,129 @@
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
+ #include <cstdlib>
16
+ #include <cstring>
17
+
18
+ #include "s2/third_party/absl/base/dynamic_annotations.h"
19
+
20
+ #ifndef __has_feature
21
+ #define __has_feature(x) 0
22
+ #endif
23
+
24
+ /* Compiler-based ThreadSanitizer defines
25
+ DYNAMIC_ANNOTATIONS_EXTERNAL_IMPL = 1
26
+ and provides its own definitions of the functions. */
27
+
28
+ #ifndef DYNAMIC_ANNOTATIONS_EXTERNAL_IMPL
29
+ # define DYNAMIC_ANNOTATIONS_EXTERNAL_IMPL 0
30
+ #endif
31
+
32
+ /* Each function is empty and called (via a macro) only in debug mode.
33
+ The arguments are captured by dynamic tools at runtime. */
34
+
35
+ #if DYNAMIC_ANNOTATIONS_EXTERNAL_IMPL == 0 && !defined(__native_client__)
36
+
37
+ #if __has_feature(memory_sanitizer)
38
+ #include <sanitizer/msan_interface.h>
39
+ #endif
40
+
41
+ #ifdef __cplusplus
42
+ extern "C" {
43
+ #endif
44
+
45
+ void AnnotateRWLockCreate(const char *, int,
46
+ const volatile void *){}
47
+ void AnnotateRWLockDestroy(const char *, int,
48
+ const volatile void *){}
49
+ void AnnotateRWLockAcquired(const char *, int,
50
+ const volatile void *, long){}
51
+ void AnnotateRWLockReleased(const char *, int,
52
+ const volatile void *, long){}
53
+ void AnnotateBenignRace(const char *, int,
54
+ const volatile void *,
55
+ const char *){}
56
+ void AnnotateBenignRaceSized(const char *, int,
57
+ const volatile void *,
58
+ size_t,
59
+ const char *) {}
60
+ void AnnotateThreadName(const char *, int,
61
+ const char *){}
62
+ void AnnotateIgnoreReadsBegin(const char *, int){}
63
+ void AnnotateIgnoreReadsEnd(const char *, int){}
64
+ void AnnotateIgnoreWritesBegin(const char *, int){}
65
+ void AnnotateIgnoreWritesEnd(const char *, int){}
66
+ void AnnotateEnableRaceDetection(const char *, int, int){}
67
+ void AnnotateMemoryIsInitialized(const char *, int,
68
+ const volatile void *mem, size_t size) {
69
+ #if __has_feature(memory_sanitizer)
70
+ __msan_unpoison(mem, size);
71
+ #else
72
+ (void)mem;
73
+ (void)size;
74
+ #endif
75
+ }
76
+
77
+ void AnnotateMemoryIsUninitialized(const char *, int,
78
+ const volatile void *mem, size_t size) {
79
+ #if __has_feature(memory_sanitizer)
80
+ __msan_allocated_memory(mem, size);
81
+ #else
82
+ (void)mem;
83
+ (void)size;
84
+ #endif
85
+ }
86
+
87
+ static int GetRunningOnValgrind(void) {
88
+ #ifdef RUNNING_ON_VALGRIND
89
+ if (RUNNING_ON_VALGRIND) return 1;
90
+ #endif
91
+ char *running_on_valgrind_str = getenv("RUNNING_ON_VALGRIND");
92
+ if (running_on_valgrind_str) {
93
+ return strcmp(running_on_valgrind_str, "0") != 0;
94
+ }
95
+ return 0;
96
+ }
97
+
98
+ /* See the comments in dynamic_annotations.h */
99
+ int RunningOnValgrind(void) {
100
+ static volatile int running_on_valgrind = -1;
101
+ int local_running_on_valgrind = running_on_valgrind;
102
+ /* C doesn't have thread-safe initialization of statics, and we
103
+ don't want to depend on pthread_once here, so hack it. */
104
+ ANNOTATE_BENIGN_RACE(&running_on_valgrind, "safe hack");
105
+ if (local_running_on_valgrind == -1)
106
+ running_on_valgrind = local_running_on_valgrind = GetRunningOnValgrind();
107
+ return local_running_on_valgrind;
108
+ }
109
+
110
+ /* See the comments in dynamic_annotations.h */
111
+ double ValgrindSlowdown(void) {
112
+ /* Same initialization hack as in RunningOnValgrind(). */
113
+ static volatile double slowdown = 0.0;
114
+ double local_slowdown = slowdown;
115
+ ANNOTATE_BENIGN_RACE(&slowdown, "safe hack");
116
+ if (RunningOnValgrind() == 0) {
117
+ return 1.0;
118
+ }
119
+ if (local_slowdown == 0.0) {
120
+ char *env = getenv("VALGRIND_SLOWDOWN");
121
+ slowdown = local_slowdown = env ? atof(env) : 50.0;
122
+ }
123
+ return local_slowdown;
124
+ }
125
+
126
+ #ifdef __cplusplus
127
+ } // extern "C"
128
+ #endif
129
+ #endif /* DYNAMIC_ANNOTATIONS_EXTERNAL_IMPL == 0 */
@@ -0,0 +1,394 @@
1
+ /*
2
+ * Copyright 2017 The Abseil Authors.
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+ /* This file defines dynamic annotations for use with dynamic analysis
17
+ tool such as valgrind, PIN, etc.
18
+
19
+ Dynamic annotation is a source code annotation that affects
20
+ the generated code (that is, the annotation is not a comment).
21
+ Each such annotation is attached to a particular
22
+ instruction and/or to a particular object (address) in the program.
23
+
24
+ The annotations that should be used by users are macros in all upper-case
25
+ (e.g., ANNOTATE_THREAD_NAME).
26
+
27
+ Actual implementation of these macros may differ depending on the
28
+ dynamic analysis tool being used.
29
+
30
+ This file supports the following configurations:
31
+ - Dynamic Annotations enabled (with static thread-safety warnings disabled).
32
+ In this case, macros expand to functions implemented by Thread Sanitizer,
33
+ when building with TSan. When not provided an external implementation,
34
+ dynamic_annotations.cc provides no-op implementations.
35
+
36
+ - Static Clang thread-safety warnings enabled.
37
+ When building with a Clang compiler that supports thread-safety warnings,
38
+ a subset of annotations can be statically-checked at compile-time. We
39
+ expand these macros to static-inline functions that can be analyzed for
40
+ thread-safety, but afterwards elided when building the final binary.
41
+
42
+ - All annotations are disabled.
43
+ If neither Dynamic Annotations nor Clang thread-safety warnings are
44
+ enabled, then all annotation-macros expand to empty. */
45
+
46
+ #ifndef S2_THIRD_PARTY_ABSL_BASE_DYNAMIC_ANNOTATIONS_H_
47
+ #define S2_THIRD_PARTY_ABSL_BASE_DYNAMIC_ANNOTATIONS_H_
48
+
49
+ #ifndef DYNAMIC_ANNOTATIONS_ENABLED
50
+ # define DYNAMIC_ANNOTATIONS_ENABLED 0
51
+ #endif
52
+
53
+ #if DYNAMIC_ANNOTATIONS_ENABLED != 0
54
+
55
+ /* -------------------------------------------------------------
56
+ Annotations that suppress errors. It is usually better to express the
57
+ program's synchronization using the other annotations, but these can
58
+ be used when all else fails. */
59
+
60
+ /* Report that we may have a benign race at "pointer", with size
61
+ "sizeof(*(pointer))". "pointer" must be a non-void* pointer. Insert at the
62
+ point where "pointer" has been allocated, preferably close to the point
63
+ where the race happens. See also ANNOTATE_BENIGN_RACE_STATIC. */
64
+ #define ANNOTATE_BENIGN_RACE(pointer, description) \
65
+ AnnotateBenignRaceSized(__FILE__, __LINE__, pointer, \
66
+ sizeof(*(pointer)), description)
67
+
68
+ /* Same as ANNOTATE_BENIGN_RACE(address, description), but applies to
69
+ the memory range [address, address+size). */
70
+ #define ANNOTATE_BENIGN_RACE_SIZED(address, size, description) \
71
+ AnnotateBenignRaceSized(__FILE__, __LINE__, address, size, description)
72
+
73
+ /* Enable (enable!=0) or disable (enable==0) race detection for all threads.
74
+ This annotation could be useful if you want to skip expensive race analysis
75
+ during some period of program execution, e.g. during initialization. */
76
+ #define ANNOTATE_ENABLE_RACE_DETECTION(enable) \
77
+ AnnotateEnableRaceDetection(__FILE__, __LINE__, enable)
78
+
79
+ /* -------------------------------------------------------------
80
+ Annotations useful for debugging. */
81
+
82
+ /* Report the current thread name to a race detector. */
83
+ #define ANNOTATE_THREAD_NAME(name) \
84
+ AnnotateThreadName(__FILE__, __LINE__, name)
85
+
86
+ /* -------------------------------------------------------------
87
+ Annotations useful when implementing locks. They are not
88
+ normally needed by modules that merely use locks.
89
+ The "lock" argument is a pointer to the lock object. */
90
+
91
+ /* Report that a lock has been created at address "lock". */
92
+ #define ANNOTATE_RWLOCK_CREATE(lock) \
93
+ AnnotateRWLockCreate(__FILE__, __LINE__, lock)
94
+
95
+ /* Report that a linker initialized lock has been created at address "lock".
96
+ */
97
+ #ifdef THREAD_SANITIZER
98
+ #define ANNOTATE_RWLOCK_CREATE_STATIC(lock) \
99
+ AnnotateRWLockCreateStatic(__FILE__, __LINE__, lock)
100
+ #else
101
+ #define ANNOTATE_RWLOCK_CREATE_STATIC(lock) ANNOTATE_RWLOCK_CREATE(lock)
102
+ #endif
103
+
104
+ /* Report that the lock at address "lock" is about to be destroyed. */
105
+ #define ANNOTATE_RWLOCK_DESTROY(lock) \
106
+ AnnotateRWLockDestroy(__FILE__, __LINE__, lock)
107
+
108
+ /* Report that the lock at address "lock" has been acquired.
109
+ is_w=1 for writer lock, is_w=0 for reader lock. */
110
+ #define ANNOTATE_RWLOCK_ACQUIRED(lock, is_w) \
111
+ AnnotateRWLockAcquired(__FILE__, __LINE__, lock, is_w)
112
+
113
+ /* Report that the lock at address "lock" is about to be released. */
114
+ #define ANNOTATE_RWLOCK_RELEASED(lock, is_w) \
115
+ AnnotateRWLockReleased(__FILE__, __LINE__, lock, is_w)
116
+
117
+ #else /* DYNAMIC_ANNOTATIONS_ENABLED == 0 */
118
+
119
+ #define ANNOTATE_RWLOCK_CREATE(lock) /* empty */
120
+ #define ANNOTATE_RWLOCK_CREATE_STATIC(lock) /* empty */
121
+ #define ANNOTATE_RWLOCK_DESTROY(lock) /* empty */
122
+ #define ANNOTATE_RWLOCK_ACQUIRED(lock, is_w) /* empty */
123
+ #define ANNOTATE_RWLOCK_RELEASED(lock, is_w) /* empty */
124
+ #define ANNOTATE_BENIGN_RACE(address, description) /* empty */
125
+ #define ANNOTATE_BENIGN_RACE_SIZED(address, size, description) /* empty */
126
+ #define ANNOTATE_THREAD_NAME(name) /* empty */
127
+ #define ANNOTATE_ENABLE_RACE_DETECTION(enable) /* empty */
128
+
129
+ #endif /* DYNAMIC_ANNOTATIONS_ENABLED */
130
+
131
+ /* These annotations are also made available to LLVM's Memory Sanitizer */
132
+ #if DYNAMIC_ANNOTATIONS_ENABLED == 1 || defined(MEMORY_SANITIZER)
133
+ #define ANNOTATE_MEMORY_IS_INITIALIZED(address, size) \
134
+ AnnotateMemoryIsInitialized(__FILE__, __LINE__, address, size)
135
+
136
+ #define ANNOTATE_MEMORY_IS_UNINITIALIZED(address, size) \
137
+ AnnotateMemoryIsUninitialized(__FILE__, __LINE__, address, size)
138
+ #else
139
+ #define ANNOTATE_MEMORY_IS_INITIALIZED(address, size) /* empty */
140
+ #define ANNOTATE_MEMORY_IS_UNINITIALIZED(address, size) /* empty */
141
+ #endif /* DYNAMIC_ANNOTATIONS_ENABLED || MEMORY_SANITIZER */
142
+
143
+ #ifdef SWIG
144
+ #define ATTRIBUTE_IGNORE_READS_BEGIN /* empty */
145
+ #define ATTRIBUTE_IGNORE_READS_END /* empty */
146
+ #else // SWIG
147
+ /* TODO(user) -- Replace __CLANG_SUPPORT_DYN_ANNOTATION__ with the
148
+ appropriate feature ID. */
149
+ #if defined(__clang__) && (!defined(SWIG)) \
150
+ && defined(__CLANG_SUPPORT_DYN_ANNOTATION__)
151
+
152
+ #if DYNAMIC_ANNOTATIONS_ENABLED == 0
153
+ #define ANNOTALYSIS_ENABLED
154
+ #endif
155
+
156
+ /* When running in opt-mode, GCC will issue a warning, if these attributes are
157
+ compiled. Only include them when compiling using Clang. */
158
+ #define ATTRIBUTE_IGNORE_READS_BEGIN \
159
+ __attribute((exclusive_lock_function("*")))
160
+ #define ATTRIBUTE_IGNORE_READS_END \
161
+ __attribute((unlock_function("*")))
162
+ #else
163
+ #define ATTRIBUTE_IGNORE_READS_BEGIN /* empty */
164
+ #define ATTRIBUTE_IGNORE_READS_END /* empty */
165
+ #endif /* defined(__clang__) && ... */
166
+ #endif
167
+
168
+ #if (DYNAMIC_ANNOTATIONS_ENABLED != 0) || defined(ANNOTALYSIS_ENABLED)
169
+ #define ANNOTATIONS_ENABLED
170
+ #endif
171
+
172
+ #if (DYNAMIC_ANNOTATIONS_ENABLED != 0)
173
+
174
+ /* Request the analysis tool to ignore all reads in the current thread
175
+ until ANNOTATE_IGNORE_READS_END is called.
176
+ Useful to ignore intentional racey reads, while still checking
177
+ other reads and all writes.
178
+ See also ANNOTATE_UNPROTECTED_READ. */
179
+ #define ANNOTATE_IGNORE_READS_BEGIN() \
180
+ AnnotateIgnoreReadsBegin(__FILE__, __LINE__)
181
+
182
+ /* Stop ignoring reads. */
183
+ #define ANNOTATE_IGNORE_READS_END() \
184
+ AnnotateIgnoreReadsEnd(__FILE__, __LINE__)
185
+
186
+ /* Similar to ANNOTATE_IGNORE_READS_BEGIN, but ignore writes instead. */
187
+ #define ANNOTATE_IGNORE_WRITES_BEGIN() \
188
+ AnnotateIgnoreWritesBegin(__FILE__, __LINE__)
189
+
190
+ /* Stop ignoring writes. */
191
+ #define ANNOTATE_IGNORE_WRITES_END() \
192
+ AnnotateIgnoreWritesEnd(__FILE__, __LINE__)
193
+
194
+ /* Clang provides limited support for static thread-safety analysis
195
+ through a feature called Annotalysis. We configure macro-definitions
196
+ according to whether Annotalysis support is available. */
197
+ #elif defined(ANNOTALYSIS_ENABLED)
198
+
199
+ #define ANNOTATE_IGNORE_READS_BEGIN() \
200
+ StaticAnnotateIgnoreReadsBegin(__FILE__, __LINE__)
201
+
202
+ #define ANNOTATE_IGNORE_READS_END() \
203
+ StaticAnnotateIgnoreReadsEnd(__FILE__, __LINE__)
204
+
205
+ #define ANNOTATE_IGNORE_WRITES_BEGIN() \
206
+ StaticAnnotateIgnoreWritesBegin(__FILE__, __LINE__)
207
+
208
+ #define ANNOTATE_IGNORE_WRITES_END() \
209
+ StaticAnnotateIgnoreWritesEnd(__FILE__, __LINE__)
210
+
211
+ #else
212
+ #define ANNOTATE_IGNORE_READS_BEGIN() /* empty */
213
+ #define ANNOTATE_IGNORE_READS_END() /* empty */
214
+ #define ANNOTATE_IGNORE_WRITES_BEGIN() /* empty */
215
+ #define ANNOTATE_IGNORE_WRITES_END() /* empty */
216
+ #endif
217
+
218
+ /* Implement the ANNOTATE_IGNORE_READS_AND_WRITES_* annotations using the more
219
+ primitive annotations defined above. */
220
+ #if defined(ANNOTATIONS_ENABLED)
221
+
222
+ /* Start ignoring all memory accesses (both reads and writes). */
223
+ #define ANNOTATE_IGNORE_READS_AND_WRITES_BEGIN() \
224
+ do { \
225
+ ANNOTATE_IGNORE_READS_BEGIN(); \
226
+ ANNOTATE_IGNORE_WRITES_BEGIN(); \
227
+ }while (0)
228
+
229
+ /* Stop ignoring both reads and writes. */
230
+ #define ANNOTATE_IGNORE_READS_AND_WRITES_END() \
231
+ do { \
232
+ ANNOTATE_IGNORE_WRITES_END(); \
233
+ ANNOTATE_IGNORE_READS_END(); \
234
+ }while (0)
235
+
236
+ #else
237
+ #define ANNOTATE_IGNORE_READS_AND_WRITES_BEGIN() /* empty */
238
+ #define ANNOTATE_IGNORE_READS_AND_WRITES_END() /* empty */
239
+ #endif
240
+
241
+ /* Use the macros above rather than using these functions directly. */
242
+ #include <cstddef>
243
+ #ifdef __cplusplus
244
+ extern "C" {
245
+ #endif
246
+ void AnnotateRWLockCreate(const char *file, int line,
247
+ const volatile void *lock);
248
+ void AnnotateRWLockCreateStatic(const char *file, int line,
249
+ const volatile void *lock);
250
+ void AnnotateRWLockDestroy(const char *file, int line,
251
+ const volatile void *lock);
252
+ void AnnotateRWLockAcquired(const char *file, int line,
253
+ const volatile void *lock, long is_w); /* NOLINT */
254
+ void AnnotateRWLockReleased(const char *file, int line,
255
+ const volatile void *lock, long is_w); /* NOLINT */
256
+ void AnnotateBenignRace(const char *file, int line,
257
+ const volatile void *address,
258
+ const char *description);
259
+ void AnnotateBenignRaceSized(const char *file, int line,
260
+ const volatile void *address,
261
+ size_t size,
262
+ const char *description);
263
+ void AnnotateThreadName(const char *file, int line,
264
+ const char *name);
265
+ void AnnotateEnableRaceDetection(const char *file, int line, int enable);
266
+ void AnnotateMemoryIsInitialized(const char *file, int line,
267
+ const volatile void *mem, size_t size);
268
+ void AnnotateMemoryIsUninitialized(const char *file, int line,
269
+ const volatile void *mem, size_t size);
270
+
271
+ /* Annotations expand to these functions, when Dynamic Annotations are enabled.
272
+ These functions are either implemented as no-op calls, if no Sanitizer is
273
+ attached, or provided with externally-linked implementations by a library
274
+ like ThreadSanitizer. */
275
+ void AnnotateIgnoreReadsBegin(const char *file, int line)
276
+ ATTRIBUTE_IGNORE_READS_BEGIN;
277
+ void AnnotateIgnoreReadsEnd(const char *file, int line)
278
+ ATTRIBUTE_IGNORE_READS_END;
279
+ void AnnotateIgnoreWritesBegin(const char *file, int line);
280
+ void AnnotateIgnoreWritesEnd(const char *file, int line);
281
+
282
+ #if defined(ANNOTALYSIS_ENABLED)
283
+ /* When Annotalysis is enabled without Dynamic Annotations, the use of
284
+ static-inline functions allows the annotations to be read at compile-time,
285
+ while still letting the compiler elide the functions from the final build.
286
+
287
+ TODO(user) -- The exclusive lock here ignores writes as well, but
288
+ allows IGNORE_READS_AND_WRITES to work properly. */
289
+ #pragma GCC diagnostic push
290
+ #pragma GCC diagnostic ignored "-Wunused-function"
291
+ static inline void StaticAnnotateIgnoreReadsBegin(const char *file, int line)
292
+ ATTRIBUTE_IGNORE_READS_BEGIN { (void)file; (void)line; }
293
+ static inline void StaticAnnotateIgnoreReadsEnd(const char *file, int line)
294
+ ATTRIBUTE_IGNORE_READS_END { (void)file; (void)line; }
295
+ static inline void StaticAnnotateIgnoreWritesBegin(
296
+ const char *file, int line) { (void)file; (void)line; }
297
+ static inline void StaticAnnotateIgnoreWritesEnd(
298
+ const char *file, int line) { (void)file; (void)line; }
299
+ #pragma GCC diagnostic pop
300
+ #endif
301
+
302
+ /* Return non-zero value if running under valgrind.
303
+
304
+ If "valgrind.h" is included into dynamic_annotations.cc,
305
+ the regular valgrind mechanism will be used.
306
+ See http://valgrind.org/docs/manual/manual-core-adv.html about
307
+ RUNNING_ON_VALGRIND and other valgrind "client requests".
308
+ The file "valgrind.h" may be obtained by doing
309
+ svn co svn://svn.valgrind.org/valgrind/trunk/include
310
+
311
+ If for some reason you can't use "valgrind.h" or want to fake valgrind,
312
+ there are two ways to make this function return non-zero:
313
+ - Use environment variable: export RUNNING_ON_VALGRIND=1
314
+ - Make your tool intercept the function RunningOnValgrind() and
315
+ change its return value.
316
+ */
317
+ int RunningOnValgrind(void);
318
+
319
+ /* ValgrindSlowdown returns:
320
+ * 1.0, if (RunningOnValgrind() == 0)
321
+ * 50.0, if (RunningOnValgrind() != 0 && getenv("VALGRIND_SLOWDOWN") == NULL)
322
+ * atof(getenv("VALGRIND_SLOWDOWN")) otherwise
323
+ This function can be used to scale timeout values:
324
+ EXAMPLE:
325
+ for (;;) {
326
+ DoExpensiveBackgroundTask();
327
+ SleepForSeconds(5 * ValgrindSlowdown());
328
+ }
329
+ */
330
+ double ValgrindSlowdown(void);
331
+
332
+ #ifdef __cplusplus
333
+ }
334
+ #endif
335
+
336
+ /* ANNOTATE_UNPROTECTED_READ is the preferred way to annotate racey reads.
337
+
338
+ Instead of doing
339
+ ANNOTATE_IGNORE_READS_BEGIN();
340
+ ... = x;
341
+ ANNOTATE_IGNORE_READS_END();
342
+ one can use
343
+ ... = ANNOTATE_UNPROTECTED_READ(x); */
344
+ #if defined(__cplusplus) && defined(ANNOTATIONS_ENABLED)
345
+ template <typename T>
346
+ inline T ANNOTATE_UNPROTECTED_READ(const volatile T &x) { /* NOLINT */
347
+ ANNOTATE_IGNORE_READS_BEGIN();
348
+ T res = x;
349
+ ANNOTATE_IGNORE_READS_END();
350
+ return res;
351
+ }
352
+ #else
353
+ #define ANNOTATE_UNPROTECTED_READ(x) (x)
354
+ #endif
355
+
356
+ #if DYNAMIC_ANNOTATIONS_ENABLED != 0 && defined(__cplusplus)
357
+ /* Apply ANNOTATE_BENIGN_RACE_SIZED to a static variable. */
358
+ #define ANNOTATE_BENIGN_RACE_STATIC(static_var, description) \
359
+ namespace { \
360
+ class static_var ## _annotator { \
361
+ public: \
362
+ static_var ## _annotator() { \
363
+ ANNOTATE_BENIGN_RACE_SIZED(&static_var, \
364
+ sizeof(static_var), \
365
+ # static_var ": " description); \
366
+ } \
367
+ }; \
368
+ static static_var ## _annotator the ## static_var ## _annotator;\
369
+ } // namespace
370
+ #else /* DYNAMIC_ANNOTATIONS_ENABLED == 0 */
371
+ #define ANNOTATE_BENIGN_RACE_STATIC(static_var, description) /* empty */
372
+ #endif /* DYNAMIC_ANNOTATIONS_ENABLED */
373
+
374
+ #ifdef ADDRESS_SANITIZER
375
+ /* Describe the current state of a contiguous container such as e.g.
376
+ * std::vector or std::string. For more details see
377
+ * sanitizer/common_interface_defs.h, which is provided by the compiler. */
378
+ #include <sanitizer/common_interface_defs.h>
379
+ #define ANNOTATE_CONTIGUOUS_CONTAINER(beg, end, old_mid, new_mid) \
380
+ __sanitizer_annotate_contiguous_container(beg, end, old_mid, new_mid)
381
+ #define ADDRESS_SANITIZER_REDZONE(name) \
382
+ struct { char x[8] __attribute__ ((aligned (8))); } name
383
+ #else
384
+ #define ANNOTATE_CONTIGUOUS_CONTAINER(beg, end, old_mid, new_mid)
385
+ #define ADDRESS_SANITIZER_REDZONE(name)
386
+ #endif // ADDRESS_SANITIZER
387
+
388
+ /* Undefine the macros intended only in this file. */
389
+ #undef ANNOTALYSIS_ENABLED
390
+ #undef ANNOTATIONS_ENABLED
391
+ #undef ATTRIBUTE_IGNORE_READS_BEGIN
392
+ #undef ATTRIBUTE_IGNORE_READS_END
393
+
394
+ #endif /* THIRD_PARTY_ABSL_BASE_DYNAMIC_ANNOTATIONS_H_ */
@@ -0,0 +1,168 @@
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
+
16
+ #ifndef S2_THIRD_PARTY_ABSL_BASE_INTERNAL_ATOMIC_HOOK_H_
17
+ #define S2_THIRD_PARTY_ABSL_BASE_INTERNAL_ATOMIC_HOOK_H_
18
+
19
+ #include <atomic>
20
+ #include <cassert>
21
+ #include <cstdint>
22
+ #include <utility>
23
+
24
+ #ifdef _MSC_FULL_VER
25
+ #define ABSL_HAVE_WORKING_ATOMIC_POINTER 0
26
+ #else
27
+ #define ABSL_HAVE_WORKING_ATOMIC_POINTER 1
28
+ #endif
29
+
30
+ namespace absl {
31
+ namespace base_internal {
32
+
33
+ template <typename T>
34
+ class AtomicHook;
35
+
36
+ // AtomicHook is a helper class, templatized on a raw function pointer type, for
37
+ // implementing Abseil customization hooks. It is a callable object that
38
+ // dispatches to the registered hook.
39
+ //
40
+ // A default constructed object performs a no-op (and returns a default
41
+ // constructed object) if no hook has been registered.
42
+ //
43
+ // Hooks can be pre-registered via constant initialization, for example,
44
+ // ABSL_CONST_INIT static AtomicHook<void(*)()> my_hook(DefaultAction);
45
+ // and then changed at runtime via a call to Store().
46
+ //
47
+ // Reads and writes guarantee memory_order_acquire/memory_order_release
48
+ // semantics.
49
+ template <typename ReturnType, typename... Args>
50
+ class AtomicHook<ReturnType (*)(Args...)> {
51
+ public:
52
+ using FnPtr = ReturnType (*)(Args...);
53
+
54
+ // Constructs an object that by default performs a no-op (and
55
+ // returns a default constructed object) when no hook as been registered.
56
+ constexpr AtomicHook() : AtomicHook(DummyFunction) {}
57
+
58
+ // Constructs an object that by default dispatches to/returns the
59
+ // pre-registered default_fn when no hook has been registered at runtime.
60
+ #if ABSL_HAVE_WORKING_ATOMIC_POINTER
61
+ explicit constexpr AtomicHook(FnPtr default_fn)
62
+ : hook_(default_fn), default_fn_(default_fn) {}
63
+ #else
64
+ explicit constexpr AtomicHook(FnPtr default_fn)
65
+ : hook_(kUninitialized), default_fn_(default_fn) {}
66
+ #endif
67
+
68
+ // Stores the provided function pointer as the value for this hook.
69
+ //
70
+ // This is intended to be called once. Multiple calls are legal only if the
71
+ // same function pointer is provided for each call. The store is implemented
72
+ // as a memory_order_release operation, and read accesses are implemented as
73
+ // memory_order_acquire.
74
+ void Store(FnPtr fn) {
75
+ bool success = DoStore(fn);
76
+ static_cast<void>(success);
77
+ assert(success);
78
+ }
79
+
80
+ // Invokes the registered callback. If no callback has yet been registered, a
81
+ // default-constructed object of the appropriate type is returned instead.
82
+ template <typename... CallArgs>
83
+ ReturnType operator()(CallArgs&&... args) const {
84
+ return DoLoad()(std::forward<CallArgs>(args)...);
85
+ }
86
+
87
+ // Returns the registered callback, or nullptr if none has been registered.
88
+ // Useful if client code needs to conditionalize behavior based on whether a
89
+ // callback was registered.
90
+ //
91
+ // Note that atomic_hook.Load()() and atomic_hook() have different semantics:
92
+ // operator()() will perform a no-op if no callback was registered, while
93
+ // Load()() will dereference a null function pointer. Prefer operator()() to
94
+ // Load()() unless you must conditionalize behavior on whether a hook was
95
+ // registered.
96
+ FnPtr Load() const {
97
+ FnPtr ptr = DoLoad();
98
+ return (ptr == DummyFunction) ? nullptr : ptr;
99
+ }
100
+
101
+ private:
102
+ static ReturnType DummyFunction(Args...) {
103
+ return ReturnType();
104
+ }
105
+
106
+ // Current versions of MSVC (as of September 2017) have a broken
107
+ // implementation of std::atomic<T*>: Its constructor attempts to do the
108
+ // equivalent of a reinterpret_cast in a constexpr context, which is not
109
+ // allowed.
110
+ //
111
+ // This causes an issue when building with LLVM under Windows. To avoid this,
112
+ // we use a less-efficient, intptr_t-based implementation on Windows.
113
+ //
114
+ // TODO(b/65850802): revisit this if Windows resolves the std::atomic<T*>
115
+ // issue.
116
+ #if ABSL_HAVE_WORKING_ATOMIC_POINTER
117
+ // Return the stored value, or DummyFunction if no value has been stored.
118
+ FnPtr DoLoad() const { return hook_.load(std::memory_order_acquire); }
119
+
120
+ // Store the given value. Returns false if a different value was already
121
+ // stored to this object.
122
+ bool DoStore(FnPtr fn) {
123
+ assert(fn);
124
+ FnPtr expected = default_fn_;
125
+ const bool store_succeeded = hook_.compare_exchange_strong(
126
+ expected, fn, std::memory_order_acq_rel, std::memory_order_acquire);
127
+ const bool same_value_already_stored = (expected == fn);
128
+ return store_succeeded || same_value_already_stored;
129
+ }
130
+
131
+ std::atomic<FnPtr> hook_;
132
+ #else // !ABSL_HAVE_WORKING_ATOMIC_POINTER
133
+ // Use a sentinel value unlikely to be the address of an actual function.
134
+ static constexpr intptr_t kUninitialized = 0;
135
+
136
+ static_assert(sizeof(intptr_t) >= sizeof(FnPtr),
137
+ "intptr_t can't contain a function pointer");
138
+
139
+ FnPtr DoLoad() const {
140
+ const intptr_t value = hook_.load(std::memory_order_acquire);
141
+ if (value == kUninitialized) {
142
+ return default_fn_;
143
+ }
144
+ return reinterpret_cast<FnPtr>(value);
145
+ }
146
+
147
+ bool DoStore(FnPtr fn) {
148
+ assert(fn);
149
+ const auto value = reinterpret_cast<intptr_t>(fn);
150
+ intptr_t expected = kUninitialized;
151
+ const bool store_succeeded = hook_.compare_exchange_strong(
152
+ expected, value, std::memory_order_acq_rel, std::memory_order_acquire);
153
+ const bool same_value_already_stored = (expected == value);
154
+ return store_succeeded || same_value_already_stored;
155
+ }
156
+
157
+ std::atomic<intptr_t> hook_;
158
+ #endif
159
+
160
+ const FnPtr default_fn_;
161
+ };
162
+
163
+ #undef ABSL_HAVE_WORKING_ATOMIC_POINTER
164
+
165
+ } // namespace base_internal
166
+ } // namespace absl
167
+
168
+ #endif // S2_THIRD_PARTY_ABSL_BASE_INTERNAL_ATOMIC_HOOK_H_