grpc 1.47.0 → 1.48.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 (574) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +105 -47
  3. data/include/grpc/compression.h +1 -1
  4. data/include/grpc/event_engine/event_engine.h +20 -11
  5. data/include/grpc/event_engine/slice_buffer.h +8 -2
  6. data/include/grpc/grpc.h +3 -3
  7. data/include/grpc/impl/codegen/compression_types.h +2 -1
  8. data/include/grpc/impl/codegen/connectivity_state.h +2 -1
  9. data/include/grpc/impl/codegen/gpr_types.h +2 -1
  10. data/include/grpc/impl/codegen/grpc_types.h +2 -1
  11. data/include/grpc/impl/codegen/port_platform.h +6 -3
  12. data/src/core/ext/filters/census/grpc_context.cc +3 -0
  13. data/src/core/ext/filters/channel_idle/channel_idle_filter.cc +17 -5
  14. data/src/core/ext/filters/channel_idle/channel_idle_filter.h +16 -0
  15. data/src/core/ext/filters/channel_idle/idle_filter_state.h +2 -0
  16. data/src/core/ext/filters/client_channel/backup_poller.cc +3 -1
  17. data/src/core/ext/filters/client_channel/channel_connectivity.cc +2 -2
  18. data/src/core/ext/filters/client_channel/client_channel.cc +51 -65
  19. data/src/core/ext/filters/client_channel/client_channel.h +19 -4
  20. data/src/core/ext/filters/client_channel/config_selector.h +1 -1
  21. data/src/core/ext/filters/client_channel/connector.h +1 -1
  22. data/src/core/ext/filters/client_channel/dynamic_filters.cc +6 -4
  23. data/src/core/ext/filters/client_channel/dynamic_filters.h +1 -1
  24. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.cc +1 -1
  25. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +2 -2
  26. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.h +1 -0
  27. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +73 -43
  28. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc +1 -1
  29. data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.cc +0 -1
  30. data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.cc +33 -35
  31. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +106 -112
  32. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +91 -42
  33. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +177 -138
  34. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.h +4 -1
  35. data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +47 -44
  36. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +118 -103
  37. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +83 -78
  38. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +57 -67
  39. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +2 -2
  40. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +5 -7
  41. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +13 -17
  42. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +3 -3
  43. data/src/core/ext/filters/client_channel/lb_policy.h +0 -7
  44. data/src/core/ext/filters/client_channel/lb_policy_registry.cc +3 -5
  45. data/src/core/ext/filters/client_channel/proxy_mapper_registry.cc +0 -1
  46. data/src/core/ext/filters/client_channel/resolver/binder/binder_resolver.cc +3 -1
  47. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +6 -6
  48. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +5 -5
  49. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +10 -5
  50. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +12 -3
  51. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +5 -5
  52. data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +3 -4
  53. data/src/core/ext/filters/client_channel/resolver/polling_resolver.cc +1 -1
  54. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +1 -0
  55. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +24 -15
  56. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.h +3 -1
  57. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +7 -7
  58. data/src/core/ext/filters/client_channel/retry_filter.cc +35 -36
  59. data/src/core/ext/filters/client_channel/retry_filter.h +1 -0
  60. data/src/core/ext/filters/client_channel/retry_service_config.cc +4 -4
  61. data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +2 -1
  62. data/src/core/ext/filters/client_channel/subchannel.cc +53 -50
  63. data/src/core/ext/filters/client_channel/subchannel.h +6 -22
  64. data/src/core/ext/filters/client_channel/subchannel_interface.h +10 -18
  65. data/src/core/ext/filters/client_channel/subchannel_stream_client.cc +12 -97
  66. data/src/core/ext/filters/client_channel/subchannel_stream_client.h +5 -9
  67. data/src/core/ext/filters/deadline/deadline_filter.cc +12 -7
  68. data/src/core/ext/filters/deadline/deadline_filter.h +8 -1
  69. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +21 -2
  70. data/src/core/ext/filters/fault_injection/fault_injection_filter.h +8 -3
  71. data/src/core/ext/filters/fault_injection/service_config_parser.cc +7 -4
  72. data/src/core/ext/filters/fault_injection/service_config_parser.h +17 -3
  73. data/src/core/ext/filters/http/client/http_client_filter.cc +16 -5
  74. data/src/core/ext/filters/http/client/http_client_filter.h +8 -1
  75. data/src/core/ext/filters/http/client_authority_filter.cc +11 -10
  76. data/src/core/ext/filters/http/client_authority_filter.h +5 -2
  77. data/src/core/ext/filters/http/http_filters_plugin.cc +9 -1
  78. data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +64 -187
  79. data/src/core/ext/filters/http/message_compress/message_compress_filter.h +1 -2
  80. data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +42 -106
  81. data/src/core/ext/filters/http/message_compress/message_decompress_filter.h +1 -0
  82. data/src/core/ext/filters/http/server/http_server_filter.cc +16 -9
  83. data/src/core/ext/filters/http/server/http_server_filter.h +6 -1
  84. data/src/core/ext/filters/message_size/message_size_filter.cc +25 -15
  85. data/src/core/ext/filters/message_size/message_size_filter.h +13 -0
  86. data/src/core/ext/filters/rbac/rbac_filter.cc +14 -3
  87. data/src/core/ext/filters/rbac/rbac_filter.h +8 -0
  88. data/src/core/ext/filters/rbac/rbac_service_config_parser.cc +13 -2
  89. data/src/core/ext/filters/rbac/rbac_service_config_parser.h +14 -2
  90. data/src/core/ext/filters/server_config_selector/server_config_selector.cc +1 -0
  91. data/src/core/ext/filters/server_config_selector/server_config_selector.h +9 -0
  92. data/src/core/ext/filters/server_config_selector/server_config_selector_filter.cc +22 -2
  93. data/src/core/ext/filters/server_config_selector/server_config_selector_filter.h +1 -0
  94. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +4 -4
  95. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +15 -15
  96. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +196 -476
  97. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +1 -1
  98. data/src/core/ext/transport/chttp2/transport/flow_control.cc +141 -261
  99. data/src/core/ext/transport/chttp2/transport/flow_control.h +176 -289
  100. data/src/core/ext/transport/chttp2/transport/frame_data.cc +57 -215
  101. data/src/core/ext/transport/chttp2/transport/frame_data.h +10 -36
  102. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +0 -41
  103. data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +7 -12
  104. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +7 -6
  105. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +0 -2
  106. data/src/core/ext/transport/chttp2/transport/internal.h +9 -111
  107. data/src/core/ext/transport/chttp2/transport/parsing.cc +51 -38
  108. data/src/core/ext/transport/chttp2/transport/stream_lists.cc +0 -4
  109. data/src/core/ext/transport/chttp2/transport/writing.cc +18 -21
  110. data/src/core/ext/transport/inproc/inproc_plugin.cc +0 -1
  111. data/src/core/ext/transport/inproc/inproc_transport.cc +85 -81
  112. data/src/core/ext/transport/inproc/inproc_transport.h +3 -1
  113. data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/ring_hash/v3/ring_hash.upb.c +52 -0
  114. data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/ring_hash/v3/ring_hash.upb.h +164 -0
  115. data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/wrr_locality/v3/wrr_locality.upb.c +46 -0
  116. data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/wrr_locality/v3/wrr_locality.upb.h +94 -0
  117. data/src/core/ext/xds/certificate_provider_factory.h +6 -1
  118. data/src/core/ext/xds/certificate_provider_registry.cc +8 -8
  119. data/src/core/ext/xds/certificate_provider_registry.h +3 -1
  120. data/src/core/ext/xds/certificate_provider_store.cc +2 -0
  121. data/src/core/ext/xds/certificate_provider_store.h +9 -0
  122. data/src/core/ext/xds/file_watcher_certificate_provider_factory.cc +9 -0
  123. data/src/core/ext/xds/file_watcher_certificate_provider_factory.h +8 -0
  124. data/src/core/ext/xds/upb_utils.h +1 -2
  125. data/src/core/ext/xds/xds_api.cc +16 -18
  126. data/src/core/ext/xds/xds_api.h +12 -5
  127. data/src/core/ext/xds/xds_bootstrap.cc +37 -24
  128. data/src/core/ext/xds/xds_bootstrap.h +9 -11
  129. data/src/core/ext/xds/xds_certificate_provider.cc +12 -3
  130. data/src/core/ext/xds/xds_certificate_provider.h +16 -1
  131. data/src/core/ext/xds/xds_channel_stack_modifier.cc +9 -0
  132. data/src/core/ext/xds/xds_channel_stack_modifier.h +5 -1
  133. data/src/core/ext/xds/xds_client.cc +71 -22
  134. data/src/core/ext/xds/xds_client.h +17 -3
  135. data/src/core/ext/xds/xds_client_stats.cc +3 -4
  136. data/src/core/ext/xds/xds_client_stats.h +4 -3
  137. data/src/core/ext/xds/xds_cluster.cc +21 -10
  138. data/src/core/ext/xds/xds_cluster.h +9 -1
  139. data/src/core/ext/xds/xds_cluster_specifier_plugin.cc +16 -7
  140. data/src/core/ext/xds/xds_cluster_specifier_plugin.h +1 -8
  141. data/src/core/ext/xds/xds_common_types.cc +36 -22
  142. data/src/core/ext/xds/xds_common_types.h +12 -4
  143. data/src/core/ext/xds/xds_endpoint.cc +25 -15
  144. data/src/core/ext/xds/xds_endpoint.h +13 -5
  145. data/src/core/ext/xds/xds_http_fault_filter.cc +7 -5
  146. data/src/core/ext/xds/xds_http_fault_filter.h +3 -1
  147. data/src/core/ext/xds/xds_http_filters.cc +7 -0
  148. data/src/core/ext/xds/xds_http_filters.h +3 -3
  149. data/src/core/ext/xds/xds_http_rbac_filter.cc +16 -0
  150. data/src/core/ext/xds/xds_http_rbac_filter.h +7 -0
  151. data/src/core/ext/xds/xds_lb_policy_registry.cc +291 -0
  152. data/src/core/ext/xds/xds_lb_policy_registry.h +72 -0
  153. data/src/core/ext/xds/xds_listener.cc +51 -33
  154. data/src/core/ext/xds/xds_listener.h +10 -1
  155. data/src/core/ext/xds/xds_resource_type.h +3 -3
  156. data/src/core/ext/xds/xds_resource_type_impl.h +7 -3
  157. data/src/core/ext/xds/xds_route_config.cc +56 -28
  158. data/src/core/ext/xds/xds_route_config.h +11 -2
  159. data/src/core/ext/xds/xds_routing.cc +16 -0
  160. data/src/core/ext/xds/xds_routing.h +7 -2
  161. data/src/core/ext/xds/xds_server_config_fetcher.cc +54 -6
  162. data/src/core/lib/address_utils/parse_address.cc +5 -8
  163. data/src/core/lib/address_utils/parse_address.h +3 -2
  164. data/src/core/lib/address_utils/sockaddr_utils.cc +8 -7
  165. data/src/core/lib/address_utils/sockaddr_utils.h +2 -0
  166. data/src/core/lib/avl/avl.h +3 -3
  167. data/src/core/lib/backoff/backoff.cc +1 -1
  168. data/src/core/lib/backoff/backoff.h +1 -1
  169. data/src/core/lib/channel/call_tracer.h +3 -3
  170. data/src/core/lib/channel/channel_args.h +1 -0
  171. data/src/core/lib/channel/channel_args_preconditioning.cc +1 -0
  172. data/src/core/lib/channel/channel_fwd.h +26 -0
  173. data/src/core/lib/channel/channel_stack.cc +4 -4
  174. data/src/core/lib/channel/channel_stack.h +1 -11
  175. data/src/core/lib/channel/channel_stack_builder.h +2 -5
  176. data/src/core/lib/channel/channel_stack_builder_impl.cc +1 -1
  177. data/src/core/lib/channel/channel_stack_builder_impl.h +1 -0
  178. data/src/core/lib/channel/channelz.cc +2 -1
  179. data/src/core/lib/channel/channelz.h +2 -3
  180. data/src/core/lib/channel/channelz_registry.cc +4 -5
  181. data/src/core/lib/channel/connected_channel.cc +1 -0
  182. data/src/core/lib/channel/connected_channel.h +1 -0
  183. data/src/core/lib/channel/promise_based_filter.cc +11 -5
  184. data/src/core/lib/channel/promise_based_filter.h +2 -0
  185. data/src/core/lib/compression/compression.cc +6 -1
  186. data/src/core/lib/compression/compression_internal.cc +3 -6
  187. data/src/core/lib/compression/compression_internal.h +3 -2
  188. data/src/core/lib/compression/message_compress.cc +3 -1
  189. data/src/core/lib/compression/message_compress.h +2 -3
  190. data/src/core/lib/debug/stats.cc +9 -9
  191. data/src/core/lib/debug/stats.h +2 -1
  192. data/src/core/lib/debug/stats_data.cc +2 -1
  193. data/src/core/lib/debug/stats_data.h +0 -4
  194. data/src/core/lib/debug/trace.h +13 -12
  195. data/src/core/lib/event_engine/default_event_engine_factory.cc +1 -1
  196. data/src/core/lib/event_engine/event_engine.cc +24 -19
  197. data/src/core/lib/event_engine/event_engine_factory.h +2 -2
  198. data/src/core/lib/event_engine/{iomgr_engine.cc → iomgr_engine/iomgr_engine.cc} +44 -91
  199. data/src/core/lib/event_engine/{iomgr_engine.h → iomgr_engine/iomgr_engine.h} +20 -16
  200. data/src/core/lib/event_engine/iomgr_engine/thread_pool.cc +123 -0
  201. data/src/core/lib/event_engine/iomgr_engine/thread_pool.h +70 -0
  202. data/src/core/lib/event_engine/iomgr_engine/time_averaged_stats.cc +62 -0
  203. data/src/core/lib/event_engine/iomgr_engine/time_averaged_stats.h +81 -0
  204. data/src/core/lib/event_engine/iomgr_engine/timer.cc +312 -0
  205. data/src/core/lib/event_engine/iomgr_engine/timer.h +193 -0
  206. data/src/core/lib/event_engine/iomgr_engine/timer_heap.cc +107 -0
  207. data/src/core/lib/event_engine/iomgr_engine/timer_heap.h +56 -0
  208. data/src/core/lib/event_engine/iomgr_engine/timer_manager.cc +254 -0
  209. data/src/core/lib/event_engine/iomgr_engine/timer_manager.h +111 -0
  210. data/src/core/lib/event_engine/promise.h +69 -0
  211. data/src/core/lib/gpr/time_posix.cc +6 -9
  212. data/src/core/lib/gpr/time_windows.cc +10 -7
  213. data/src/core/lib/gprpp/manual_constructor.h +0 -67
  214. data/src/core/lib/gprpp/status_helper.cc +44 -30
  215. data/src/core/lib/gprpp/time.cc +8 -0
  216. data/src/core/lib/gprpp/time.h +4 -0
  217. data/src/core/lib/http/format_request.cc +5 -4
  218. data/src/core/lib/http/format_request.h +1 -1
  219. data/src/core/lib/http/httpcli.cc +18 -12
  220. data/src/core/lib/http/httpcli.h +19 -3
  221. data/src/core/lib/http/httpcli_security_connector.cc +16 -4
  222. data/src/core/lib/http/httpcli_ssl_credentials.h +3 -1
  223. data/src/core/lib/http/parser.cc +6 -7
  224. data/src/core/lib/http/parser.h +3 -0
  225. data/src/core/lib/iomgr/call_combiner.cc +2 -2
  226. data/src/core/lib/iomgr/endpoint.h +1 -1
  227. data/src/core/lib/iomgr/endpoint_cfstream.cc +2 -2
  228. data/src/core/lib/iomgr/error.cc +11 -9
  229. data/src/core/lib/iomgr/error.h +9 -5
  230. data/src/core/lib/iomgr/ev_epoll1_linux.cc +57 -18
  231. data/src/core/lib/iomgr/ev_epoll1_linux.h +1 -1
  232. data/src/core/lib/iomgr/ev_poll_posix.cc +77 -52
  233. data/src/core/lib/iomgr/ev_poll_posix.h +2 -2
  234. data/src/core/lib/iomgr/ev_posix.cc +54 -92
  235. data/src/core/lib/iomgr/ev_posix.h +5 -3
  236. data/src/core/lib/iomgr/fork_posix.cc +1 -1
  237. data/src/core/lib/iomgr/iomgr.cc +7 -0
  238. data/src/core/lib/iomgr/iomgr_posix.cc +1 -0
  239. data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +1 -0
  240. data/src/core/lib/iomgr/load_file.cc +1 -1
  241. data/src/core/lib/iomgr/resolve_address_posix.cc +1 -1
  242. data/src/core/lib/iomgr/resolve_address_windows.cc +1 -1
  243. data/src/core/lib/iomgr/tcp_client.cc +12 -7
  244. data/src/core/lib/iomgr/tcp_client.h +24 -13
  245. data/src/core/lib/iomgr/tcp_client_cfstream.cc +15 -9
  246. data/src/core/lib/iomgr/tcp_client_posix.cc +143 -25
  247. data/src/core/lib/iomgr/tcp_client_posix.h +1 -1
  248. data/src/core/lib/iomgr/tcp_client_windows.cc +14 -10
  249. data/src/core/lib/iomgr/tcp_posix.cc +91 -29
  250. data/src/core/lib/iomgr/tcp_server_posix.cc +7 -7
  251. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +12 -12
  252. data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +2 -2
  253. data/src/core/lib/iomgr/tcp_server_windows.cc +7 -7
  254. data/src/core/lib/iomgr/tcp_windows.cc +5 -5
  255. data/src/core/lib/iomgr/unix_sockets_posix.cc +2 -2
  256. data/src/core/lib/iomgr/wakeup_fd_pipe.cc +2 -2
  257. data/src/core/lib/iomgr/wakeup_fd_posix.cc +15 -12
  258. data/src/core/lib/iomgr/wakeup_fd_posix.h +0 -2
  259. data/src/core/lib/iomgr/work_serializer.h +2 -3
  260. data/src/core/lib/matchers/matchers.cc +6 -3
  261. data/src/core/lib/matchers/matchers.h +2 -0
  262. data/src/core/lib/promise/activity.cc +0 -1
  263. data/src/core/lib/promise/activity.h +7 -13
  264. data/src/core/lib/promise/loop.h +1 -0
  265. data/src/core/lib/promise/promise.h +1 -0
  266. data/src/core/lib/promise/sleep.cc +36 -31
  267. data/src/core/lib/promise/sleep.h +25 -25
  268. data/src/core/lib/resolver/resolver.cc +5 -0
  269. data/src/core/lib/resolver/resolver.h +3 -0
  270. data/src/core/lib/resolver/resolver_factory.h +5 -2
  271. data/src/core/lib/resolver/resolver_registry.cc +2 -9
  272. data/src/core/lib/resolver/resolver_registry.h +12 -1
  273. data/src/core/lib/resolver/server_address.cc +8 -0
  274. data/src/core/lib/resolver/server_address.h +9 -2
  275. data/src/core/lib/resource_quota/memory_quota.cc +18 -60
  276. data/src/core/lib/resource_quota/memory_quota.h +11 -25
  277. data/src/core/lib/security/authorization/authorization_policy_provider.h +7 -0
  278. data/src/core/lib/security/authorization/authorization_policy_provider_vtable.cc +4 -0
  279. data/src/core/lib/security/authorization/evaluate_args.cc +9 -3
  280. data/src/core/lib/security/authorization/evaluate_args.h +6 -3
  281. data/src/core/lib/security/authorization/grpc_authorization_engine.cc +6 -0
  282. data/src/core/lib/security/authorization/grpc_authorization_engine.h +7 -0
  283. data/src/core/lib/security/authorization/grpc_server_authz_filter.cc +12 -0
  284. data/src/core/lib/security/authorization/grpc_server_authz_filter.h +12 -1
  285. data/src/core/lib/security/authorization/matchers.cc +9 -1
  286. data/src/core/lib/security/authorization/matchers.h +7 -0
  287. data/src/core/lib/security/authorization/rbac_policy.cc +5 -0
  288. data/src/core/lib/security/authorization/rbac_policy.h +7 -0
  289. data/src/core/lib/security/context/security_context.cc +5 -2
  290. data/src/core/lib/security/context/security_context.h +14 -2
  291. data/src/core/lib/security/credentials/alts/alts_credentials.cc +4 -2
  292. data/src/core/lib/security/credentials/alts/alts_credentials.h +6 -1
  293. data/src/core/lib/security/credentials/alts/grpc_alts_credentials_client_options.cc +1 -3
  294. data/src/core/lib/security/credentials/alts/grpc_alts_credentials_server_options.cc +1 -4
  295. data/src/core/lib/security/credentials/call_creds_util.cc +8 -0
  296. data/src/core/lib/security/credentials/call_creds_util.h +1 -0
  297. data/src/core/lib/security/credentials/channel_creds_registry.h +6 -1
  298. data/src/core/lib/security/credentials/channel_creds_registry_init.cc +10 -0
  299. data/src/core/lib/security/credentials/composite/composite_credentials.cc +4 -4
  300. data/src/core/lib/security/credentials/composite/composite_credentials.h +16 -2
  301. data/src/core/lib/security/credentials/credentials.cc +4 -8
  302. data/src/core/lib/security/credentials/credentials.h +10 -8
  303. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +28 -10
  304. data/src/core/lib/security/credentials/external/aws_external_account_credentials.h +10 -0
  305. data/src/core/lib/security/credentials/external/aws_request_signer.cc +9 -0
  306. data/src/core/lib/security/credentials/external/external_account_credentials.cc +24 -9
  307. data/src/core/lib/security/credentials/external/external_account_credentials.h +11 -0
  308. data/src/core/lib/security/credentials/external/file_external_account_credentials.cc +12 -4
  309. data/src/core/lib/security/credentials/external/file_external_account_credentials.h +6 -0
  310. data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +20 -4
  311. data/src/core/lib/security/credentials/external/url_external_account_credentials.h +10 -0
  312. data/src/core/lib/security/credentials/fake/fake_credentials.cc +8 -6
  313. data/src/core/lib/security/credentials/fake/fake_credentials.h +13 -1
  314. data/src/core/lib/security/credentials/google_default/credentials_generic.cc +1 -0
  315. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +27 -10
  316. data/src/core/lib/security/credentials/google_default/google_default_credentials.h +10 -1
  317. data/src/core/lib/security/credentials/iam/iam_credentials.cc +9 -3
  318. data/src/core/lib/security/credentials/iam/iam_credentials.h +10 -0
  319. data/src/core/lib/security/credentials/insecure/insecure_credentials.cc +4 -0
  320. data/src/core/lib/security/credentials/insecure/insecure_credentials.h +5 -0
  321. data/src/core/lib/security/credentials/jwt/json_token.cc +5 -2
  322. data/src/core/lib/security/credentials/jwt/json_token.h +2 -2
  323. data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +11 -5
  324. data/src/core/lib/security/credentials/jwt/jwt_credentials.h +14 -0
  325. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +28 -3
  326. data/src/core/lib/security/credentials/jwt/jwt_verifier.h +4 -2
  327. data/src/core/lib/security/credentials/local/local_credentials.cc +4 -3
  328. data/src/core/lib/security/credentials/local/local_credentials.h +7 -0
  329. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +26 -13
  330. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +20 -0
  331. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +8 -7
  332. data/src/core/lib/security/credentials/plugin/plugin_credentials.h +24 -0
  333. data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +5 -0
  334. data/src/core/lib/security/credentials/ssl/ssl_credentials.h +13 -0
  335. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.cc +6 -6
  336. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.h +9 -3
  337. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc +29 -10
  338. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h +9 -4
  339. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.cc +9 -2
  340. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.h +6 -7
  341. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +4 -5
  342. data/src/core/lib/security/credentials/tls/tls_credentials.cc +7 -2
  343. data/src/core/lib/security/credentials/tls/tls_credentials.h +5 -1
  344. data/src/core/lib/security/credentials/tls/tls_utils.cc +2 -0
  345. data/src/core/lib/security/credentials/tls/tls_utils.h +1 -1
  346. data/src/core/lib/security/credentials/xds/xds_credentials.cc +8 -1
  347. data/src/core/lib/security/credentials/xds/xds_credentials.h +14 -0
  348. data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +22 -2
  349. data/src/core/lib/security/security_connector/alts/alts_security_connector.h +6 -3
  350. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +17 -1
  351. data/src/core/lib/security/security_connector/fake/fake_security_connector.h +2 -2
  352. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.cc +9 -0
  353. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.h +17 -2
  354. data/src/core/lib/security/security_connector/load_system_roots_fallback.cc +5 -3
  355. data/src/core/lib/security/security_connector/{load_system_roots_linux.cc → load_system_roots_supported.cc} +27 -19
  356. data/src/core/lib/security/security_connector/{load_system_roots_linux.h → load_system_roots_supported.h} +5 -5
  357. data/src/core/lib/security/security_connector/local/local_security_connector.cc +22 -3
  358. data/src/core/lib/security/security_connector/local/local_security_connector.h +6 -2
  359. data/src/core/lib/security/security_connector/security_connector.cc +20 -18
  360. data/src/core/lib/security/security_connector/security_connector.h +18 -6
  361. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +18 -6
  362. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.h +4 -2
  363. data/src/core/lib/security/security_connector/ssl_utils.cc +12 -2
  364. data/src/core/lib/security/security_connector/ssl_utils.h +10 -7
  365. data/src/core/lib/security/security_connector/ssl_utils_config.h +1 -1
  366. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +21 -13
  367. data/src/core/lib/security/security_connector/tls/tls_security_connector.h +23 -3
  368. data/src/core/lib/security/transport/auth_filters.h +7 -0
  369. data/src/core/lib/security/transport/client_auth_filter.cc +18 -9
  370. data/src/core/lib/security/transport/secure_endpoint.cc +63 -13
  371. data/src/core/lib/security/transport/secure_endpoint.h +4 -3
  372. data/src/core/lib/security/transport/security_handshaker.cc +44 -11
  373. data/src/core/lib/security/transport/security_handshaker.h +4 -0
  374. data/src/core/lib/security/transport/server_auth_filter.cc +26 -4
  375. data/src/core/lib/security/util/json_util.cc +3 -2
  376. data/src/core/lib/security/util/json_util.h +0 -2
  377. data/src/core/lib/service_config/service_config_call_data.h +2 -1
  378. data/src/core/lib/service_config/service_config_impl.cc +6 -6
  379. data/src/core/lib/service_config/service_config_impl.h +1 -3
  380. data/src/core/lib/service_config/service_config_parser.cc +2 -4
  381. data/src/core/lib/slice/slice_buffer.cc +30 -1
  382. data/src/core/lib/slice/slice_buffer.h +37 -6
  383. data/src/core/lib/slice/slice_string_helpers.cc +0 -20
  384. data/src/core/lib/slice/slice_string_helpers.h +0 -4
  385. data/src/core/lib/surface/call.cc +53 -115
  386. data/src/core/lib/surface/call.h +5 -1
  387. data/src/core/lib/surface/channel.h +2 -0
  388. data/src/core/lib/surface/channel_ping.cc +1 -1
  389. data/src/core/lib/surface/completion_queue.cc +15 -14
  390. data/src/core/lib/surface/completion_queue.h +2 -1
  391. data/src/core/lib/surface/init.cc +0 -1
  392. data/src/core/lib/surface/lame_client.cc +1 -1
  393. data/src/core/lib/surface/lame_client.h +1 -1
  394. data/src/core/lib/surface/server.cc +14 -8
  395. data/src/core/lib/surface/server.h +4 -1
  396. data/src/core/lib/surface/validate_metadata.cc +1 -1
  397. data/src/core/lib/surface/version.cc +2 -2
  398. data/src/core/lib/transport/error_utils.cc +13 -7
  399. data/src/core/lib/transport/handshaker.cc +3 -3
  400. data/src/core/lib/transport/http_connect_handshaker.cc +4 -4
  401. data/src/core/lib/transport/tcp_connect_handshaker.cc +2 -2
  402. data/src/core/lib/transport/transport.cc +0 -3
  403. data/src/core/lib/transport/transport.h +20 -14
  404. data/src/core/lib/transport/transport_fwd.h +20 -0
  405. data/src/core/lib/transport/transport_impl.h +1 -0
  406. data/src/core/lib/transport/transport_op_string.cc +9 -9
  407. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +1 -1
  408. data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +9 -1
  409. data/src/core/tsi/fake_transport_security.cc +13 -1
  410. data/src/core/tsi/fake_transport_security.h +6 -0
  411. data/src/core/tsi/ssl_transport_security.cc +1 -1
  412. data/src/core/tsi/transport_security_grpc.cc +3 -2
  413. data/src/core/tsi/transport_security_grpc.h +5 -2
  414. data/src/ruby/ext/grpc/ext-export-truffleruby.clang +2 -0
  415. data/src/ruby/ext/grpc/ext-export-truffleruby.gcc +7 -0
  416. data/src/ruby/ext/grpc/ext-export.clang +1 -0
  417. data/src/ruby/ext/grpc/ext-export.gcc +1 -0
  418. data/src/ruby/ext/grpc/extconf.rb +49 -18
  419. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +1 -1
  420. data/src/ruby/lib/grpc/errors.rb +1 -1
  421. data/src/ruby/lib/grpc/version.rb +1 -1
  422. data/src/ruby/spec/generic/client_stub_spec.rb +23 -23
  423. data/third_party/abseil-cpp/absl/algorithm/container.h +1 -1
  424. data/third_party/abseil-cpp/absl/base/attributes.h +49 -22
  425. data/third_party/abseil-cpp/absl/base/casts.h +61 -68
  426. data/third_party/abseil-cpp/absl/base/config.h +182 -41
  427. data/third_party/abseil-cpp/absl/base/internal/cycleclock.cc +12 -42
  428. data/third_party/abseil-cpp/absl/base/internal/cycleclock.h +67 -2
  429. data/third_party/abseil-cpp/absl/base/internal/direct_mmap.h +3 -3
  430. data/third_party/abseil-cpp/absl/base/internal/endian.h +17 -62
  431. data/third_party/abseil-cpp/absl/base/internal/fast_type_id.h +2 -0
  432. data/third_party/abseil-cpp/absl/base/internal/invoke.h +54 -0
  433. data/third_party/abseil-cpp/absl/base/internal/prefetch.h +138 -0
  434. data/third_party/abseil-cpp/absl/base/internal/raw_logging.cc +29 -22
  435. data/third_party/abseil-cpp/absl/base/internal/raw_logging.h +13 -12
  436. data/third_party/abseil-cpp/absl/base/internal/spinlock.cc +3 -0
  437. data/third_party/abseil-cpp/absl/base/internal/spinlock.h +8 -0
  438. data/third_party/abseil-cpp/absl/base/internal/spinlock_linux.inc +2 -5
  439. data/third_party/abseil-cpp/absl/base/internal/strerror.cc +88 -0
  440. data/third_party/abseil-cpp/absl/base/internal/strerror.h +39 -0
  441. data/third_party/abseil-cpp/absl/base/internal/sysinfo.cc +0 -1
  442. data/third_party/abseil-cpp/absl/base/internal/thread_identity.cc +2 -1
  443. data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.cc +6 -7
  444. data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.h +12 -3
  445. data/third_party/abseil-cpp/absl/base/log_severity.cc +28 -0
  446. data/third_party/abseil-cpp/absl/base/log_severity.h +51 -0
  447. data/third_party/abseil-cpp/absl/base/optimization.h +19 -11
  448. data/third_party/abseil-cpp/absl/base/options.h +1 -1
  449. data/third_party/abseil-cpp/absl/base/thread_annotations.h +2 -2
  450. data/third_party/abseil-cpp/absl/container/fixed_array.h +2 -0
  451. data/third_party/abseil-cpp/absl/container/flat_hash_map.h +11 -4
  452. data/third_party/abseil-cpp/absl/container/flat_hash_set.h +15 -9
  453. data/third_party/abseil-cpp/absl/container/inlined_vector.h +20 -9
  454. data/third_party/abseil-cpp/absl/container/internal/common.h +6 -5
  455. data/third_party/abseil-cpp/absl/container/internal/container_memory.h +10 -28
  456. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.cc +68 -20
  457. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.h +29 -11
  458. data/third_party/abseil-cpp/absl/container/internal/inlined_vector.h +59 -38
  459. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.cc +4 -0
  460. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.h +515 -184
  461. data/third_party/abseil-cpp/absl/debugging/internal/address_is_readable.cc +45 -88
  462. data/third_party/abseil-cpp/absl/debugging/internal/elf_mem_image.cc +4 -0
  463. data/third_party/abseil-cpp/absl/debugging/internal/elf_mem_image.h +3 -2
  464. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_aarch64-inl.inc +8 -3
  465. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_arm-inl.inc +8 -3
  466. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_config.h +2 -1
  467. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_powerpc-inl.inc +8 -3
  468. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_riscv-inl.inc +20 -18
  469. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_x86-inl.inc +8 -3
  470. data/third_party/abseil-cpp/absl/debugging/internal/vdso_support.cc +15 -2
  471. data/third_party/abseil-cpp/absl/debugging/symbolize.cc +6 -1
  472. data/third_party/abseil-cpp/absl/debugging/symbolize_elf.inc +46 -7
  473. data/third_party/abseil-cpp/absl/functional/bind_front.h +10 -1
  474. data/third_party/abseil-cpp/absl/functional/function_ref.h +2 -1
  475. data/third_party/abseil-cpp/absl/hash/hash.h +82 -8
  476. data/third_party/abseil-cpp/absl/hash/internal/hash.h +218 -23
  477. data/third_party/abseil-cpp/absl/numeric/bits.h +2 -1
  478. data/third_party/abseil-cpp/absl/numeric/int128.cc +4 -2
  479. data/third_party/abseil-cpp/absl/numeric/int128.h +2 -2
  480. data/third_party/abseil-cpp/absl/profiling/internal/sample_recorder.h +21 -6
  481. data/third_party/abseil-cpp/absl/random/bernoulli_distribution.h +4 -4
  482. data/third_party/abseil-cpp/absl/random/distributions.h +3 -3
  483. data/third_party/abseil-cpp/absl/random/internal/distribution_caller.h +3 -0
  484. data/third_party/abseil-cpp/absl/random/internal/fast_uniform_bits.h +2 -1
  485. data/third_party/abseil-cpp/absl/random/internal/generate_real.h +2 -2
  486. data/third_party/abseil-cpp/absl/random/internal/nonsecure_base.h +59 -48
  487. data/third_party/abseil-cpp/absl/random/internal/pcg_engine.h +1 -1
  488. data/third_party/abseil-cpp/absl/random/internal/randen.h +5 -11
  489. data/third_party/abseil-cpp/absl/random/internal/randen_detect.cc +6 -2
  490. data/third_party/abseil-cpp/absl/random/internal/randen_engine.h +48 -23
  491. data/third_party/abseil-cpp/absl/random/internal/salted_seed_seq.h +24 -26
  492. data/third_party/abseil-cpp/absl/random/internal/traits.h +53 -5
  493. data/third_party/abseil-cpp/absl/random/internal/uniform_helper.h +5 -5
  494. data/third_party/abseil-cpp/absl/random/internal/wide_multiply.h +33 -48
  495. data/third_party/abseil-cpp/absl/random/log_uniform_int_distribution.h +9 -10
  496. data/third_party/abseil-cpp/absl/random/poisson_distribution.h +7 -4
  497. data/third_party/abseil-cpp/absl/random/seed_sequences.h +1 -0
  498. data/third_party/abseil-cpp/absl/random/uniform_int_distribution.h +2 -2
  499. data/third_party/abseil-cpp/absl/random/uniform_real_distribution.h +1 -1
  500. data/third_party/abseil-cpp/absl/random/zipf_distribution.h +4 -3
  501. data/third_party/abseil-cpp/absl/status/internal/status_internal.h +17 -0
  502. data/third_party/abseil-cpp/absl/status/status.cc +174 -2
  503. data/third_party/abseil-cpp/absl/status/status.h +22 -12
  504. data/third_party/abseil-cpp/absl/status/statusor.h +9 -3
  505. data/third_party/abseil-cpp/absl/strings/ascii.h +4 -4
  506. data/third_party/abseil-cpp/absl/strings/cord.cc +194 -913
  507. data/third_party/abseil-cpp/absl/strings/cord.h +202 -81
  508. data/third_party/abseil-cpp/absl/strings/cord_analysis.cc +188 -0
  509. data/third_party/abseil-cpp/absl/strings/cord_analysis.h +44 -0
  510. data/third_party/abseil-cpp/absl/strings/cord_buffer.cc +30 -0
  511. data/third_party/abseil-cpp/absl/strings/cord_buffer.h +572 -0
  512. data/third_party/abseil-cpp/absl/strings/internal/cord_data_edge.h +63 -0
  513. data/third_party/abseil-cpp/absl/strings/internal/cord_internal.cc +20 -32
  514. data/third_party/abseil-cpp/absl/strings/internal/cord_internal.h +123 -88
  515. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree.cc +149 -49
  516. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree.h +44 -59
  517. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_navigator.cc +3 -1
  518. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_navigator.h +4 -2
  519. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_reader.cc +3 -2
  520. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_reader.h +5 -4
  521. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_consume.cc +7 -74
  522. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_crc.cc +54 -0
  523. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_crc.h +102 -0
  524. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_flat.h +58 -17
  525. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring.cc +13 -11
  526. data/third_party/abseil-cpp/absl/strings/internal/cordz_info.cc +11 -38
  527. data/third_party/abseil-cpp/absl/strings/internal/cordz_statistics.h +1 -0
  528. data/third_party/abseil-cpp/absl/strings/internal/cordz_update_tracker.h +4 -2
  529. data/third_party/abseil-cpp/absl/strings/internal/escaping.cc +6 -5
  530. data/third_party/abseil-cpp/absl/strings/internal/ostringstream.cc +1 -1
  531. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.cc +1 -1
  532. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.h +1 -1
  533. data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.h +38 -7
  534. data/third_party/abseil-cpp/absl/strings/internal/str_format/checker.h +7 -2
  535. data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.cc +4 -5
  536. data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.h +5 -2
  537. data/third_party/abseil-cpp/absl/strings/internal/str_format/output.h +2 -1
  538. data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.h +4 -2
  539. data/third_party/abseil-cpp/absl/strings/internal/str_join_internal.h +9 -6
  540. data/third_party/abseil-cpp/absl/strings/internal/string_constant.h +10 -2
  541. data/third_party/abseil-cpp/absl/strings/internal/utf8.cc +9 -9
  542. data/third_party/abseil-cpp/absl/strings/numbers.cc +8 -8
  543. data/third_party/abseil-cpp/absl/strings/numbers.h +26 -23
  544. data/third_party/abseil-cpp/absl/strings/str_cat.h +20 -13
  545. data/third_party/abseil-cpp/absl/strings/str_join.h +9 -15
  546. data/third_party/abseil-cpp/absl/strings/str_split.h +1 -2
  547. data/third_party/abseil-cpp/absl/strings/string_view.cc +2 -13
  548. data/third_party/abseil-cpp/absl/strings/string_view.h +3 -2
  549. data/third_party/abseil-cpp/absl/strings/strip.h +8 -6
  550. data/third_party/abseil-cpp/absl/strings/substitute.h +10 -2
  551. data/third_party/abseil-cpp/absl/synchronization/internal/create_thread_identity.cc +9 -6
  552. data/third_party/abseil-cpp/absl/synchronization/internal/create_thread_identity.h +0 -4
  553. data/third_party/abseil-cpp/absl/synchronization/internal/per_thread_sem.cc +0 -4
  554. data/third_party/abseil-cpp/absl/synchronization/internal/per_thread_sem.h +1 -6
  555. data/third_party/abseil-cpp/absl/synchronization/internal/waiter.cc +0 -25
  556. data/third_party/abseil-cpp/absl/synchronization/internal/waiter.h +10 -4
  557. data/third_party/abseil-cpp/absl/synchronization/mutex.cc +75 -40
  558. data/third_party/abseil-cpp/absl/synchronization/mutex.h +17 -9
  559. data/third_party/abseil-cpp/absl/synchronization/notification.h +3 -2
  560. data/third_party/abseil-cpp/absl/time/duration.cc +5 -4
  561. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/civil_time_detail.h +11 -7
  562. data/third_party/abseil-cpp/absl/time/time.h +16 -12
  563. data/third_party/abseil-cpp/absl/types/internal/optional.h +8 -0
  564. data/third_party/abseil-cpp/absl/types/internal/variant.h +3 -3
  565. data/third_party/abseil-cpp/absl/types/optional.h +17 -14
  566. data/third_party/abseil-cpp/absl/types/span.h +2 -1
  567. metadata +39 -15
  568. data/src/core/lib/slice/slice_split.cc +0 -103
  569. data/src/core/lib/slice/slice_split.h +0 -36
  570. data/src/core/lib/transport/byte_stream.cc +0 -165
  571. data/src/core/lib/transport/byte_stream.h +0 -170
  572. data/third_party/abseil-cpp/absl/cleanup/cleanup.h +0 -140
  573. data/third_party/abseil-cpp/absl/cleanup/internal/cleanup.h +0 -100
  574. data/third_party/abseil-cpp/absl/container/internal/have_sse.h +0 -50
@@ -373,7 +373,7 @@ RealType Gaussian(URBG&& urbg, // NOLINT(runtime/references)
373
373
  template <typename IntType, typename URBG>
374
374
  IntType LogUniform(URBG&& urbg, // NOLINT(runtime/references)
375
375
  IntType lo, IntType hi, IntType base = 2) {
376
- static_assert(std::is_integral<IntType>::value,
376
+ static_assert(random_internal::IsIntegral<IntType>::value,
377
377
  "Template-argument 'IntType' must be an integral type, in "
378
378
  "absl::LogUniform<IntType, URBG>(...)");
379
379
 
@@ -403,7 +403,7 @@ IntType LogUniform(URBG&& urbg, // NOLINT(runtime/references)
403
403
  template <typename IntType, typename URBG>
404
404
  IntType Poisson(URBG&& urbg, // NOLINT(runtime/references)
405
405
  double mean = 1.0) {
406
- static_assert(std::is_integral<IntType>::value,
406
+ static_assert(random_internal::IsIntegral<IntType>::value,
407
407
  "Template-argument 'IntType' must be an integral type, in "
408
408
  "absl::Poisson<IntType, URBG>(...)");
409
409
 
@@ -435,7 +435,7 @@ template <typename IntType, typename URBG>
435
435
  IntType Zipf(URBG&& urbg, // NOLINT(runtime/references)
436
436
  IntType hi = (std::numeric_limits<IntType>::max)(), double q = 2.0,
437
437
  double v = 1.0) {
438
- static_assert(std::is_integral<IntType>::value,
438
+ static_assert(random_internal::IsIntegral<IntType>::value,
439
439
  "Template-argument 'IntType' must be an integral type, in "
440
440
  "absl::Zipf<IntType, URBG>(...)");
441
441
 
@@ -18,6 +18,7 @@
18
18
  #define ABSL_RANDOM_INTERNAL_DISTRIBUTION_CALLER_H_
19
19
 
20
20
  #include <utility>
21
+ #include <type_traits>
21
22
 
22
23
  #include "absl/base/config.h"
23
24
  #include "absl/base/internal/fast_type_id.h"
@@ -32,6 +33,8 @@ namespace random_internal {
32
33
  // to intercept such calls.
33
34
  template <typename URBG>
34
35
  struct DistributionCaller {
36
+ static_assert(!std::is_pointer<URBG>::value,
37
+ "You must pass a reference, not a pointer.");
35
38
  // SFINAE to detect whether the URBG type includes a member matching
36
39
  // bool InvokeMock(base_internal::FastTypeIdType, void*, void*).
37
40
  //
@@ -22,6 +22,7 @@
22
22
 
23
23
  #include "absl/base/config.h"
24
24
  #include "absl/meta/type_traits.h"
25
+ #include "absl/random/internal/traits.h"
25
26
 
26
27
  namespace absl {
27
28
  ABSL_NAMESPACE_BEGIN
@@ -98,7 +99,7 @@ class FastUniformBits {
98
99
  result_type operator()(URBG& g); // NOLINT(runtime/references)
99
100
 
100
101
  private:
101
- static_assert(std::is_unsigned<UIntType>::value,
102
+ static_assert(IsUnsigned<UIntType>::value,
102
103
  "Class-template FastUniformBits<> must be parameterized using "
103
104
  "an unsigned type.");
104
105
 
@@ -50,10 +50,10 @@ struct GenerateSignedTag {};
50
50
  // inputs, otherwise it never returns 0.
51
51
  //
52
52
  // When a value in U(0,1) is required, use:
53
- // Uniform64ToReal<double, PositiveValueT, true>;
53
+ // GenerateRealFromBits<double, PositiveValueT, true>;
54
54
  //
55
55
  // When a value in U(-1,1) is required, use:
56
- // Uniform64ToReal<double, SignedValueT, false>;
56
+ // GenerateRealFromBits<double, SignedValueT, false>;
57
57
  //
58
58
  // This generates more distinct values than the mathematical equivalent
59
59
  // `U(0, 1) * 2.0 - 1.0`.
@@ -17,28 +17,82 @@
17
17
 
18
18
  #include <algorithm>
19
19
  #include <cstdint>
20
- #include <iostream>
21
20
  #include <iterator>
22
- #include <random>
23
- #include <string>
24
21
  #include <type_traits>
22
+ #include <utility>
25
23
  #include <vector>
26
24
 
27
25
  #include "absl/base/macros.h"
26
+ #include "absl/container/inlined_vector.h"
28
27
  #include "absl/meta/type_traits.h"
29
28
  #include "absl/random/internal/pool_urbg.h"
30
29
  #include "absl/random/internal/salted_seed_seq.h"
31
30
  #include "absl/random/internal/seed_material.h"
32
- #include "absl/types/optional.h"
33
31
  #include "absl/types/span.h"
34
32
 
35
33
  namespace absl {
36
34
  ABSL_NAMESPACE_BEGIN
37
35
  namespace random_internal {
38
36
 
37
+ // RandenPoolSeedSeq is a custom seed sequence type where generate() fills the
38
+ // provided buffer via the RandenPool entropy source.
39
+ class RandenPoolSeedSeq {
40
+ private:
41
+ struct ContiguousTag {};
42
+ struct BufferTag {};
43
+
44
+ // Generate random unsigned values directly into the buffer.
45
+ template <typename Contiguous>
46
+ void generate_impl(ContiguousTag, Contiguous begin, Contiguous end) {
47
+ const size_t n = std::distance(begin, end);
48
+ auto* a = &(*begin);
49
+ RandenPool<uint8_t>::Fill(
50
+ absl::MakeSpan(reinterpret_cast<uint8_t*>(a), sizeof(*a) * n));
51
+ }
52
+
53
+ // Construct a buffer of size n and fill it with values, then copy
54
+ // those values into the seed iterators.
55
+ template <typename RandomAccessIterator>
56
+ void generate_impl(BufferTag, RandomAccessIterator begin,
57
+ RandomAccessIterator end) {
58
+ const size_t n = std::distance(begin, end);
59
+ absl::InlinedVector<uint32_t, 8> data(n, 0);
60
+ RandenPool<uint32_t>::Fill(absl::MakeSpan(data.begin(), data.end()));
61
+ std::copy(std::begin(data), std::end(data), begin);
62
+ }
63
+
64
+ public:
65
+ using result_type = uint32_t;
66
+
67
+ size_t size() { return 0; }
68
+
69
+ template <typename OutIterator>
70
+ void param(OutIterator) const {}
71
+
72
+ template <typename RandomAccessIterator>
73
+ void generate(RandomAccessIterator begin, RandomAccessIterator end) {
74
+ // RandomAccessIterator must be assignable from uint32_t
75
+ if (begin != end) {
76
+ using U = typename std::iterator_traits<RandomAccessIterator>::value_type;
77
+ // ContiguousTag indicates the common case of a known contiguous buffer,
78
+ // which allows directly filling the buffer. In C++20,
79
+ // std::contiguous_iterator_tag provides a mechanism for testing this
80
+ // capability, however until Abseil's support requirements allow us to
81
+ // assume C++20, limit checks to a few common cases.
82
+ using TagType = absl::conditional_t<
83
+ (std::is_pointer<RandomAccessIterator>::value ||
84
+ std::is_same<RandomAccessIterator,
85
+ typename std::vector<U>::iterator>::value),
86
+ ContiguousTag, BufferTag>;
87
+
88
+ generate_impl(TagType{}, begin, end);
89
+ }
90
+ }
91
+ };
92
+
39
93
  // Each instance of NonsecureURBGBase<URBG> will be seeded by variates produced
40
94
  // by a thread-unique URBG-instance.
41
- template <typename URBG>
95
+ template <typename URBG, typename Seeder = RandenPoolSeedSeq>
42
96
  class NonsecureURBGBase {
43
97
  public:
44
98
  using result_type = typename URBG::result_type;
@@ -85,49 +139,6 @@ class NonsecureURBGBase {
85
139
  }
86
140
 
87
141
  private:
88
- // Seeder is a custom seed sequence type where generate() fills the provided
89
- // buffer via the RandenPool entropy source.
90
- struct Seeder {
91
- using result_type = uint32_t;
92
-
93
- size_t size() { return 0; }
94
-
95
- template <typename OutIterator>
96
- void param(OutIterator) const {}
97
-
98
- template <typename RandomAccessIterator>
99
- void generate(RandomAccessIterator begin, RandomAccessIterator end) {
100
- if (begin != end) {
101
- // begin, end must be random access iterators assignable from uint32_t.
102
- generate_impl(
103
- std::integral_constant<bool, sizeof(*begin) == sizeof(uint32_t)>{},
104
- begin, end);
105
- }
106
- }
107
-
108
- // Commonly, generate is invoked with a pointer to a buffer which
109
- // can be cast to a uint32_t.
110
- template <typename RandomAccessIterator>
111
- void generate_impl(std::integral_constant<bool, true>,
112
- RandomAccessIterator begin, RandomAccessIterator end) {
113
- auto buffer = absl::MakeSpan(begin, end);
114
- auto target = absl::MakeSpan(reinterpret_cast<uint32_t*>(buffer.data()),
115
- buffer.size());
116
- RandenPool<uint32_t>::Fill(target);
117
- }
118
-
119
- // The non-uint32_t case should be uncommon, and involves an extra copy,
120
- // filling the uint32_t buffer and then mixing into the output.
121
- template <typename RandomAccessIterator>
122
- void generate_impl(std::integral_constant<bool, false>,
123
- RandomAccessIterator begin, RandomAccessIterator end) {
124
- const size_t n = std::distance(begin, end);
125
- absl::InlinedVector<uint32_t, 8> data(n, 0);
126
- RandenPool<uint32_t>::Fill(absl::MakeSpan(data.begin(), data.end()));
127
- std::copy(std::begin(data), std::end(data), begin);
128
- }
129
- };
130
-
131
142
  static URBG ConstructURBG() {
132
143
  Seeder seeder;
133
144
  return URBG(seeder);
@@ -262,7 +262,7 @@ struct pcg_xsl_rr_128_64 {
262
262
  uint64_t rotate = h >> 58u;
263
263
  uint64_t s = Uint128Low64(state) ^ h;
264
264
  #endif
265
- return rotr(s, rotate);
265
+ return rotr(s, static_cast<int>(rotate));
266
266
  }
267
267
  };
268
268
 
@@ -43,10 +43,8 @@ class Randen {
43
43
 
44
44
  // Generate updates the randen sponge. The outer portion of the sponge
45
45
  // (kCapacityBytes .. kStateBytes) may be consumed as PRNG state.
46
- template <typename T, size_t N>
47
- void Generate(T (&state)[N]) const {
48
- static_assert(N * sizeof(T) == kStateBytes,
49
- "Randen::Generate() requires kStateBytes of state");
46
+ // REQUIRES: state points to kStateBytes of state.
47
+ inline void Generate(void* state) const {
50
48
  #if ABSL_RANDOM_INTERNAL_AES_DISPATCH
51
49
  // HW AES Dispatch.
52
50
  if (has_crypto_) {
@@ -65,13 +63,9 @@ class Randen {
65
63
 
66
64
  // Absorb incorporates additional seed material into the randen sponge. After
67
65
  // absorb returns, Generate must be called before the state may be consumed.
68
- template <typename S, size_t M, typename T, size_t N>
69
- void Absorb(const S (&seed)[M], T (&state)[N]) const {
70
- static_assert(M * sizeof(S) == RandenTraits::kSeedBytes,
71
- "Randen::Absorb() requires kSeedBytes of seed");
72
-
73
- static_assert(N * sizeof(T) == RandenTraits::kStateBytes,
74
- "Randen::Absorb() requires kStateBytes of state");
66
+ // REQUIRES: seed points to kSeedBytes of seed.
67
+ // REQUIRES: state points to kStateBytes of state.
68
+ inline void Absorb(const void* seed, void* state) const {
75
69
  #if ABSL_RANDOM_INTERNAL_AES_DISPATCH
76
70
  // HW AES Dispatch.
77
71
  if (has_crypto_) {
@@ -24,6 +24,11 @@
24
24
 
25
25
  #include "absl/random/internal/platform.h"
26
26
 
27
+ #if !defined(__UCLIBC__) && defined(__GLIBC__) && \
28
+ (__GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 16))
29
+ #define ABSL_HAVE_GETAUXVAL
30
+ #endif
31
+
27
32
  #if defined(ABSL_ARCH_X86_64)
28
33
  #define ABSL_INTERNAL_USE_X86_CPUID
29
34
  #elif defined(ABSL_ARCH_PPC) || defined(ABSL_ARCH_ARM) || \
@@ -31,7 +36,7 @@
31
36
  #if defined(__ANDROID__)
32
37
  #define ABSL_INTERNAL_USE_ANDROID_GETAUXVAL
33
38
  #define ABSL_INTERNAL_USE_GETAUXVAL
34
- #elif defined(__linux__)
39
+ #elif defined(__linux__) && defined(ABSL_HAVE_GETAUXVAL)
35
40
  #define ABSL_INTERNAL_USE_LINUX_GETAUXVAL
36
41
  #define ABSL_INTERNAL_USE_GETAUXVAL
37
42
  #endif
@@ -40,7 +45,6 @@
40
45
  #if defined(ABSL_INTERNAL_USE_X86_CPUID)
41
46
  #if defined(_WIN32) || defined(_WIN64)
42
47
  #include <intrin.h> // NOLINT(build/include_order)
43
- #pragma intrinsic(__cpuid)
44
48
  #else
45
49
  // MSVC-equivalent __cpuid intrinsic function.
46
50
  static void __cpuid(int cpu_info[4], int info_type) {
@@ -42,7 +42,7 @@ namespace random_internal {
42
42
  // 'Strong' (well-distributed, unpredictable, backtracking-resistant) random
43
43
  // generator, faster in some benchmarks than std::mt19937_64 and pcg64_c32.
44
44
  template <typename T>
45
- class alignas(16) randen_engine {
45
+ class alignas(8) randen_engine {
46
46
  public:
47
47
  // C++11 URBG interface:
48
48
  using result_type = T;
@@ -58,7 +58,8 @@ class alignas(16) randen_engine {
58
58
  return (std::numeric_limits<result_type>::max)();
59
59
  }
60
60
 
61
- explicit randen_engine(result_type seed_value = 0) { seed(seed_value); }
61
+ randen_engine() : randen_engine(0) {}
62
+ explicit randen_engine(result_type seed_value) { seed(seed_value); }
62
63
 
63
64
  template <class SeedSequence,
64
65
  typename = typename absl::enable_if_t<
@@ -67,17 +68,27 @@ class alignas(16) randen_engine {
67
68
  seed(seq);
68
69
  }
69
70
 
70
- randen_engine(const randen_engine&) = default;
71
+ // alignment requirements dictate custom copy and move constructors.
72
+ randen_engine(const randen_engine& other)
73
+ : next_(other.next_), impl_(other.impl_) {
74
+ std::memcpy(state(), other.state(), kStateSizeT * sizeof(result_type));
75
+ }
76
+ randen_engine& operator=(const randen_engine& other) {
77
+ next_ = other.next_;
78
+ impl_ = other.impl_;
79
+ std::memcpy(state(), other.state(), kStateSizeT * sizeof(result_type));
80
+ return *this;
81
+ }
71
82
 
72
83
  // Returns random bits from the buffer in units of result_type.
73
84
  result_type operator()() {
74
85
  // Refill the buffer if needed (unlikely).
86
+ auto* begin = state();
75
87
  if (next_ >= kStateSizeT) {
76
88
  next_ = kCapacityT;
77
- impl_.Generate(state_);
89
+ impl_.Generate(begin);
78
90
  }
79
-
80
- return little_endian::ToHost(state_[next_++]);
91
+ return little_endian::ToHost(begin[next_++]);
81
92
  }
82
93
 
83
94
  template <class SeedSequence>
@@ -92,9 +103,10 @@ class alignas(16) randen_engine {
92
103
  void seed(result_type seed_value = 0) {
93
104
  next_ = kStateSizeT;
94
105
  // Zeroes the inner state and fills the outer state with seed_value to
95
- // mimics behaviour of reseed
96
- std::fill(std::begin(state_), std::begin(state_) + kCapacityT, 0);
97
- std::fill(std::begin(state_) + kCapacityT, std::end(state_), seed_value);
106
+ // mimic the behaviour of reseed
107
+ auto* begin = state();
108
+ std::fill(begin, begin + kCapacityT, 0);
109
+ std::fill(begin + kCapacityT, begin + kStateSizeT, seed_value);
98
110
  }
99
111
 
100
112
  // Inserts entropy into (part of) the state. Calling this periodically with
@@ -105,7 +117,6 @@ class alignas(16) randen_engine {
105
117
  using sequence_result_type = typename SeedSequence::result_type;
106
118
  static_assert(sizeof(sequence_result_type) == 4,
107
119
  "SeedSequence::result_type must be 32-bit");
108
-
109
120
  constexpr size_t kBufferSize =
110
121
  Randen::kSeedBytes / sizeof(sequence_result_type);
111
122
  alignas(16) sequence_result_type buffer[kBufferSize];
@@ -119,8 +130,8 @@ class alignas(16) randen_engine {
119
130
  if (entropy_size < kBufferSize) {
120
131
  // ... and only request that many values, or 256-bits, when unspecified.
121
132
  const size_t requested_entropy = (entropy_size == 0) ? 8u : entropy_size;
122
- std::fill(std::begin(buffer) + requested_entropy, std::end(buffer), 0);
123
- seq.generate(std::begin(buffer), std::begin(buffer) + requested_entropy);
133
+ std::fill(buffer + requested_entropy, buffer + kBufferSize, 0);
134
+ seq.generate(buffer, buffer + requested_entropy);
124
135
  #ifdef ABSL_IS_BIG_ENDIAN
125
136
  // Randen expects the seed buffer to be in Little Endian; reverse it on
126
137
  // Big Endian platforms.
@@ -146,9 +157,9 @@ class alignas(16) randen_engine {
146
157
  std::swap(buffer[--dst], buffer[--src]);
147
158
  }
148
159
  } else {
149
- seq.generate(std::begin(buffer), std::end(buffer));
160
+ seq.generate(buffer, buffer + kBufferSize);
150
161
  }
151
- impl_.Absorb(buffer, state_);
162
+ impl_.Absorb(buffer, state());
152
163
 
153
164
  // Generate will be called when operator() is called
154
165
  next_ = kStateSizeT;
@@ -159,9 +170,10 @@ class alignas(16) randen_engine {
159
170
  count -= step;
160
171
 
161
172
  constexpr uint64_t kRateT = kStateSizeT - kCapacityT;
173
+ auto* begin = state();
162
174
  while (count > 0) {
163
175
  next_ = kCapacityT;
164
- impl_.Generate(state_);
176
+ impl_.Generate(*reinterpret_cast<result_type(*)[kStateSizeT]>(begin));
165
177
  step = std::min<uint64_t>(kRateT, count);
166
178
  count -= step;
167
179
  }
@@ -169,9 +181,9 @@ class alignas(16) randen_engine {
169
181
  }
170
182
 
171
183
  bool operator==(const randen_engine& other) const {
184
+ const auto* begin = state();
172
185
  return next_ == other.next_ &&
173
- std::equal(std::begin(state_), std::end(state_),
174
- std::begin(other.state_));
186
+ std::equal(begin, begin + kStateSizeT, other.state());
175
187
  }
176
188
 
177
189
  bool operator!=(const randen_engine& other) const {
@@ -185,11 +197,12 @@ class alignas(16) randen_engine {
185
197
  using numeric_type =
186
198
  typename random_internal::stream_format_type<result_type>::type;
187
199
  auto saver = random_internal::make_ostream_state_saver(os);
188
- for (const auto& elem : engine.state_) {
200
+ auto* it = engine.state();
201
+ for (auto* end = it + kStateSizeT; it < end; ++it) {
189
202
  // In the case that `elem` is `uint8_t`, it must be cast to something
190
203
  // larger so that it prints as an integer rather than a character. For
191
204
  // simplicity, apply the cast all circumstances.
192
- os << static_cast<numeric_type>(little_endian::FromHost(elem))
205
+ os << static_cast<numeric_type>(little_endian::FromHost(*it))
193
206
  << os.fill();
194
207
  }
195
208
  os << engine.next_;
@@ -215,7 +228,7 @@ class alignas(16) randen_engine {
215
228
  if (is.fail()) {
216
229
  return is;
217
230
  }
218
- std::memcpy(engine.state_, state, sizeof(engine.state_));
231
+ std::memcpy(engine.state(), state, sizeof(state));
219
232
  engine.next_ = next;
220
233
  return is;
221
234
  }
@@ -226,9 +239,21 @@ class alignas(16) randen_engine {
226
239
  static constexpr size_t kCapacityT =
227
240
  Randen::kCapacityBytes / sizeof(result_type);
228
241
 
229
- // First kCapacityT are `inner', the others are accessible random bits.
230
- alignas(16) result_type state_[kStateSizeT];
231
- size_t next_; // index within state_
242
+ // Returns the state array pointer, which is aligned to 16 bytes.
243
+ // The first kCapacityT are the `inner' sponge; the remainder are available.
244
+ result_type* state() {
245
+ return reinterpret_cast<result_type*>(
246
+ (reinterpret_cast<uintptr_t>(&raw_state_) & 0xf) ? (raw_state_ + 8)
247
+ : raw_state_);
248
+ }
249
+ const result_type* state() const {
250
+ return const_cast<randen_engine*>(this)->state();
251
+ }
252
+
253
+ // raw state array, manually aligned in state(). This overallocates
254
+ // by 8 bytes since C++ does not guarantee extended heap alignment.
255
+ alignas(8) char raw_state_[Randen::kStateBytes + 8];
256
+ size_t next_; // index within state()
232
257
  Randen impl_;
233
258
  };
234
259
 
@@ -22,6 +22,7 @@
22
22
  #include <memory>
23
23
  #include <type_traits>
24
24
  #include <utility>
25
+ #include <vector>
25
26
 
26
27
  #include "absl/container/inlined_vector.h"
27
28
  #include "absl/meta/type_traits.h"
@@ -65,15 +66,19 @@ class SaltedSeedSeq {
65
66
 
66
67
  template <typename RandomAccessIterator>
67
68
  void generate(RandomAccessIterator begin, RandomAccessIterator end) {
69
+ using U = typename std::iterator_traits<RandomAccessIterator>::value_type;
70
+
68
71
  // The common case is that generate is called with ContiguousIterators
69
72
  // to uint arrays. Such contiguous memory regions may be optimized,
70
73
  // which we detect here.
71
- using tag = absl::conditional_t<
72
- (std::is_pointer<RandomAccessIterator>::value &&
73
- std::is_same<absl::decay_t<decltype(*begin)>, uint32_t>::value),
74
+ using TagType = absl::conditional_t<
75
+ (std::is_same<U, uint32_t>::value &&
76
+ (std::is_pointer<RandomAccessIterator>::value ||
77
+ std::is_same<RandomAccessIterator,
78
+ typename std::vector<U>::iterator>::value)),
74
79
  ContiguousAndUint32Tag, DefaultTag>;
75
80
  if (begin != end) {
76
- generate_impl(begin, end, tag{});
81
+ generate_impl(TagType{}, begin, end, std::distance(begin, end));
77
82
  }
78
83
  }
79
84
 
@@ -89,8 +94,15 @@ class SaltedSeedSeq {
89
94
  struct DefaultTag {};
90
95
 
91
96
  // Generate which requires the iterators are contiguous pointers to uint32_t.
92
- void generate_impl(uint32_t* begin, uint32_t* end, ContiguousAndUint32Tag) {
93
- generate_contiguous(absl::MakeSpan(begin, end));
97
+ // Fills the initial seed buffer the underlying SSeq::generate() call,
98
+ // then mixes in the salt material.
99
+ template <typename Contiguous>
100
+ void generate_impl(ContiguousAndUint32Tag, Contiguous begin, Contiguous end,
101
+ size_t n) {
102
+ seq_->generate(begin, end);
103
+ const uint32_t salt = absl::random_internal::GetSaltMaterial().value_or(0);
104
+ auto span = absl::Span<uint32_t>(&*begin, n);
105
+ MixIntoSeedMaterial(absl::MakeConstSpan(&salt, 1), span);
94
106
  }
95
107
 
96
108
  // The uncommon case for generate is that it is called with iterators over
@@ -98,27 +110,13 @@ class SaltedSeedSeq {
98
110
  // case we allocate a temporary 32-bit buffer and then copy-assign back
99
111
  // to the initial inputs.
100
112
  template <typename RandomAccessIterator>
101
- void generate_impl(RandomAccessIterator begin, RandomAccessIterator end,
102
- DefaultTag) {
103
- return generate_and_copy(std::distance(begin, end), begin);
104
- }
105
-
106
- // Fills the initial seed buffer the underlying SSeq::generate() call,
107
- // mixing in the salt material.
108
- void generate_contiguous(absl::Span<uint32_t> buffer) {
109
- seq_->generate(buffer.begin(), buffer.end());
110
- const uint32_t salt = absl::random_internal::GetSaltMaterial().value_or(0);
111
- MixIntoSeedMaterial(absl::MakeConstSpan(&salt, 1), buffer);
112
- }
113
-
114
- // Allocates a seed buffer of `n` elements, generates the seed, then
115
- // copies the result into the `out` iterator.
116
- template <typename Iterator>
117
- void generate_and_copy(size_t n, Iterator out) {
118
- // Allocate a temporary buffer, generate, and then copy.
113
+ void generate_impl(DefaultTag, RandomAccessIterator begin,
114
+ RandomAccessIterator, size_t n) {
115
+ // Allocates a seed buffer of `n` elements, generates the seed, then
116
+ // copies the result into the `out` iterator.
119
117
  absl::InlinedVector<uint32_t, 8> data(n, 0);
120
- generate_contiguous(absl::MakeSpan(data.data(), data.size()));
121
- std::copy(data.begin(), data.end(), out);
118
+ generate_impl(ContiguousAndUint32Tag{}, data.begin(), data.end(), n);
119
+ std::copy(data.begin(), data.end(), begin);
122
120
  }
123
121
 
124
122
  // Because [rand.req.seedseq] is not required to be copy-constructible,
@@ -20,6 +20,8 @@
20
20
  #include <type_traits>
21
21
 
22
22
  #include "absl/base/config.h"
23
+ #include "absl/numeric/bits.h"
24
+ #include "absl/numeric/int128.h"
23
25
 
24
26
  namespace absl {
25
27
  ABSL_NAMESPACE_BEGIN
@@ -59,6 +61,31 @@ class is_widening_convertible {
59
61
  rank<A>() <= rank<B>();
60
62
  };
61
63
 
64
+ template <typename T>
65
+ struct IsIntegral : std::is_integral<T> {};
66
+ template <>
67
+ struct IsIntegral<absl::int128> : std::true_type {};
68
+ template <>
69
+ struct IsIntegral<absl::uint128> : std::true_type {};
70
+
71
+ template <typename T>
72
+ struct MakeUnsigned : std::make_unsigned<T> {};
73
+ template <>
74
+ struct MakeUnsigned<absl::int128> {
75
+ using type = absl::uint128;
76
+ };
77
+ template <>
78
+ struct MakeUnsigned<absl::uint128> {
79
+ using type = absl::uint128;
80
+ };
81
+
82
+ template <typename T>
83
+ struct IsUnsigned : std::is_unsigned<T> {};
84
+ template <>
85
+ struct IsUnsigned<absl::int128> : std::false_type {};
86
+ template <>
87
+ struct IsUnsigned<absl::uint128> : std::true_type {};
88
+
62
89
  // unsigned_bits<N>::type returns the unsigned int type with the indicated
63
90
  // number of bits.
64
91
  template <size_t N>
@@ -81,19 +108,40 @@ struct unsigned_bits<64> {
81
108
  using type = uint64_t;
82
109
  };
83
110
 
84
- #ifdef ABSL_HAVE_INTRINSIC_INT128
85
111
  template <>
86
112
  struct unsigned_bits<128> {
87
- using type = __uint128_t;
113
+ using type = absl::uint128;
114
+ };
115
+
116
+ // 256-bit wrapper for wide multiplications.
117
+ struct U256 {
118
+ uint128 hi;
119
+ uint128 lo;
120
+ };
121
+ template <>
122
+ struct unsigned_bits<256> {
123
+ using type = U256;
88
124
  };
89
- #endif
90
125
 
91
126
  template <typename IntType>
92
127
  struct make_unsigned_bits {
93
- using type = typename unsigned_bits<std::numeric_limits<
94
- typename std::make_unsigned<IntType>::type>::digits>::type;
128
+ using type = typename unsigned_bits<
129
+ std::numeric_limits<typename MakeUnsigned<IntType>::type>::digits>::type;
95
130
  };
96
131
 
132
+ template <typename T>
133
+ int BitWidth(T v) {
134
+ // Workaround for bit_width not supporting int128.
135
+ // Don't hardcode `64` to make sure this code does not trigger compiler
136
+ // warnings in smaller types.
137
+ constexpr int half_bits = sizeof(T) * 8 / 2;
138
+ if (sizeof(T) == 16 && (v >> half_bits) != 0) {
139
+ return bit_width(static_cast<uint64_t>(v >> half_bits)) + half_bits;
140
+ } else {
141
+ return bit_width(static_cast<uint64_t>(v));
142
+ }
143
+ }
144
+
97
145
  } // namespace random_internal
98
146
  ABSL_NAMESPACE_END
99
147
  } // namespace absl
@@ -100,7 +100,7 @@ using uniform_inferred_return_t =
100
100
  template <typename IntType, typename Tag>
101
101
  typename absl::enable_if_t<
102
102
  absl::conjunction<
103
- std::is_integral<IntType>,
103
+ IsIntegral<IntType>,
104
104
  absl::disjunction<std::is_same<Tag, IntervalOpenClosedTag>,
105
105
  std::is_same<Tag, IntervalOpenOpenTag>>>::value,
106
106
  IntType>
@@ -131,7 +131,7 @@ uniform_lower_bound(Tag, NumType a, NumType) {
131
131
  template <typename IntType, typename Tag>
132
132
  typename absl::enable_if_t<
133
133
  absl::conjunction<
134
- std::is_integral<IntType>,
134
+ IsIntegral<IntType>,
135
135
  absl::disjunction<std::is_same<Tag, IntervalClosedOpenTag>,
136
136
  std::is_same<Tag, IntervalOpenOpenTag>>>::value,
137
137
  IntType>
@@ -153,7 +153,7 @@ uniform_upper_bound(Tag, FloatType, FloatType b) {
153
153
  template <typename IntType, typename Tag>
154
154
  typename absl::enable_if_t<
155
155
  absl::conjunction<
156
- std::is_integral<IntType>,
156
+ IsIntegral<IntType>,
157
157
  absl::disjunction<std::is_same<Tag, IntervalClosedClosedTag>,
158
158
  std::is_same<Tag, IntervalOpenClosedTag>>>::value,
159
159
  IntType>
@@ -201,7 +201,7 @@ is_uniform_range_valid(FloatType a, FloatType b) {
201
201
  }
202
202
 
203
203
  template <typename IntType>
204
- absl::enable_if_t<std::is_integral<IntType>::value, bool>
204
+ absl::enable_if_t<IsIntegral<IntType>::value, bool>
205
205
  is_uniform_range_valid(IntType a, IntType b) {
206
206
  return a <= b;
207
207
  }
@@ -210,7 +210,7 @@ is_uniform_range_valid(IntType a, IntType b) {
210
210
  // or absl::uniform_real_distribution depending on the NumType parameter.
211
211
  template <typename NumType>
212
212
  using UniformDistribution =
213
- typename std::conditional<std::is_integral<NumType>::value,
213
+ typename std::conditional<IsIntegral<NumType>::value,
214
214
  absl::uniform_int_distribution<NumType>,
215
215
  absl::uniform_real_distribution<NumType>>::type;
216
216