grpc 1.37.1 → 1.38.0.pre1

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of grpc might be problematic. Click here for more details.

Files changed (544) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +64 -58
  3. data/include/grpc/event_engine/README.md +38 -0
  4. data/include/grpc/event_engine/channel_args.h +28 -0
  5. data/include/grpc/event_engine/event_engine.h +336 -0
  6. data/include/grpc/event_engine/port.h +39 -0
  7. data/include/grpc/event_engine/slice_allocator.h +81 -0
  8. data/include/grpc/grpc.h +2 -2
  9. data/include/grpc/grpc_security_constants.h +14 -0
  10. data/include/grpc/impl/codegen/grpc_types.h +11 -0
  11. data/include/grpc/impl/codegen/port_platform.h +5 -0
  12. data/include/grpc/module.modulemap +14 -14
  13. data/src/core/ext/filters/client_channel/backup_poller.cc +3 -3
  14. data/src/core/ext/filters/client_channel/channel_connectivity.cc +177 -202
  15. data/src/core/ext/filters/client_channel/client_channel.cc +628 -3101
  16. data/src/core/ext/filters/client_channel/client_channel.h +489 -55
  17. data/src/core/ext/filters/client_channel/client_channel_channelz.h +1 -1
  18. data/src/core/ext/filters/client_channel/client_channel_plugin.cc +4 -1
  19. data/src/core/ext/filters/client_channel/config_selector.h +1 -1
  20. data/src/core/ext/filters/client_channel/connector.h +1 -1
  21. data/src/core/ext/filters/client_channel/dynamic_filters.cc +9 -10
  22. data/src/core/ext/filters/client_channel/dynamic_filters.h +3 -3
  23. data/src/core/ext/filters/client_channel/health/health_check_client.cc +26 -27
  24. data/src/core/ext/filters/client_channel/health/health_check_client.h +27 -26
  25. data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +24 -21
  26. data/src/core/ext/filters/client_channel/lb_policy.cc +1 -1
  27. data/src/core/ext/filters/client_channel/lb_policy.h +4 -4
  28. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +6 -6
  29. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +46 -43
  30. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc +1 -1
  31. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h +2 -1
  32. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +5 -5
  33. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +14 -12
  34. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +4 -4
  35. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +1 -1
  36. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +15 -15
  37. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +36 -30
  38. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +23 -23
  39. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +31 -46
  40. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +84 -61
  41. data/src/core/ext/filters/client_channel/lb_policy_factory.h +1 -1
  42. data/src/core/ext/filters/client_channel/lb_policy_registry.cc +4 -4
  43. data/src/core/ext/filters/client_channel/lb_policy_registry.h +1 -1
  44. data/src/core/ext/filters/client_channel/resolver.h +2 -2
  45. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +23 -15
  46. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +1 -1
  47. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_libuv.cc +3 -3
  48. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +2 -2
  49. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +14 -14
  50. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +33 -24
  51. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +1 -1
  52. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_libuv.cc +1 -1
  53. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_windows.cc +1 -1
  54. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +17 -9
  55. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +20 -28
  56. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h +7 -5
  57. data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +13 -11
  58. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +1 -1
  59. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +43 -28
  60. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +32 -239
  61. data/src/core/ext/filters/client_channel/resolver_result_parsing.h +20 -49
  62. data/src/core/ext/filters/client_channel/retry_filter.cc +2188 -0
  63. data/src/core/ext/filters/client_channel/retry_filter.h +30 -0
  64. data/src/core/ext/filters/client_channel/retry_service_config.cc +287 -0
  65. data/src/core/ext/filters/client_channel/retry_service_config.h +90 -0
  66. data/src/core/ext/filters/client_channel/server_address.cc +1 -1
  67. data/src/core/ext/filters/client_channel/service_config.cc +15 -14
  68. data/src/core/ext/filters/client_channel/service_config.h +7 -6
  69. data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +5 -4
  70. data/src/core/ext/filters/client_channel/service_config_parser.cc +6 -6
  71. data/src/core/ext/filters/client_channel/service_config_parser.h +7 -4
  72. data/src/core/ext/filters/client_channel/subchannel.cc +17 -16
  73. data/src/core/ext/filters/client_channel/subchannel.h +7 -6
  74. data/src/core/ext/filters/client_idle/client_idle_filter.cc +16 -15
  75. data/src/core/ext/filters/deadline/deadline_filter.cc +10 -10
  76. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +19 -18
  77. data/src/core/ext/filters/fault_injection/service_config_parser.cc +5 -5
  78. data/src/core/ext/filters/fault_injection/service_config_parser.h +1 -1
  79. data/src/core/ext/filters/http/client/http_client_filter.cc +28 -21
  80. data/src/core/ext/filters/http/client_authority_filter.cc +3 -3
  81. data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +23 -22
  82. data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +21 -21
  83. data/src/core/ext/filters/http/server/http_server_filter.cc +27 -23
  84. data/src/core/ext/filters/max_age/max_age_filter.cc +12 -10
  85. data/src/core/ext/filters/message_size/message_size_filter.cc +14 -11
  86. data/src/core/ext/filters/message_size/message_size_filter.h +1 -1
  87. data/src/core/ext/filters/workarounds/workaround_cronet_compression_filter.cc +4 -3
  88. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +7 -7
  89. data/src/core/ext/transport/chttp2/client/chttp2_connector.h +7 -7
  90. data/src/core/ext/transport/chttp2/client/insecure/channel_create.cc +2 -2
  91. data/src/core/ext/transport/chttp2/client/insecure/channel_create_posix.cc +1 -1
  92. data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +3 -3
  93. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +44 -45
  94. data/src/core/ext/transport/chttp2/server/chttp2_server.h +2 -2
  95. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2.cc +3 -4
  96. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.cc +2 -2
  97. data/src/core/ext/transport/chttp2/server/secure/server_secure_chttp2.cc +3 -4
  98. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +129 -116
  99. data/src/core/ext/transport/chttp2/transport/context_list.cc +4 -5
  100. data/src/core/ext/transport/chttp2/transport/context_list.h +4 -4
  101. data/src/core/ext/transport/chttp2/transport/flow_control.cc +3 -3
  102. data/src/core/ext/transport/chttp2/transport/flow_control.h +8 -8
  103. data/src/core/ext/transport/chttp2/transport/frame_data.cc +8 -8
  104. data/src/core/ext/transport/chttp2/transport/frame_data.h +10 -10
  105. data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +7 -8
  106. data/src/core/ext/transport/chttp2/transport/frame_goaway.h +6 -6
  107. data/src/core/ext/transport/chttp2/transport/frame_ping.cc +7 -8
  108. data/src/core/ext/transport/chttp2/transport/frame_ping.h +7 -6
  109. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +7 -7
  110. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.h +6 -6
  111. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +6 -5
  112. data/src/core/ext/transport/chttp2/transport/frame_settings.h +6 -6
  113. data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +4 -6
  114. data/src/core/ext/transport/chttp2/transport/frame_window_update.h +4 -6
  115. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +237 -208
  116. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +10 -10
  117. data/src/core/ext/transport/chttp2/transport/hpack_table.cc +4 -3
  118. data/src/core/ext/transport/chttp2/transport/hpack_table.h +4 -4
  119. data/src/core/ext/transport/chttp2/transport/incoming_metadata.cc +2 -2
  120. data/src/core/ext/transport/chttp2/transport/incoming_metadata.h +2 -2
  121. data/src/core/ext/transport/chttp2/transport/internal.h +31 -27
  122. data/src/core/ext/transport/chttp2/transport/parsing.cc +63 -56
  123. data/src/core/ext/transport/chttp2/transport/writing.cc +7 -3
  124. data/src/core/ext/transport/inproc/inproc_transport.cc +30 -29
  125. data/src/core/ext/xds/certificate_provider_factory.h +1 -1
  126. data/src/core/ext/xds/certificate_provider_store.h +3 -3
  127. data/src/core/ext/xds/file_watcher_certificate_provider_factory.cc +3 -3
  128. data/src/core/ext/xds/file_watcher_certificate_provider_factory.h +2 -2
  129. data/src/core/ext/xds/xds_api.cc +101 -93
  130. data/src/core/ext/xds/xds_api.h +6 -6
  131. data/src/core/ext/xds/xds_bootstrap.cc +97 -159
  132. data/src/core/ext/xds/xds_bootstrap.h +19 -24
  133. data/src/core/ext/xds/xds_certificate_provider.cc +4 -4
  134. data/src/core/ext/xds/xds_certificate_provider.h +4 -4
  135. data/src/core/ext/xds/xds_channel_args.h +5 -2
  136. data/src/core/ext/xds/xds_client.cc +310 -178
  137. data/src/core/ext/xds/xds_client.h +41 -27
  138. data/src/core/ext/xds/xds_client_stats.h +3 -2
  139. data/src/core/ext/xds/xds_server_config_fetcher.cc +34 -20
  140. data/src/core/lib/{iomgr → address_utils}/parse_address.cc +17 -17
  141. data/src/core/lib/{iomgr → address_utils}/parse_address.h +7 -7
  142. data/src/core/lib/{iomgr → address_utils}/sockaddr_utils.cc +3 -20
  143. data/src/core/lib/{iomgr → address_utils}/sockaddr_utils.h +6 -11
  144. data/src/core/lib/channel/channel_stack.cc +10 -9
  145. data/src/core/lib/channel/channel_stack.h +10 -9
  146. data/src/core/lib/channel/channel_stack_builder.cc +2 -2
  147. data/src/core/lib/channel/channel_stack_builder.h +1 -1
  148. data/src/core/lib/channel/channelz.cc +21 -13
  149. data/src/core/lib/channel/connected_channel.cc +4 -4
  150. data/src/core/lib/channel/handshaker.cc +7 -6
  151. data/src/core/lib/channel/handshaker.h +5 -5
  152. data/src/core/lib/event_engine/slice_allocator.cc +59 -0
  153. data/src/core/lib/event_engine/sockaddr.cc +38 -0
  154. data/src/core/lib/gprpp/ref_counted.h +28 -14
  155. data/src/core/lib/gprpp/status_helper.cc +407 -0
  156. data/src/core/lib/gprpp/status_helper.h +180 -0
  157. data/src/core/lib/http/httpcli.cc +11 -11
  158. data/src/core/lib/http/httpcli_security_connector.cc +11 -7
  159. data/src/core/lib/http/parser.cc +16 -16
  160. data/src/core/lib/http/parser.h +4 -4
  161. data/src/core/lib/iomgr/buffer_list.cc +7 -9
  162. data/src/core/lib/iomgr/buffer_list.h +4 -5
  163. data/src/core/lib/iomgr/call_combiner.cc +15 -12
  164. data/src/core/lib/iomgr/call_combiner.h +12 -14
  165. data/src/core/lib/iomgr/cfstream_handle.cc +3 -3
  166. data/src/core/lib/iomgr/cfstream_handle.h +1 -1
  167. data/src/core/lib/iomgr/closure.h +7 -6
  168. data/src/core/lib/iomgr/combiner.cc +14 -12
  169. data/src/core/lib/iomgr/combiner.h +2 -2
  170. data/src/core/lib/iomgr/endpoint.cc +1 -1
  171. data/src/core/lib/iomgr/endpoint.h +2 -2
  172. data/src/core/lib/iomgr/endpoint_cfstream.cc +11 -13
  173. data/src/core/lib/iomgr/endpoint_pair_windows.cc +1 -1
  174. data/src/core/lib/iomgr/error.cc +167 -61
  175. data/src/core/lib/iomgr/error.h +217 -106
  176. data/src/core/lib/iomgr/error_cfstream.cc +3 -2
  177. data/src/core/lib/iomgr/error_cfstream.h +2 -2
  178. data/src/core/lib/iomgr/error_internal.h +5 -1
  179. data/src/core/lib/iomgr/ev_apple.cc +5 -5
  180. data/src/core/lib/iomgr/ev_epoll1_linux.cc +19 -19
  181. data/src/core/lib/iomgr/ev_epollex_linux.cc +48 -45
  182. data/src/core/lib/iomgr/ev_poll_posix.cc +26 -23
  183. data/src/core/lib/iomgr/ev_posix.cc +9 -8
  184. data/src/core/lib/iomgr/ev_posix.h +9 -9
  185. data/src/core/lib/iomgr/exec_ctx.cc +4 -4
  186. data/src/core/lib/iomgr/exec_ctx.h +1 -1
  187. data/src/core/lib/iomgr/executor.cc +8 -8
  188. data/src/core/lib/iomgr/executor.h +2 -2
  189. data/src/core/lib/iomgr/iomgr.cc +1 -1
  190. data/src/core/lib/iomgr/iomgr.h +1 -1
  191. data/src/core/lib/iomgr/iomgr_custom.cc +1 -1
  192. data/src/core/lib/iomgr/iomgr_internal.cc +2 -2
  193. data/src/core/lib/iomgr/iomgr_internal.h +3 -3
  194. data/src/core/lib/iomgr/iomgr_posix.cc +1 -1
  195. data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +2 -2
  196. data/src/core/lib/iomgr/iomgr_windows.cc +1 -1
  197. data/src/core/lib/iomgr/load_file.cc +4 -4
  198. data/src/core/lib/iomgr/load_file.h +2 -2
  199. data/src/core/lib/iomgr/lockfree_event.cc +5 -5
  200. data/src/core/lib/iomgr/lockfree_event.h +1 -1
  201. data/src/core/lib/iomgr/pollset.cc +5 -5
  202. data/src/core/lib/iomgr/pollset.h +9 -9
  203. data/src/core/lib/iomgr/pollset_custom.cc +5 -5
  204. data/src/core/lib/iomgr/pollset_windows.cc +5 -5
  205. data/src/core/lib/iomgr/port.h +1 -1
  206. data/src/core/lib/iomgr/python_util.h +1 -1
  207. data/src/core/lib/iomgr/resolve_address.cc +3 -3
  208. data/src/core/lib/iomgr/resolve_address.h +6 -6
  209. data/src/core/lib/iomgr/resolve_address_custom.cc +10 -9
  210. data/src/core/lib/iomgr/resolve_address_custom.h +3 -3
  211. data/src/core/lib/iomgr/resolve_address_posix.cc +3 -3
  212. data/src/core/lib/iomgr/resolve_address_windows.cc +4 -4
  213. data/src/core/lib/iomgr/resource_quota.cc +11 -10
  214. data/src/core/lib/iomgr/socket_utils_common_posix.cc +22 -20
  215. data/src/core/lib/iomgr/socket_utils_posix.h +20 -20
  216. data/src/core/lib/iomgr/tcp_client_cfstream.cc +4 -4
  217. data/src/core/lib/iomgr/tcp_client_custom.cc +5 -6
  218. data/src/core/lib/iomgr/tcp_client_posix.cc +15 -17
  219. data/src/core/lib/iomgr/tcp_client_posix.h +3 -4
  220. data/src/core/lib/iomgr/tcp_client_windows.cc +5 -5
  221. data/src/core/lib/iomgr/tcp_custom.cc +14 -16
  222. data/src/core/lib/iomgr/tcp_custom.h +13 -12
  223. data/src/core/lib/iomgr/tcp_posix.cc +36 -34
  224. data/src/core/lib/iomgr/tcp_server.cc +6 -6
  225. data/src/core/lib/iomgr/tcp_server.h +12 -11
  226. data/src/core/lib/iomgr/tcp_server_custom.cc +23 -21
  227. data/src/core/lib/iomgr/tcp_server_posix.cc +22 -21
  228. data/src/core/lib/iomgr/tcp_server_utils_posix.h +13 -12
  229. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +19 -17
  230. data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +9 -9
  231. data/src/core/lib/iomgr/tcp_server_utils_posix_noifaddrs.cc +4 -4
  232. data/src/core/lib/iomgr/tcp_server_windows.cc +26 -25
  233. data/src/core/lib/iomgr/tcp_uv.cc +25 -23
  234. data/src/core/lib/iomgr/tcp_windows.cc +13 -13
  235. data/src/core/lib/iomgr/tcp_windows.h +2 -2
  236. data/src/core/lib/iomgr/timer_custom.cc +2 -1
  237. data/src/core/lib/iomgr/timer_custom.h +1 -1
  238. data/src/core/lib/iomgr/timer_generic.cc +6 -6
  239. data/src/core/lib/iomgr/udp_server.cc +21 -20
  240. data/src/core/lib/iomgr/unix_sockets_posix.cc +3 -3
  241. data/src/core/lib/iomgr/unix_sockets_posix.h +2 -2
  242. data/src/core/lib/iomgr/unix_sockets_posix_noop.cc +10 -7
  243. data/src/core/lib/iomgr/wakeup_fd_eventfd.cc +3 -3
  244. data/src/core/lib/iomgr/wakeup_fd_pipe.cc +4 -4
  245. data/src/core/lib/iomgr/wakeup_fd_posix.cc +3 -3
  246. data/src/core/lib/iomgr/wakeup_fd_posix.h +8 -6
  247. data/src/core/lib/iomgr/work_serializer.h +17 -1
  248. data/src/core/lib/json/json.h +1 -1
  249. data/src/core/lib/json/json_reader.cc +4 -4
  250. data/src/core/lib/matchers/matchers.cc +39 -39
  251. data/src/core/lib/matchers/matchers.h +28 -28
  252. data/src/core/lib/security/credentials/composite/composite_credentials.cc +4 -4
  253. data/src/core/lib/security/credentials/composite/composite_credentials.h +2 -2
  254. data/src/core/lib/security/credentials/credentials.h +2 -2
  255. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +17 -13
  256. data/src/core/lib/security/credentials/external/aws_external_account_credentials.h +13 -11
  257. data/src/core/lib/security/credentials/external/aws_request_signer.cc +2 -1
  258. data/src/core/lib/security/credentials/external/aws_request_signer.h +1 -1
  259. data/src/core/lib/security/credentials/external/external_account_credentials.cc +15 -12
  260. data/src/core/lib/security/credentials/external/external_account_credentials.h +9 -8
  261. data/src/core/lib/security/credentials/external/file_external_account_credentials.cc +5 -4
  262. data/src/core/lib/security/credentials/external/file_external_account_credentials.h +4 -3
  263. data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +8 -8
  264. data/src/core/lib/security/credentials/external/url_external_account_credentials.h +9 -7
  265. data/src/core/lib/security/credentials/fake/fake_credentials.cc +2 -2
  266. data/src/core/lib/security/credentials/fake/fake_credentials.h +2 -2
  267. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +9 -9
  268. data/src/core/lib/security/credentials/iam/iam_credentials.cc +2 -2
  269. data/src/core/lib/security/credentials/iam/iam_credentials.h +2 -2
  270. data/src/core/lib/security/credentials/jwt/json_token.cc +2 -2
  271. data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +3 -3
  272. data/src/core/lib/security/credentials/jwt/jwt_credentials.h +2 -2
  273. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +7 -5
  274. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +21 -19
  275. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +5 -5
  276. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +5 -5
  277. data/src/core/lib/security/credentials/plugin/plugin_credentials.h +2 -2
  278. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.cc +8 -7
  279. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.h +9 -9
  280. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc +19 -13
  281. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +4 -0
  282. data/src/core/lib/security/credentials/xds/xds_credentials.cc +3 -3
  283. data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +13 -3
  284. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +13 -3
  285. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.cc +2 -2
  286. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.h +12 -2
  287. data/src/core/lib/security/security_connector/load_system_roots_linux.cc +1 -1
  288. data/src/core/lib/security/security_connector/local/local_security_connector.cc +14 -4
  289. data/src/core/lib/security/security_connector/security_connector.h +9 -4
  290. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +16 -6
  291. data/src/core/lib/security/security_connector/ssl_utils.cc +22 -4
  292. data/src/core/lib/security/security_connector/ssl_utils.h +4 -4
  293. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +56 -60
  294. data/src/core/lib/security/security_connector/tls/tls_security_connector.h +66 -48
  295. data/src/core/lib/security/transport/client_auth_filter.cc +18 -10
  296. data/src/core/lib/security/transport/secure_endpoint.cc +4 -4
  297. data/src/core/lib/security/transport/security_handshaker.cc +33 -32
  298. data/src/core/lib/security/transport/server_auth_filter.cc +19 -13
  299. data/src/core/lib/security/transport/tsi_error.cc +2 -1
  300. data/src/core/lib/security/transport/tsi_error.h +2 -1
  301. data/src/core/lib/security/util/json_util.cc +2 -2
  302. data/src/core/lib/security/util/json_util.h +1 -1
  303. data/src/core/lib/surface/call.cc +46 -45
  304. data/src/core/lib/surface/call.h +2 -2
  305. data/src/core/lib/surface/channel.cc +6 -6
  306. data/src/core/lib/surface/channel.h +3 -2
  307. data/src/core/lib/surface/channel_ping.cc +1 -1
  308. data/src/core/lib/surface/completion_queue.cc +46 -47
  309. data/src/core/lib/surface/completion_queue.h +2 -1
  310. data/src/core/lib/surface/lame_client.cc +11 -11
  311. data/src/core/lib/surface/lame_client.h +1 -1
  312. data/src/core/lib/surface/server.cc +28 -22
  313. data/src/core/lib/surface/server.h +16 -15
  314. data/src/core/lib/surface/validate_metadata.cc +7 -7
  315. data/src/core/lib/surface/validate_metadata.h +3 -2
  316. data/src/core/lib/surface/version.cc +4 -2
  317. data/src/core/lib/transport/byte_stream.cc +5 -5
  318. data/src/core/lib/transport/byte_stream.h +8 -8
  319. data/src/core/lib/transport/connectivity_state.cc +1 -1
  320. data/src/core/lib/transport/error_utils.cc +19 -8
  321. data/src/core/lib/transport/error_utils.h +11 -5
  322. data/src/core/lib/transport/metadata_batch.cc +37 -37
  323. data/src/core/lib/transport/metadata_batch.h +19 -18
  324. data/src/core/lib/transport/transport.cc +4 -3
  325. data/src/core/lib/transport/transport.h +4 -4
  326. data/src/core/lib/transport/transport_op_string.cc +5 -5
  327. data/src/core/tsi/alts/crypt/gsec.h +4 -0
  328. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +5 -4
  329. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +7 -6
  330. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker_private.h +2 -1
  331. data/src/core/tsi/ssl_transport_security.cc +32 -14
  332. data/src/core/tsi/ssl_transport_security.h +3 -4
  333. data/src/ruby/bin/math_services_pb.rb +1 -1
  334. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +1 -1
  335. data/src/ruby/lib/grpc/version.rb +1 -1
  336. data/src/ruby/pb/grpc/health/v1/health_services_pb.rb +1 -1
  337. data/src/ruby/pb/src/proto/grpc/testing/test_services_pb.rb +6 -6
  338. data/third_party/abseil-cpp/absl/algorithm/container.h +3 -3
  339. data/third_party/abseil-cpp/absl/base/attributes.h +24 -4
  340. data/third_party/abseil-cpp/absl/base/call_once.h +2 -9
  341. data/third_party/abseil-cpp/absl/base/config.h +37 -9
  342. data/third_party/abseil-cpp/absl/base/dynamic_annotations.h +24 -10
  343. data/third_party/abseil-cpp/absl/base/internal/direct_mmap.h +4 -1
  344. data/third_party/abseil-cpp/absl/base/internal/endian.h +61 -0
  345. data/third_party/abseil-cpp/absl/base/internal/low_level_scheduling.h +2 -3
  346. data/third_party/abseil-cpp/absl/base/internal/raw_logging.cc +34 -32
  347. data/third_party/abseil-cpp/absl/base/internal/raw_logging.h +16 -6
  348. data/third_party/abseil-cpp/absl/base/internal/spinlock.cc +11 -2
  349. data/third_party/abseil-cpp/absl/base/internal/spinlock.h +14 -5
  350. data/third_party/abseil-cpp/absl/base/internal/spinlock_akaros.inc +2 -2
  351. data/third_party/abseil-cpp/absl/base/internal/spinlock_linux.inc +3 -3
  352. data/third_party/abseil-cpp/absl/base/internal/spinlock_posix.inc +2 -2
  353. data/third_party/abseil-cpp/absl/base/internal/spinlock_wait.h +11 -11
  354. data/third_party/abseil-cpp/absl/base/internal/spinlock_win32.inc +5 -5
  355. data/third_party/abseil-cpp/absl/base/internal/sysinfo.cc +1 -1
  356. data/third_party/abseil-cpp/absl/base/internal/thread_identity.cc +5 -2
  357. data/third_party/abseil-cpp/absl/base/internal/thread_identity.h +43 -42
  358. data/third_party/abseil-cpp/absl/base/internal/throw_delegate.cc +111 -7
  359. data/third_party/abseil-cpp/absl/base/internal/unaligned_access.h +0 -76
  360. data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.cc +1 -3
  361. data/third_party/abseil-cpp/absl/base/log_severity.h +4 -4
  362. data/third_party/abseil-cpp/absl/base/macros.h +11 -0
  363. data/third_party/abseil-cpp/absl/base/optimization.h +10 -7
  364. data/third_party/abseil-cpp/absl/base/options.h +1 -1
  365. data/third_party/abseil-cpp/absl/base/port.h +0 -1
  366. data/third_party/abseil-cpp/absl/base/thread_annotations.h +1 -1
  367. data/third_party/abseil-cpp/absl/container/fixed_array.h +2 -2
  368. data/third_party/abseil-cpp/absl/container/inlined_vector.h +5 -3
  369. data/third_party/abseil-cpp/absl/container/internal/compressed_tuple.h +1 -1
  370. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.cc +5 -1
  371. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.h +2 -1
  372. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler_force_weak_definition.cc +2 -1
  373. data/third_party/abseil-cpp/absl/container/internal/inlined_vector.h +141 -66
  374. data/third_party/abseil-cpp/absl/container/internal/layout.h +4 -4
  375. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.cc +14 -1
  376. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.h +136 -136
  377. data/third_party/abseil-cpp/absl/debugging/internal/demangle.cc +16 -12
  378. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_aarch64-inl.inc +5 -2
  379. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_config.h +3 -12
  380. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_powerpc-inl.inc +6 -1
  381. data/third_party/abseil-cpp/absl/debugging/internal/symbolize.h +3 -5
  382. data/third_party/abseil-cpp/absl/debugging/symbolize_darwin.inc +2 -2
  383. data/third_party/abseil-cpp/absl/debugging/symbolize_elf.inc +2 -2
  384. data/third_party/abseil-cpp/absl/hash/internal/city.cc +15 -12
  385. data/third_party/abseil-cpp/absl/hash/internal/city.h +1 -19
  386. data/third_party/abseil-cpp/absl/hash/internal/hash.cc +25 -10
  387. data/third_party/abseil-cpp/absl/hash/internal/hash.h +86 -37
  388. data/third_party/abseil-cpp/absl/hash/internal/wyhash.cc +111 -0
  389. data/third_party/abseil-cpp/absl/hash/internal/wyhash.h +48 -0
  390. data/third_party/abseil-cpp/absl/meta/type_traits.h +16 -2
  391. data/third_party/abseil-cpp/absl/numeric/bits.h +177 -0
  392. data/third_party/abseil-cpp/absl/numeric/int128.cc +3 -3
  393. data/third_party/abseil-cpp/absl/numeric/internal/bits.h +358 -0
  394. data/third_party/abseil-cpp/absl/numeric/internal/representation.h +55 -0
  395. data/third_party/abseil-cpp/absl/status/internal/status_internal.h +18 -0
  396. data/third_party/abseil-cpp/absl/status/internal/statusor_internal.h +4 -7
  397. data/third_party/abseil-cpp/absl/status/status.cc +29 -22
  398. data/third_party/abseil-cpp/absl/status/status.h +81 -20
  399. data/third_party/abseil-cpp/absl/status/statusor.h +3 -3
  400. data/third_party/abseil-cpp/absl/strings/charconv.cc +5 -5
  401. data/third_party/abseil-cpp/absl/strings/cord.cc +326 -371
  402. data/third_party/abseil-cpp/absl/strings/cord.h +182 -64
  403. data/third_party/abseil-cpp/absl/strings/escaping.cc +4 -4
  404. data/third_party/abseil-cpp/absl/strings/internal/charconv_parse.cc +6 -6
  405. data/third_party/abseil-cpp/absl/strings/internal/cord_internal.cc +83 -0
  406. data/third_party/abseil-cpp/absl/strings/internal/cord_internal.h +387 -17
  407. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_flat.h +146 -0
  408. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring.cc +897 -0
  409. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring.h +589 -0
  410. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring_reader.h +114 -0
  411. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.cc +14 -0
  412. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.h +14 -0
  413. data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.cc +15 -1
  414. data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.h +19 -4
  415. data/third_party/abseil-cpp/absl/strings/internal/str_format/checker.h +14 -0
  416. data/third_party/abseil-cpp/absl/strings/internal/str_format/float_conversion.cc +36 -18
  417. data/third_party/abseil-cpp/absl/strings/internal/str_format/float_conversion.h +14 -0
  418. data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.cc +14 -0
  419. data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.h +14 -0
  420. data/third_party/abseil-cpp/absl/strings/internal/str_split_internal.h +15 -40
  421. data/third_party/abseil-cpp/absl/strings/internal/string_constant.h +64 -0
  422. data/third_party/abseil-cpp/absl/strings/match.cc +6 -3
  423. data/third_party/abseil-cpp/absl/strings/match.h +16 -6
  424. data/third_party/abseil-cpp/absl/strings/numbers.cc +132 -4
  425. data/third_party/abseil-cpp/absl/strings/numbers.h +10 -10
  426. data/third_party/abseil-cpp/absl/strings/str_join.h +1 -1
  427. data/third_party/abseil-cpp/absl/strings/str_split.h +38 -4
  428. data/third_party/abseil-cpp/absl/synchronization/internal/futex.h +154 -0
  429. data/third_party/abseil-cpp/absl/synchronization/internal/kernel_timeout.h +2 -1
  430. data/third_party/abseil-cpp/absl/synchronization/internal/per_thread_sem.cc +2 -2
  431. data/third_party/abseil-cpp/absl/synchronization/internal/per_thread_sem.h +4 -4
  432. data/third_party/abseil-cpp/absl/synchronization/internal/waiter.cc +1 -65
  433. data/third_party/abseil-cpp/absl/synchronization/internal/waiter.h +2 -6
  434. data/third_party/abseil-cpp/absl/synchronization/mutex.cc +71 -59
  435. data/third_party/abseil-cpp/absl/synchronization/mutex.h +79 -62
  436. data/third_party/abseil-cpp/absl/time/clock.cc +146 -130
  437. data/third_party/abseil-cpp/absl/time/clock.h +2 -2
  438. data/third_party/abseil-cpp/absl/time/duration.cc +3 -2
  439. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/civil_time_detail.h +7 -11
  440. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_libc.cc +7 -1
  441. data/third_party/abseil-cpp/absl/time/internal/cctz/src/tzfile.h +4 -4
  442. data/third_party/abseil-cpp/absl/time/time.cc +4 -3
  443. data/third_party/abseil-cpp/absl/time/time.h +26 -24
  444. data/third_party/abseil-cpp/absl/types/internal/variant.h +1 -1
  445. data/third_party/abseil-cpp/absl/types/variant.h +9 -4
  446. data/third_party/boringssl-with-bazel/err_data.c +477 -461
  447. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_bool.c +1 -1
  448. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_object.c +1 -1
  449. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_type.c +18 -8
  450. data/third_party/boringssl-with-bazel/src/crypto/asn1/asn1_lib.c +1 -2
  451. data/third_party/boringssl-with-bazel/src/crypto/asn1/asn1_locl.h +5 -0
  452. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_enc.c +1 -1
  453. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_fre.c +1 -1
  454. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_tls.c +1 -88
  455. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/internal.h +14 -3
  456. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/tls_cbc.c +119 -273
  457. data/third_party/boringssl-with-bazel/src/crypto/err/err.c +87 -80
  458. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bcm.c +1 -0
  459. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/internal.h +1 -1
  460. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/cipher.c +11 -3
  461. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/e_aes.c +25 -2
  462. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/digest/digests.c +10 -2
  463. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/digest/md32_common.h +4 -43
  464. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec.c +4 -0
  465. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec_key.c +0 -1
  466. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/internal.h +0 -4
  467. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdsa/ecdsa.c +104 -93
  468. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdsa/internal.h +39 -0
  469. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/md4/md4.c +43 -46
  470. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/md5/md5.c +43 -46
  471. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/cbc.c +33 -22
  472. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/cfb.c +9 -8
  473. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/ctr.c +9 -8
  474. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/gcm.c +17 -13
  475. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/internal.h +1 -22
  476. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/ofb.c +2 -1
  477. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/urandom.c +26 -7
  478. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/self_check/fips.c +79 -0
  479. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/self_check/self_check.c +14 -9
  480. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha1.c +45 -48
  481. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha256.c +38 -43
  482. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha512.c +37 -45
  483. data/third_party/boringssl-with-bazel/src/crypto/hpke/hpke.c +103 -42
  484. data/third_party/boringssl-with-bazel/src/crypto/hpke/internal.h +58 -37
  485. data/third_party/boringssl-with-bazel/src/crypto/internal.h +65 -0
  486. data/third_party/boringssl-with-bazel/src/crypto/mem.c +14 -0
  487. data/third_party/boringssl-with-bazel/src/crypto/obj/obj.c +3 -3
  488. data/third_party/boringssl-with-bazel/src/crypto/pkcs7/pkcs7_x509.c +1 -1
  489. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8_x509.c +95 -48
  490. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/rand_extra.c +1 -1
  491. data/third_party/boringssl-with-bazel/src/crypto/thread_pthread.c +0 -28
  492. data/third_party/boringssl-with-bazel/src/crypto/x509/internal.h +19 -0
  493. data/third_party/boringssl-with-bazel/src/crypto/x509/t_req.c +2 -0
  494. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_att.c +19 -25
  495. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_cmp.c +3 -2
  496. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_req.c +39 -89
  497. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_set.c +9 -16
  498. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_vfy.c +1 -1
  499. data/third_party/boringssl-with-bazel/src/crypto/x509/x_algor.c +21 -17
  500. data/third_party/boringssl-with-bazel/src/crypto/x509/x_attrib.c +7 -25
  501. data/third_party/boringssl-with-bazel/src/crypto/x509/x_crl.c +5 -0
  502. data/third_party/boringssl-with-bazel/src/crypto/x509/x_pubkey.c +25 -22
  503. data/third_party/boringssl-with-bazel/src/crypto/x509/x_val.c +2 -0
  504. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_cpols.c +2 -4
  505. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_purp.c +1 -1
  506. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_skey.c +1 -0
  507. data/third_party/boringssl-with-bazel/src/include/openssl/aead.h +0 -3
  508. data/third_party/boringssl-with-bazel/src/include/openssl/asn1.h +120 -41
  509. data/third_party/boringssl-with-bazel/src/include/openssl/base.h +9 -0
  510. data/third_party/boringssl-with-bazel/src/include/openssl/cipher.h +0 -8
  511. data/third_party/boringssl-with-bazel/src/include/openssl/crypto.h +24 -4
  512. data/third_party/boringssl-with-bazel/src/include/openssl/ec.h +5 -2
  513. data/third_party/boringssl-with-bazel/src/include/openssl/ecdsa.h +19 -0
  514. data/third_party/boringssl-with-bazel/src/include/openssl/err.h +3 -2
  515. data/third_party/boringssl-with-bazel/src/include/openssl/evp.h +1 -38
  516. data/third_party/boringssl-with-bazel/src/{crypto/x509/x509_r2x.c → include/openssl/evp_errors.h} +41 -58
  517. data/third_party/boringssl-with-bazel/src/include/openssl/obj.h +24 -5
  518. data/third_party/boringssl-with-bazel/src/include/openssl/pkcs7.h +2 -0
  519. data/third_party/boringssl-with-bazel/src/include/openssl/pkcs8.h +9 -1
  520. data/third_party/boringssl-with-bazel/src/include/openssl/rand.h +2 -2
  521. data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +185 -17
  522. data/third_party/boringssl-with-bazel/src/include/openssl/tls1.h +1 -0
  523. data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +416 -121
  524. data/third_party/boringssl-with-bazel/src/include/openssl/x509v3.h +2 -0
  525. data/third_party/boringssl-with-bazel/src/ssl/d1_both.cc +5 -0
  526. data/third_party/boringssl-with-bazel/src/ssl/encrypted_client_hello.cc +444 -0
  527. data/third_party/boringssl-with-bazel/src/ssl/handoff.cc +244 -1
  528. data/third_party/boringssl-with-bazel/src/ssl/handshake.cc +43 -12
  529. data/third_party/boringssl-with-bazel/src/ssl/handshake_server.cc +149 -8
  530. data/third_party/boringssl-with-bazel/src/ssl/internal.h +220 -46
  531. data/third_party/boringssl-with-bazel/src/ssl/s3_both.cc +7 -1
  532. data/third_party/boringssl-with-bazel/src/ssl/ssl_cert.cc +4 -6
  533. data/third_party/boringssl-with-bazel/src/ssl/ssl_key_share.cc +23 -26
  534. data/third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc +74 -15
  535. data/third_party/boringssl-with-bazel/src/ssl/t1_lib.cc +98 -64
  536. data/third_party/boringssl-with-bazel/src/ssl/tls13_both.cc +34 -4
  537. data/third_party/boringssl-with-bazel/src/ssl/tls13_server.cc +205 -100
  538. data/third_party/boringssl-with-bazel/src/ssl/tls_method.cc +4 -2
  539. metadata +68 -45
  540. data/src/core/lib/iomgr/poller/eventmanager_libuv.cc +0 -88
  541. data/src/core/lib/iomgr/poller/eventmanager_libuv.h +0 -88
  542. data/third_party/abseil-cpp/absl/base/internal/bits.h +0 -219
  543. data/third_party/abseil-cpp/absl/synchronization/internal/mutex_nonprod.inc +0 -249
  544. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/is_fips.c +0 -29
@@ -0,0 +1,111 @@
1
+ // Copyright 2020 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
+ // https://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 "absl/hash/internal/wyhash.h"
16
+
17
+ #include "absl/base/internal/unaligned_access.h"
18
+ #include "absl/numeric/int128.h"
19
+
20
+ namespace absl {
21
+ ABSL_NAMESPACE_BEGIN
22
+ namespace hash_internal {
23
+
24
+ static uint64_t WyhashMix(uint64_t v0, uint64_t v1) {
25
+ absl::uint128 p = v0;
26
+ p *= v1;
27
+ return absl::Uint128Low64(p) ^ absl::Uint128High64(p);
28
+ }
29
+
30
+ uint64_t Wyhash(const void* data, size_t len, uint64_t seed,
31
+ const uint64_t salt[]) {
32
+ const uint8_t* ptr = static_cast<const uint8_t*>(data);
33
+ uint64_t starting_length = static_cast<uint64_t>(len);
34
+ uint64_t current_state = seed ^ salt[0];
35
+
36
+ if (len > 64) {
37
+ // If we have more than 64 bytes, we're going to handle chunks of 64
38
+ // bytes at a time. We're going to build up two separate hash states
39
+ // which we will then hash together.
40
+ uint64_t duplicated_state = current_state;
41
+
42
+ do {
43
+ uint64_t a = absl::base_internal::UnalignedLoad64(ptr);
44
+ uint64_t b = absl::base_internal::UnalignedLoad64(ptr + 8);
45
+ uint64_t c = absl::base_internal::UnalignedLoad64(ptr + 16);
46
+ uint64_t d = absl::base_internal::UnalignedLoad64(ptr + 24);
47
+ uint64_t e = absl::base_internal::UnalignedLoad64(ptr + 32);
48
+ uint64_t f = absl::base_internal::UnalignedLoad64(ptr + 40);
49
+ uint64_t g = absl::base_internal::UnalignedLoad64(ptr + 48);
50
+ uint64_t h = absl::base_internal::UnalignedLoad64(ptr + 56);
51
+
52
+ uint64_t cs0 = WyhashMix(a ^ salt[1], b ^ current_state);
53
+ uint64_t cs1 = WyhashMix(c ^ salt[2], d ^ current_state);
54
+ current_state = (cs0 ^ cs1);
55
+
56
+ uint64_t ds0 = WyhashMix(e ^ salt[3], f ^ duplicated_state);
57
+ uint64_t ds1 = WyhashMix(g ^ salt[4], h ^ duplicated_state);
58
+ duplicated_state = (ds0 ^ ds1);
59
+
60
+ ptr += 64;
61
+ len -= 64;
62
+ } while (len > 64);
63
+
64
+ current_state = current_state ^ duplicated_state;
65
+ }
66
+
67
+ // We now have a data `ptr` with at most 64 bytes and the current state
68
+ // of the hashing state machine stored in current_state.
69
+ while (len > 16) {
70
+ uint64_t a = absl::base_internal::UnalignedLoad64(ptr);
71
+ uint64_t b = absl::base_internal::UnalignedLoad64(ptr + 8);
72
+
73
+ current_state = WyhashMix(a ^ salt[1], b ^ current_state);
74
+
75
+ ptr += 16;
76
+ len -= 16;
77
+ }
78
+
79
+ // We now have a data `ptr` with at most 16 bytes.
80
+ uint64_t a = 0;
81
+ uint64_t b = 0;
82
+ if (len > 8) {
83
+ // When we have at least 9 and at most 16 bytes, set A to the first 64
84
+ // bits of the input and B to the last 64 bits of the input. Yes, they will
85
+ // overlap in the middle if we are working with less than the full 16
86
+ // bytes.
87
+ a = absl::base_internal::UnalignedLoad64(ptr);
88
+ b = absl::base_internal::UnalignedLoad64(ptr + len - 8);
89
+ } else if (len > 3) {
90
+ // If we have at least 4 and at most 8 bytes, set A to the first 32
91
+ // bits and B to the last 32 bits.
92
+ a = absl::base_internal::UnalignedLoad32(ptr);
93
+ b = absl::base_internal::UnalignedLoad32(ptr + len - 4);
94
+ } else if (len > 0) {
95
+ // If we have at least 1 and at most 3 bytes, read all of the provided
96
+ // bits into A, with some adjustments.
97
+ a = ((ptr[0] << 16) | (ptr[len >> 1] << 8) | ptr[len - 1]);
98
+ b = 0;
99
+ } else {
100
+ a = 0;
101
+ b = 0;
102
+ }
103
+
104
+ uint64_t w = WyhashMix(a ^ salt[1], b ^ current_state);
105
+ uint64_t z = salt[1] ^ starting_length;
106
+ return WyhashMix(w, z);
107
+ }
108
+
109
+ } // namespace hash_internal
110
+ ABSL_NAMESPACE_END
111
+ } // namespace absl
@@ -0,0 +1,48 @@
1
+ // Copyright 2020 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
+ // https://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 file provides the Google-internal implementation of the Wyhash
16
+ // algorithm.
17
+ //
18
+ // Wyhash is a fast hash function for hash tables, the fastest we've currently
19
+ // (late 2020) found that passes the SMHasher tests. The algorithm relies on
20
+ // intrinsic 128-bit multiplication for speed. This is not meant to be secure -
21
+ // just fast.
22
+
23
+ #ifndef ABSL_HASH_INTERNAL_WYHASH_H_
24
+ #define ABSL_HASH_INTERNAL_WYHASH_H_
25
+
26
+ #include <stdint.h>
27
+ #include <stdlib.h>
28
+
29
+ #include "absl/base/config.h"
30
+
31
+ namespace absl {
32
+ ABSL_NAMESPACE_BEGIN
33
+ namespace hash_internal {
34
+
35
+ // Hash function for a byte array. A 64-bit seed and a set of five 64-bit
36
+ // integers are hashed into the result.
37
+ //
38
+ // To allow all hashable types (including string_view and Span) to depend on
39
+ // this algoritm, we keep the API low-level, with as few dependencies as
40
+ // possible.
41
+ uint64_t Wyhash(const void* data, size_t len, uint64_t seed,
42
+ const uint64_t salt[5]);
43
+
44
+ } // namespace hash_internal
45
+ ABSL_NAMESPACE_END
46
+ } // namespace absl
47
+
48
+ #endif // ABSL_HASH_INTERNAL_WYHASH_H_
@@ -610,8 +610,22 @@ using common_type_t = typename std::common_type<T...>::type;
610
610
  template <typename T>
611
611
  using underlying_type_t = typename std::underlying_type<T>::type;
612
612
 
613
- template <typename T>
614
- using result_of_t = typename std::result_of<T>::type;
613
+
614
+ namespace type_traits_internal {
615
+
616
+ #if __cplusplus >= 201703L
617
+ // std::result_of is deprecated (C++17) or removed (C++20)
618
+ template<typename> struct result_of;
619
+ template<typename F, typename... Args>
620
+ struct result_of<F(Args...)> : std::invoke_result<F, Args...> {};
621
+ #else
622
+ template<typename F> using result_of = std::result_of<F>;
623
+ #endif
624
+
625
+ } // namespace type_traits_internal
626
+
627
+ template<typename F>
628
+ using result_of_t = typename type_traits_internal::result_of<F>::type;
615
629
 
616
630
  namespace type_traits_internal {
617
631
  // In MSVC we can't probe std::hash or stdext::hash because it triggers a
@@ -0,0 +1,177 @@
1
+ // Copyright 2020 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
+ // https://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
+ // File: bits.h
17
+ // -----------------------------------------------------------------------------
18
+ //
19
+ // This file contains implementations of C++20's bitwise math functions, as
20
+ // defined by:
21
+ //
22
+ // P0553R4:
23
+ // http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/p0553r4.html
24
+ // P0556R3:
25
+ // http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p0556r3.html
26
+ // P1355R2:
27
+ // http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/p1355r2.html
28
+ // P1956R1:
29
+ // http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2020/p1956r1.pdf
30
+ //
31
+ // When using a standard library that implements these functions, we use the
32
+ // standard library's implementation.
33
+
34
+ #ifndef ABSL_NUMERIC_BITS_H_
35
+ #define ABSL_NUMERIC_BITS_H_
36
+
37
+ #include <cstdint>
38
+ #include <limits>
39
+ #include <type_traits>
40
+
41
+ #if (defined(__cpp_lib_int_pow2) && __cpp_lib_int_pow2 >= 202002L) || \
42
+ (defined(__cpp_lib_bitops) && __cpp_lib_bitops >= 201907L)
43
+ #include <bit>
44
+ #endif
45
+
46
+ #include "absl/base/attributes.h"
47
+ #include "absl/base/config.h"
48
+ #include "absl/numeric/internal/bits.h"
49
+
50
+ namespace absl {
51
+ ABSL_NAMESPACE_BEGIN
52
+
53
+ #if !(defined(__cpp_lib_bitops) && __cpp_lib_bitops >= 201907L)
54
+ // rotating
55
+ template <class T>
56
+ ABSL_MUST_USE_RESULT constexpr
57
+ typename std::enable_if<std::is_unsigned<T>::value, T>::type
58
+ rotl(T x, int s) noexcept {
59
+ return numeric_internal::RotateLeft(x, s);
60
+ }
61
+
62
+ template <class T>
63
+ ABSL_MUST_USE_RESULT constexpr
64
+ typename std::enable_if<std::is_unsigned<T>::value, T>::type
65
+ rotr(T x, int s) noexcept {
66
+ return numeric_internal::RotateRight(x, s);
67
+ }
68
+
69
+ // Counting functions
70
+ //
71
+ // While these functions are typically constexpr, on some platforms, they may
72
+ // not be marked as constexpr due to constraints of the compiler/available
73
+ // intrinsics.
74
+ template <class T>
75
+ ABSL_INTERNAL_CONSTEXPR_CLZ inline
76
+ typename std::enable_if<std::is_unsigned<T>::value, int>::type
77
+ countl_zero(T x) noexcept {
78
+ return numeric_internal::CountLeadingZeroes(x);
79
+ }
80
+
81
+ template <class T>
82
+ ABSL_INTERNAL_CONSTEXPR_CLZ inline
83
+ typename std::enable_if<std::is_unsigned<T>::value, int>::type
84
+ countl_one(T x) noexcept {
85
+ // Avoid integer promotion to a wider type
86
+ return countl_zero(static_cast<T>(~x));
87
+ }
88
+
89
+ template <class T>
90
+ ABSL_INTERNAL_CONSTEXPR_CTZ inline
91
+ typename std::enable_if<std::is_unsigned<T>::value, int>::type
92
+ countr_zero(T x) noexcept {
93
+ return numeric_internal::CountTrailingZeroes(x);
94
+ }
95
+
96
+ template <class T>
97
+ ABSL_INTERNAL_CONSTEXPR_CTZ inline
98
+ typename std::enable_if<std::is_unsigned<T>::value, int>::type
99
+ countr_one(T x) noexcept {
100
+ // Avoid integer promotion to a wider type
101
+ return countr_zero(static_cast<T>(~x));
102
+ }
103
+
104
+ template <class T>
105
+ ABSL_INTERNAL_CONSTEXPR_POPCOUNT inline
106
+ typename std::enable_if<std::is_unsigned<T>::value, int>::type
107
+ popcount(T x) noexcept {
108
+ return numeric_internal::Popcount(x);
109
+ }
110
+ #else // defined(__cpp_lib_bitops) && __cpp_lib_bitops >= 201907L
111
+
112
+ using std::countl_one;
113
+ using std::countl_zero;
114
+ using std::countr_one;
115
+ using std::countr_zero;
116
+ using std::popcount;
117
+ using std::rotl;
118
+ using std::rotr;
119
+
120
+ #endif
121
+
122
+ #if !(defined(__cpp_lib_int_pow2) && __cpp_lib_int_pow2 >= 202002L)
123
+ // Returns: true if x is an integral power of two; false otherwise.
124
+ template <class T>
125
+ constexpr inline typename std::enable_if<std::is_unsigned<T>::value, bool>::type
126
+ has_single_bit(T x) noexcept {
127
+ return x != 0 && (x & (x - 1)) == 0;
128
+ }
129
+
130
+ // Returns: If x == 0, 0; otherwise one plus the base-2 logarithm of x, with any
131
+ // fractional part discarded.
132
+ template <class T>
133
+ ABSL_INTERNAL_CONSTEXPR_CLZ inline
134
+ typename std::enable_if<std::is_unsigned<T>::value, T>::type
135
+ bit_width(T x) noexcept {
136
+ return std::numeric_limits<T>::digits - countl_zero(x);
137
+ }
138
+
139
+ // Returns: If x == 0, 0; otherwise the maximal value y such that
140
+ // has_single_bit(y) is true and y <= x.
141
+ template <class T>
142
+ ABSL_INTERNAL_CONSTEXPR_CLZ inline
143
+ typename std::enable_if<std::is_unsigned<T>::value, T>::type
144
+ bit_floor(T x) noexcept {
145
+ return x == 0 ? 0 : T{1} << (bit_width(x) - 1);
146
+ }
147
+
148
+ // Returns: N, where N is the smallest power of 2 greater than or equal to x.
149
+ //
150
+ // Preconditions: N is representable as a value of type T.
151
+ template <class T>
152
+ ABSL_INTERNAL_CONSTEXPR_CLZ inline
153
+ typename std::enable_if<std::is_unsigned<T>::value, T>::type
154
+ bit_ceil(T x) {
155
+ // If T is narrower than unsigned, T{1} << bit_width will be promoted. We
156
+ // want to force it to wraparound so that bit_ceil of an invalid value are not
157
+ // core constant expressions.
158
+ //
159
+ // BitCeilNonPowerOf2 triggers an overflow in constexpr contexts if we would
160
+ // undergo promotion to unsigned but not fit the result into T without
161
+ // truncation.
162
+ return has_single_bit(x) ? T{1} << (bit_width(x) - 1)
163
+ : numeric_internal::BitCeilNonPowerOf2(x);
164
+ }
165
+ #else // defined(__cpp_lib_int_pow2) && __cpp_lib_int_pow2 >= 202002L
166
+
167
+ using std::bit_ceil;
168
+ using std::bit_floor;
169
+ using std::bit_width;
170
+ using std::has_single_bit;
171
+
172
+ #endif
173
+
174
+ ABSL_NAMESPACE_END
175
+ } // namespace absl
176
+
177
+ #endif // ABSL_NUMERIC_BITS_H_
@@ -23,8 +23,8 @@
23
23
  #include <string>
24
24
  #include <type_traits>
25
25
 
26
- #include "absl/base/internal/bits.h"
27
26
  #include "absl/base/optimization.h"
27
+ #include "absl/numeric/bits.h"
28
28
 
29
29
  namespace absl {
30
30
  ABSL_NAMESPACE_BEGIN
@@ -43,11 +43,11 @@ namespace {
43
43
  inline ABSL_ATTRIBUTE_ALWAYS_INLINE int Fls128(uint128 n) {
44
44
  if (uint64_t hi = Uint128High64(n)) {
45
45
  ABSL_INTERNAL_ASSUME(hi != 0);
46
- return 127 - base_internal::CountLeadingZeros64(hi);
46
+ return 127 - countl_zero(hi);
47
47
  }
48
48
  const uint64_t low = Uint128Low64(n);
49
49
  ABSL_INTERNAL_ASSUME(low != 0);
50
- return 63 - base_internal::CountLeadingZeros64(low);
50
+ return 63 - countl_zero(low);
51
51
  }
52
52
 
53
53
  // Long division/modulo for uint128 implemented using the shift-subtract
@@ -0,0 +1,358 @@
1
+ // Copyright 2020 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
+ // https://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
+ #ifndef ABSL_NUMERIC_INTERNAL_BITS_H_
16
+ #define ABSL_NUMERIC_INTERNAL_BITS_H_
17
+
18
+ #include <cstdint>
19
+ #include <limits>
20
+ #include <type_traits>
21
+
22
+ // Clang on Windows has __builtin_clzll; otherwise we need to use the
23
+ // windows intrinsic functions.
24
+ #if defined(_MSC_VER) && !defined(__clang__)
25
+ #include <intrin.h>
26
+ #endif
27
+
28
+ #include "absl/base/attributes.h"
29
+ #include "absl/base/config.h"
30
+
31
+ #if defined(__GNUC__) && !defined(__clang__)
32
+ // GCC
33
+ #define ABSL_NUMERIC_INTERNAL_HAVE_BUILTIN_OR_GCC(x) 1
34
+ #else
35
+ #define ABSL_NUMERIC_INTERNAL_HAVE_BUILTIN_OR_GCC(x) ABSL_HAVE_BUILTIN(x)
36
+ #endif
37
+
38
+ #if ABSL_NUMERIC_INTERNAL_HAVE_BUILTIN_OR_GCC(__builtin_popcountl) && \
39
+ ABSL_NUMERIC_INTERNAL_HAVE_BUILTIN_OR_GCC(__builtin_popcountll)
40
+ #define ABSL_INTERNAL_CONSTEXPR_POPCOUNT constexpr
41
+ #define ABSL_INTERNAL_HAS_CONSTEXPR_POPCOUNT 1
42
+ #else
43
+ #define ABSL_INTERNAL_CONSTEXPR_POPCOUNT
44
+ #define ABSL_INTERNAL_HAS_CONSTEXPR_POPCOUNT 0
45
+ #endif
46
+
47
+ #if ABSL_NUMERIC_INTERNAL_HAVE_BUILTIN_OR_GCC(__builtin_clz) && \
48
+ ABSL_NUMERIC_INTERNAL_HAVE_BUILTIN_OR_GCC(__builtin_clzll)
49
+ #define ABSL_INTERNAL_CONSTEXPR_CLZ constexpr
50
+ #define ABSL_INTERNAL_HAS_CONSTEXPR_CLZ 1
51
+ #else
52
+ #define ABSL_INTERNAL_CONSTEXPR_CLZ
53
+ #define ABSL_INTERNAL_HAS_CONSTEXPR_CLZ 0
54
+ #endif
55
+
56
+ #if ABSL_NUMERIC_INTERNAL_HAVE_BUILTIN_OR_GCC(__builtin_ctz) && \
57
+ ABSL_NUMERIC_INTERNAL_HAVE_BUILTIN_OR_GCC(__builtin_ctzll)
58
+ #define ABSL_INTERNAL_CONSTEXPR_CTZ constexpr
59
+ #define ABSL_INTERNAL_HAS_CONSTEXPR_CTZ 1
60
+ #else
61
+ #define ABSL_INTERNAL_CONSTEXPR_CTZ
62
+ #define ABSL_INTERNAL_HAS_CONSTEXPR_CTZ 0
63
+ #endif
64
+
65
+ namespace absl {
66
+ ABSL_NAMESPACE_BEGIN
67
+ namespace numeric_internal {
68
+
69
+ constexpr bool IsPowerOf2(unsigned int x) noexcept {
70
+ return x != 0 && (x & (x - 1)) == 0;
71
+ }
72
+
73
+ template <class T>
74
+ ABSL_MUST_USE_RESULT ABSL_ATTRIBUTE_ALWAYS_INLINE constexpr T RotateRight(
75
+ T x, int s) noexcept {
76
+ static_assert(std::is_unsigned<T>::value, "T must be unsigned");
77
+ static_assert(IsPowerOf2(std::numeric_limits<T>::digits),
78
+ "T must have a power-of-2 size");
79
+
80
+ return static_cast<T>(x >> (s & (std::numeric_limits<T>::digits - 1))) |
81
+ static_cast<T>(x << ((-s) & (std::numeric_limits<T>::digits - 1)));
82
+ }
83
+
84
+ template <class T>
85
+ ABSL_MUST_USE_RESULT ABSL_ATTRIBUTE_ALWAYS_INLINE constexpr T RotateLeft(
86
+ T x, int s) noexcept {
87
+ static_assert(std::is_unsigned<T>::value, "T must be unsigned");
88
+ static_assert(IsPowerOf2(std::numeric_limits<T>::digits),
89
+ "T must have a power-of-2 size");
90
+
91
+ return static_cast<T>(x << (s & (std::numeric_limits<T>::digits - 1))) |
92
+ static_cast<T>(x >> ((-s) & (std::numeric_limits<T>::digits - 1)));
93
+ }
94
+
95
+ ABSL_ATTRIBUTE_ALWAYS_INLINE ABSL_INTERNAL_CONSTEXPR_POPCOUNT inline int
96
+ Popcount32(uint32_t x) noexcept {
97
+ #if ABSL_NUMERIC_INTERNAL_HAVE_BUILTIN_OR_GCC(__builtin_popcount)
98
+ static_assert(sizeof(unsigned int) == sizeof(x),
99
+ "__builtin_popcount does not take 32-bit arg");
100
+ return __builtin_popcount(x);
101
+ #else
102
+ x -= ((x >> 1) & 0x55555555);
103
+ x = ((x >> 2) & 0x33333333) + (x & 0x33333333);
104
+ return static_cast<int>((((x + (x >> 4)) & 0xF0F0F0F) * 0x1010101) >> 24);
105
+ #endif
106
+ }
107
+
108
+ ABSL_ATTRIBUTE_ALWAYS_INLINE ABSL_INTERNAL_CONSTEXPR_POPCOUNT inline int
109
+ Popcount64(uint64_t x) noexcept {
110
+ #if ABSL_NUMERIC_INTERNAL_HAVE_BUILTIN_OR_GCC(__builtin_popcountll)
111
+ static_assert(sizeof(unsigned long long) == sizeof(x), // NOLINT(runtime/int)
112
+ "__builtin_popcount does not take 64-bit arg");
113
+ return __builtin_popcountll(x);
114
+ #else
115
+ x -= (x >> 1) & 0x5555555555555555ULL;
116
+ x = ((x >> 2) & 0x3333333333333333ULL) + (x & 0x3333333333333333ULL);
117
+ return static_cast<int>(
118
+ (((x + (x >> 4)) & 0xF0F0F0F0F0F0F0FULL) * 0x101010101010101ULL) >> 56);
119
+ #endif
120
+ }
121
+
122
+ template <class T>
123
+ ABSL_ATTRIBUTE_ALWAYS_INLINE ABSL_INTERNAL_CONSTEXPR_POPCOUNT inline int
124
+ Popcount(T x) noexcept {
125
+ static_assert(std::is_unsigned<T>::value, "T must be unsigned");
126
+ static_assert(IsPowerOf2(std::numeric_limits<T>::digits),
127
+ "T must have a power-of-2 size");
128
+ static_assert(sizeof(x) <= sizeof(uint64_t), "T is too large");
129
+ return sizeof(x) <= sizeof(uint32_t) ? Popcount32(x) : Popcount64(x);
130
+ }
131
+
132
+ ABSL_ATTRIBUTE_ALWAYS_INLINE ABSL_INTERNAL_CONSTEXPR_CLZ inline int
133
+ CountLeadingZeroes32(uint32_t x) {
134
+ #if ABSL_NUMERIC_INTERNAL_HAVE_BUILTIN_OR_GCC(__builtin_clz)
135
+ // Use __builtin_clz, which uses the following instructions:
136
+ // x86: bsr, lzcnt
137
+ // ARM64: clz
138
+ // PPC: cntlzd
139
+
140
+ static_assert(sizeof(unsigned int) == sizeof(x),
141
+ "__builtin_clz does not take 32-bit arg");
142
+ // Handle 0 as a special case because __builtin_clz(0) is undefined.
143
+ return x == 0 ? 32 : __builtin_clz(x);
144
+ #elif defined(_MSC_VER) && !defined(__clang__)
145
+ unsigned long result = 0; // NOLINT(runtime/int)
146
+ if (_BitScanReverse(&result, x)) {
147
+ return 31 - result;
148
+ }
149
+ return 32;
150
+ #else
151
+ int zeroes = 28;
152
+ if (x >> 16) {
153
+ zeroes -= 16;
154
+ x >>= 16;
155
+ }
156
+ if (x >> 8) {
157
+ zeroes -= 8;
158
+ x >>= 8;
159
+ }
160
+ if (x >> 4) {
161
+ zeroes -= 4;
162
+ x >>= 4;
163
+ }
164
+ return "\4\3\2\2\1\1\1\1\0\0\0\0\0\0\0"[x] + zeroes;
165
+ #endif
166
+ }
167
+
168
+ ABSL_ATTRIBUTE_ALWAYS_INLINE ABSL_INTERNAL_CONSTEXPR_CLZ inline int
169
+ CountLeadingZeroes16(uint16_t x) {
170
+ #if ABSL_HAVE_BUILTIN(__builtin_clzs)
171
+ static_assert(sizeof(unsigned short) == sizeof(x), // NOLINT(runtime/int)
172
+ "__builtin_clzs does not take 16-bit arg");
173
+ return x == 0 ? 16 : __builtin_clzs(x);
174
+ #else
175
+ return CountLeadingZeroes32(x) - 16;
176
+ #endif
177
+ }
178
+
179
+ ABSL_ATTRIBUTE_ALWAYS_INLINE ABSL_INTERNAL_CONSTEXPR_CLZ inline int
180
+ CountLeadingZeroes64(uint64_t x) {
181
+ #if ABSL_NUMERIC_INTERNAL_HAVE_BUILTIN_OR_GCC(__builtin_clzll)
182
+ // Use __builtin_clzll, which uses the following instructions:
183
+ // x86: bsr, lzcnt
184
+ // ARM64: clz
185
+ // PPC: cntlzd
186
+ static_assert(sizeof(unsigned long long) == sizeof(x), // NOLINT(runtime/int)
187
+ "__builtin_clzll does not take 64-bit arg");
188
+
189
+ // Handle 0 as a special case because __builtin_clzll(0) is undefined.
190
+ return x == 0 ? 64 : __builtin_clzll(x);
191
+ #elif defined(_MSC_VER) && !defined(__clang__) && \
192
+ (defined(_M_X64) || defined(_M_ARM64))
193
+ // MSVC does not have __buitin_clzll. Use _BitScanReverse64.
194
+ unsigned long result = 0; // NOLINT(runtime/int)
195
+ if (_BitScanReverse64(&result, x)) {
196
+ return 63 - result;
197
+ }
198
+ return 64;
199
+ #elif defined(_MSC_VER) && !defined(__clang__)
200
+ // MSVC does not have __buitin_clzll. Compose two calls to _BitScanReverse
201
+ unsigned long result = 0; // NOLINT(runtime/int)
202
+ if ((x >> 32) &&
203
+ _BitScanReverse(&result, static_cast<unsigned long>(x >> 32))) {
204
+ return 31 - result;
205
+ }
206
+ if (_BitScanReverse(&result, static_cast<unsigned long>(x))) {
207
+ return 63 - result;
208
+ }
209
+ return 64;
210
+ #else
211
+ int zeroes = 60;
212
+ if (x >> 32) {
213
+ zeroes -= 32;
214
+ x >>= 32;
215
+ }
216
+ if (x >> 16) {
217
+ zeroes -= 16;
218
+ x >>= 16;
219
+ }
220
+ if (x >> 8) {
221
+ zeroes -= 8;
222
+ x >>= 8;
223
+ }
224
+ if (x >> 4) {
225
+ zeroes -= 4;
226
+ x >>= 4;
227
+ }
228
+ return "\4\3\2\2\1\1\1\1\0\0\0\0\0\0\0"[x] + zeroes;
229
+ #endif
230
+ }
231
+
232
+ template <typename T>
233
+ ABSL_ATTRIBUTE_ALWAYS_INLINE ABSL_INTERNAL_CONSTEXPR_CLZ inline int
234
+ CountLeadingZeroes(T x) {
235
+ static_assert(std::is_unsigned<T>::value, "T must be unsigned");
236
+ static_assert(IsPowerOf2(std::numeric_limits<T>::digits),
237
+ "T must have a power-of-2 size");
238
+ static_assert(sizeof(T) <= sizeof(uint64_t), "T too large");
239
+ return sizeof(T) <= sizeof(uint16_t)
240
+ ? CountLeadingZeroes16(static_cast<uint16_t>(x)) -
241
+ (std::numeric_limits<uint16_t>::digits -
242
+ std::numeric_limits<T>::digits)
243
+ : (sizeof(T) <= sizeof(uint32_t)
244
+ ? CountLeadingZeroes32(static_cast<uint32_t>(x)) -
245
+ (std::numeric_limits<uint32_t>::digits -
246
+ std::numeric_limits<T>::digits)
247
+ : CountLeadingZeroes64(x));
248
+ }
249
+
250
+ ABSL_ATTRIBUTE_ALWAYS_INLINE ABSL_INTERNAL_CONSTEXPR_CTZ inline int
251
+ CountTrailingZeroesNonzero32(uint32_t x) {
252
+ #if ABSL_NUMERIC_INTERNAL_HAVE_BUILTIN_OR_GCC(__builtin_ctz)
253
+ static_assert(sizeof(unsigned int) == sizeof(x),
254
+ "__builtin_ctz does not take 32-bit arg");
255
+ return __builtin_ctz(x);
256
+ #elif defined(_MSC_VER) && !defined(__clang__)
257
+ unsigned long result = 0; // NOLINT(runtime/int)
258
+ _BitScanForward(&result, x);
259
+ return result;
260
+ #else
261
+ int c = 31;
262
+ x &= ~x + 1;
263
+ if (x & 0x0000FFFF) c -= 16;
264
+ if (x & 0x00FF00FF) c -= 8;
265
+ if (x & 0x0F0F0F0F) c -= 4;
266
+ if (x & 0x33333333) c -= 2;
267
+ if (x & 0x55555555) c -= 1;
268
+ return c;
269
+ #endif
270
+ }
271
+
272
+ ABSL_ATTRIBUTE_ALWAYS_INLINE ABSL_INTERNAL_CONSTEXPR_CTZ inline int
273
+ CountTrailingZeroesNonzero64(uint64_t x) {
274
+ #if ABSL_NUMERIC_INTERNAL_HAVE_BUILTIN_OR_GCC(__builtin_ctzll)
275
+ static_assert(sizeof(unsigned long long) == sizeof(x), // NOLINT(runtime/int)
276
+ "__builtin_ctzll does not take 64-bit arg");
277
+ return __builtin_ctzll(x);
278
+ #elif defined(_MSC_VER) && !defined(__clang__) && \
279
+ (defined(_M_X64) || defined(_M_ARM64))
280
+ unsigned long result = 0; // NOLINT(runtime/int)
281
+ _BitScanForward64(&result, x);
282
+ return result;
283
+ #elif defined(_MSC_VER) && !defined(__clang__)
284
+ unsigned long result = 0; // NOLINT(runtime/int)
285
+ if (static_cast<uint32_t>(x) == 0) {
286
+ _BitScanForward(&result, static_cast<unsigned long>(x >> 32));
287
+ return result + 32;
288
+ }
289
+ _BitScanForward(&result, static_cast<unsigned long>(x));
290
+ return result;
291
+ #else
292
+ int c = 63;
293
+ x &= ~x + 1;
294
+ if (x & 0x00000000FFFFFFFF) c -= 32;
295
+ if (x & 0x0000FFFF0000FFFF) c -= 16;
296
+ if (x & 0x00FF00FF00FF00FF) c -= 8;
297
+ if (x & 0x0F0F0F0F0F0F0F0F) c -= 4;
298
+ if (x & 0x3333333333333333) c -= 2;
299
+ if (x & 0x5555555555555555) c -= 1;
300
+ return c;
301
+ #endif
302
+ }
303
+
304
+ ABSL_ATTRIBUTE_ALWAYS_INLINE ABSL_INTERNAL_CONSTEXPR_CTZ inline int
305
+ CountTrailingZeroesNonzero16(uint16_t x) {
306
+ #if ABSL_HAVE_BUILTIN(__builtin_ctzs)
307
+ static_assert(sizeof(unsigned short) == sizeof(x), // NOLINT(runtime/int)
308
+ "__builtin_ctzs does not take 16-bit arg");
309
+ return __builtin_ctzs(x);
310
+ #else
311
+ return CountTrailingZeroesNonzero32(x);
312
+ #endif
313
+ }
314
+
315
+ template <class T>
316
+ ABSL_ATTRIBUTE_ALWAYS_INLINE ABSL_INTERNAL_CONSTEXPR_CTZ inline int
317
+ CountTrailingZeroes(T x) noexcept {
318
+ static_assert(std::is_unsigned<T>::value, "T must be unsigned");
319
+ static_assert(IsPowerOf2(std::numeric_limits<T>::digits),
320
+ "T must have a power-of-2 size");
321
+ static_assert(sizeof(T) <= sizeof(uint64_t), "T too large");
322
+ return x == 0 ? std::numeric_limits<T>::digits
323
+ : (sizeof(T) <= sizeof(uint16_t)
324
+ ? CountTrailingZeroesNonzero16(static_cast<uint16_t>(x))
325
+ : (sizeof(T) <= sizeof(uint32_t)
326
+ ? CountTrailingZeroesNonzero32(
327
+ static_cast<uint32_t>(x))
328
+ : CountTrailingZeroesNonzero64(x)));
329
+ }
330
+
331
+ // If T is narrower than unsigned, T{1} << bit_width will be promoted. We
332
+ // want to force it to wraparound so that bit_ceil of an invalid value are not
333
+ // core constant expressions.
334
+ template <class T>
335
+ ABSL_ATTRIBUTE_ALWAYS_INLINE ABSL_INTERNAL_CONSTEXPR_CLZ inline
336
+ typename std::enable_if<std::is_unsigned<T>::value, T>::type
337
+ BitCeilPromotionHelper(T x, T promotion) {
338
+ return (T{1} << (x + promotion)) >> promotion;
339
+ }
340
+
341
+ template <class T>
342
+ ABSL_ATTRIBUTE_ALWAYS_INLINE ABSL_INTERNAL_CONSTEXPR_CLZ inline
343
+ typename std::enable_if<std::is_unsigned<T>::value, T>::type
344
+ BitCeilNonPowerOf2(T x) {
345
+ // If T is narrower than unsigned, it undergoes promotion to unsigned when we
346
+ // shift. We calculate the number of bits added by the wider type.
347
+ return BitCeilPromotionHelper(
348
+ static_cast<T>(std::numeric_limits<T>::digits - CountLeadingZeroes(x)),
349
+ T{sizeof(T) >= sizeof(unsigned) ? 0
350
+ : std::numeric_limits<unsigned>::digits -
351
+ std::numeric_limits<T>::digits});
352
+ }
353
+
354
+ } // namespace numeric_internal
355
+ ABSL_NAMESPACE_END
356
+ } // namespace absl
357
+
358
+ #endif // ABSL_NUMERIC_INTERNAL_BITS_H_