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.
- checksums.yaml +4 -4
- data/Makefile +84 -64
- data/include/grpc/grpc_security.h +10 -0
- data/include/grpc/impl/codegen/compression_types.h +0 -2
- data/include/grpc/impl/codegen/grpc_types.h +6 -0
- data/src/core/ext/filters/client_channel/backend_metric.h +1 -1
- data/src/core/ext/filters/client_channel/client_channel.cc +62 -68
- data/src/core/ext/filters/client_channel/client_channel.h +8 -8
- data/src/core/ext/filters/client_channel/client_channel_plugin.cc +1 -1
- data/src/core/ext/filters/client_channel/config_selector.h +4 -4
- data/src/core/ext/filters/client_channel/dynamic_filters.h +1 -1
- data/src/core/ext/filters/client_channel/health/health_check_client.cc +16 -14
- data/src/core/ext/filters/client_channel/health/health_check_client.h +3 -3
- data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +1 -1
- data/src/core/ext/filters/client_channel/lb_policy/address_filtering.cc +4 -3
- data/src/core/ext/filters/client_channel/lb_policy/address_filtering.h +6 -5
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +3 -7
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +31 -32
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.h +0 -7
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.h +1 -1
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel.h +1 -1
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc +1 -1
- data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +43 -29
- data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +6 -2
- data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +120 -68
- data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +60 -48
- data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +62 -61
- data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +16 -11
- data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +11 -5
- data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +19 -15
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds.h +1 -1
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +14 -12
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +3 -2
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +50 -105
- data/src/core/ext/filters/client_channel/lb_policy.cc +15 -14
- data/src/core/ext/filters/client_channel/lb_policy.h +19 -3
- data/src/core/ext/filters/client_channel/resolver/binder/binder_resolver.cc +3 -3
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +207 -81
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +22 -12
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +19 -15
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +23 -38
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +118 -207
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +25 -32
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_windows.cc +1 -1
- data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +82 -73
- data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +10 -10
- data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h +2 -1
- data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +2 -5
- data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +5 -5
- data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +157 -67
- data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +1 -1
- data/src/core/ext/filters/client_channel/resolver_result_parsing.h +2 -2
- data/src/core/ext/filters/client_channel/retry_filter.cc +37 -64
- data/src/core/ext/filters/client_channel/retry_service_config.cc +1 -1
- data/src/core/ext/filters/client_channel/retry_service_config.h +1 -1
- data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +1 -1
- data/src/core/ext/filters/client_channel/subchannel.cc +12 -16
- data/src/core/ext/filters/client_channel/subchannel.h +2 -3
- data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +37 -48
- data/src/core/ext/filters/fault_injection/service_config_parser.cc +6 -8
- data/src/core/ext/filters/fault_injection/service_config_parser.h +1 -1
- data/src/core/ext/filters/http/client/http_client_filter.cc +51 -122
- data/src/core/ext/filters/http/client_authority_filter.cc +8 -24
- data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +42 -140
- data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +5 -25
- data/src/core/ext/filters/http/server/http_server_filter.cc +50 -135
- data/src/core/ext/filters/message_size/message_size_filter.cc +1 -1
- data/src/core/ext/filters/message_size/message_size_filter.h +1 -1
- data/src/core/ext/filters/rbac/rbac_filter.cc +157 -0
- data/src/core/ext/filters/rbac/rbac_filter.h +74 -0
- data/src/core/ext/filters/rbac/rbac_service_config_parser.cc +605 -0
- data/src/core/ext/filters/rbac/rbac_service_config_parser.h +70 -0
- data/src/core/ext/filters/server_config_selector/server_config_selector.h +3 -2
- data/src/core/ext/filters/server_config_selector/server_config_selector_filter.cc +11 -6
- data/src/core/ext/transport/chttp2/client/insecure/channel_create.cc +1 -1
- data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +1 -1
- data/src/core/ext/transport/chttp2/server/chttp2_server.cc +89 -29
- data/src/core/ext/transport/chttp2/transport/chttp2_plugin.cc +0 -1
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +45 -186
- data/src/core/ext/transport/chttp2/transport/frame_data.cc +0 -1
- data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +341 -279
- data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +69 -159
- data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.cc +1 -1
- data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.h +2 -0
- data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +19 -32
- data/src/core/ext/transport/chttp2/transport/hpack_parser.h +0 -1
- data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +94 -1
- data/src/core/ext/transport/chttp2/transport/hpack_parser_table.h +2 -24
- data/src/core/ext/transport/chttp2/transport/internal.h +0 -33
- data/src/core/ext/transport/chttp2/transport/parsing.cc +0 -6
- data/src/core/ext/transport/chttp2/transport/writing.cc +47 -116
- data/src/core/ext/transport/inproc/inproc_plugin.cc +0 -4
- data/src/core/ext/transport/inproc/inproc_transport.cc +11 -63
- data/src/core/ext/transport/inproc/inproc_transport.h +0 -3
- data/src/core/ext/upb-generated/envoy/extensions/filters/http/rbac/v3/rbac.upb.c +61 -0
- data/src/core/ext/upb-generated/envoy/extensions/filters/http/rbac/v3/rbac.upb.h +146 -0
- data/src/core/ext/upbdefs-generated/envoy/config/rbac/v3/rbac.upbdefs.c +188 -0
- data/src/core/ext/upbdefs-generated/envoy/config/rbac/v3/rbac.upbdefs.h +70 -0
- data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/rbac/v3/rbac.upbdefs.c +56 -0
- data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/rbac/v3/rbac.upbdefs.h +40 -0
- data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/checked.upbdefs.c +154 -0
- data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/checked.upbdefs.h +95 -0
- data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/eval.upbdefs.c +58 -0
- data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/eval.upbdefs.h +55 -0
- data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/explain.upbdefs.c +44 -0
- data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/explain.upbdefs.h +40 -0
- data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/syntax.upbdefs.c +153 -0
- data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/syntax.upbdefs.h +100 -0
- data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/value.upbdefs.c +75 -0
- data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/value.upbdefs.h +55 -0
- data/src/core/ext/xds/upb_utils.h +65 -0
- data/src/core/ext/xds/xds_api.cc +81 -3458
- data/src/core/ext/xds/xds_api.h +56 -611
- data/src/core/ext/xds/xds_bootstrap.cc +189 -125
- data/src/core/ext/xds/xds_bootstrap.h +20 -15
- data/src/core/ext/xds/xds_certificate_provider.h +1 -0
- data/src/core/ext/xds/xds_channel_creds.cc +108 -0
- data/src/core/ext/xds/xds_channel_creds.h +50 -0
- data/src/core/ext/xds/xds_client.cc +584 -994
- data/src/core/ext/xds/xds_client.h +78 -135
- data/src/core/ext/xds/xds_cluster.cc +451 -0
- data/src/core/ext/xds/xds_cluster.h +111 -0
- data/src/core/ext/xds/xds_common_types.cc +388 -0
- data/src/core/ext/xds/xds_common_types.h +110 -0
- data/src/core/ext/xds/xds_endpoint.cc +364 -0
- data/src/core/ext/xds/xds_endpoint.h +135 -0
- data/src/core/ext/xds/xds_http_filters.cc +5 -0
- data/src/core/ext/xds/xds_http_rbac_filter.cc +563 -0
- data/src/core/ext/xds/xds_http_rbac_filter.h +54 -0
- data/src/core/ext/xds/xds_listener.cc +1036 -0
- data/src/core/ext/xds/xds_listener.h +220 -0
- data/src/core/ext/{transport/chttp2/transport/hpack_utils.h → xds/xds_resource_type.cc} +12 -9
- data/src/core/ext/xds/xds_resource_type.h +98 -0
- data/src/core/ext/xds/xds_resource_type_impl.h +87 -0
- data/src/core/ext/xds/xds_route_config.cc +993 -0
- data/src/core/ext/xds/xds_route_config.h +215 -0
- data/src/core/ext/xds/xds_routing.cc +11 -8
- data/src/core/ext/xds/xds_routing.h +8 -5
- data/src/core/ext/xds/xds_server_config_fetcher.cc +159 -99
- data/src/core/lib/address_utils/parse_address.cc +20 -0
- data/src/core/lib/address_utils/parse_address.h +5 -0
- data/src/core/lib/address_utils/sockaddr_utils.cc +33 -36
- data/src/core/lib/address_utils/sockaddr_utils.h +1 -16
- data/src/core/lib/backoff/backoff.cc +4 -30
- data/src/core/lib/backoff/backoff.h +3 -3
- data/src/core/lib/channel/channel_args.cc +0 -1
- data/src/core/lib/channel/channel_stack.cc +8 -0
- data/src/core/lib/channel/channel_stack.h +1 -1
- data/src/core/lib/channel/channel_stack_builder.cc +5 -9
- data/src/core/lib/channel/channel_stack_builder.h +4 -7
- data/src/core/lib/channel/channelz.cc +1 -0
- data/src/core/lib/compression/compression.cc +19 -111
- data/src/core/lib/compression/compression_internal.cc +142 -202
- data/src/core/lib/compression/compression_internal.h +64 -69
- data/src/core/lib/compression/message_compress.cc +11 -11
- data/src/core/lib/compression/message_compress.h +2 -2
- data/src/core/lib/gpr/useful.h +4 -0
- data/src/core/lib/gprpp/bitset.h +7 -0
- data/src/core/lib/gprpp/chunked_vector.h +45 -3
- data/src/core/lib/gprpp/status_helper.cc +20 -28
- data/src/core/lib/gprpp/status_helper.h +6 -19
- data/src/core/lib/gprpp/table.h +11 -0
- data/src/core/lib/http/httpcli.cc +37 -46
- data/src/core/lib/http/httpcli.h +3 -15
- data/src/core/lib/iomgr/call_combiner.cc +15 -4
- data/src/core/lib/iomgr/closure.h +29 -9
- data/src/core/lib/iomgr/combiner.cc +25 -3
- data/src/core/lib/iomgr/error.cc +2 -0
- data/src/core/lib/iomgr/error.h +3 -0
- data/src/core/lib/iomgr/event_engine/iomgr.cc +3 -2
- data/src/core/lib/iomgr/event_engine/resolved_address_internal.cc +6 -0
- data/src/core/lib/iomgr/event_engine/resolved_address_internal.h +2 -0
- data/src/core/lib/iomgr/event_engine/resolver.cc +66 -48
- data/src/core/lib/iomgr/event_engine/resolver.h +56 -0
- data/src/core/lib/iomgr/exec_ctx.cc +22 -9
- data/src/core/lib/iomgr/executor.cc +10 -1
- data/src/core/lib/iomgr/fork_posix.cc +3 -2
- data/src/core/lib/iomgr/iomgr_custom.cc +4 -1
- data/src/core/lib/iomgr/iomgr_posix.cc +2 -2
- data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +2 -2
- data/src/core/lib/iomgr/iomgr_windows.cc +2 -2
- data/src/core/lib/iomgr/port.h +2 -2
- data/src/core/lib/iomgr/resolve_address.cc +5 -24
- data/src/core/lib/iomgr/resolve_address.h +47 -44
- data/src/core/lib/iomgr/resolve_address_custom.cc +131 -109
- data/src/core/lib/iomgr/resolve_address_custom.h +101 -19
- data/src/core/lib/iomgr/resolve_address_impl.h +59 -0
- data/src/core/lib/iomgr/resolve_address_posix.cc +82 -66
- data/src/core/lib/iomgr/resolve_address_posix.h +47 -0
- data/src/core/lib/iomgr/resolve_address_windows.cc +93 -74
- data/src/core/lib/iomgr/resolve_address_windows.h +47 -0
- data/src/core/lib/iomgr/resolved_address.h +39 -0
- data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +1 -0
- data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +1 -0
- data/src/core/lib/iomgr/unix_sockets_posix.cc +22 -34
- data/src/core/lib/iomgr/unix_sockets_posix.h +4 -7
- data/src/core/lib/iomgr/unix_sockets_posix_noop.cc +6 -15
- data/src/core/lib/matchers/matchers.cc +1 -1
- data/src/core/lib/promise/activity.h +49 -20
- data/src/core/lib/promise/detail/status.h +5 -0
- data/src/core/{ext/filters/client_channel → lib/resolver}/resolver.cc +17 -25
- data/src/core/{ext/filters/client_channel → lib/resolver}/resolver.h +43 -44
- data/src/core/{ext/filters/client_channel → lib/resolver}/resolver_factory.h +10 -5
- data/src/core/{ext/filters/client_channel → lib/resolver}/resolver_registry.cc +3 -2
- data/src/core/{ext/filters/client_channel → lib/resolver}/resolver_registry.h +4 -5
- data/src/core/{ext/filters/client_channel → lib/resolver}/server_address.cc +1 -1
- data/src/core/{ext/filters/client_channel → lib/resolver}/server_address.h +4 -4
- data/src/core/lib/resource_quota/api.h +0 -1
- data/src/core/lib/{gprpp → resource_quota}/arena.cc +16 -13
- data/src/core/lib/{gprpp → resource_quota}/arena.h +24 -13
- data/src/core/lib/security/authorization/evaluate_args.cc +30 -15
- data/src/core/lib/security/authorization/evaluate_args.h +1 -0
- data/src/core/lib/security/authorization/grpc_authorization_engine.cc +60 -0
- data/src/core/lib/security/authorization/grpc_authorization_engine.h +62 -0
- data/src/core/lib/security/authorization/matchers.cc +227 -0
- data/src/core/lib/security/authorization/matchers.h +211 -0
- data/src/core/lib/security/authorization/rbac_policy.cc +442 -0
- data/src/core/lib/security/authorization/rbac_policy.h +170 -0
- data/src/core/lib/security/context/security_context.cc +4 -2
- data/src/core/lib/security/context/security_context.h +1 -1
- data/src/core/lib/security/credentials/composite/composite_credentials.cc +5 -5
- data/src/core/lib/security/credentials/composite/composite_credentials.h +4 -3
- data/src/core/lib/security/credentials/credentials.h +10 -20
- data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +6 -9
- data/src/core/lib/security/credentials/external/external_account_credentials.cc +7 -9
- data/src/core/lib/security/credentials/external/external_account_credentials.h +2 -7
- data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +2 -3
- data/src/core/lib/security/credentials/fake/fake_credentials.cc +5 -4
- data/src/core/lib/security/credentials/fake/fake_credentials.h +8 -7
- data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +2 -5
- data/src/core/lib/security/credentials/iam/iam_credentials.cc +16 -19
- data/src/core/lib/security/credentials/iam/iam_credentials.h +6 -5
- data/src/core/lib/security/credentials/jwt/json_token.cc +4 -6
- data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +16 -28
- data/src/core/lib/security/credentials/jwt/jwt_credentials.h +8 -8
- data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +6 -13
- data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +44 -57
- data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +13 -15
- data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +6 -7
- data/src/core/lib/security/credentials/plugin/plugin_credentials.h +5 -4
- data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +1 -10
- data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +6 -0
- data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h +7 -0
- data/src/core/lib/security/credentials/xds/xds_credentials.h +1 -1
- data/src/core/lib/security/security_connector/security_connector.cc +0 -4
- data/src/core/lib/security/security_connector/security_connector.h +5 -1
- data/src/core/lib/security/security_connector/ssl_utils.cc +14 -24
- data/src/core/lib/security/security_connector/ssl_utils.h +5 -14
- data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +2 -3
- data/src/core/lib/security/transport/auth_filters.h +7 -0
- data/src/core/lib/security/transport/client_auth_filter.cc +53 -33
- data/src/core/lib/security/transport/server_auth_filter.cc +40 -35
- data/src/core/{ext → lib}/service_config/service_config.cc +2 -2
- data/src/core/{ext → lib}/service_config/service_config.h +4 -4
- data/src/core/{ext → lib}/service_config/service_config_call_data.h +5 -5
- data/src/core/{ext → lib}/service_config/service_config_parser.cc +1 -1
- data/src/core/{ext → lib}/service_config/service_config_parser.h +3 -3
- data/src/core/lib/slice/slice.cc +3 -1
- data/src/core/lib/slice/slice.h +43 -13
- data/src/core/lib/slice/slice_intern.cc +3 -101
- data/src/core/lib/slice/slice_internal.h +1 -2
- data/src/core/lib/slice/slice_refcount.h +4 -13
- data/src/core/lib/slice/slice_refcount_base.h +0 -16
- data/src/core/lib/surface/call.cc +140 -382
- data/src/core/lib/surface/call.h +4 -4
- data/src/core/lib/surface/channel.cc +42 -44
- data/src/core/lib/surface/channel.h +4 -4
- data/src/core/lib/surface/init.cc +0 -2
- data/src/core/lib/surface/lame_client.cc +0 -1
- data/src/core/lib/surface/server.cc +12 -29
- data/src/core/lib/surface/server.h +2 -2
- data/src/core/lib/surface/version.cc +2 -2
- data/src/core/lib/transport/error_utils.h +14 -0
- data/src/core/lib/transport/metadata_batch.h +799 -717
- data/src/core/lib/transport/parsed_metadata.cc +2 -0
- data/src/core/lib/transport/parsed_metadata.h +95 -92
- data/src/core/lib/transport/timeout_encoding.cc +200 -66
- data/src/core/lib/transport/timeout_encoding.h +40 -10
- data/src/core/lib/transport/transport.h +1 -1
- data/src/core/lib/transport/transport_op_string.cc +6 -39
- data/src/core/lib/uri/uri_parser.cc +223 -53
- data/src/core/lib/uri/uri_parser.h +36 -23
- data/src/core/plugin_registry/grpc_plugin_registry.cc +4 -3
- data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +1 -1
- data/src/core/tsi/ssl/session_cache/ssl_session.h +2 -4
- data/src/core/tsi/ssl/session_cache/ssl_session_cache.h +3 -5
- data/src/core/tsi/ssl_transport_security.cc +53 -13
- data/src/core/tsi/ssl_transport_security.h +18 -6
- data/src/ruby/ext/grpc/extconf.rb +10 -3
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +2 -0
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +3 -0
- data/src/ruby/lib/grpc/version.rb +1 -1
- data/src/ruby/pb/src/proto/grpc/testing/test_pb.rb +2 -1
- data/third_party/abseil-cpp/absl/base/internal/fast_type_id.h +48 -0
- data/third_party/abseil-cpp/absl/random/bernoulli_distribution.h +200 -0
- data/third_party/abseil-cpp/absl/random/beta_distribution.h +427 -0
- data/third_party/abseil-cpp/absl/random/discrete_distribution.cc +98 -0
- data/third_party/abseil-cpp/absl/random/discrete_distribution.h +247 -0
- data/third_party/abseil-cpp/absl/random/distributions.h +452 -0
- data/third_party/abseil-cpp/absl/random/exponential_distribution.h +165 -0
- data/third_party/abseil-cpp/absl/random/gaussian_distribution.cc +104 -0
- data/third_party/abseil-cpp/absl/random/gaussian_distribution.h +275 -0
- data/third_party/abseil-cpp/absl/random/internal/distribution_caller.h +92 -0
- data/third_party/abseil-cpp/absl/random/internal/fast_uniform_bits.h +268 -0
- data/third_party/abseil-cpp/absl/random/internal/fastmath.h +57 -0
- data/third_party/abseil-cpp/absl/random/internal/generate_real.h +144 -0
- data/third_party/abseil-cpp/absl/random/internal/iostream_state_saver.h +245 -0
- data/third_party/abseil-cpp/absl/random/internal/nonsecure_base.h +150 -0
- data/third_party/abseil-cpp/absl/random/internal/pcg_engine.h +308 -0
- data/third_party/abseil-cpp/absl/random/internal/platform.h +171 -0
- data/third_party/abseil-cpp/absl/random/internal/pool_urbg.cc +253 -0
- data/third_party/abseil-cpp/absl/random/internal/pool_urbg.h +131 -0
- data/third_party/abseil-cpp/absl/random/internal/randen.cc +91 -0
- data/third_party/abseil-cpp/absl/random/internal/randen.h +102 -0
- data/third_party/abseil-cpp/absl/random/internal/randen_detect.cc +221 -0
- data/third_party/abseil-cpp/absl/random/internal/randen_detect.h +33 -0
- data/third_party/abseil-cpp/absl/random/internal/randen_engine.h +239 -0
- data/third_party/abseil-cpp/absl/random/internal/randen_hwaes.cc +526 -0
- data/third_party/abseil-cpp/absl/random/internal/randen_hwaes.h +50 -0
- data/third_party/abseil-cpp/absl/random/internal/randen_round_keys.cc +462 -0
- data/third_party/abseil-cpp/absl/random/internal/randen_slow.cc +471 -0
- data/third_party/abseil-cpp/absl/random/internal/randen_slow.h +40 -0
- data/third_party/abseil-cpp/absl/random/internal/randen_traits.h +88 -0
- data/third_party/abseil-cpp/absl/random/internal/salted_seed_seq.h +167 -0
- data/third_party/abseil-cpp/absl/random/internal/seed_material.cc +267 -0
- data/third_party/abseil-cpp/absl/random/internal/seed_material.h +104 -0
- data/third_party/abseil-cpp/absl/random/internal/traits.h +101 -0
- data/third_party/abseil-cpp/absl/random/internal/uniform_helper.h +244 -0
- data/third_party/abseil-cpp/absl/random/internal/wide_multiply.h +111 -0
- data/third_party/abseil-cpp/absl/random/log_uniform_int_distribution.h +257 -0
- data/third_party/abseil-cpp/absl/random/poisson_distribution.h +258 -0
- data/third_party/abseil-cpp/absl/random/random.h +189 -0
- data/third_party/abseil-cpp/absl/random/seed_gen_exception.cc +46 -0
- data/third_party/abseil-cpp/absl/random/seed_gen_exception.h +55 -0
- data/third_party/abseil-cpp/absl/random/seed_sequences.cc +29 -0
- data/third_party/abseil-cpp/absl/random/seed_sequences.h +110 -0
- data/third_party/abseil-cpp/absl/random/uniform_int_distribution.h +275 -0
- data/third_party/abseil-cpp/absl/random/uniform_real_distribution.h +202 -0
- data/third_party/abseil-cpp/absl/random/zipf_distribution.h +271 -0
- data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_enc.c +1 -0
- data/third_party/boringssl-with-bazel/src/crypto/base64/base64.c +13 -0
- data/third_party/boringssl-with-bazel/src/crypto/dsa/dsa.c +21 -0
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/cipher.c +12 -0
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdsa/ecdsa.c +1 -2
- data/third_party/boringssl-with-bazel/src/crypto/hpke/hpke.c +2 -2
- data/third_party/boringssl-with-bazel/src/crypto/mem.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/pkcs7/pkcs7.c +29 -0
- data/third_party/boringssl-with-bazel/src/crypto/pkcs8/internal.h +0 -1
- data/third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8_x509.c +1 -1
- data/third_party/boringssl-with-bazel/src/include/openssl/base64.h +8 -0
- data/third_party/boringssl-with-bazel/src/include/openssl/cipher.h +13 -1
- data/third_party/boringssl-with-bazel/src/include/openssl/dsa.h +10 -0
- data/third_party/boringssl-with-bazel/src/include/openssl/hpke.h +1 -1
- data/third_party/boringssl-with-bazel/src/include/openssl/pkcs7.h +9 -4
- data/third_party/boringssl-with-bazel/src/include/openssl/pkcs8.h +6 -1
- data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +23 -2
- data/third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc +4 -0
- data/third_party/xxhash/xxhash.h +607 -352
- metadata +149 -77
- data/src/core/ext/transport/chttp2/transport/hpack_encoder_index.h +0 -107
- data/src/core/ext/transport/chttp2/transport/hpack_utils.cc +0 -46
- data/src/core/ext/transport/chttp2/transport/popularity_count.h +0 -60
- data/src/core/lib/compression/algorithm_metadata.h +0 -62
- data/src/core/lib/compression/compression_args.cc +0 -140
- data/src/core/lib/compression/compression_args.h +0 -58
- data/src/core/lib/compression/stream_compression.cc +0 -81
- data/src/core/lib/compression/stream_compression.h +0 -117
- data/src/core/lib/compression/stream_compression_gzip.cc +0 -231
- data/src/core/lib/compression/stream_compression_gzip.h +0 -28
- data/src/core/lib/compression/stream_compression_identity.cc +0 -91
- data/src/core/lib/compression/stream_compression_identity.h +0 -29
- data/src/core/lib/security/credentials/credentials_metadata.cc +0 -61
- data/src/core/lib/slice/static_slice.cc +0 -377
- data/src/core/lib/slice/static_slice.h +0 -300
- data/src/core/lib/transport/metadata.cc +0 -714
- data/src/core/lib/transport/metadata.h +0 -449
- data/src/core/lib/transport/metadata_batch.cc +0 -99
- data/src/core/lib/transport/static_metadata.cc +0 -1032
- data/src/core/lib/transport/static_metadata.h +0 -322
- data/src/core/lib/transport/status_metadata.cc +0 -63
- data/src/core/lib/transport/status_metadata.h +0 -48
@@ -0,0 +1,258 @@
|
|
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_POISSON_DISTRIBUTION_H_
|
16
|
+
#define ABSL_RANDOM_POISSON_DISTRIBUTION_H_
|
17
|
+
|
18
|
+
#include <cassert>
|
19
|
+
#include <cmath>
|
20
|
+
#include <istream>
|
21
|
+
#include <limits>
|
22
|
+
#include <ostream>
|
23
|
+
#include <type_traits>
|
24
|
+
|
25
|
+
#include "absl/random/internal/fast_uniform_bits.h"
|
26
|
+
#include "absl/random/internal/fastmath.h"
|
27
|
+
#include "absl/random/internal/generate_real.h"
|
28
|
+
#include "absl/random/internal/iostream_state_saver.h"
|
29
|
+
|
30
|
+
namespace absl {
|
31
|
+
ABSL_NAMESPACE_BEGIN
|
32
|
+
|
33
|
+
// absl::poisson_distribution:
|
34
|
+
// Generates discrete variates conforming to a Poisson distribution.
|
35
|
+
// p(n) = (mean^n / n!) exp(-mean)
|
36
|
+
//
|
37
|
+
// Depending on the parameter, the distribution selects one of the following
|
38
|
+
// algorithms:
|
39
|
+
// * The standard algorithm, attributed to Knuth, extended using a split method
|
40
|
+
// for larger values
|
41
|
+
// * The "Ratio of Uniforms as a convenient method for sampling from classical
|
42
|
+
// discrete distributions", Stadlober, 1989.
|
43
|
+
// http://www.sciencedirect.com/science/article/pii/0377042790903495
|
44
|
+
//
|
45
|
+
// NOTE: param_type.mean() is a double, which permits values larger than
|
46
|
+
// poisson_distribution<IntType>::max(), however this should be avoided and
|
47
|
+
// the distribution results are limited to the max() value.
|
48
|
+
//
|
49
|
+
// The goals of this implementation are to provide good performance while still
|
50
|
+
// beig thread-safe: This limits the implementation to not using lgamma provided
|
51
|
+
// by <math.h>.
|
52
|
+
//
|
53
|
+
template <typename IntType = int>
|
54
|
+
class poisson_distribution {
|
55
|
+
public:
|
56
|
+
using result_type = IntType;
|
57
|
+
|
58
|
+
class param_type {
|
59
|
+
public:
|
60
|
+
using distribution_type = poisson_distribution;
|
61
|
+
explicit param_type(double mean = 1.0);
|
62
|
+
|
63
|
+
double mean() const { return mean_; }
|
64
|
+
|
65
|
+
friend bool operator==(const param_type& a, const param_type& b) {
|
66
|
+
return a.mean_ == b.mean_;
|
67
|
+
}
|
68
|
+
|
69
|
+
friend bool operator!=(const param_type& a, const param_type& b) {
|
70
|
+
return !(a == b);
|
71
|
+
}
|
72
|
+
|
73
|
+
private:
|
74
|
+
friend class poisson_distribution;
|
75
|
+
|
76
|
+
double mean_;
|
77
|
+
double emu_; // e ^ -mean_
|
78
|
+
double lmu_; // ln(mean_)
|
79
|
+
double s_;
|
80
|
+
double log_k_;
|
81
|
+
int split_;
|
82
|
+
|
83
|
+
static_assert(std::is_integral<IntType>::value,
|
84
|
+
"Class-template absl::poisson_distribution<> must be "
|
85
|
+
"parameterized using an integral type.");
|
86
|
+
};
|
87
|
+
|
88
|
+
poisson_distribution() : poisson_distribution(1.0) {}
|
89
|
+
|
90
|
+
explicit poisson_distribution(double mean) : param_(mean) {}
|
91
|
+
|
92
|
+
explicit poisson_distribution(const param_type& p) : param_(p) {}
|
93
|
+
|
94
|
+
void reset() {}
|
95
|
+
|
96
|
+
// generating functions
|
97
|
+
template <typename URBG>
|
98
|
+
result_type operator()(URBG& g) { // NOLINT(runtime/references)
|
99
|
+
return (*this)(g, param_);
|
100
|
+
}
|
101
|
+
|
102
|
+
template <typename URBG>
|
103
|
+
result_type operator()(URBG& g, // NOLINT(runtime/references)
|
104
|
+
const param_type& p);
|
105
|
+
|
106
|
+
param_type param() const { return param_; }
|
107
|
+
void param(const param_type& p) { param_ = p; }
|
108
|
+
|
109
|
+
result_type(min)() const { return 0; }
|
110
|
+
result_type(max)() const { return (std::numeric_limits<result_type>::max)(); }
|
111
|
+
|
112
|
+
double mean() const { return param_.mean(); }
|
113
|
+
|
114
|
+
friend bool operator==(const poisson_distribution& a,
|
115
|
+
const poisson_distribution& b) {
|
116
|
+
return a.param_ == b.param_;
|
117
|
+
}
|
118
|
+
friend bool operator!=(const poisson_distribution& a,
|
119
|
+
const poisson_distribution& b) {
|
120
|
+
return a.param_ != b.param_;
|
121
|
+
}
|
122
|
+
|
123
|
+
private:
|
124
|
+
param_type param_;
|
125
|
+
random_internal::FastUniformBits<uint64_t> fast_u64_;
|
126
|
+
};
|
127
|
+
|
128
|
+
// -----------------------------------------------------------------------------
|
129
|
+
// Implementation details follow
|
130
|
+
// -----------------------------------------------------------------------------
|
131
|
+
|
132
|
+
template <typename IntType>
|
133
|
+
poisson_distribution<IntType>::param_type::param_type(double mean)
|
134
|
+
: mean_(mean), split_(0) {
|
135
|
+
assert(mean >= 0);
|
136
|
+
assert(mean <= (std::numeric_limits<result_type>::max)());
|
137
|
+
// As a defensive measure, avoid large values of the mean. The rejection
|
138
|
+
// algorithm used does not support very large values well. It my be worth
|
139
|
+
// changing algorithms to better deal with these cases.
|
140
|
+
assert(mean <= 1e10);
|
141
|
+
if (mean_ < 10) {
|
142
|
+
// For small lambda, use the knuth method.
|
143
|
+
split_ = 1;
|
144
|
+
emu_ = std::exp(-mean_);
|
145
|
+
} else if (mean_ <= 50) {
|
146
|
+
// Use split-knuth method.
|
147
|
+
split_ = 1 + static_cast<int>(mean_ / 10.0);
|
148
|
+
emu_ = std::exp(-mean_ / static_cast<double>(split_));
|
149
|
+
} else {
|
150
|
+
// Use ratio of uniforms method.
|
151
|
+
constexpr double k2E = 0.7357588823428846;
|
152
|
+
constexpr double kSA = 0.4494580810294493;
|
153
|
+
|
154
|
+
lmu_ = std::log(mean_);
|
155
|
+
double a = mean_ + 0.5;
|
156
|
+
s_ = kSA + std::sqrt(k2E * a);
|
157
|
+
const double mode = std::ceil(mean_) - 1;
|
158
|
+
log_k_ = lmu_ * mode - absl::random_internal::StirlingLogFactorial(mode);
|
159
|
+
}
|
160
|
+
}
|
161
|
+
|
162
|
+
template <typename IntType>
|
163
|
+
template <typename URBG>
|
164
|
+
typename poisson_distribution<IntType>::result_type
|
165
|
+
poisson_distribution<IntType>::operator()(
|
166
|
+
URBG& g, // NOLINT(runtime/references)
|
167
|
+
const param_type& p) {
|
168
|
+
using random_internal::GeneratePositiveTag;
|
169
|
+
using random_internal::GenerateRealFromBits;
|
170
|
+
using random_internal::GenerateSignedTag;
|
171
|
+
|
172
|
+
if (p.split_ != 0) {
|
173
|
+
// Use Knuth's algorithm with range splitting to avoid floating-point
|
174
|
+
// errors. Knuth's algorithm is: Ui is a sequence of uniform variates on
|
175
|
+
// (0,1); return the number of variates required for product(Ui) <
|
176
|
+
// exp(-lambda).
|
177
|
+
//
|
178
|
+
// The expected number of variates required for Knuth's method can be
|
179
|
+
// computed as follows:
|
180
|
+
// The expected value of U is 0.5, so solving for 0.5^n < exp(-lambda) gives
|
181
|
+
// the expected number of uniform variates
|
182
|
+
// required for a given lambda, which is:
|
183
|
+
// lambda = [2, 5, 9, 10, 11, 12, 13, 14, 15, 16, 17]
|
184
|
+
// n = [3, 8, 13, 15, 16, 18, 19, 21, 22, 24, 25]
|
185
|
+
//
|
186
|
+
result_type n = 0;
|
187
|
+
for (int split = p.split_; split > 0; --split) {
|
188
|
+
double r = 1.0;
|
189
|
+
do {
|
190
|
+
r *= GenerateRealFromBits<double, GeneratePositiveTag, true>(
|
191
|
+
fast_u64_(g)); // U(-1, 0)
|
192
|
+
++n;
|
193
|
+
} while (r > p.emu_);
|
194
|
+
--n;
|
195
|
+
}
|
196
|
+
return n;
|
197
|
+
}
|
198
|
+
|
199
|
+
// Use ratio of uniforms method.
|
200
|
+
//
|
201
|
+
// Let u ~ Uniform(0, 1), v ~ Uniform(-1, 1),
|
202
|
+
// a = lambda + 1/2,
|
203
|
+
// s = 1.5 - sqrt(3/e) + sqrt(2(lambda + 1/2)/e),
|
204
|
+
// x = s * v/u + a.
|
205
|
+
// P(floor(x) = k | u^2 < f(floor(x))/k), where
|
206
|
+
// f(m) = lambda^m exp(-lambda)/ m!, for 0 <= m, and f(m) = 0 otherwise,
|
207
|
+
// and k = max(f).
|
208
|
+
const double a = p.mean_ + 0.5;
|
209
|
+
for (;;) {
|
210
|
+
const double u = GenerateRealFromBits<double, GeneratePositiveTag, false>(
|
211
|
+
fast_u64_(g)); // U(0, 1)
|
212
|
+
const double v = GenerateRealFromBits<double, GenerateSignedTag, false>(
|
213
|
+
fast_u64_(g)); // U(-1, 1)
|
214
|
+
|
215
|
+
const double x = std::floor(p.s_ * v / u + a);
|
216
|
+
if (x < 0) continue; // f(negative) = 0
|
217
|
+
const double rhs = x * p.lmu_;
|
218
|
+
// clang-format off
|
219
|
+
double s = (x <= 1.0) ? 0.0
|
220
|
+
: (x == 2.0) ? 0.693147180559945
|
221
|
+
: absl::random_internal::StirlingLogFactorial(x);
|
222
|
+
// clang-format on
|
223
|
+
const double lhs = 2.0 * std::log(u) + p.log_k_ + s;
|
224
|
+
if (lhs < rhs) {
|
225
|
+
return x > (max)() ? (max)()
|
226
|
+
: static_cast<result_type>(x); // f(x)/k >= u^2
|
227
|
+
}
|
228
|
+
}
|
229
|
+
}
|
230
|
+
|
231
|
+
template <typename CharT, typename Traits, typename IntType>
|
232
|
+
std::basic_ostream<CharT, Traits>& operator<<(
|
233
|
+
std::basic_ostream<CharT, Traits>& os, // NOLINT(runtime/references)
|
234
|
+
const poisson_distribution<IntType>& x) {
|
235
|
+
auto saver = random_internal::make_ostream_state_saver(os);
|
236
|
+
os.precision(random_internal::stream_precision_helper<double>::kPrecision);
|
237
|
+
os << x.mean();
|
238
|
+
return os;
|
239
|
+
}
|
240
|
+
|
241
|
+
template <typename CharT, typename Traits, typename IntType>
|
242
|
+
std::basic_istream<CharT, Traits>& operator>>(
|
243
|
+
std::basic_istream<CharT, Traits>& is, // NOLINT(runtime/references)
|
244
|
+
poisson_distribution<IntType>& x) { // NOLINT(runtime/references)
|
245
|
+
using param_type = typename poisson_distribution<IntType>::param_type;
|
246
|
+
|
247
|
+
auto saver = random_internal::make_istream_state_saver(is);
|
248
|
+
double mean = random_internal::read_floating_point<double>(is);
|
249
|
+
if (!is.fail()) {
|
250
|
+
x.param(param_type(mean));
|
251
|
+
}
|
252
|
+
return is;
|
253
|
+
}
|
254
|
+
|
255
|
+
ABSL_NAMESPACE_END
|
256
|
+
} // namespace absl
|
257
|
+
|
258
|
+
#endif // ABSL_RANDOM_POISSON_DISTRIBUTION_H_
|
@@ -0,0 +1,189 @@
|
|
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: random.h
|
17
|
+
// -----------------------------------------------------------------------------
|
18
|
+
//
|
19
|
+
// This header defines the recommended Uniform Random Bit Generator (URBG)
|
20
|
+
// types for use within the Abseil Random library. These types are not
|
21
|
+
// suitable for security-related use-cases, but should suffice for most other
|
22
|
+
// uses of generating random values.
|
23
|
+
//
|
24
|
+
// The Abseil random library provides the following URBG types:
|
25
|
+
//
|
26
|
+
// * BitGen, a good general-purpose bit generator, optimized for generating
|
27
|
+
// random (but not cryptographically secure) values
|
28
|
+
// * InsecureBitGen, a slightly faster, though less random, bit generator, for
|
29
|
+
// cases where the existing BitGen is a drag on performance.
|
30
|
+
|
31
|
+
#ifndef ABSL_RANDOM_RANDOM_H_
|
32
|
+
#define ABSL_RANDOM_RANDOM_H_
|
33
|
+
|
34
|
+
#include <random>
|
35
|
+
|
36
|
+
#include "absl/random/distributions.h" // IWYU pragma: export
|
37
|
+
#include "absl/random/internal/nonsecure_base.h" // IWYU pragma: export
|
38
|
+
#include "absl/random/internal/pcg_engine.h" // IWYU pragma: export
|
39
|
+
#include "absl/random/internal/pool_urbg.h"
|
40
|
+
#include "absl/random/internal/randen_engine.h"
|
41
|
+
#include "absl/random/seed_sequences.h" // IWYU pragma: export
|
42
|
+
|
43
|
+
namespace absl {
|
44
|
+
ABSL_NAMESPACE_BEGIN
|
45
|
+
|
46
|
+
// -----------------------------------------------------------------------------
|
47
|
+
// absl::BitGen
|
48
|
+
// -----------------------------------------------------------------------------
|
49
|
+
//
|
50
|
+
// `absl::BitGen` is a general-purpose random bit generator for generating
|
51
|
+
// random values for use within the Abseil random library. Typically, you use a
|
52
|
+
// bit generator in combination with a distribution to provide random values.
|
53
|
+
//
|
54
|
+
// Example:
|
55
|
+
//
|
56
|
+
// // Create an absl::BitGen. There is no need to seed this bit generator.
|
57
|
+
// absl::BitGen gen;
|
58
|
+
//
|
59
|
+
// // Generate an integer value in the closed interval [1,6]
|
60
|
+
// int die_roll = absl::uniform_int_distribution<int>(1, 6)(gen);
|
61
|
+
//
|
62
|
+
// `absl::BitGen` is seeded by default with non-deterministic data to produce
|
63
|
+
// different sequences of random values across different instances, including
|
64
|
+
// different binary invocations. This behavior is different than the standard
|
65
|
+
// library bit generators, which use golden values as their seeds. Default
|
66
|
+
// construction intentionally provides no stability guarantees, to avoid
|
67
|
+
// accidental dependence on such a property.
|
68
|
+
//
|
69
|
+
// `absl::BitGen` may be constructed with an optional seed sequence type,
|
70
|
+
// conforming to [rand.req.seed_seq], which will be mixed with additional
|
71
|
+
// non-deterministic data.
|
72
|
+
//
|
73
|
+
// Example:
|
74
|
+
//
|
75
|
+
// // Create an absl::BitGen using an std::seed_seq seed sequence
|
76
|
+
// std::seed_seq seq{1,2,3};
|
77
|
+
// absl::BitGen gen_with_seed(seq);
|
78
|
+
//
|
79
|
+
// // Generate an integer value in the closed interval [1,6]
|
80
|
+
// int die_roll2 = absl::uniform_int_distribution<int>(1, 6)(gen_with_seed);
|
81
|
+
//
|
82
|
+
// `absl::BitGen` meets the requirements of the Uniform Random Bit Generator
|
83
|
+
// (URBG) concept as per the C++17 standard [rand.req.urng] though differs
|
84
|
+
// slightly with [rand.req.eng]. Like its standard library equivalents (e.g.
|
85
|
+
// `std::mersenne_twister_engine`) `absl::BitGen` is not cryptographically
|
86
|
+
// secure.
|
87
|
+
//
|
88
|
+
// Constructing two `absl::BitGen`s with the same seed sequence in the same
|
89
|
+
// binary will produce the same sequence of variates within the same binary, but
|
90
|
+
// need not do so across multiple binary invocations.
|
91
|
+
//
|
92
|
+
// This type has been optimized to perform better than Mersenne Twister
|
93
|
+
// (https://en.wikipedia.org/wiki/Mersenne_Twister) and many other complex URBG
|
94
|
+
// types on modern x86, ARM, and PPC architectures.
|
95
|
+
//
|
96
|
+
// This type is thread-compatible, but not thread-safe.
|
97
|
+
|
98
|
+
// ---------------------------------------------------------------------------
|
99
|
+
// absl::BitGen member functions
|
100
|
+
// ---------------------------------------------------------------------------
|
101
|
+
|
102
|
+
// absl::BitGen::operator()()
|
103
|
+
//
|
104
|
+
// Calls the BitGen, returning a generated value.
|
105
|
+
|
106
|
+
// absl::BitGen::min()
|
107
|
+
//
|
108
|
+
// Returns the smallest possible value from this bit generator.
|
109
|
+
|
110
|
+
// absl::BitGen::max()
|
111
|
+
//
|
112
|
+
// Returns the largest possible value from this bit generator.
|
113
|
+
|
114
|
+
// absl::BitGen::discard(num)
|
115
|
+
//
|
116
|
+
// Advances the internal state of this bit generator by `num` times, and
|
117
|
+
// discards the intermediate results.
|
118
|
+
// ---------------------------------------------------------------------------
|
119
|
+
|
120
|
+
using BitGen = random_internal::NonsecureURBGBase<
|
121
|
+
random_internal::randen_engine<uint64_t>>;
|
122
|
+
|
123
|
+
// -----------------------------------------------------------------------------
|
124
|
+
// absl::InsecureBitGen
|
125
|
+
// -----------------------------------------------------------------------------
|
126
|
+
//
|
127
|
+
// `absl::InsecureBitGen` is an efficient random bit generator for generating
|
128
|
+
// random values, recommended only for performance-sensitive use cases where
|
129
|
+
// `absl::BitGen` is not satisfactory when compute-bounded by bit generation
|
130
|
+
// costs.
|
131
|
+
//
|
132
|
+
// Example:
|
133
|
+
//
|
134
|
+
// // Create an absl::InsecureBitGen
|
135
|
+
// absl::InsecureBitGen gen;
|
136
|
+
// for (size_t i = 0; i < 1000000; i++) {
|
137
|
+
//
|
138
|
+
// // Generate a bunch of random values from some complex distribution
|
139
|
+
// auto my_rnd = some_distribution(gen, 1, 1000);
|
140
|
+
// }
|
141
|
+
//
|
142
|
+
// Like `absl::BitGen`, `absl::InsecureBitGen` is seeded by default with
|
143
|
+
// non-deterministic data to produce different sequences of random values across
|
144
|
+
// different instances, including different binary invocations. (This behavior
|
145
|
+
// is different than the standard library bit generators, which use golden
|
146
|
+
// values as their seeds.)
|
147
|
+
//
|
148
|
+
// `absl::InsecureBitGen` may be constructed with an optional seed sequence
|
149
|
+
// type, conforming to [rand.req.seed_seq], which will be mixed with additional
|
150
|
+
// non-deterministic data. (See std_seed_seq.h for more information.)
|
151
|
+
//
|
152
|
+
// `absl::InsecureBitGen` meets the requirements of the Uniform Random Bit
|
153
|
+
// Generator (URBG) concept as per the C++17 standard [rand.req.urng] though
|
154
|
+
// its implementation differs slightly with [rand.req.eng]. Like its standard
|
155
|
+
// library equivalents (e.g. `std::mersenne_twister_engine`)
|
156
|
+
// `absl::InsecureBitGen` is not cryptographically secure.
|
157
|
+
//
|
158
|
+
// Prefer `absl::BitGen` over `absl::InsecureBitGen` as the general type is
|
159
|
+
// often fast enough for the vast majority of applications.
|
160
|
+
|
161
|
+
using InsecureBitGen =
|
162
|
+
random_internal::NonsecureURBGBase<random_internal::pcg64_2018_engine>;
|
163
|
+
|
164
|
+
// ---------------------------------------------------------------------------
|
165
|
+
// absl::InsecureBitGen member functions
|
166
|
+
// ---------------------------------------------------------------------------
|
167
|
+
|
168
|
+
// absl::InsecureBitGen::operator()()
|
169
|
+
//
|
170
|
+
// Calls the InsecureBitGen, returning a generated value.
|
171
|
+
|
172
|
+
// absl::InsecureBitGen::min()
|
173
|
+
//
|
174
|
+
// Returns the smallest possible value from this bit generator.
|
175
|
+
|
176
|
+
// absl::InsecureBitGen::max()
|
177
|
+
//
|
178
|
+
// Returns the largest possible value from this bit generator.
|
179
|
+
|
180
|
+
// absl::InsecureBitGen::discard(num)
|
181
|
+
//
|
182
|
+
// Advances the internal state of this bit generator by `num` times, and
|
183
|
+
// discards the intermediate results.
|
184
|
+
// ---------------------------------------------------------------------------
|
185
|
+
|
186
|
+
ABSL_NAMESPACE_END
|
187
|
+
} // namespace absl
|
188
|
+
|
189
|
+
#endif // ABSL_RANDOM_RANDOM_H_
|
@@ -0,0 +1,46 @@
|
|
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
|
+
#include "absl/random/seed_gen_exception.h"
|
16
|
+
|
17
|
+
#include <iostream>
|
18
|
+
|
19
|
+
#include "absl/base/config.h"
|
20
|
+
|
21
|
+
namespace absl {
|
22
|
+
ABSL_NAMESPACE_BEGIN
|
23
|
+
|
24
|
+
static constexpr const char kExceptionMessage[] =
|
25
|
+
"Failed generating seed-material for URBG.";
|
26
|
+
|
27
|
+
SeedGenException::~SeedGenException() = default;
|
28
|
+
|
29
|
+
const char* SeedGenException::what() const noexcept {
|
30
|
+
return kExceptionMessage;
|
31
|
+
}
|
32
|
+
|
33
|
+
namespace random_internal {
|
34
|
+
|
35
|
+
void ThrowSeedGenException() {
|
36
|
+
#ifdef ABSL_HAVE_EXCEPTIONS
|
37
|
+
throw absl::SeedGenException();
|
38
|
+
#else
|
39
|
+
std::cerr << kExceptionMessage << std::endl;
|
40
|
+
std::terminate();
|
41
|
+
#endif
|
42
|
+
}
|
43
|
+
|
44
|
+
} // namespace random_internal
|
45
|
+
ABSL_NAMESPACE_END
|
46
|
+
} // namespace absl
|
@@ -0,0 +1,55 @@
|
|
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: seed_gen_exception.h
|
17
|
+
// -----------------------------------------------------------------------------
|
18
|
+
//
|
19
|
+
// This header defines an exception class which may be thrown if unpredictable
|
20
|
+
// events prevent the derivation of suitable seed-material for constructing a
|
21
|
+
// bit generator conforming to [rand.req.urng] (eg. entropy cannot be read from
|
22
|
+
// /dev/urandom on a Unix-based system).
|
23
|
+
//
|
24
|
+
// Note: if exceptions are disabled, `std::terminate()` is called instead.
|
25
|
+
|
26
|
+
#ifndef ABSL_RANDOM_SEED_GEN_EXCEPTION_H_
|
27
|
+
#define ABSL_RANDOM_SEED_GEN_EXCEPTION_H_
|
28
|
+
|
29
|
+
#include <exception>
|
30
|
+
|
31
|
+
#include "absl/base/config.h"
|
32
|
+
|
33
|
+
namespace absl {
|
34
|
+
ABSL_NAMESPACE_BEGIN
|
35
|
+
|
36
|
+
//------------------------------------------------------------------------------
|
37
|
+
// SeedGenException
|
38
|
+
//------------------------------------------------------------------------------
|
39
|
+
class SeedGenException : public std::exception {
|
40
|
+
public:
|
41
|
+
SeedGenException() = default;
|
42
|
+
~SeedGenException() override;
|
43
|
+
const char* what() const noexcept override;
|
44
|
+
};
|
45
|
+
|
46
|
+
namespace random_internal {
|
47
|
+
|
48
|
+
// throw delegator
|
49
|
+
[[noreturn]] void ThrowSeedGenException();
|
50
|
+
|
51
|
+
} // namespace random_internal
|
52
|
+
ABSL_NAMESPACE_END
|
53
|
+
} // namespace absl
|
54
|
+
|
55
|
+
#endif // ABSL_RANDOM_SEED_GEN_EXCEPTION_H_
|
@@ -0,0 +1,29 @@
|
|
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
|
+
#include "absl/random/seed_sequences.h"
|
16
|
+
|
17
|
+
#include "absl/random/internal/pool_urbg.h"
|
18
|
+
|
19
|
+
namespace absl {
|
20
|
+
ABSL_NAMESPACE_BEGIN
|
21
|
+
|
22
|
+
SeedSeq MakeSeedSeq() {
|
23
|
+
SeedSeq::result_type seed_material[8];
|
24
|
+
random_internal::RandenPool<uint32_t>::Fill(absl::MakeSpan(seed_material));
|
25
|
+
return SeedSeq(std::begin(seed_material), std::end(seed_material));
|
26
|
+
}
|
27
|
+
|
28
|
+
ABSL_NAMESPACE_END
|
29
|
+
} // namespace absl
|
@@ -0,0 +1,110 @@
|
|
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: seed_sequences.h
|
17
|
+
// -----------------------------------------------------------------------------
|
18
|
+
//
|
19
|
+
// This header contains utilities for creating and working with seed sequences
|
20
|
+
// conforming to [rand.req.seedseq]. In general, direct construction of seed
|
21
|
+
// sequences is discouraged, but use-cases for construction of identical bit
|
22
|
+
// generators (using the same seed sequence) may be helpful (e.g. replaying a
|
23
|
+
// simulation whose state is derived from variates of a bit generator).
|
24
|
+
|
25
|
+
#ifndef ABSL_RANDOM_SEED_SEQUENCES_H_
|
26
|
+
#define ABSL_RANDOM_SEED_SEQUENCES_H_
|
27
|
+
|
28
|
+
#include <iterator>
|
29
|
+
#include <random>
|
30
|
+
|
31
|
+
#include "absl/random/internal/salted_seed_seq.h"
|
32
|
+
#include "absl/random/internal/seed_material.h"
|
33
|
+
#include "absl/random/seed_gen_exception.h"
|
34
|
+
#include "absl/types/span.h"
|
35
|
+
|
36
|
+
namespace absl {
|
37
|
+
ABSL_NAMESPACE_BEGIN
|
38
|
+
|
39
|
+
// -----------------------------------------------------------------------------
|
40
|
+
// absl::SeedSeq
|
41
|
+
// -----------------------------------------------------------------------------
|
42
|
+
//
|
43
|
+
// `absl::SeedSeq` constructs a seed sequence according to [rand.req.seedseq]
|
44
|
+
// for use within bit generators. `absl::SeedSeq`, unlike `std::seed_seq`
|
45
|
+
// additionally salts the generated seeds with extra implementation-defined
|
46
|
+
// entropy. For that reason, you can use `absl::SeedSeq` in combination with
|
47
|
+
// standard library bit generators (e.g. `std::mt19937`) to introduce
|
48
|
+
// non-determinism in your seeds.
|
49
|
+
//
|
50
|
+
// Example:
|
51
|
+
//
|
52
|
+
// absl::SeedSeq my_seed_seq({a, b, c});
|
53
|
+
// std::mt19937 my_bitgen(my_seed_seq);
|
54
|
+
//
|
55
|
+
using SeedSeq = random_internal::SaltedSeedSeq<std::seed_seq>;
|
56
|
+
|
57
|
+
// -----------------------------------------------------------------------------
|
58
|
+
// absl::CreateSeedSeqFrom(bitgen*)
|
59
|
+
// -----------------------------------------------------------------------------
|
60
|
+
//
|
61
|
+
// Constructs a seed sequence conforming to [rand.req.seedseq] using variates
|
62
|
+
// produced by a provided bit generator.
|
63
|
+
//
|
64
|
+
// You should generally avoid direct construction of seed sequences, but
|
65
|
+
// use-cases for reuse of a seed sequence to construct identical bit generators
|
66
|
+
// may be helpful (eg. replaying a simulation whose state is derived from bit
|
67
|
+
// generator values).
|
68
|
+
//
|
69
|
+
// If bitgen == nullptr, then behavior is undefined.
|
70
|
+
//
|
71
|
+
// Example:
|
72
|
+
//
|
73
|
+
// absl::BitGen my_bitgen;
|
74
|
+
// auto seed_seq = absl::CreateSeedSeqFrom(&my_bitgen);
|
75
|
+
// absl::BitGen new_engine(seed_seq); // derived from my_bitgen, but not
|
76
|
+
// // correlated.
|
77
|
+
//
|
78
|
+
template <typename URBG>
|
79
|
+
SeedSeq CreateSeedSeqFrom(URBG* urbg) {
|
80
|
+
SeedSeq::result_type
|
81
|
+
seed_material[random_internal::kEntropyBlocksNeeded];
|
82
|
+
|
83
|
+
if (!random_internal::ReadSeedMaterialFromURBG(
|
84
|
+
urbg, absl::MakeSpan(seed_material))) {
|
85
|
+
random_internal::ThrowSeedGenException();
|
86
|
+
}
|
87
|
+
return SeedSeq(std::begin(seed_material), std::end(seed_material));
|
88
|
+
}
|
89
|
+
|
90
|
+
// -----------------------------------------------------------------------------
|
91
|
+
// absl::MakeSeedSeq()
|
92
|
+
// -----------------------------------------------------------------------------
|
93
|
+
//
|
94
|
+
// Constructs an `absl::SeedSeq` salting the generated values using
|
95
|
+
// implementation-defined entropy. The returned sequence can be used to create
|
96
|
+
// equivalent bit generators correlated using this sequence.
|
97
|
+
//
|
98
|
+
// Example:
|
99
|
+
//
|
100
|
+
// auto my_seed_seq = absl::MakeSeedSeq();
|
101
|
+
// std::mt19937 rng1(my_seed_seq);
|
102
|
+
// std::mt19937 rng2(my_seed_seq);
|
103
|
+
// EXPECT_EQ(rng1(), rng2());
|
104
|
+
//
|
105
|
+
SeedSeq MakeSeedSeq();
|
106
|
+
|
107
|
+
ABSL_NAMESPACE_END
|
108
|
+
} // namespace absl
|
109
|
+
|
110
|
+
#endif // ABSL_RANDOM_SEED_SEQUENCES_H_
|