grpc 1.43.1 → 1.44.0.pre2

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 (382) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +84 -64
  3. data/include/grpc/grpc_security.h +10 -0
  4. data/include/grpc/impl/codegen/compression_types.h +0 -2
  5. data/include/grpc/impl/codegen/grpc_types.h +6 -0
  6. data/src/core/ext/filters/client_channel/backend_metric.h +1 -1
  7. data/src/core/ext/filters/client_channel/client_channel.cc +62 -68
  8. data/src/core/ext/filters/client_channel/client_channel.h +8 -8
  9. data/src/core/ext/filters/client_channel/client_channel_plugin.cc +1 -1
  10. data/src/core/ext/filters/client_channel/config_selector.h +4 -4
  11. data/src/core/ext/filters/client_channel/dynamic_filters.h +1 -1
  12. data/src/core/ext/filters/client_channel/health/health_check_client.cc +16 -14
  13. data/src/core/ext/filters/client_channel/health/health_check_client.h +3 -3
  14. data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +1 -1
  15. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.cc +4 -3
  16. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.h +6 -5
  17. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +3 -7
  18. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +31 -32
  19. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.h +0 -7
  20. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.h +1 -1
  21. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel.h +1 -1
  22. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc +1 -1
  23. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +43 -29
  24. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +6 -2
  25. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +120 -68
  26. data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +60 -48
  27. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +62 -61
  28. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +16 -11
  29. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +11 -5
  30. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +19 -15
  31. data/src/core/ext/filters/client_channel/lb_policy/xds/xds.h +1 -1
  32. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +14 -12
  33. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +3 -2
  34. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +50 -105
  35. data/src/core/ext/filters/client_channel/lb_policy.cc +15 -14
  36. data/src/core/ext/filters/client_channel/lb_policy.h +19 -3
  37. data/src/core/ext/filters/client_channel/resolver/binder/binder_resolver.cc +3 -3
  38. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +207 -81
  39. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +22 -12
  40. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +19 -15
  41. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +23 -38
  42. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +118 -207
  43. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +25 -32
  44. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_windows.cc +1 -1
  45. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +82 -73
  46. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +10 -10
  47. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h +2 -1
  48. data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +2 -5
  49. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +5 -5
  50. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +157 -67
  51. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +1 -1
  52. data/src/core/ext/filters/client_channel/resolver_result_parsing.h +2 -2
  53. data/src/core/ext/filters/client_channel/retry_filter.cc +37 -64
  54. data/src/core/ext/filters/client_channel/retry_service_config.cc +1 -1
  55. data/src/core/ext/filters/client_channel/retry_service_config.h +1 -1
  56. data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +1 -1
  57. data/src/core/ext/filters/client_channel/subchannel.cc +12 -16
  58. data/src/core/ext/filters/client_channel/subchannel.h +2 -3
  59. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +37 -48
  60. data/src/core/ext/filters/fault_injection/service_config_parser.cc +6 -8
  61. data/src/core/ext/filters/fault_injection/service_config_parser.h +1 -1
  62. data/src/core/ext/filters/http/client/http_client_filter.cc +51 -122
  63. data/src/core/ext/filters/http/client_authority_filter.cc +8 -24
  64. data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +42 -140
  65. data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +5 -25
  66. data/src/core/ext/filters/http/server/http_server_filter.cc +50 -135
  67. data/src/core/ext/filters/message_size/message_size_filter.cc +1 -1
  68. data/src/core/ext/filters/message_size/message_size_filter.h +1 -1
  69. data/src/core/ext/filters/rbac/rbac_filter.cc +157 -0
  70. data/src/core/ext/filters/rbac/rbac_filter.h +74 -0
  71. data/src/core/ext/filters/rbac/rbac_service_config_parser.cc +605 -0
  72. data/src/core/ext/filters/rbac/rbac_service_config_parser.h +70 -0
  73. data/src/core/ext/filters/server_config_selector/server_config_selector.h +3 -2
  74. data/src/core/ext/filters/server_config_selector/server_config_selector_filter.cc +11 -6
  75. data/src/core/ext/transport/chttp2/client/insecure/channel_create.cc +1 -1
  76. data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +1 -1
  77. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +89 -29
  78. data/src/core/ext/transport/chttp2/transport/chttp2_plugin.cc +0 -1
  79. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +45 -186
  80. data/src/core/ext/transport/chttp2/transport/frame_data.cc +0 -1
  81. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +341 -279
  82. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +69 -159
  83. data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.cc +1 -1
  84. data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.h +2 -0
  85. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +19 -32
  86. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +0 -1
  87. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +94 -1
  88. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.h +2 -24
  89. data/src/core/ext/transport/chttp2/transport/internal.h +0 -33
  90. data/src/core/ext/transport/chttp2/transport/parsing.cc +0 -6
  91. data/src/core/ext/transport/chttp2/transport/writing.cc +47 -116
  92. data/src/core/ext/transport/inproc/inproc_plugin.cc +0 -4
  93. data/src/core/ext/transport/inproc/inproc_transport.cc +11 -63
  94. data/src/core/ext/transport/inproc/inproc_transport.h +0 -3
  95. data/src/core/ext/upb-generated/envoy/extensions/filters/http/rbac/v3/rbac.upb.c +61 -0
  96. data/src/core/ext/upb-generated/envoy/extensions/filters/http/rbac/v3/rbac.upb.h +146 -0
  97. data/src/core/ext/upbdefs-generated/envoy/config/rbac/v3/rbac.upbdefs.c +188 -0
  98. data/src/core/ext/upbdefs-generated/envoy/config/rbac/v3/rbac.upbdefs.h +70 -0
  99. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/rbac/v3/rbac.upbdefs.c +56 -0
  100. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/rbac/v3/rbac.upbdefs.h +40 -0
  101. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/checked.upbdefs.c +154 -0
  102. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/checked.upbdefs.h +95 -0
  103. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/eval.upbdefs.c +58 -0
  104. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/eval.upbdefs.h +55 -0
  105. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/explain.upbdefs.c +44 -0
  106. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/explain.upbdefs.h +40 -0
  107. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/syntax.upbdefs.c +153 -0
  108. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/syntax.upbdefs.h +100 -0
  109. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/value.upbdefs.c +75 -0
  110. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/value.upbdefs.h +55 -0
  111. data/src/core/ext/xds/upb_utils.h +65 -0
  112. data/src/core/ext/xds/xds_api.cc +81 -3458
  113. data/src/core/ext/xds/xds_api.h +56 -611
  114. data/src/core/ext/xds/xds_bootstrap.cc +189 -125
  115. data/src/core/ext/xds/xds_bootstrap.h +20 -15
  116. data/src/core/ext/xds/xds_certificate_provider.h +1 -0
  117. data/src/core/ext/xds/xds_channel_creds.cc +108 -0
  118. data/src/core/ext/xds/xds_channel_creds.h +50 -0
  119. data/src/core/ext/xds/xds_client.cc +584 -994
  120. data/src/core/ext/xds/xds_client.h +78 -135
  121. data/src/core/ext/xds/xds_cluster.cc +451 -0
  122. data/src/core/ext/xds/xds_cluster.h +111 -0
  123. data/src/core/ext/xds/xds_common_types.cc +388 -0
  124. data/src/core/ext/xds/xds_common_types.h +110 -0
  125. data/src/core/ext/xds/xds_endpoint.cc +364 -0
  126. data/src/core/ext/xds/xds_endpoint.h +135 -0
  127. data/src/core/ext/xds/xds_http_filters.cc +5 -0
  128. data/src/core/ext/xds/xds_http_rbac_filter.cc +563 -0
  129. data/src/core/ext/xds/xds_http_rbac_filter.h +54 -0
  130. data/src/core/ext/xds/xds_listener.cc +1036 -0
  131. data/src/core/ext/xds/xds_listener.h +220 -0
  132. data/src/core/ext/{transport/chttp2/transport/hpack_utils.h → xds/xds_resource_type.cc} +12 -9
  133. data/src/core/ext/xds/xds_resource_type.h +98 -0
  134. data/src/core/ext/xds/xds_resource_type_impl.h +87 -0
  135. data/src/core/ext/xds/xds_route_config.cc +993 -0
  136. data/src/core/ext/xds/xds_route_config.h +215 -0
  137. data/src/core/ext/xds/xds_routing.cc +11 -8
  138. data/src/core/ext/xds/xds_routing.h +8 -5
  139. data/src/core/ext/xds/xds_server_config_fetcher.cc +159 -99
  140. data/src/core/lib/address_utils/parse_address.cc +20 -0
  141. data/src/core/lib/address_utils/parse_address.h +5 -0
  142. data/src/core/lib/address_utils/sockaddr_utils.cc +33 -36
  143. data/src/core/lib/address_utils/sockaddr_utils.h +1 -16
  144. data/src/core/lib/backoff/backoff.cc +4 -30
  145. data/src/core/lib/backoff/backoff.h +3 -3
  146. data/src/core/lib/channel/channel_args.cc +0 -1
  147. data/src/core/lib/channel/channel_stack.cc +8 -0
  148. data/src/core/lib/channel/channel_stack.h +1 -1
  149. data/src/core/lib/channel/channel_stack_builder.cc +5 -9
  150. data/src/core/lib/channel/channel_stack_builder.h +4 -7
  151. data/src/core/lib/channel/channelz.cc +1 -0
  152. data/src/core/lib/compression/compression.cc +19 -111
  153. data/src/core/lib/compression/compression_internal.cc +142 -202
  154. data/src/core/lib/compression/compression_internal.h +64 -69
  155. data/src/core/lib/compression/message_compress.cc +11 -11
  156. data/src/core/lib/compression/message_compress.h +2 -2
  157. data/src/core/lib/gpr/useful.h +4 -0
  158. data/src/core/lib/gprpp/bitset.h +7 -0
  159. data/src/core/lib/gprpp/chunked_vector.h +45 -3
  160. data/src/core/lib/gprpp/status_helper.cc +20 -28
  161. data/src/core/lib/gprpp/status_helper.h +6 -19
  162. data/src/core/lib/gprpp/table.h +11 -0
  163. data/src/core/lib/http/httpcli.cc +37 -46
  164. data/src/core/lib/http/httpcli.h +3 -15
  165. data/src/core/lib/iomgr/call_combiner.cc +15 -4
  166. data/src/core/lib/iomgr/closure.h +29 -9
  167. data/src/core/lib/iomgr/combiner.cc +25 -3
  168. data/src/core/lib/iomgr/error.cc +2 -0
  169. data/src/core/lib/iomgr/error.h +3 -0
  170. data/src/core/lib/iomgr/event_engine/iomgr.cc +3 -2
  171. data/src/core/lib/iomgr/event_engine/resolved_address_internal.cc +6 -0
  172. data/src/core/lib/iomgr/event_engine/resolved_address_internal.h +2 -0
  173. data/src/core/lib/iomgr/event_engine/resolver.cc +66 -48
  174. data/src/core/lib/iomgr/event_engine/resolver.h +56 -0
  175. data/src/core/lib/iomgr/exec_ctx.cc +22 -9
  176. data/src/core/lib/iomgr/executor.cc +10 -1
  177. data/src/core/lib/iomgr/fork_posix.cc +3 -2
  178. data/src/core/lib/iomgr/iomgr_custom.cc +4 -1
  179. data/src/core/lib/iomgr/iomgr_posix.cc +2 -2
  180. data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +2 -2
  181. data/src/core/lib/iomgr/iomgr_windows.cc +2 -2
  182. data/src/core/lib/iomgr/port.h +2 -2
  183. data/src/core/lib/iomgr/resolve_address.cc +5 -24
  184. data/src/core/lib/iomgr/resolve_address.h +47 -44
  185. data/src/core/lib/iomgr/resolve_address_custom.cc +131 -109
  186. data/src/core/lib/iomgr/resolve_address_custom.h +101 -19
  187. data/src/core/lib/iomgr/resolve_address_impl.h +59 -0
  188. data/src/core/lib/iomgr/resolve_address_posix.cc +82 -66
  189. data/src/core/lib/iomgr/resolve_address_posix.h +47 -0
  190. data/src/core/lib/iomgr/resolve_address_windows.cc +93 -74
  191. data/src/core/lib/iomgr/resolve_address_windows.h +47 -0
  192. data/src/core/lib/iomgr/resolved_address.h +39 -0
  193. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +1 -0
  194. data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +1 -0
  195. data/src/core/lib/iomgr/unix_sockets_posix.cc +22 -34
  196. data/src/core/lib/iomgr/unix_sockets_posix.h +4 -7
  197. data/src/core/lib/iomgr/unix_sockets_posix_noop.cc +6 -15
  198. data/src/core/lib/matchers/matchers.cc +1 -1
  199. data/src/core/lib/promise/activity.h +49 -20
  200. data/src/core/lib/promise/detail/status.h +5 -0
  201. data/src/core/{ext/filters/client_channel → lib/resolver}/resolver.cc +17 -25
  202. data/src/core/{ext/filters/client_channel → lib/resolver}/resolver.h +43 -44
  203. data/src/core/{ext/filters/client_channel → lib/resolver}/resolver_factory.h +10 -5
  204. data/src/core/{ext/filters/client_channel → lib/resolver}/resolver_registry.cc +3 -2
  205. data/src/core/{ext/filters/client_channel → lib/resolver}/resolver_registry.h +4 -5
  206. data/src/core/{ext/filters/client_channel → lib/resolver}/server_address.cc +1 -1
  207. data/src/core/{ext/filters/client_channel → lib/resolver}/server_address.h +4 -4
  208. data/src/core/lib/resource_quota/api.h +0 -1
  209. data/src/core/lib/{gprpp → resource_quota}/arena.cc +16 -13
  210. data/src/core/lib/{gprpp → resource_quota}/arena.h +24 -13
  211. data/src/core/lib/security/authorization/evaluate_args.cc +30 -15
  212. data/src/core/lib/security/authorization/evaluate_args.h +1 -0
  213. data/src/core/lib/security/authorization/grpc_authorization_engine.cc +60 -0
  214. data/src/core/lib/security/authorization/grpc_authorization_engine.h +62 -0
  215. data/src/core/lib/security/authorization/matchers.cc +227 -0
  216. data/src/core/lib/security/authorization/matchers.h +211 -0
  217. data/src/core/lib/security/authorization/rbac_policy.cc +442 -0
  218. data/src/core/lib/security/authorization/rbac_policy.h +170 -0
  219. data/src/core/lib/security/context/security_context.cc +4 -2
  220. data/src/core/lib/security/context/security_context.h +1 -1
  221. data/src/core/lib/security/credentials/composite/composite_credentials.cc +5 -5
  222. data/src/core/lib/security/credentials/composite/composite_credentials.h +4 -3
  223. data/src/core/lib/security/credentials/credentials.h +10 -20
  224. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +6 -9
  225. data/src/core/lib/security/credentials/external/external_account_credentials.cc +7 -9
  226. data/src/core/lib/security/credentials/external/external_account_credentials.h +2 -7
  227. data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +2 -3
  228. data/src/core/lib/security/credentials/fake/fake_credentials.cc +5 -4
  229. data/src/core/lib/security/credentials/fake/fake_credentials.h +8 -7
  230. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +2 -5
  231. data/src/core/lib/security/credentials/iam/iam_credentials.cc +16 -19
  232. data/src/core/lib/security/credentials/iam/iam_credentials.h +6 -5
  233. data/src/core/lib/security/credentials/jwt/json_token.cc +4 -6
  234. data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +16 -28
  235. data/src/core/lib/security/credentials/jwt/jwt_credentials.h +8 -8
  236. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +6 -13
  237. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +44 -57
  238. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +13 -15
  239. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +6 -7
  240. data/src/core/lib/security/credentials/plugin/plugin_credentials.h +5 -4
  241. data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +1 -10
  242. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +6 -0
  243. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h +7 -0
  244. data/src/core/lib/security/credentials/xds/xds_credentials.h +1 -1
  245. data/src/core/lib/security/security_connector/security_connector.cc +0 -4
  246. data/src/core/lib/security/security_connector/security_connector.h +5 -1
  247. data/src/core/lib/security/security_connector/ssl_utils.cc +14 -24
  248. data/src/core/lib/security/security_connector/ssl_utils.h +5 -14
  249. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +2 -3
  250. data/src/core/lib/security/transport/auth_filters.h +7 -0
  251. data/src/core/lib/security/transport/client_auth_filter.cc +53 -33
  252. data/src/core/lib/security/transport/server_auth_filter.cc +40 -35
  253. data/src/core/{ext → lib}/service_config/service_config.cc +2 -2
  254. data/src/core/{ext → lib}/service_config/service_config.h +4 -4
  255. data/src/core/{ext → lib}/service_config/service_config_call_data.h +5 -5
  256. data/src/core/{ext → lib}/service_config/service_config_parser.cc +1 -1
  257. data/src/core/{ext → lib}/service_config/service_config_parser.h +3 -3
  258. data/src/core/lib/slice/slice.cc +3 -1
  259. data/src/core/lib/slice/slice.h +43 -13
  260. data/src/core/lib/slice/slice_intern.cc +3 -101
  261. data/src/core/lib/slice/slice_internal.h +1 -2
  262. data/src/core/lib/slice/slice_refcount.h +4 -13
  263. data/src/core/lib/slice/slice_refcount_base.h +0 -16
  264. data/src/core/lib/surface/call.cc +140 -382
  265. data/src/core/lib/surface/call.h +4 -4
  266. data/src/core/lib/surface/channel.cc +42 -44
  267. data/src/core/lib/surface/channel.h +4 -4
  268. data/src/core/lib/surface/init.cc +0 -2
  269. data/src/core/lib/surface/lame_client.cc +0 -1
  270. data/src/core/lib/surface/server.cc +12 -29
  271. data/src/core/lib/surface/server.h +2 -2
  272. data/src/core/lib/surface/version.cc +2 -2
  273. data/src/core/lib/transport/error_utils.h +14 -0
  274. data/src/core/lib/transport/metadata_batch.h +799 -717
  275. data/src/core/lib/transport/parsed_metadata.cc +2 -0
  276. data/src/core/lib/transport/parsed_metadata.h +95 -92
  277. data/src/core/lib/transport/timeout_encoding.cc +200 -66
  278. data/src/core/lib/transport/timeout_encoding.h +40 -10
  279. data/src/core/lib/transport/transport.h +1 -1
  280. data/src/core/lib/transport/transport_op_string.cc +6 -39
  281. data/src/core/lib/uri/uri_parser.cc +223 -53
  282. data/src/core/lib/uri/uri_parser.h +36 -23
  283. data/src/core/plugin_registry/grpc_plugin_registry.cc +4 -3
  284. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +1 -1
  285. data/src/core/tsi/ssl/session_cache/ssl_session.h +2 -4
  286. data/src/core/tsi/ssl/session_cache/ssl_session_cache.h +3 -5
  287. data/src/core/tsi/ssl_transport_security.cc +53 -13
  288. data/src/core/tsi/ssl_transport_security.h +18 -6
  289. data/src/ruby/ext/grpc/extconf.rb +10 -3
  290. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +2 -0
  291. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +3 -0
  292. data/src/ruby/lib/grpc/version.rb +1 -1
  293. data/src/ruby/pb/src/proto/grpc/testing/test_pb.rb +2 -1
  294. data/third_party/abseil-cpp/absl/base/internal/fast_type_id.h +48 -0
  295. data/third_party/abseil-cpp/absl/random/bernoulli_distribution.h +200 -0
  296. data/third_party/abseil-cpp/absl/random/beta_distribution.h +427 -0
  297. data/third_party/abseil-cpp/absl/random/discrete_distribution.cc +98 -0
  298. data/third_party/abseil-cpp/absl/random/discrete_distribution.h +247 -0
  299. data/third_party/abseil-cpp/absl/random/distributions.h +452 -0
  300. data/third_party/abseil-cpp/absl/random/exponential_distribution.h +165 -0
  301. data/third_party/abseil-cpp/absl/random/gaussian_distribution.cc +104 -0
  302. data/third_party/abseil-cpp/absl/random/gaussian_distribution.h +275 -0
  303. data/third_party/abseil-cpp/absl/random/internal/distribution_caller.h +92 -0
  304. data/third_party/abseil-cpp/absl/random/internal/fast_uniform_bits.h +268 -0
  305. data/third_party/abseil-cpp/absl/random/internal/fastmath.h +57 -0
  306. data/third_party/abseil-cpp/absl/random/internal/generate_real.h +144 -0
  307. data/third_party/abseil-cpp/absl/random/internal/iostream_state_saver.h +245 -0
  308. data/third_party/abseil-cpp/absl/random/internal/nonsecure_base.h +150 -0
  309. data/third_party/abseil-cpp/absl/random/internal/pcg_engine.h +308 -0
  310. data/third_party/abseil-cpp/absl/random/internal/platform.h +171 -0
  311. data/third_party/abseil-cpp/absl/random/internal/pool_urbg.cc +253 -0
  312. data/third_party/abseil-cpp/absl/random/internal/pool_urbg.h +131 -0
  313. data/third_party/abseil-cpp/absl/random/internal/randen.cc +91 -0
  314. data/third_party/abseil-cpp/absl/random/internal/randen.h +102 -0
  315. data/third_party/abseil-cpp/absl/random/internal/randen_detect.cc +221 -0
  316. data/third_party/abseil-cpp/absl/random/internal/randen_detect.h +33 -0
  317. data/third_party/abseil-cpp/absl/random/internal/randen_engine.h +239 -0
  318. data/third_party/abseil-cpp/absl/random/internal/randen_hwaes.cc +526 -0
  319. data/third_party/abseil-cpp/absl/random/internal/randen_hwaes.h +50 -0
  320. data/third_party/abseil-cpp/absl/random/internal/randen_round_keys.cc +462 -0
  321. data/third_party/abseil-cpp/absl/random/internal/randen_slow.cc +471 -0
  322. data/third_party/abseil-cpp/absl/random/internal/randen_slow.h +40 -0
  323. data/third_party/abseil-cpp/absl/random/internal/randen_traits.h +88 -0
  324. data/third_party/abseil-cpp/absl/random/internal/salted_seed_seq.h +167 -0
  325. data/third_party/abseil-cpp/absl/random/internal/seed_material.cc +267 -0
  326. data/third_party/abseil-cpp/absl/random/internal/seed_material.h +104 -0
  327. data/third_party/abseil-cpp/absl/random/internal/traits.h +101 -0
  328. data/third_party/abseil-cpp/absl/random/internal/uniform_helper.h +244 -0
  329. data/third_party/abseil-cpp/absl/random/internal/wide_multiply.h +111 -0
  330. data/third_party/abseil-cpp/absl/random/log_uniform_int_distribution.h +257 -0
  331. data/third_party/abseil-cpp/absl/random/poisson_distribution.h +258 -0
  332. data/third_party/abseil-cpp/absl/random/random.h +189 -0
  333. data/third_party/abseil-cpp/absl/random/seed_gen_exception.cc +46 -0
  334. data/third_party/abseil-cpp/absl/random/seed_gen_exception.h +55 -0
  335. data/third_party/abseil-cpp/absl/random/seed_sequences.cc +29 -0
  336. data/third_party/abseil-cpp/absl/random/seed_sequences.h +110 -0
  337. data/third_party/abseil-cpp/absl/random/uniform_int_distribution.h +275 -0
  338. data/third_party/abseil-cpp/absl/random/uniform_real_distribution.h +202 -0
  339. data/third_party/abseil-cpp/absl/random/zipf_distribution.h +271 -0
  340. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_enc.c +1 -0
  341. data/third_party/boringssl-with-bazel/src/crypto/base64/base64.c +13 -0
  342. data/third_party/boringssl-with-bazel/src/crypto/dsa/dsa.c +21 -0
  343. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/cipher.c +12 -0
  344. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdsa/ecdsa.c +1 -2
  345. data/third_party/boringssl-with-bazel/src/crypto/hpke/hpke.c +2 -2
  346. data/third_party/boringssl-with-bazel/src/crypto/mem.c +1 -1
  347. data/third_party/boringssl-with-bazel/src/crypto/pkcs7/pkcs7.c +29 -0
  348. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/internal.h +0 -1
  349. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8.c +1 -1
  350. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8_x509.c +1 -1
  351. data/third_party/boringssl-with-bazel/src/include/openssl/base64.h +8 -0
  352. data/third_party/boringssl-with-bazel/src/include/openssl/cipher.h +13 -1
  353. data/third_party/boringssl-with-bazel/src/include/openssl/dsa.h +10 -0
  354. data/third_party/boringssl-with-bazel/src/include/openssl/hpke.h +1 -1
  355. data/third_party/boringssl-with-bazel/src/include/openssl/pkcs7.h +9 -4
  356. data/third_party/boringssl-with-bazel/src/include/openssl/pkcs8.h +6 -1
  357. data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +23 -2
  358. data/third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc +4 -0
  359. data/third_party/xxhash/xxhash.h +607 -352
  360. metadata +149 -77
  361. data/src/core/ext/transport/chttp2/transport/hpack_encoder_index.h +0 -107
  362. data/src/core/ext/transport/chttp2/transport/hpack_utils.cc +0 -46
  363. data/src/core/ext/transport/chttp2/transport/popularity_count.h +0 -60
  364. data/src/core/lib/compression/algorithm_metadata.h +0 -62
  365. data/src/core/lib/compression/compression_args.cc +0 -140
  366. data/src/core/lib/compression/compression_args.h +0 -58
  367. data/src/core/lib/compression/stream_compression.cc +0 -81
  368. data/src/core/lib/compression/stream_compression.h +0 -117
  369. data/src/core/lib/compression/stream_compression_gzip.cc +0 -231
  370. data/src/core/lib/compression/stream_compression_gzip.h +0 -28
  371. data/src/core/lib/compression/stream_compression_identity.cc +0 -91
  372. data/src/core/lib/compression/stream_compression_identity.h +0 -29
  373. data/src/core/lib/security/credentials/credentials_metadata.cc +0 -61
  374. data/src/core/lib/slice/static_slice.cc +0 -377
  375. data/src/core/lib/slice/static_slice.h +0 -300
  376. data/src/core/lib/transport/metadata.cc +0 -714
  377. data/src/core/lib/transport/metadata.h +0 -449
  378. data/src/core/lib/transport/metadata_batch.cc +0 -99
  379. data/src/core/lib/transport/static_metadata.cc +0 -1032
  380. data/src/core/lib/transport/static_metadata.h +0 -322
  381. data/src/core/lib/transport/status_metadata.cc +0 -63
  382. data/src/core/lib/transport/status_metadata.h +0 -48
@@ -0,0 +1,452 @@
1
+ // Copyright 2017 The Abseil Authors.
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // 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: distributions.h
17
+ // -----------------------------------------------------------------------------
18
+ //
19
+ // This header defines functions representing distributions, which you use in
20
+ // combination with an Abseil random bit generator to produce random values
21
+ // according to the rules of that distribution.
22
+ //
23
+ // The Abseil random library defines the following distributions within this
24
+ // file:
25
+ //
26
+ // * `absl::Uniform` for uniform (constant) distributions having constant
27
+ // probability
28
+ // * `absl::Bernoulli` for discrete distributions having exactly two outcomes
29
+ // * `absl::Beta` for continuous distributions parameterized through two
30
+ // free parameters
31
+ // * `absl::Exponential` for discrete distributions of events occurring
32
+ // continuously and independently at a constant average rate
33
+ // * `absl::Gaussian` (also known as "normal distributions") for continuous
34
+ // distributions using an associated quadratic function
35
+ // * `absl::LogUniform` for continuous uniform distributions where the log
36
+ // to the given base of all values is uniform
37
+ // * `absl::Poisson` for discrete probability distributions that express the
38
+ // probability of a given number of events occurring within a fixed interval
39
+ // * `absl::Zipf` for discrete probability distributions commonly used for
40
+ // modelling of rare events
41
+ //
42
+ // Prefer use of these distribution function classes over manual construction of
43
+ // your own distribution classes, as it allows library maintainers greater
44
+ // flexibility to change the underlying implementation in the future.
45
+
46
+ #ifndef ABSL_RANDOM_DISTRIBUTIONS_H_
47
+ #define ABSL_RANDOM_DISTRIBUTIONS_H_
48
+
49
+ #include <algorithm>
50
+ #include <cmath>
51
+ #include <limits>
52
+ #include <random>
53
+ #include <type_traits>
54
+
55
+ #include "absl/base/internal/inline_variable.h"
56
+ #include "absl/random/bernoulli_distribution.h"
57
+ #include "absl/random/beta_distribution.h"
58
+ #include "absl/random/exponential_distribution.h"
59
+ #include "absl/random/gaussian_distribution.h"
60
+ #include "absl/random/internal/distribution_caller.h" // IWYU pragma: export
61
+ #include "absl/random/internal/uniform_helper.h" // IWYU pragma: export
62
+ #include "absl/random/log_uniform_int_distribution.h"
63
+ #include "absl/random/poisson_distribution.h"
64
+ #include "absl/random/uniform_int_distribution.h"
65
+ #include "absl/random/uniform_real_distribution.h"
66
+ #include "absl/random/zipf_distribution.h"
67
+
68
+ namespace absl {
69
+ ABSL_NAMESPACE_BEGIN
70
+
71
+ ABSL_INTERNAL_INLINE_CONSTEXPR(IntervalClosedClosedTag, IntervalClosedClosed,
72
+ {});
73
+ ABSL_INTERNAL_INLINE_CONSTEXPR(IntervalClosedClosedTag, IntervalClosed, {});
74
+ ABSL_INTERNAL_INLINE_CONSTEXPR(IntervalClosedOpenTag, IntervalClosedOpen, {});
75
+ ABSL_INTERNAL_INLINE_CONSTEXPR(IntervalOpenOpenTag, IntervalOpenOpen, {});
76
+ ABSL_INTERNAL_INLINE_CONSTEXPR(IntervalOpenOpenTag, IntervalOpen, {});
77
+ ABSL_INTERNAL_INLINE_CONSTEXPR(IntervalOpenClosedTag, IntervalOpenClosed, {});
78
+
79
+ // -----------------------------------------------------------------------------
80
+ // absl::Uniform<T>(tag, bitgen, lo, hi)
81
+ // -----------------------------------------------------------------------------
82
+ //
83
+ // `absl::Uniform()` produces random values of type `T` uniformly distributed in
84
+ // a defined interval {lo, hi}. The interval `tag` defines the type of interval
85
+ // which should be one of the following possible values:
86
+ //
87
+ // * `absl::IntervalOpenOpen`
88
+ // * `absl::IntervalOpenClosed`
89
+ // * `absl::IntervalClosedOpen`
90
+ // * `absl::IntervalClosedClosed`
91
+ //
92
+ // where "open" refers to an exclusive value (excluded) from the output, while
93
+ // "closed" refers to an inclusive value (included) from the output.
94
+ //
95
+ // In the absence of an explicit return type `T`, `absl::Uniform()` will deduce
96
+ // the return type based on the provided endpoint arguments {A lo, B hi}.
97
+ // Given these endpoints, one of {A, B} will be chosen as the return type, if
98
+ // a type can be implicitly converted into the other in a lossless way. The
99
+ // lack of any such implicit conversion between {A, B} will produce a
100
+ // compile-time error
101
+ //
102
+ // See https://en.wikipedia.org/wiki/Uniform_distribution_(continuous)
103
+ //
104
+ // Example:
105
+ //
106
+ // absl::BitGen bitgen;
107
+ //
108
+ // // Produce a random float value between 0.0 and 1.0, inclusive
109
+ // auto x = absl::Uniform(absl::IntervalClosedClosed, bitgen, 0.0f, 1.0f);
110
+ //
111
+ // // The most common interval of `absl::IntervalClosedOpen` is available by
112
+ // // default:
113
+ //
114
+ // auto x = absl::Uniform(bitgen, 0.0f, 1.0f);
115
+ //
116
+ // // Return-types are typically inferred from the arguments, however callers
117
+ // // can optionally provide an explicit return-type to the template.
118
+ //
119
+ // auto x = absl::Uniform<float>(bitgen, 0, 1);
120
+ //
121
+ template <typename R = void, typename TagType, typename URBG>
122
+ typename absl::enable_if_t<!std::is_same<R, void>::value, R> //
123
+ Uniform(TagType tag,
124
+ URBG&& urbg, // NOLINT(runtime/references)
125
+ R lo, R hi) {
126
+ using gen_t = absl::decay_t<URBG>;
127
+ using distribution_t = random_internal::UniformDistributionWrapper<R>;
128
+
129
+ auto a = random_internal::uniform_lower_bound(tag, lo, hi);
130
+ auto b = random_internal::uniform_upper_bound(tag, lo, hi);
131
+ if (!random_internal::is_uniform_range_valid(a, b)) return lo;
132
+
133
+ return random_internal::DistributionCaller<gen_t>::template Call<
134
+ distribution_t>(&urbg, tag, lo, hi);
135
+ }
136
+
137
+ // absl::Uniform<T>(bitgen, lo, hi)
138
+ //
139
+ // Overload of `Uniform()` using the default closed-open interval of [lo, hi),
140
+ // and returning values of type `T`
141
+ template <typename R = void, typename URBG>
142
+ typename absl::enable_if_t<!std::is_same<R, void>::value, R> //
143
+ Uniform(URBG&& urbg, // NOLINT(runtime/references)
144
+ R lo, R hi) {
145
+ using gen_t = absl::decay_t<URBG>;
146
+ using distribution_t = random_internal::UniformDistributionWrapper<R>;
147
+ constexpr auto tag = absl::IntervalClosedOpen;
148
+
149
+ auto a = random_internal::uniform_lower_bound(tag, lo, hi);
150
+ auto b = random_internal::uniform_upper_bound(tag, lo, hi);
151
+ if (!random_internal::is_uniform_range_valid(a, b)) return lo;
152
+
153
+ return random_internal::DistributionCaller<gen_t>::template Call<
154
+ distribution_t>(&urbg, lo, hi);
155
+ }
156
+
157
+ // absl::Uniform(tag, bitgen, lo, hi)
158
+ //
159
+ // Overload of `Uniform()` using different (but compatible) lo, hi types. Note
160
+ // that a compile-error will result if the return type cannot be deduced
161
+ // correctly from the passed types.
162
+ template <typename R = void, typename TagType, typename URBG, typename A,
163
+ typename B>
164
+ typename absl::enable_if_t<std::is_same<R, void>::value,
165
+ random_internal::uniform_inferred_return_t<A, B>>
166
+ Uniform(TagType tag,
167
+ URBG&& urbg, // NOLINT(runtime/references)
168
+ A lo, B hi) {
169
+ using gen_t = absl::decay_t<URBG>;
170
+ using return_t = typename random_internal::uniform_inferred_return_t<A, B>;
171
+ using distribution_t = random_internal::UniformDistributionWrapper<return_t>;
172
+
173
+ auto a = random_internal::uniform_lower_bound<return_t>(tag, lo, hi);
174
+ auto b = random_internal::uniform_upper_bound<return_t>(tag, lo, hi);
175
+ if (!random_internal::is_uniform_range_valid(a, b)) return lo;
176
+
177
+ return random_internal::DistributionCaller<gen_t>::template Call<
178
+ distribution_t>(&urbg, tag, static_cast<return_t>(lo),
179
+ static_cast<return_t>(hi));
180
+ }
181
+
182
+ // absl::Uniform(bitgen, lo, hi)
183
+ //
184
+ // Overload of `Uniform()` using different (but compatible) lo, hi types and the
185
+ // default closed-open interval of [lo, hi). Note that a compile-error will
186
+ // result if the return type cannot be deduced correctly from the passed types.
187
+ template <typename R = void, typename URBG, typename A, typename B>
188
+ typename absl::enable_if_t<std::is_same<R, void>::value,
189
+ random_internal::uniform_inferred_return_t<A, B>>
190
+ Uniform(URBG&& urbg, // NOLINT(runtime/references)
191
+ A lo, B hi) {
192
+ using gen_t = absl::decay_t<URBG>;
193
+ using return_t = typename random_internal::uniform_inferred_return_t<A, B>;
194
+ using distribution_t = random_internal::UniformDistributionWrapper<return_t>;
195
+
196
+ constexpr auto tag = absl::IntervalClosedOpen;
197
+ auto a = random_internal::uniform_lower_bound<return_t>(tag, lo, hi);
198
+ auto b = random_internal::uniform_upper_bound<return_t>(tag, lo, hi);
199
+ if (!random_internal::is_uniform_range_valid(a, b)) return lo;
200
+
201
+ return random_internal::DistributionCaller<gen_t>::template Call<
202
+ distribution_t>(&urbg, static_cast<return_t>(lo),
203
+ static_cast<return_t>(hi));
204
+ }
205
+
206
+ // absl::Uniform<unsigned T>(bitgen)
207
+ //
208
+ // Overload of Uniform() using the minimum and maximum values of a given type
209
+ // `T` (which must be unsigned), returning a value of type `unsigned T`
210
+ template <typename R, typename URBG>
211
+ typename absl::enable_if_t<!std::is_signed<R>::value, R> //
212
+ Uniform(URBG&& urbg) { // NOLINT(runtime/references)
213
+ using gen_t = absl::decay_t<URBG>;
214
+ using distribution_t = random_internal::UniformDistributionWrapper<R>;
215
+
216
+ return random_internal::DistributionCaller<gen_t>::template Call<
217
+ distribution_t>(&urbg);
218
+ }
219
+
220
+ // -----------------------------------------------------------------------------
221
+ // absl::Bernoulli(bitgen, p)
222
+ // -----------------------------------------------------------------------------
223
+ //
224
+ // `absl::Bernoulli` produces a random boolean value, with probability `p`
225
+ // (where 0.0 <= p <= 1.0) equaling `true`.
226
+ //
227
+ // Prefer `absl::Bernoulli` to produce boolean values over other alternatives
228
+ // such as comparing an `absl::Uniform()` value to a specific output.
229
+ //
230
+ // See https://en.wikipedia.org/wiki/Bernoulli_distribution
231
+ //
232
+ // Example:
233
+ //
234
+ // absl::BitGen bitgen;
235
+ // ...
236
+ // if (absl::Bernoulli(bitgen, 1.0/3721.0)) {
237
+ // std::cout << "Asteroid field navigation successful.";
238
+ // }
239
+ //
240
+ template <typename URBG>
241
+ bool Bernoulli(URBG&& urbg, // NOLINT(runtime/references)
242
+ double p) {
243
+ using gen_t = absl::decay_t<URBG>;
244
+ using distribution_t = absl::bernoulli_distribution;
245
+
246
+ return random_internal::DistributionCaller<gen_t>::template Call<
247
+ distribution_t>(&urbg, p);
248
+ }
249
+
250
+ // -----------------------------------------------------------------------------
251
+ // absl::Beta<T>(bitgen, alpha, beta)
252
+ // -----------------------------------------------------------------------------
253
+ //
254
+ // `absl::Beta` produces a floating point number distributed in the closed
255
+ // interval [0,1] and parameterized by two values `alpha` and `beta` as per a
256
+ // Beta distribution. `T` must be a floating point type, but may be inferred
257
+ // from the types of `alpha` and `beta`.
258
+ //
259
+ // See https://en.wikipedia.org/wiki/Beta_distribution.
260
+ //
261
+ // Example:
262
+ //
263
+ // absl::BitGen bitgen;
264
+ // ...
265
+ // double sample = absl::Beta(bitgen, 3.0, 2.0);
266
+ //
267
+ template <typename RealType, typename URBG>
268
+ RealType Beta(URBG&& urbg, // NOLINT(runtime/references)
269
+ RealType alpha, RealType beta) {
270
+ static_assert(
271
+ std::is_floating_point<RealType>::value,
272
+ "Template-argument 'RealType' must be a floating-point type, in "
273
+ "absl::Beta<RealType, URBG>(...)");
274
+
275
+ using gen_t = absl::decay_t<URBG>;
276
+ using distribution_t = typename absl::beta_distribution<RealType>;
277
+
278
+ return random_internal::DistributionCaller<gen_t>::template Call<
279
+ distribution_t>(&urbg, alpha, beta);
280
+ }
281
+
282
+ // -----------------------------------------------------------------------------
283
+ // absl::Exponential<T>(bitgen, lambda = 1)
284
+ // -----------------------------------------------------------------------------
285
+ //
286
+ // `absl::Exponential` produces a floating point number representing the
287
+ // distance (time) between two consecutive events in a point process of events
288
+ // occurring continuously and independently at a constant average rate. `T` must
289
+ // be a floating point type, but may be inferred from the type of `lambda`.
290
+ //
291
+ // See https://en.wikipedia.org/wiki/Exponential_distribution.
292
+ //
293
+ // Example:
294
+ //
295
+ // absl::BitGen bitgen;
296
+ // ...
297
+ // double call_length = absl::Exponential(bitgen, 7.0);
298
+ //
299
+ template <typename RealType, typename URBG>
300
+ RealType Exponential(URBG&& urbg, // NOLINT(runtime/references)
301
+ RealType lambda = 1) {
302
+ static_assert(
303
+ std::is_floating_point<RealType>::value,
304
+ "Template-argument 'RealType' must be a floating-point type, in "
305
+ "absl::Exponential<RealType, URBG>(...)");
306
+
307
+ using gen_t = absl::decay_t<URBG>;
308
+ using distribution_t = typename absl::exponential_distribution<RealType>;
309
+
310
+ return random_internal::DistributionCaller<gen_t>::template Call<
311
+ distribution_t>(&urbg, lambda);
312
+ }
313
+
314
+ // -----------------------------------------------------------------------------
315
+ // absl::Gaussian<T>(bitgen, mean = 0, stddev = 1)
316
+ // -----------------------------------------------------------------------------
317
+ //
318
+ // `absl::Gaussian` produces a floating point number selected from the Gaussian
319
+ // (ie. "Normal") distribution. `T` must be a floating point type, but may be
320
+ // inferred from the types of `mean` and `stddev`.
321
+ //
322
+ // See https://en.wikipedia.org/wiki/Normal_distribution
323
+ //
324
+ // Example:
325
+ //
326
+ // absl::BitGen bitgen;
327
+ // ...
328
+ // double giraffe_height = absl::Gaussian(bitgen, 16.3, 3.3);
329
+ //
330
+ template <typename RealType, typename URBG>
331
+ RealType Gaussian(URBG&& urbg, // NOLINT(runtime/references)
332
+ RealType mean = 0, RealType stddev = 1) {
333
+ static_assert(
334
+ std::is_floating_point<RealType>::value,
335
+ "Template-argument 'RealType' must be a floating-point type, in "
336
+ "absl::Gaussian<RealType, URBG>(...)");
337
+
338
+ using gen_t = absl::decay_t<URBG>;
339
+ using distribution_t = typename absl::gaussian_distribution<RealType>;
340
+
341
+ return random_internal::DistributionCaller<gen_t>::template Call<
342
+ distribution_t>(&urbg, mean, stddev);
343
+ }
344
+
345
+ // -----------------------------------------------------------------------------
346
+ // absl::LogUniform<T>(bitgen, lo, hi, base = 2)
347
+ // -----------------------------------------------------------------------------
348
+ //
349
+ // `absl::LogUniform` produces random values distributed where the log to a
350
+ // given base of all values is uniform in a closed interval [lo, hi]. `T` must
351
+ // be an integral type, but may be inferred from the types of `lo` and `hi`.
352
+ //
353
+ // I.e., `LogUniform(0, n, b)` is uniformly distributed across buckets
354
+ // [0], [1, b-1], [b, b^2-1] .. [b^(k-1), (b^k)-1] .. [b^floor(log(n, b)), n]
355
+ // and is uniformly distributed within each bucket.
356
+ //
357
+ // The resulting probability density is inversely related to bucket size, though
358
+ // values in the final bucket may be more likely than previous values. (In the
359
+ // extreme case where n = b^i the final value will be tied with zero as the most
360
+ // probable result.
361
+ //
362
+ // If `lo` is nonzero then this distribution is shifted to the desired interval,
363
+ // so LogUniform(lo, hi, b) is equivalent to LogUniform(0, hi-lo, b)+lo.
364
+ //
365
+ // See http://ecolego.facilia.se/ecolego/show/Log-Uniform%20Distribution
366
+ //
367
+ // Example:
368
+ //
369
+ // absl::BitGen bitgen;
370
+ // ...
371
+ // int v = absl::LogUniform(bitgen, 0, 1000);
372
+ //
373
+ template <typename IntType, typename URBG>
374
+ IntType LogUniform(URBG&& urbg, // NOLINT(runtime/references)
375
+ IntType lo, IntType hi, IntType base = 2) {
376
+ static_assert(std::is_integral<IntType>::value,
377
+ "Template-argument 'IntType' must be an integral type, in "
378
+ "absl::LogUniform<IntType, URBG>(...)");
379
+
380
+ using gen_t = absl::decay_t<URBG>;
381
+ using distribution_t = typename absl::log_uniform_int_distribution<IntType>;
382
+
383
+ return random_internal::DistributionCaller<gen_t>::template Call<
384
+ distribution_t>(&urbg, lo, hi, base);
385
+ }
386
+
387
+ // -----------------------------------------------------------------------------
388
+ // absl::Poisson<T>(bitgen, mean = 1)
389
+ // -----------------------------------------------------------------------------
390
+ //
391
+ // `absl::Poisson` produces discrete probabilities for a given number of events
392
+ // occurring within a fixed interval within the closed interval [0, max]. `T`
393
+ // must be an integral type.
394
+ //
395
+ // See https://en.wikipedia.org/wiki/Poisson_distribution
396
+ //
397
+ // Example:
398
+ //
399
+ // absl::BitGen bitgen;
400
+ // ...
401
+ // int requests_per_minute = absl::Poisson<int>(bitgen, 3.2);
402
+ //
403
+ template <typename IntType, typename URBG>
404
+ IntType Poisson(URBG&& urbg, // NOLINT(runtime/references)
405
+ double mean = 1.0) {
406
+ static_assert(std::is_integral<IntType>::value,
407
+ "Template-argument 'IntType' must be an integral type, in "
408
+ "absl::Poisson<IntType, URBG>(...)");
409
+
410
+ using gen_t = absl::decay_t<URBG>;
411
+ using distribution_t = typename absl::poisson_distribution<IntType>;
412
+
413
+ return random_internal::DistributionCaller<gen_t>::template Call<
414
+ distribution_t>(&urbg, mean);
415
+ }
416
+
417
+ // -----------------------------------------------------------------------------
418
+ // absl::Zipf<T>(bitgen, hi = max, q = 2, v = 1)
419
+ // -----------------------------------------------------------------------------
420
+ //
421
+ // `absl::Zipf` produces discrete probabilities commonly used for modelling of
422
+ // rare events over the closed interval [0, hi]. The parameters `v` and `q`
423
+ // determine the skew of the distribution. `T` must be an integral type, but
424
+ // may be inferred from the type of `hi`.
425
+ //
426
+ // See http://mathworld.wolfram.com/ZipfDistribution.html
427
+ //
428
+ // Example:
429
+ //
430
+ // absl::BitGen bitgen;
431
+ // ...
432
+ // int term_rank = absl::Zipf<int>(bitgen);
433
+ //
434
+ template <typename IntType, typename URBG>
435
+ IntType Zipf(URBG&& urbg, // NOLINT(runtime/references)
436
+ IntType hi = (std::numeric_limits<IntType>::max)(), double q = 2.0,
437
+ double v = 1.0) {
438
+ static_assert(std::is_integral<IntType>::value,
439
+ "Template-argument 'IntType' must be an integral type, in "
440
+ "absl::Zipf<IntType, URBG>(...)");
441
+
442
+ using gen_t = absl::decay_t<URBG>;
443
+ using distribution_t = typename absl::zipf_distribution<IntType>;
444
+
445
+ return random_internal::DistributionCaller<gen_t>::template Call<
446
+ distribution_t>(&urbg, hi, q, v);
447
+ }
448
+
449
+ ABSL_NAMESPACE_END
450
+ } // namespace absl
451
+
452
+ #endif // ABSL_RANDOM_DISTRIBUTIONS_H_
@@ -0,0 +1,165 @@
1
+ // Copyright 2017 The Abseil Authors.
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // 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_RANDOM_EXPONENTIAL_DISTRIBUTION_H_
16
+ #define ABSL_RANDOM_EXPONENTIAL_DISTRIBUTION_H_
17
+
18
+ #include <cassert>
19
+ #include <cmath>
20
+ #include <istream>
21
+ #include <limits>
22
+ #include <type_traits>
23
+
24
+ #include "absl/meta/type_traits.h"
25
+ #include "absl/random/internal/fast_uniform_bits.h"
26
+ #include "absl/random/internal/generate_real.h"
27
+ #include "absl/random/internal/iostream_state_saver.h"
28
+
29
+ namespace absl {
30
+ ABSL_NAMESPACE_BEGIN
31
+
32
+ // absl::exponential_distribution:
33
+ // Generates a number conforming to an exponential distribution and is
34
+ // equivalent to the standard [rand.dist.pois.exp] distribution.
35
+ template <typename RealType = double>
36
+ class exponential_distribution {
37
+ public:
38
+ using result_type = RealType;
39
+
40
+ class param_type {
41
+ public:
42
+ using distribution_type = exponential_distribution;
43
+
44
+ explicit param_type(result_type lambda = 1) : lambda_(lambda) {
45
+ assert(lambda > 0);
46
+ neg_inv_lambda_ = -result_type(1) / lambda_;
47
+ }
48
+
49
+ result_type lambda() const { return lambda_; }
50
+
51
+ friend bool operator==(const param_type& a, const param_type& b) {
52
+ return a.lambda_ == b.lambda_;
53
+ }
54
+
55
+ friend bool operator!=(const param_type& a, const param_type& b) {
56
+ return !(a == b);
57
+ }
58
+
59
+ private:
60
+ friend class exponential_distribution;
61
+
62
+ result_type lambda_;
63
+ result_type neg_inv_lambda_;
64
+
65
+ static_assert(
66
+ std::is_floating_point<RealType>::value,
67
+ "Class-template absl::exponential_distribution<> must be parameterized "
68
+ "using a floating-point type.");
69
+ };
70
+
71
+ exponential_distribution() : exponential_distribution(1) {}
72
+
73
+ explicit exponential_distribution(result_type lambda) : param_(lambda) {}
74
+
75
+ explicit exponential_distribution(const param_type& p) : param_(p) {}
76
+
77
+ void reset() {}
78
+
79
+ // Generating functions
80
+ template <typename URBG>
81
+ result_type operator()(URBG& g) { // NOLINT(runtime/references)
82
+ return (*this)(g, param_);
83
+ }
84
+
85
+ template <typename URBG>
86
+ result_type operator()(URBG& g, // NOLINT(runtime/references)
87
+ const param_type& p);
88
+
89
+ param_type param() const { return param_; }
90
+ void param(const param_type& p) { param_ = p; }
91
+
92
+ result_type(min)() const { return 0; }
93
+ result_type(max)() const {
94
+ return std::numeric_limits<result_type>::infinity();
95
+ }
96
+
97
+ result_type lambda() const { return param_.lambda(); }
98
+
99
+ friend bool operator==(const exponential_distribution& a,
100
+ const exponential_distribution& b) {
101
+ return a.param_ == b.param_;
102
+ }
103
+ friend bool operator!=(const exponential_distribution& a,
104
+ const exponential_distribution& b) {
105
+ return a.param_ != b.param_;
106
+ }
107
+
108
+ private:
109
+ param_type param_;
110
+ random_internal::FastUniformBits<uint64_t> fast_u64_;
111
+ };
112
+
113
+ // --------------------------------------------------------------------------
114
+ // Implementation details follow
115
+ // --------------------------------------------------------------------------
116
+
117
+ template <typename RealType>
118
+ template <typename URBG>
119
+ typename exponential_distribution<RealType>::result_type
120
+ exponential_distribution<RealType>::operator()(
121
+ URBG& g, // NOLINT(runtime/references)
122
+ const param_type& p) {
123
+ using random_internal::GenerateNegativeTag;
124
+ using random_internal::GenerateRealFromBits;
125
+ using real_type =
126
+ absl::conditional_t<std::is_same<RealType, float>::value, float, double>;
127
+
128
+ const result_type u = GenerateRealFromBits<real_type, GenerateNegativeTag,
129
+ false>(fast_u64_(g)); // U(-1, 0)
130
+
131
+ // log1p(-x) is mathematically equivalent to log(1 - x) but has more
132
+ // accuracy for x near zero.
133
+ return p.neg_inv_lambda_ * std::log1p(u);
134
+ }
135
+
136
+ template <typename CharT, typename Traits, typename RealType>
137
+ std::basic_ostream<CharT, Traits>& operator<<(
138
+ std::basic_ostream<CharT, Traits>& os, // NOLINT(runtime/references)
139
+ const exponential_distribution<RealType>& x) {
140
+ auto saver = random_internal::make_ostream_state_saver(os);
141
+ os.precision(random_internal::stream_precision_helper<RealType>::kPrecision);
142
+ os << x.lambda();
143
+ return os;
144
+ }
145
+
146
+ template <typename CharT, typename Traits, typename RealType>
147
+ std::basic_istream<CharT, Traits>& operator>>(
148
+ std::basic_istream<CharT, Traits>& is, // NOLINT(runtime/references)
149
+ exponential_distribution<RealType>& x) { // NOLINT(runtime/references)
150
+ using result_type = typename exponential_distribution<RealType>::result_type;
151
+ using param_type = typename exponential_distribution<RealType>::param_type;
152
+ result_type lambda;
153
+
154
+ auto saver = random_internal::make_istream_state_saver(is);
155
+ lambda = random_internal::read_floating_point<result_type>(is);
156
+ if (!is.fail()) {
157
+ x.param(param_type(lambda));
158
+ }
159
+ return is;
160
+ }
161
+
162
+ ABSL_NAMESPACE_END
163
+ } // namespace absl
164
+
165
+ #endif // ABSL_RANDOM_EXPONENTIAL_DISTRIBUTION_H_