grpc 1.47.0 → 1.48.0.pre1
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of grpc might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/Makefile +105 -47
- data/include/grpc/compression.h +1 -1
- data/include/grpc/event_engine/event_engine.h +20 -11
- data/include/grpc/event_engine/slice_buffer.h +8 -2
- data/include/grpc/grpc.h +3 -3
- data/include/grpc/impl/codegen/compression_types.h +2 -1
- data/include/grpc/impl/codegen/connectivity_state.h +2 -1
- data/include/grpc/impl/codegen/gpr_types.h +2 -1
- data/include/grpc/impl/codegen/grpc_types.h +2 -1
- data/include/grpc/impl/codegen/port_platform.h +6 -3
- data/src/core/ext/filters/census/grpc_context.cc +3 -0
- data/src/core/ext/filters/channel_idle/channel_idle_filter.cc +17 -5
- data/src/core/ext/filters/channel_idle/channel_idle_filter.h +16 -0
- data/src/core/ext/filters/channel_idle/idle_filter_state.h +2 -0
- data/src/core/ext/filters/client_channel/backup_poller.cc +3 -1
- data/src/core/ext/filters/client_channel/channel_connectivity.cc +2 -2
- data/src/core/ext/filters/client_channel/client_channel.cc +51 -65
- data/src/core/ext/filters/client_channel/client_channel.h +19 -4
- data/src/core/ext/filters/client_channel/config_selector.h +1 -1
- data/src/core/ext/filters/client_channel/connector.h +1 -1
- data/src/core/ext/filters/client_channel/dynamic_filters.cc +6 -4
- data/src/core/ext/filters/client_channel/dynamic_filters.h +1 -1
- data/src/core/ext/filters/client_channel/lb_policy/address_filtering.cc +1 -1
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +2 -2
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.h +1 -0
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +73 -43
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc +1 -1
- data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.cc +0 -1
- data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.cc +33 -35
- data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +106 -112
- data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +91 -42
- data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +177 -138
- data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.h +4 -1
- data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +47 -44
- data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +118 -103
- data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +83 -78
- data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +57 -67
- data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +2 -2
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +5 -7
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +13 -17
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +3 -3
- data/src/core/ext/filters/client_channel/lb_policy.h +0 -7
- data/src/core/ext/filters/client_channel/lb_policy_registry.cc +3 -5
- data/src/core/ext/filters/client_channel/proxy_mapper_registry.cc +0 -1
- data/src/core/ext/filters/client_channel/resolver/binder/binder_resolver.cc +3 -1
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +6 -6
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +5 -5
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +10 -5
- data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +12 -3
- data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +5 -5
- data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +3 -4
- data/src/core/ext/filters/client_channel/resolver/polling_resolver.cc +1 -1
- data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +1 -0
- data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +24 -15
- data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.h +3 -1
- data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +7 -7
- data/src/core/ext/filters/client_channel/retry_filter.cc +35 -36
- data/src/core/ext/filters/client_channel/retry_filter.h +1 -0
- data/src/core/ext/filters/client_channel/retry_service_config.cc +4 -4
- data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +2 -1
- data/src/core/ext/filters/client_channel/subchannel.cc +53 -50
- data/src/core/ext/filters/client_channel/subchannel.h +6 -22
- data/src/core/ext/filters/client_channel/subchannel_interface.h +10 -18
- data/src/core/ext/filters/client_channel/subchannel_stream_client.cc +12 -97
- data/src/core/ext/filters/client_channel/subchannel_stream_client.h +5 -9
- data/src/core/ext/filters/deadline/deadline_filter.cc +12 -7
- data/src/core/ext/filters/deadline/deadline_filter.h +8 -1
- data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +21 -2
- data/src/core/ext/filters/fault_injection/fault_injection_filter.h +8 -3
- data/src/core/ext/filters/fault_injection/service_config_parser.cc +7 -4
- data/src/core/ext/filters/fault_injection/service_config_parser.h +17 -3
- data/src/core/ext/filters/http/client/http_client_filter.cc +16 -5
- data/src/core/ext/filters/http/client/http_client_filter.h +8 -1
- data/src/core/ext/filters/http/client_authority_filter.cc +11 -10
- data/src/core/ext/filters/http/client_authority_filter.h +5 -2
- data/src/core/ext/filters/http/http_filters_plugin.cc +9 -1
- data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +64 -187
- data/src/core/ext/filters/http/message_compress/message_compress_filter.h +1 -2
- data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +42 -106
- data/src/core/ext/filters/http/message_compress/message_decompress_filter.h +1 -0
- data/src/core/ext/filters/http/server/http_server_filter.cc +16 -9
- data/src/core/ext/filters/http/server/http_server_filter.h +6 -1
- data/src/core/ext/filters/message_size/message_size_filter.cc +25 -15
- data/src/core/ext/filters/message_size/message_size_filter.h +13 -0
- data/src/core/ext/filters/rbac/rbac_filter.cc +14 -3
- data/src/core/ext/filters/rbac/rbac_filter.h +8 -0
- data/src/core/ext/filters/rbac/rbac_service_config_parser.cc +13 -2
- data/src/core/ext/filters/rbac/rbac_service_config_parser.h +14 -2
- data/src/core/ext/filters/server_config_selector/server_config_selector.cc +1 -0
- data/src/core/ext/filters/server_config_selector/server_config_selector.h +9 -0
- data/src/core/ext/filters/server_config_selector/server_config_selector_filter.cc +22 -2
- data/src/core/ext/filters/server_config_selector/server_config_selector_filter.h +1 -0
- data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +4 -4
- data/src/core/ext/transport/chttp2/server/chttp2_server.cc +15 -15
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +196 -476
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +1 -1
- data/src/core/ext/transport/chttp2/transport/flow_control.cc +141 -261
- data/src/core/ext/transport/chttp2/transport/flow_control.h +176 -289
- data/src/core/ext/transport/chttp2/transport/frame_data.cc +57 -215
- data/src/core/ext/transport/chttp2/transport/frame_data.h +10 -36
- data/src/core/ext/transport/chttp2/transport/frame_settings.cc +0 -41
- data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +7 -12
- data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +7 -6
- data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +0 -2
- data/src/core/ext/transport/chttp2/transport/internal.h +9 -111
- data/src/core/ext/transport/chttp2/transport/parsing.cc +51 -38
- data/src/core/ext/transport/chttp2/transport/stream_lists.cc +0 -4
- data/src/core/ext/transport/chttp2/transport/writing.cc +18 -21
- data/src/core/ext/transport/inproc/inproc_plugin.cc +0 -1
- data/src/core/ext/transport/inproc/inproc_transport.cc +85 -81
- data/src/core/ext/transport/inproc/inproc_transport.h +3 -1
- data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/ring_hash/v3/ring_hash.upb.c +52 -0
- data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/ring_hash/v3/ring_hash.upb.h +164 -0
- data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/wrr_locality/v3/wrr_locality.upb.c +46 -0
- data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/wrr_locality/v3/wrr_locality.upb.h +94 -0
- data/src/core/ext/xds/certificate_provider_factory.h +6 -1
- data/src/core/ext/xds/certificate_provider_registry.cc +8 -8
- data/src/core/ext/xds/certificate_provider_registry.h +3 -1
- data/src/core/ext/xds/certificate_provider_store.cc +2 -0
- data/src/core/ext/xds/certificate_provider_store.h +9 -0
- data/src/core/ext/xds/file_watcher_certificate_provider_factory.cc +9 -0
- data/src/core/ext/xds/file_watcher_certificate_provider_factory.h +8 -0
- data/src/core/ext/xds/upb_utils.h +1 -2
- data/src/core/ext/xds/xds_api.cc +16 -18
- data/src/core/ext/xds/xds_api.h +12 -5
- data/src/core/ext/xds/xds_bootstrap.cc +37 -24
- data/src/core/ext/xds/xds_bootstrap.h +9 -11
- data/src/core/ext/xds/xds_certificate_provider.cc +12 -3
- data/src/core/ext/xds/xds_certificate_provider.h +16 -1
- data/src/core/ext/xds/xds_channel_stack_modifier.cc +9 -0
- data/src/core/ext/xds/xds_channel_stack_modifier.h +5 -1
- data/src/core/ext/xds/xds_client.cc +71 -22
- data/src/core/ext/xds/xds_client.h +17 -3
- data/src/core/ext/xds/xds_client_stats.cc +3 -4
- data/src/core/ext/xds/xds_client_stats.h +4 -3
- data/src/core/ext/xds/xds_cluster.cc +21 -10
- data/src/core/ext/xds/xds_cluster.h +9 -1
- data/src/core/ext/xds/xds_cluster_specifier_plugin.cc +16 -7
- data/src/core/ext/xds/xds_cluster_specifier_plugin.h +1 -8
- data/src/core/ext/xds/xds_common_types.cc +36 -22
- data/src/core/ext/xds/xds_common_types.h +12 -4
- data/src/core/ext/xds/xds_endpoint.cc +25 -15
- data/src/core/ext/xds/xds_endpoint.h +13 -5
- data/src/core/ext/xds/xds_http_fault_filter.cc +7 -5
- data/src/core/ext/xds/xds_http_fault_filter.h +3 -1
- data/src/core/ext/xds/xds_http_filters.cc +7 -0
- data/src/core/ext/xds/xds_http_filters.h +3 -3
- data/src/core/ext/xds/xds_http_rbac_filter.cc +16 -0
- data/src/core/ext/xds/xds_http_rbac_filter.h +7 -0
- data/src/core/ext/xds/xds_lb_policy_registry.cc +291 -0
- data/src/core/ext/xds/xds_lb_policy_registry.h +72 -0
- data/src/core/ext/xds/xds_listener.cc +51 -33
- data/src/core/ext/xds/xds_listener.h +10 -1
- data/src/core/ext/xds/xds_resource_type.h +3 -3
- data/src/core/ext/xds/xds_resource_type_impl.h +7 -3
- data/src/core/ext/xds/xds_route_config.cc +56 -28
- data/src/core/ext/xds/xds_route_config.h +11 -2
- data/src/core/ext/xds/xds_routing.cc +16 -0
- data/src/core/ext/xds/xds_routing.h +7 -2
- data/src/core/ext/xds/xds_server_config_fetcher.cc +54 -6
- data/src/core/lib/address_utils/parse_address.cc +5 -8
- data/src/core/lib/address_utils/parse_address.h +3 -2
- data/src/core/lib/address_utils/sockaddr_utils.cc +8 -7
- data/src/core/lib/address_utils/sockaddr_utils.h +2 -0
- data/src/core/lib/avl/avl.h +3 -3
- data/src/core/lib/backoff/backoff.cc +1 -1
- data/src/core/lib/backoff/backoff.h +1 -1
- data/src/core/lib/channel/call_tracer.h +3 -3
- data/src/core/lib/channel/channel_args.h +1 -0
- data/src/core/lib/channel/channel_args_preconditioning.cc +1 -0
- data/src/core/lib/channel/channel_fwd.h +26 -0
- data/src/core/lib/channel/channel_stack.cc +4 -4
- data/src/core/lib/channel/channel_stack.h +1 -11
- data/src/core/lib/channel/channel_stack_builder.h +2 -5
- data/src/core/lib/channel/channel_stack_builder_impl.cc +1 -1
- data/src/core/lib/channel/channel_stack_builder_impl.h +1 -0
- data/src/core/lib/channel/channelz.cc +2 -1
- data/src/core/lib/channel/channelz.h +2 -3
- data/src/core/lib/channel/channelz_registry.cc +4 -5
- data/src/core/lib/channel/connected_channel.cc +1 -0
- data/src/core/lib/channel/connected_channel.h +1 -0
- data/src/core/lib/channel/promise_based_filter.cc +11 -5
- data/src/core/lib/channel/promise_based_filter.h +2 -0
- data/src/core/lib/compression/compression.cc +6 -1
- data/src/core/lib/compression/compression_internal.cc +3 -6
- data/src/core/lib/compression/compression_internal.h +3 -2
- data/src/core/lib/compression/message_compress.cc +3 -1
- data/src/core/lib/compression/message_compress.h +2 -3
- data/src/core/lib/debug/stats.cc +9 -9
- data/src/core/lib/debug/stats.h +2 -1
- data/src/core/lib/debug/stats_data.cc +2 -1
- data/src/core/lib/debug/stats_data.h +0 -4
- data/src/core/lib/debug/trace.h +13 -12
- data/src/core/lib/event_engine/default_event_engine_factory.cc +1 -1
- data/src/core/lib/event_engine/event_engine.cc +24 -19
- data/src/core/lib/event_engine/event_engine_factory.h +2 -2
- data/src/core/lib/event_engine/{iomgr_engine.cc → iomgr_engine/iomgr_engine.cc} +44 -91
- data/src/core/lib/event_engine/{iomgr_engine.h → iomgr_engine/iomgr_engine.h} +20 -16
- data/src/core/lib/event_engine/iomgr_engine/thread_pool.cc +123 -0
- data/src/core/lib/event_engine/iomgr_engine/thread_pool.h +70 -0
- data/src/core/lib/event_engine/iomgr_engine/time_averaged_stats.cc +62 -0
- data/src/core/lib/event_engine/iomgr_engine/time_averaged_stats.h +81 -0
- data/src/core/lib/event_engine/iomgr_engine/timer.cc +312 -0
- data/src/core/lib/event_engine/iomgr_engine/timer.h +193 -0
- data/src/core/lib/event_engine/iomgr_engine/timer_heap.cc +107 -0
- data/src/core/lib/event_engine/iomgr_engine/timer_heap.h +56 -0
- data/src/core/lib/event_engine/iomgr_engine/timer_manager.cc +254 -0
- data/src/core/lib/event_engine/iomgr_engine/timer_manager.h +111 -0
- data/src/core/lib/event_engine/promise.h +69 -0
- data/src/core/lib/gpr/time_posix.cc +6 -9
- data/src/core/lib/gpr/time_windows.cc +10 -7
- data/src/core/lib/gprpp/manual_constructor.h +0 -67
- data/src/core/lib/gprpp/status_helper.cc +44 -30
- data/src/core/lib/gprpp/time.cc +8 -0
- data/src/core/lib/gprpp/time.h +4 -0
- data/src/core/lib/http/format_request.cc +5 -4
- data/src/core/lib/http/format_request.h +1 -1
- data/src/core/lib/http/httpcli.cc +18 -12
- data/src/core/lib/http/httpcli.h +19 -3
- data/src/core/lib/http/httpcli_security_connector.cc +16 -4
- data/src/core/lib/http/httpcli_ssl_credentials.h +3 -1
- data/src/core/lib/http/parser.cc +6 -7
- data/src/core/lib/http/parser.h +3 -0
- data/src/core/lib/iomgr/call_combiner.cc +2 -2
- data/src/core/lib/iomgr/endpoint.h +1 -1
- data/src/core/lib/iomgr/endpoint_cfstream.cc +2 -2
- data/src/core/lib/iomgr/error.cc +11 -9
- data/src/core/lib/iomgr/error.h +9 -5
- data/src/core/lib/iomgr/ev_epoll1_linux.cc +57 -18
- data/src/core/lib/iomgr/ev_epoll1_linux.h +1 -1
- data/src/core/lib/iomgr/ev_poll_posix.cc +77 -52
- data/src/core/lib/iomgr/ev_poll_posix.h +2 -2
- data/src/core/lib/iomgr/ev_posix.cc +54 -92
- data/src/core/lib/iomgr/ev_posix.h +5 -3
- data/src/core/lib/iomgr/fork_posix.cc +1 -1
- data/src/core/lib/iomgr/iomgr.cc +7 -0
- data/src/core/lib/iomgr/iomgr_posix.cc +1 -0
- data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +1 -0
- data/src/core/lib/iomgr/load_file.cc +1 -1
- data/src/core/lib/iomgr/resolve_address_posix.cc +1 -1
- data/src/core/lib/iomgr/resolve_address_windows.cc +1 -1
- data/src/core/lib/iomgr/tcp_client.cc +12 -7
- data/src/core/lib/iomgr/tcp_client.h +24 -13
- data/src/core/lib/iomgr/tcp_client_cfstream.cc +15 -9
- data/src/core/lib/iomgr/tcp_client_posix.cc +143 -25
- data/src/core/lib/iomgr/tcp_client_posix.h +1 -1
- data/src/core/lib/iomgr/tcp_client_windows.cc +14 -10
- data/src/core/lib/iomgr/tcp_posix.cc +91 -29
- data/src/core/lib/iomgr/tcp_server_posix.cc +7 -7
- data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +12 -12
- data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +2 -2
- data/src/core/lib/iomgr/tcp_server_windows.cc +7 -7
- data/src/core/lib/iomgr/tcp_windows.cc +5 -5
- data/src/core/lib/iomgr/unix_sockets_posix.cc +2 -2
- data/src/core/lib/iomgr/wakeup_fd_pipe.cc +2 -2
- data/src/core/lib/iomgr/wakeup_fd_posix.cc +15 -12
- data/src/core/lib/iomgr/wakeup_fd_posix.h +0 -2
- data/src/core/lib/iomgr/work_serializer.h +2 -3
- data/src/core/lib/matchers/matchers.cc +6 -3
- data/src/core/lib/matchers/matchers.h +2 -0
- data/src/core/lib/promise/activity.cc +0 -1
- data/src/core/lib/promise/activity.h +7 -13
- data/src/core/lib/promise/loop.h +1 -0
- data/src/core/lib/promise/promise.h +1 -0
- data/src/core/lib/promise/sleep.cc +36 -31
- data/src/core/lib/promise/sleep.h +25 -25
- data/src/core/lib/resolver/resolver.cc +5 -0
- data/src/core/lib/resolver/resolver.h +3 -0
- data/src/core/lib/resolver/resolver_factory.h +5 -2
- data/src/core/lib/resolver/resolver_registry.cc +2 -9
- data/src/core/lib/resolver/resolver_registry.h +12 -1
- data/src/core/lib/resolver/server_address.cc +8 -0
- data/src/core/lib/resolver/server_address.h +9 -2
- data/src/core/lib/resource_quota/memory_quota.cc +18 -60
- data/src/core/lib/resource_quota/memory_quota.h +11 -25
- data/src/core/lib/security/authorization/authorization_policy_provider.h +7 -0
- data/src/core/lib/security/authorization/authorization_policy_provider_vtable.cc +4 -0
- data/src/core/lib/security/authorization/evaluate_args.cc +9 -3
- data/src/core/lib/security/authorization/evaluate_args.h +6 -3
- data/src/core/lib/security/authorization/grpc_authorization_engine.cc +6 -0
- data/src/core/lib/security/authorization/grpc_authorization_engine.h +7 -0
- data/src/core/lib/security/authorization/grpc_server_authz_filter.cc +12 -0
- data/src/core/lib/security/authorization/grpc_server_authz_filter.h +12 -1
- data/src/core/lib/security/authorization/matchers.cc +9 -1
- data/src/core/lib/security/authorization/matchers.h +7 -0
- data/src/core/lib/security/authorization/rbac_policy.cc +5 -0
- data/src/core/lib/security/authorization/rbac_policy.h +7 -0
- data/src/core/lib/security/context/security_context.cc +5 -2
- data/src/core/lib/security/context/security_context.h +14 -2
- data/src/core/lib/security/credentials/alts/alts_credentials.cc +4 -2
- data/src/core/lib/security/credentials/alts/alts_credentials.h +6 -1
- data/src/core/lib/security/credentials/alts/grpc_alts_credentials_client_options.cc +1 -3
- data/src/core/lib/security/credentials/alts/grpc_alts_credentials_server_options.cc +1 -4
- data/src/core/lib/security/credentials/call_creds_util.cc +8 -0
- data/src/core/lib/security/credentials/call_creds_util.h +1 -0
- data/src/core/lib/security/credentials/channel_creds_registry.h +6 -1
- data/src/core/lib/security/credentials/channel_creds_registry_init.cc +10 -0
- data/src/core/lib/security/credentials/composite/composite_credentials.cc +4 -4
- data/src/core/lib/security/credentials/composite/composite_credentials.h +16 -2
- data/src/core/lib/security/credentials/credentials.cc +4 -8
- data/src/core/lib/security/credentials/credentials.h +10 -8
- data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +28 -10
- data/src/core/lib/security/credentials/external/aws_external_account_credentials.h +10 -0
- data/src/core/lib/security/credentials/external/aws_request_signer.cc +9 -0
- data/src/core/lib/security/credentials/external/external_account_credentials.cc +24 -9
- data/src/core/lib/security/credentials/external/external_account_credentials.h +11 -0
- data/src/core/lib/security/credentials/external/file_external_account_credentials.cc +12 -4
- data/src/core/lib/security/credentials/external/file_external_account_credentials.h +6 -0
- data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +20 -4
- data/src/core/lib/security/credentials/external/url_external_account_credentials.h +10 -0
- data/src/core/lib/security/credentials/fake/fake_credentials.cc +8 -6
- data/src/core/lib/security/credentials/fake/fake_credentials.h +13 -1
- data/src/core/lib/security/credentials/google_default/credentials_generic.cc +1 -0
- data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +27 -10
- data/src/core/lib/security/credentials/google_default/google_default_credentials.h +10 -1
- data/src/core/lib/security/credentials/iam/iam_credentials.cc +9 -3
- data/src/core/lib/security/credentials/iam/iam_credentials.h +10 -0
- data/src/core/lib/security/credentials/insecure/insecure_credentials.cc +4 -0
- data/src/core/lib/security/credentials/insecure/insecure_credentials.h +5 -0
- data/src/core/lib/security/credentials/jwt/json_token.cc +5 -2
- data/src/core/lib/security/credentials/jwt/json_token.h +2 -2
- data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +11 -5
- data/src/core/lib/security/credentials/jwt/jwt_credentials.h +14 -0
- data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +28 -3
- data/src/core/lib/security/credentials/jwt/jwt_verifier.h +4 -2
- data/src/core/lib/security/credentials/local/local_credentials.cc +4 -3
- data/src/core/lib/security/credentials/local/local_credentials.h +7 -0
- data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +26 -13
- data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +20 -0
- data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +8 -7
- data/src/core/lib/security/credentials/plugin/plugin_credentials.h +24 -0
- data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +5 -0
- data/src/core/lib/security/credentials/ssl/ssl_credentials.h +13 -0
- data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.cc +6 -6
- data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.h +9 -3
- data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc +29 -10
- data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h +9 -4
- data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.cc +9 -2
- data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.h +6 -7
- data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +4 -5
- data/src/core/lib/security/credentials/tls/tls_credentials.cc +7 -2
- data/src/core/lib/security/credentials/tls/tls_credentials.h +5 -1
- data/src/core/lib/security/credentials/tls/tls_utils.cc +2 -0
- data/src/core/lib/security/credentials/tls/tls_utils.h +1 -1
- data/src/core/lib/security/credentials/xds/xds_credentials.cc +8 -1
- data/src/core/lib/security/credentials/xds/xds_credentials.h +14 -0
- data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +22 -2
- data/src/core/lib/security/security_connector/alts/alts_security_connector.h +6 -3
- data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +17 -1
- data/src/core/lib/security/security_connector/fake/fake_security_connector.h +2 -2
- data/src/core/lib/security/security_connector/insecure/insecure_security_connector.cc +9 -0
- data/src/core/lib/security/security_connector/insecure/insecure_security_connector.h +17 -2
- data/src/core/lib/security/security_connector/load_system_roots_fallback.cc +5 -3
- data/src/core/lib/security/security_connector/{load_system_roots_linux.cc → load_system_roots_supported.cc} +27 -19
- data/src/core/lib/security/security_connector/{load_system_roots_linux.h → load_system_roots_supported.h} +5 -5
- data/src/core/lib/security/security_connector/local/local_security_connector.cc +22 -3
- data/src/core/lib/security/security_connector/local/local_security_connector.h +6 -2
- data/src/core/lib/security/security_connector/security_connector.cc +20 -18
- data/src/core/lib/security/security_connector/security_connector.h +18 -6
- data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +18 -6
- data/src/core/lib/security/security_connector/ssl/ssl_security_connector.h +4 -2
- data/src/core/lib/security/security_connector/ssl_utils.cc +12 -2
- data/src/core/lib/security/security_connector/ssl_utils.h +10 -7
- data/src/core/lib/security/security_connector/ssl_utils_config.h +1 -1
- data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +21 -13
- data/src/core/lib/security/security_connector/tls/tls_security_connector.h +23 -3
- data/src/core/lib/security/transport/auth_filters.h +7 -0
- data/src/core/lib/security/transport/client_auth_filter.cc +18 -9
- data/src/core/lib/security/transport/secure_endpoint.cc +63 -13
- data/src/core/lib/security/transport/secure_endpoint.h +4 -3
- data/src/core/lib/security/transport/security_handshaker.cc +44 -11
- data/src/core/lib/security/transport/security_handshaker.h +4 -0
- data/src/core/lib/security/transport/server_auth_filter.cc +26 -4
- data/src/core/lib/security/util/json_util.cc +3 -2
- data/src/core/lib/security/util/json_util.h +0 -2
- data/src/core/lib/service_config/service_config_call_data.h +2 -1
- data/src/core/lib/service_config/service_config_impl.cc +6 -6
- data/src/core/lib/service_config/service_config_impl.h +1 -3
- data/src/core/lib/service_config/service_config_parser.cc +2 -4
- data/src/core/lib/slice/slice_buffer.cc +30 -1
- data/src/core/lib/slice/slice_buffer.h +37 -6
- data/src/core/lib/slice/slice_string_helpers.cc +0 -20
- data/src/core/lib/slice/slice_string_helpers.h +0 -4
- data/src/core/lib/surface/call.cc +53 -115
- data/src/core/lib/surface/call.h +5 -1
- data/src/core/lib/surface/channel.h +2 -0
- data/src/core/lib/surface/channel_ping.cc +1 -1
- data/src/core/lib/surface/completion_queue.cc +15 -14
- data/src/core/lib/surface/completion_queue.h +2 -1
- data/src/core/lib/surface/init.cc +0 -1
- data/src/core/lib/surface/lame_client.cc +1 -1
- data/src/core/lib/surface/lame_client.h +1 -1
- data/src/core/lib/surface/server.cc +14 -8
- data/src/core/lib/surface/server.h +4 -1
- data/src/core/lib/surface/validate_metadata.cc +1 -1
- data/src/core/lib/surface/version.cc +2 -2
- data/src/core/lib/transport/error_utils.cc +13 -7
- data/src/core/lib/transport/handshaker.cc +3 -3
- data/src/core/lib/transport/http_connect_handshaker.cc +4 -4
- data/src/core/lib/transport/tcp_connect_handshaker.cc +2 -2
- data/src/core/lib/transport/transport.cc +0 -3
- data/src/core/lib/transport/transport.h +20 -14
- data/src/core/lib/transport/transport_fwd.h +20 -0
- data/src/core/lib/transport/transport_impl.h +1 -0
- data/src/core/lib/transport/transport_op_string.cc +9 -9
- data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +1 -1
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +9 -1
- data/src/core/tsi/fake_transport_security.cc +13 -1
- data/src/core/tsi/fake_transport_security.h +6 -0
- data/src/core/tsi/ssl_transport_security.cc +1 -1
- data/src/core/tsi/transport_security_grpc.cc +3 -2
- data/src/core/tsi/transport_security_grpc.h +5 -2
- data/src/ruby/ext/grpc/ext-export-truffleruby.clang +2 -0
- data/src/ruby/ext/grpc/ext-export-truffleruby.gcc +7 -0
- data/src/ruby/ext/grpc/ext-export.clang +1 -0
- data/src/ruby/ext/grpc/ext-export.gcc +1 -0
- data/src/ruby/ext/grpc/extconf.rb +49 -18
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +1 -1
- data/src/ruby/lib/grpc/errors.rb +1 -1
- data/src/ruby/lib/grpc/version.rb +1 -1
- data/src/ruby/spec/generic/client_stub_spec.rb +23 -23
- data/third_party/abseil-cpp/absl/algorithm/container.h +1 -1
- data/third_party/abseil-cpp/absl/base/attributes.h +49 -22
- data/third_party/abseil-cpp/absl/base/casts.h +61 -68
- data/third_party/abseil-cpp/absl/base/config.h +182 -41
- data/third_party/abseil-cpp/absl/base/internal/cycleclock.cc +12 -42
- data/third_party/abseil-cpp/absl/base/internal/cycleclock.h +67 -2
- data/third_party/abseil-cpp/absl/base/internal/direct_mmap.h +3 -3
- data/third_party/abseil-cpp/absl/base/internal/endian.h +17 -62
- data/third_party/abseil-cpp/absl/base/internal/fast_type_id.h +2 -0
- data/third_party/abseil-cpp/absl/base/internal/invoke.h +54 -0
- data/third_party/abseil-cpp/absl/base/internal/prefetch.h +138 -0
- data/third_party/abseil-cpp/absl/base/internal/raw_logging.cc +29 -22
- data/third_party/abseil-cpp/absl/base/internal/raw_logging.h +13 -12
- data/third_party/abseil-cpp/absl/base/internal/spinlock.cc +3 -0
- data/third_party/abseil-cpp/absl/base/internal/spinlock.h +8 -0
- data/third_party/abseil-cpp/absl/base/internal/spinlock_linux.inc +2 -5
- data/third_party/abseil-cpp/absl/base/internal/strerror.cc +88 -0
- data/third_party/abseil-cpp/absl/base/internal/strerror.h +39 -0
- data/third_party/abseil-cpp/absl/base/internal/sysinfo.cc +0 -1
- data/third_party/abseil-cpp/absl/base/internal/thread_identity.cc +2 -1
- data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.cc +6 -7
- data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.h +12 -3
- data/third_party/abseil-cpp/absl/base/log_severity.cc +28 -0
- data/third_party/abseil-cpp/absl/base/log_severity.h +51 -0
- data/third_party/abseil-cpp/absl/base/optimization.h +19 -11
- data/third_party/abseil-cpp/absl/base/options.h +1 -1
- data/third_party/abseil-cpp/absl/base/thread_annotations.h +2 -2
- data/third_party/abseil-cpp/absl/container/fixed_array.h +2 -0
- data/third_party/abseil-cpp/absl/container/flat_hash_map.h +11 -4
- data/third_party/abseil-cpp/absl/container/flat_hash_set.h +15 -9
- data/third_party/abseil-cpp/absl/container/inlined_vector.h +20 -9
- data/third_party/abseil-cpp/absl/container/internal/common.h +6 -5
- data/third_party/abseil-cpp/absl/container/internal/container_memory.h +10 -28
- data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.cc +68 -20
- data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.h +29 -11
- data/third_party/abseil-cpp/absl/container/internal/inlined_vector.h +59 -38
- data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.cc +4 -0
- data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.h +515 -184
- data/third_party/abseil-cpp/absl/debugging/internal/address_is_readable.cc +45 -88
- data/third_party/abseil-cpp/absl/debugging/internal/elf_mem_image.cc +4 -0
- data/third_party/abseil-cpp/absl/debugging/internal/elf_mem_image.h +3 -2
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_aarch64-inl.inc +8 -3
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_arm-inl.inc +8 -3
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_config.h +2 -1
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_powerpc-inl.inc +8 -3
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_riscv-inl.inc +20 -18
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_x86-inl.inc +8 -3
- data/third_party/abseil-cpp/absl/debugging/internal/vdso_support.cc +15 -2
- data/third_party/abseil-cpp/absl/debugging/symbolize.cc +6 -1
- data/third_party/abseil-cpp/absl/debugging/symbolize_elf.inc +46 -7
- data/third_party/abseil-cpp/absl/functional/bind_front.h +10 -1
- data/third_party/abseil-cpp/absl/functional/function_ref.h +2 -1
- data/third_party/abseil-cpp/absl/hash/hash.h +82 -8
- data/third_party/abseil-cpp/absl/hash/internal/hash.h +218 -23
- data/third_party/abseil-cpp/absl/numeric/bits.h +2 -1
- data/third_party/abseil-cpp/absl/numeric/int128.cc +4 -2
- data/third_party/abseil-cpp/absl/numeric/int128.h +2 -2
- data/third_party/abseil-cpp/absl/profiling/internal/sample_recorder.h +21 -6
- data/third_party/abseil-cpp/absl/random/bernoulli_distribution.h +4 -4
- data/third_party/abseil-cpp/absl/random/distributions.h +3 -3
- data/third_party/abseil-cpp/absl/random/internal/distribution_caller.h +3 -0
- data/third_party/abseil-cpp/absl/random/internal/fast_uniform_bits.h +2 -1
- data/third_party/abseil-cpp/absl/random/internal/generate_real.h +2 -2
- data/third_party/abseil-cpp/absl/random/internal/nonsecure_base.h +59 -48
- data/third_party/abseil-cpp/absl/random/internal/pcg_engine.h +1 -1
- data/third_party/abseil-cpp/absl/random/internal/randen.h +5 -11
- data/third_party/abseil-cpp/absl/random/internal/randen_detect.cc +6 -2
- data/third_party/abseil-cpp/absl/random/internal/randen_engine.h +48 -23
- data/third_party/abseil-cpp/absl/random/internal/salted_seed_seq.h +24 -26
- data/third_party/abseil-cpp/absl/random/internal/traits.h +53 -5
- data/third_party/abseil-cpp/absl/random/internal/uniform_helper.h +5 -5
- data/third_party/abseil-cpp/absl/random/internal/wide_multiply.h +33 -48
- data/third_party/abseil-cpp/absl/random/log_uniform_int_distribution.h +9 -10
- data/third_party/abseil-cpp/absl/random/poisson_distribution.h +7 -4
- data/third_party/abseil-cpp/absl/random/seed_sequences.h +1 -0
- data/third_party/abseil-cpp/absl/random/uniform_int_distribution.h +2 -2
- data/third_party/abseil-cpp/absl/random/uniform_real_distribution.h +1 -1
- data/third_party/abseil-cpp/absl/random/zipf_distribution.h +4 -3
- data/third_party/abseil-cpp/absl/status/internal/status_internal.h +17 -0
- data/third_party/abseil-cpp/absl/status/status.cc +174 -2
- data/third_party/abseil-cpp/absl/status/status.h +22 -12
- data/third_party/abseil-cpp/absl/status/statusor.h +9 -3
- data/third_party/abseil-cpp/absl/strings/ascii.h +4 -4
- data/third_party/abseil-cpp/absl/strings/cord.cc +194 -913
- data/third_party/abseil-cpp/absl/strings/cord.h +202 -81
- data/third_party/abseil-cpp/absl/strings/cord_analysis.cc +188 -0
- data/third_party/abseil-cpp/absl/strings/cord_analysis.h +44 -0
- data/third_party/abseil-cpp/absl/strings/cord_buffer.cc +30 -0
- data/third_party/abseil-cpp/absl/strings/cord_buffer.h +572 -0
- data/third_party/abseil-cpp/absl/strings/internal/cord_data_edge.h +63 -0
- data/third_party/abseil-cpp/absl/strings/internal/cord_internal.cc +20 -32
- data/third_party/abseil-cpp/absl/strings/internal/cord_internal.h +123 -88
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree.cc +149 -49
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree.h +44 -59
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_navigator.cc +3 -1
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_navigator.h +4 -2
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_reader.cc +3 -2
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_reader.h +5 -4
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_consume.cc +7 -74
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_crc.cc +54 -0
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_crc.h +102 -0
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_flat.h +58 -17
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring.cc +13 -11
- data/third_party/abseil-cpp/absl/strings/internal/cordz_info.cc +11 -38
- data/third_party/abseil-cpp/absl/strings/internal/cordz_statistics.h +1 -0
- data/third_party/abseil-cpp/absl/strings/internal/cordz_update_tracker.h +4 -2
- data/third_party/abseil-cpp/absl/strings/internal/escaping.cc +6 -5
- data/third_party/abseil-cpp/absl/strings/internal/ostringstream.cc +1 -1
- data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.cc +1 -1
- data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.h +1 -1
- data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.h +38 -7
- data/third_party/abseil-cpp/absl/strings/internal/str_format/checker.h +7 -2
- data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.cc +4 -5
- data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.h +5 -2
- data/third_party/abseil-cpp/absl/strings/internal/str_format/output.h +2 -1
- data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.h +4 -2
- data/third_party/abseil-cpp/absl/strings/internal/str_join_internal.h +9 -6
- data/third_party/abseil-cpp/absl/strings/internal/string_constant.h +10 -2
- data/third_party/abseil-cpp/absl/strings/internal/utf8.cc +9 -9
- data/third_party/abseil-cpp/absl/strings/numbers.cc +8 -8
- data/third_party/abseil-cpp/absl/strings/numbers.h +26 -23
- data/third_party/abseil-cpp/absl/strings/str_cat.h +20 -13
- data/third_party/abseil-cpp/absl/strings/str_join.h +9 -15
- data/third_party/abseil-cpp/absl/strings/str_split.h +1 -2
- data/third_party/abseil-cpp/absl/strings/string_view.cc +2 -13
- data/third_party/abseil-cpp/absl/strings/string_view.h +3 -2
- data/third_party/abseil-cpp/absl/strings/strip.h +8 -6
- data/third_party/abseil-cpp/absl/strings/substitute.h +10 -2
- data/third_party/abseil-cpp/absl/synchronization/internal/create_thread_identity.cc +9 -6
- data/third_party/abseil-cpp/absl/synchronization/internal/create_thread_identity.h +0 -4
- data/third_party/abseil-cpp/absl/synchronization/internal/per_thread_sem.cc +0 -4
- data/third_party/abseil-cpp/absl/synchronization/internal/per_thread_sem.h +1 -6
- data/third_party/abseil-cpp/absl/synchronization/internal/waiter.cc +0 -25
- data/third_party/abseil-cpp/absl/synchronization/internal/waiter.h +10 -4
- data/third_party/abseil-cpp/absl/synchronization/mutex.cc +75 -40
- data/third_party/abseil-cpp/absl/synchronization/mutex.h +17 -9
- data/third_party/abseil-cpp/absl/synchronization/notification.h +3 -2
- data/third_party/abseil-cpp/absl/time/duration.cc +5 -4
- data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/civil_time_detail.h +11 -7
- data/third_party/abseil-cpp/absl/time/time.h +16 -12
- data/third_party/abseil-cpp/absl/types/internal/optional.h +8 -0
- data/third_party/abseil-cpp/absl/types/internal/variant.h +3 -3
- data/third_party/abseil-cpp/absl/types/optional.h +17 -14
- data/third_party/abseil-cpp/absl/types/span.h +2 -1
- metadata +39 -15
- data/src/core/lib/slice/slice_split.cc +0 -103
- data/src/core/lib/slice/slice_split.h +0 -36
- data/src/core/lib/transport/byte_stream.cc +0 -165
- data/src/core/lib/transport/byte_stream.h +0 -170
- data/third_party/abseil-cpp/absl/cleanup/cleanup.h +0 -140
- data/third_party/abseil-cpp/absl/cleanup/internal/cleanup.h +0 -100
- data/third_party/abseil-cpp/absl/container/internal/have_sse.h +0 -50
@@ -373,7 +373,7 @@ RealType Gaussian(URBG&& urbg, // NOLINT(runtime/references)
|
|
373
373
|
template <typename IntType, typename URBG>
|
374
374
|
IntType LogUniform(URBG&& urbg, // NOLINT(runtime/references)
|
375
375
|
IntType lo, IntType hi, IntType base = 2) {
|
376
|
-
static_assert(
|
376
|
+
static_assert(random_internal::IsIntegral<IntType>::value,
|
377
377
|
"Template-argument 'IntType' must be an integral type, in "
|
378
378
|
"absl::LogUniform<IntType, URBG>(...)");
|
379
379
|
|
@@ -403,7 +403,7 @@ IntType LogUniform(URBG&& urbg, // NOLINT(runtime/references)
|
|
403
403
|
template <typename IntType, typename URBG>
|
404
404
|
IntType Poisson(URBG&& urbg, // NOLINT(runtime/references)
|
405
405
|
double mean = 1.0) {
|
406
|
-
static_assert(
|
406
|
+
static_assert(random_internal::IsIntegral<IntType>::value,
|
407
407
|
"Template-argument 'IntType' must be an integral type, in "
|
408
408
|
"absl::Poisson<IntType, URBG>(...)");
|
409
409
|
|
@@ -435,7 +435,7 @@ template <typename IntType, typename URBG>
|
|
435
435
|
IntType Zipf(URBG&& urbg, // NOLINT(runtime/references)
|
436
436
|
IntType hi = (std::numeric_limits<IntType>::max)(), double q = 2.0,
|
437
437
|
double v = 1.0) {
|
438
|
-
static_assert(
|
438
|
+
static_assert(random_internal::IsIntegral<IntType>::value,
|
439
439
|
"Template-argument 'IntType' must be an integral type, in "
|
440
440
|
"absl::Zipf<IntType, URBG>(...)");
|
441
441
|
|
@@ -18,6 +18,7 @@
|
|
18
18
|
#define ABSL_RANDOM_INTERNAL_DISTRIBUTION_CALLER_H_
|
19
19
|
|
20
20
|
#include <utility>
|
21
|
+
#include <type_traits>
|
21
22
|
|
22
23
|
#include "absl/base/config.h"
|
23
24
|
#include "absl/base/internal/fast_type_id.h"
|
@@ -32,6 +33,8 @@ namespace random_internal {
|
|
32
33
|
// to intercept such calls.
|
33
34
|
template <typename URBG>
|
34
35
|
struct DistributionCaller {
|
36
|
+
static_assert(!std::is_pointer<URBG>::value,
|
37
|
+
"You must pass a reference, not a pointer.");
|
35
38
|
// SFINAE to detect whether the URBG type includes a member matching
|
36
39
|
// bool InvokeMock(base_internal::FastTypeIdType, void*, void*).
|
37
40
|
//
|
@@ -22,6 +22,7 @@
|
|
22
22
|
|
23
23
|
#include "absl/base/config.h"
|
24
24
|
#include "absl/meta/type_traits.h"
|
25
|
+
#include "absl/random/internal/traits.h"
|
25
26
|
|
26
27
|
namespace absl {
|
27
28
|
ABSL_NAMESPACE_BEGIN
|
@@ -98,7 +99,7 @@ class FastUniformBits {
|
|
98
99
|
result_type operator()(URBG& g); // NOLINT(runtime/references)
|
99
100
|
|
100
101
|
private:
|
101
|
-
static_assert(
|
102
|
+
static_assert(IsUnsigned<UIntType>::value,
|
102
103
|
"Class-template FastUniformBits<> must be parameterized using "
|
103
104
|
"an unsigned type.");
|
104
105
|
|
@@ -50,10 +50,10 @@ struct GenerateSignedTag {};
|
|
50
50
|
// inputs, otherwise it never returns 0.
|
51
51
|
//
|
52
52
|
// When a value in U(0,1) is required, use:
|
53
|
-
//
|
53
|
+
// GenerateRealFromBits<double, PositiveValueT, true>;
|
54
54
|
//
|
55
55
|
// When a value in U(-1,1) is required, use:
|
56
|
-
//
|
56
|
+
// GenerateRealFromBits<double, SignedValueT, false>;
|
57
57
|
//
|
58
58
|
// This generates more distinct values than the mathematical equivalent
|
59
59
|
// `U(0, 1) * 2.0 - 1.0`.
|
@@ -17,28 +17,82 @@
|
|
17
17
|
|
18
18
|
#include <algorithm>
|
19
19
|
#include <cstdint>
|
20
|
-
#include <iostream>
|
21
20
|
#include <iterator>
|
22
|
-
#include <random>
|
23
|
-
#include <string>
|
24
21
|
#include <type_traits>
|
22
|
+
#include <utility>
|
25
23
|
#include <vector>
|
26
24
|
|
27
25
|
#include "absl/base/macros.h"
|
26
|
+
#include "absl/container/inlined_vector.h"
|
28
27
|
#include "absl/meta/type_traits.h"
|
29
28
|
#include "absl/random/internal/pool_urbg.h"
|
30
29
|
#include "absl/random/internal/salted_seed_seq.h"
|
31
30
|
#include "absl/random/internal/seed_material.h"
|
32
|
-
#include "absl/types/optional.h"
|
33
31
|
#include "absl/types/span.h"
|
34
32
|
|
35
33
|
namespace absl {
|
36
34
|
ABSL_NAMESPACE_BEGIN
|
37
35
|
namespace random_internal {
|
38
36
|
|
37
|
+
// RandenPoolSeedSeq is a custom seed sequence type where generate() fills the
|
38
|
+
// provided buffer via the RandenPool entropy source.
|
39
|
+
class RandenPoolSeedSeq {
|
40
|
+
private:
|
41
|
+
struct ContiguousTag {};
|
42
|
+
struct BufferTag {};
|
43
|
+
|
44
|
+
// Generate random unsigned values directly into the buffer.
|
45
|
+
template <typename Contiguous>
|
46
|
+
void generate_impl(ContiguousTag, Contiguous begin, Contiguous end) {
|
47
|
+
const size_t n = std::distance(begin, end);
|
48
|
+
auto* a = &(*begin);
|
49
|
+
RandenPool<uint8_t>::Fill(
|
50
|
+
absl::MakeSpan(reinterpret_cast<uint8_t*>(a), sizeof(*a) * n));
|
51
|
+
}
|
52
|
+
|
53
|
+
// Construct a buffer of size n and fill it with values, then copy
|
54
|
+
// those values into the seed iterators.
|
55
|
+
template <typename RandomAccessIterator>
|
56
|
+
void generate_impl(BufferTag, RandomAccessIterator begin,
|
57
|
+
RandomAccessIterator end) {
|
58
|
+
const size_t n = std::distance(begin, end);
|
59
|
+
absl::InlinedVector<uint32_t, 8> data(n, 0);
|
60
|
+
RandenPool<uint32_t>::Fill(absl::MakeSpan(data.begin(), data.end()));
|
61
|
+
std::copy(std::begin(data), std::end(data), begin);
|
62
|
+
}
|
63
|
+
|
64
|
+
public:
|
65
|
+
using result_type = uint32_t;
|
66
|
+
|
67
|
+
size_t size() { return 0; }
|
68
|
+
|
69
|
+
template <typename OutIterator>
|
70
|
+
void param(OutIterator) const {}
|
71
|
+
|
72
|
+
template <typename RandomAccessIterator>
|
73
|
+
void generate(RandomAccessIterator begin, RandomAccessIterator end) {
|
74
|
+
// RandomAccessIterator must be assignable from uint32_t
|
75
|
+
if (begin != end) {
|
76
|
+
using U = typename std::iterator_traits<RandomAccessIterator>::value_type;
|
77
|
+
// ContiguousTag indicates the common case of a known contiguous buffer,
|
78
|
+
// which allows directly filling the buffer. In C++20,
|
79
|
+
// std::contiguous_iterator_tag provides a mechanism for testing this
|
80
|
+
// capability, however until Abseil's support requirements allow us to
|
81
|
+
// assume C++20, limit checks to a few common cases.
|
82
|
+
using TagType = absl::conditional_t<
|
83
|
+
(std::is_pointer<RandomAccessIterator>::value ||
|
84
|
+
std::is_same<RandomAccessIterator,
|
85
|
+
typename std::vector<U>::iterator>::value),
|
86
|
+
ContiguousTag, BufferTag>;
|
87
|
+
|
88
|
+
generate_impl(TagType{}, begin, end);
|
89
|
+
}
|
90
|
+
}
|
91
|
+
};
|
92
|
+
|
39
93
|
// Each instance of NonsecureURBGBase<URBG> will be seeded by variates produced
|
40
94
|
// by a thread-unique URBG-instance.
|
41
|
-
template <typename URBG>
|
95
|
+
template <typename URBG, typename Seeder = RandenPoolSeedSeq>
|
42
96
|
class NonsecureURBGBase {
|
43
97
|
public:
|
44
98
|
using result_type = typename URBG::result_type;
|
@@ -85,49 +139,6 @@ class NonsecureURBGBase {
|
|
85
139
|
}
|
86
140
|
|
87
141
|
private:
|
88
|
-
// Seeder is a custom seed sequence type where generate() fills the provided
|
89
|
-
// buffer via the RandenPool entropy source.
|
90
|
-
struct Seeder {
|
91
|
-
using result_type = uint32_t;
|
92
|
-
|
93
|
-
size_t size() { return 0; }
|
94
|
-
|
95
|
-
template <typename OutIterator>
|
96
|
-
void param(OutIterator) const {}
|
97
|
-
|
98
|
-
template <typename RandomAccessIterator>
|
99
|
-
void generate(RandomAccessIterator begin, RandomAccessIterator end) {
|
100
|
-
if (begin != end) {
|
101
|
-
// begin, end must be random access iterators assignable from uint32_t.
|
102
|
-
generate_impl(
|
103
|
-
std::integral_constant<bool, sizeof(*begin) == sizeof(uint32_t)>{},
|
104
|
-
begin, end);
|
105
|
-
}
|
106
|
-
}
|
107
|
-
|
108
|
-
// Commonly, generate is invoked with a pointer to a buffer which
|
109
|
-
// can be cast to a uint32_t.
|
110
|
-
template <typename RandomAccessIterator>
|
111
|
-
void generate_impl(std::integral_constant<bool, true>,
|
112
|
-
RandomAccessIterator begin, RandomAccessIterator end) {
|
113
|
-
auto buffer = absl::MakeSpan(begin, end);
|
114
|
-
auto target = absl::MakeSpan(reinterpret_cast<uint32_t*>(buffer.data()),
|
115
|
-
buffer.size());
|
116
|
-
RandenPool<uint32_t>::Fill(target);
|
117
|
-
}
|
118
|
-
|
119
|
-
// The non-uint32_t case should be uncommon, and involves an extra copy,
|
120
|
-
// filling the uint32_t buffer and then mixing into the output.
|
121
|
-
template <typename RandomAccessIterator>
|
122
|
-
void generate_impl(std::integral_constant<bool, false>,
|
123
|
-
RandomAccessIterator begin, RandomAccessIterator end) {
|
124
|
-
const size_t n = std::distance(begin, end);
|
125
|
-
absl::InlinedVector<uint32_t, 8> data(n, 0);
|
126
|
-
RandenPool<uint32_t>::Fill(absl::MakeSpan(data.begin(), data.end()));
|
127
|
-
std::copy(std::begin(data), std::end(data), begin);
|
128
|
-
}
|
129
|
-
};
|
130
|
-
|
131
142
|
static URBG ConstructURBG() {
|
132
143
|
Seeder seeder;
|
133
144
|
return URBG(seeder);
|
@@ -43,10 +43,8 @@ class Randen {
|
|
43
43
|
|
44
44
|
// Generate updates the randen sponge. The outer portion of the sponge
|
45
45
|
// (kCapacityBytes .. kStateBytes) may be consumed as PRNG state.
|
46
|
-
|
47
|
-
void Generate(
|
48
|
-
static_assert(N * sizeof(T) == kStateBytes,
|
49
|
-
"Randen::Generate() requires kStateBytes of state");
|
46
|
+
// REQUIRES: state points to kStateBytes of state.
|
47
|
+
inline void Generate(void* state) const {
|
50
48
|
#if ABSL_RANDOM_INTERNAL_AES_DISPATCH
|
51
49
|
// HW AES Dispatch.
|
52
50
|
if (has_crypto_) {
|
@@ -65,13 +63,9 @@ class Randen {
|
|
65
63
|
|
66
64
|
// Absorb incorporates additional seed material into the randen sponge. After
|
67
65
|
// absorb returns, Generate must be called before the state may be consumed.
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
"Randen::Absorb() requires kSeedBytes of seed");
|
72
|
-
|
73
|
-
static_assert(N * sizeof(T) == RandenTraits::kStateBytes,
|
74
|
-
"Randen::Absorb() requires kStateBytes of state");
|
66
|
+
// REQUIRES: seed points to kSeedBytes of seed.
|
67
|
+
// REQUIRES: state points to kStateBytes of state.
|
68
|
+
inline void Absorb(const void* seed, void* state) const {
|
75
69
|
#if ABSL_RANDOM_INTERNAL_AES_DISPATCH
|
76
70
|
// HW AES Dispatch.
|
77
71
|
if (has_crypto_) {
|
@@ -24,6 +24,11 @@
|
|
24
24
|
|
25
25
|
#include "absl/random/internal/platform.h"
|
26
26
|
|
27
|
+
#if !defined(__UCLIBC__) && defined(__GLIBC__) && \
|
28
|
+
(__GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 16))
|
29
|
+
#define ABSL_HAVE_GETAUXVAL
|
30
|
+
#endif
|
31
|
+
|
27
32
|
#if defined(ABSL_ARCH_X86_64)
|
28
33
|
#define ABSL_INTERNAL_USE_X86_CPUID
|
29
34
|
#elif defined(ABSL_ARCH_PPC) || defined(ABSL_ARCH_ARM) || \
|
@@ -31,7 +36,7 @@
|
|
31
36
|
#if defined(__ANDROID__)
|
32
37
|
#define ABSL_INTERNAL_USE_ANDROID_GETAUXVAL
|
33
38
|
#define ABSL_INTERNAL_USE_GETAUXVAL
|
34
|
-
#elif defined(__linux__)
|
39
|
+
#elif defined(__linux__) && defined(ABSL_HAVE_GETAUXVAL)
|
35
40
|
#define ABSL_INTERNAL_USE_LINUX_GETAUXVAL
|
36
41
|
#define ABSL_INTERNAL_USE_GETAUXVAL
|
37
42
|
#endif
|
@@ -40,7 +45,6 @@
|
|
40
45
|
#if defined(ABSL_INTERNAL_USE_X86_CPUID)
|
41
46
|
#if defined(_WIN32) || defined(_WIN64)
|
42
47
|
#include <intrin.h> // NOLINT(build/include_order)
|
43
|
-
#pragma intrinsic(__cpuid)
|
44
48
|
#else
|
45
49
|
// MSVC-equivalent __cpuid intrinsic function.
|
46
50
|
static void __cpuid(int cpu_info[4], int info_type) {
|
@@ -42,7 +42,7 @@ namespace random_internal {
|
|
42
42
|
// 'Strong' (well-distributed, unpredictable, backtracking-resistant) random
|
43
43
|
// generator, faster in some benchmarks than std::mt19937_64 and pcg64_c32.
|
44
44
|
template <typename T>
|
45
|
-
class alignas(
|
45
|
+
class alignas(8) randen_engine {
|
46
46
|
public:
|
47
47
|
// C++11 URBG interface:
|
48
48
|
using result_type = T;
|
@@ -58,7 +58,8 @@ class alignas(16) randen_engine {
|
|
58
58
|
return (std::numeric_limits<result_type>::max)();
|
59
59
|
}
|
60
60
|
|
61
|
-
|
61
|
+
randen_engine() : randen_engine(0) {}
|
62
|
+
explicit randen_engine(result_type seed_value) { seed(seed_value); }
|
62
63
|
|
63
64
|
template <class SeedSequence,
|
64
65
|
typename = typename absl::enable_if_t<
|
@@ -67,17 +68,27 @@ class alignas(16) randen_engine {
|
|
67
68
|
seed(seq);
|
68
69
|
}
|
69
70
|
|
70
|
-
|
71
|
+
// alignment requirements dictate custom copy and move constructors.
|
72
|
+
randen_engine(const randen_engine& other)
|
73
|
+
: next_(other.next_), impl_(other.impl_) {
|
74
|
+
std::memcpy(state(), other.state(), kStateSizeT * sizeof(result_type));
|
75
|
+
}
|
76
|
+
randen_engine& operator=(const randen_engine& other) {
|
77
|
+
next_ = other.next_;
|
78
|
+
impl_ = other.impl_;
|
79
|
+
std::memcpy(state(), other.state(), kStateSizeT * sizeof(result_type));
|
80
|
+
return *this;
|
81
|
+
}
|
71
82
|
|
72
83
|
// Returns random bits from the buffer in units of result_type.
|
73
84
|
result_type operator()() {
|
74
85
|
// Refill the buffer if needed (unlikely).
|
86
|
+
auto* begin = state();
|
75
87
|
if (next_ >= kStateSizeT) {
|
76
88
|
next_ = kCapacityT;
|
77
|
-
impl_.Generate(
|
89
|
+
impl_.Generate(begin);
|
78
90
|
}
|
79
|
-
|
80
|
-
return little_endian::ToHost(state_[next_++]);
|
91
|
+
return little_endian::ToHost(begin[next_++]);
|
81
92
|
}
|
82
93
|
|
83
94
|
template <class SeedSequence>
|
@@ -92,9 +103,10 @@ class alignas(16) randen_engine {
|
|
92
103
|
void seed(result_type seed_value = 0) {
|
93
104
|
next_ = kStateSizeT;
|
94
105
|
// Zeroes the inner state and fills the outer state with seed_value to
|
95
|
-
//
|
96
|
-
|
97
|
-
std::fill(
|
106
|
+
// mimic the behaviour of reseed
|
107
|
+
auto* begin = state();
|
108
|
+
std::fill(begin, begin + kCapacityT, 0);
|
109
|
+
std::fill(begin + kCapacityT, begin + kStateSizeT, seed_value);
|
98
110
|
}
|
99
111
|
|
100
112
|
// Inserts entropy into (part of) the state. Calling this periodically with
|
@@ -105,7 +117,6 @@ class alignas(16) randen_engine {
|
|
105
117
|
using sequence_result_type = typename SeedSequence::result_type;
|
106
118
|
static_assert(sizeof(sequence_result_type) == 4,
|
107
119
|
"SeedSequence::result_type must be 32-bit");
|
108
|
-
|
109
120
|
constexpr size_t kBufferSize =
|
110
121
|
Randen::kSeedBytes / sizeof(sequence_result_type);
|
111
122
|
alignas(16) sequence_result_type buffer[kBufferSize];
|
@@ -119,8 +130,8 @@ class alignas(16) randen_engine {
|
|
119
130
|
if (entropy_size < kBufferSize) {
|
120
131
|
// ... and only request that many values, or 256-bits, when unspecified.
|
121
132
|
const size_t requested_entropy = (entropy_size == 0) ? 8u : entropy_size;
|
122
|
-
std::fill(
|
123
|
-
seq.generate(
|
133
|
+
std::fill(buffer + requested_entropy, buffer + kBufferSize, 0);
|
134
|
+
seq.generate(buffer, buffer + requested_entropy);
|
124
135
|
#ifdef ABSL_IS_BIG_ENDIAN
|
125
136
|
// Randen expects the seed buffer to be in Little Endian; reverse it on
|
126
137
|
// Big Endian platforms.
|
@@ -146,9 +157,9 @@ class alignas(16) randen_engine {
|
|
146
157
|
std::swap(buffer[--dst], buffer[--src]);
|
147
158
|
}
|
148
159
|
} else {
|
149
|
-
seq.generate(
|
160
|
+
seq.generate(buffer, buffer + kBufferSize);
|
150
161
|
}
|
151
|
-
impl_.Absorb(buffer,
|
162
|
+
impl_.Absorb(buffer, state());
|
152
163
|
|
153
164
|
// Generate will be called when operator() is called
|
154
165
|
next_ = kStateSizeT;
|
@@ -159,9 +170,10 @@ class alignas(16) randen_engine {
|
|
159
170
|
count -= step;
|
160
171
|
|
161
172
|
constexpr uint64_t kRateT = kStateSizeT - kCapacityT;
|
173
|
+
auto* begin = state();
|
162
174
|
while (count > 0) {
|
163
175
|
next_ = kCapacityT;
|
164
|
-
impl_.Generate(
|
176
|
+
impl_.Generate(*reinterpret_cast<result_type(*)[kStateSizeT]>(begin));
|
165
177
|
step = std::min<uint64_t>(kRateT, count);
|
166
178
|
count -= step;
|
167
179
|
}
|
@@ -169,9 +181,9 @@ class alignas(16) randen_engine {
|
|
169
181
|
}
|
170
182
|
|
171
183
|
bool operator==(const randen_engine& other) const {
|
184
|
+
const auto* begin = state();
|
172
185
|
return next_ == other.next_ &&
|
173
|
-
std::equal(
|
174
|
-
std::begin(other.state_));
|
186
|
+
std::equal(begin, begin + kStateSizeT, other.state());
|
175
187
|
}
|
176
188
|
|
177
189
|
bool operator!=(const randen_engine& other) const {
|
@@ -185,11 +197,12 @@ class alignas(16) randen_engine {
|
|
185
197
|
using numeric_type =
|
186
198
|
typename random_internal::stream_format_type<result_type>::type;
|
187
199
|
auto saver = random_internal::make_ostream_state_saver(os);
|
188
|
-
|
200
|
+
auto* it = engine.state();
|
201
|
+
for (auto* end = it + kStateSizeT; it < end; ++it) {
|
189
202
|
// In the case that `elem` is `uint8_t`, it must be cast to something
|
190
203
|
// larger so that it prints as an integer rather than a character. For
|
191
204
|
// simplicity, apply the cast all circumstances.
|
192
|
-
os << static_cast<numeric_type>(little_endian::FromHost(
|
205
|
+
os << static_cast<numeric_type>(little_endian::FromHost(*it))
|
193
206
|
<< os.fill();
|
194
207
|
}
|
195
208
|
os << engine.next_;
|
@@ -215,7 +228,7 @@ class alignas(16) randen_engine {
|
|
215
228
|
if (is.fail()) {
|
216
229
|
return is;
|
217
230
|
}
|
218
|
-
std::memcpy(engine.
|
231
|
+
std::memcpy(engine.state(), state, sizeof(state));
|
219
232
|
engine.next_ = next;
|
220
233
|
return is;
|
221
234
|
}
|
@@ -226,9 +239,21 @@ class alignas(16) randen_engine {
|
|
226
239
|
static constexpr size_t kCapacityT =
|
227
240
|
Randen::kCapacityBytes / sizeof(result_type);
|
228
241
|
|
229
|
-
//
|
230
|
-
|
231
|
-
|
242
|
+
// Returns the state array pointer, which is aligned to 16 bytes.
|
243
|
+
// The first kCapacityT are the `inner' sponge; the remainder are available.
|
244
|
+
result_type* state() {
|
245
|
+
return reinterpret_cast<result_type*>(
|
246
|
+
(reinterpret_cast<uintptr_t>(&raw_state_) & 0xf) ? (raw_state_ + 8)
|
247
|
+
: raw_state_);
|
248
|
+
}
|
249
|
+
const result_type* state() const {
|
250
|
+
return const_cast<randen_engine*>(this)->state();
|
251
|
+
}
|
252
|
+
|
253
|
+
// raw state array, manually aligned in state(). This overallocates
|
254
|
+
// by 8 bytes since C++ does not guarantee extended heap alignment.
|
255
|
+
alignas(8) char raw_state_[Randen::kStateBytes + 8];
|
256
|
+
size_t next_; // index within state()
|
232
257
|
Randen impl_;
|
233
258
|
};
|
234
259
|
|
@@ -22,6 +22,7 @@
|
|
22
22
|
#include <memory>
|
23
23
|
#include <type_traits>
|
24
24
|
#include <utility>
|
25
|
+
#include <vector>
|
25
26
|
|
26
27
|
#include "absl/container/inlined_vector.h"
|
27
28
|
#include "absl/meta/type_traits.h"
|
@@ -65,15 +66,19 @@ class SaltedSeedSeq {
|
|
65
66
|
|
66
67
|
template <typename RandomAccessIterator>
|
67
68
|
void generate(RandomAccessIterator begin, RandomAccessIterator end) {
|
69
|
+
using U = typename std::iterator_traits<RandomAccessIterator>::value_type;
|
70
|
+
|
68
71
|
// The common case is that generate is called with ContiguousIterators
|
69
72
|
// to uint arrays. Such contiguous memory regions may be optimized,
|
70
73
|
// which we detect here.
|
71
|
-
using
|
72
|
-
(std::
|
73
|
-
std::
|
74
|
+
using TagType = absl::conditional_t<
|
75
|
+
(std::is_same<U, uint32_t>::value &&
|
76
|
+
(std::is_pointer<RandomAccessIterator>::value ||
|
77
|
+
std::is_same<RandomAccessIterator,
|
78
|
+
typename std::vector<U>::iterator>::value)),
|
74
79
|
ContiguousAndUint32Tag, DefaultTag>;
|
75
80
|
if (begin != end) {
|
76
|
-
generate_impl(begin, end,
|
81
|
+
generate_impl(TagType{}, begin, end, std::distance(begin, end));
|
77
82
|
}
|
78
83
|
}
|
79
84
|
|
@@ -89,8 +94,15 @@ class SaltedSeedSeq {
|
|
89
94
|
struct DefaultTag {};
|
90
95
|
|
91
96
|
// Generate which requires the iterators are contiguous pointers to uint32_t.
|
92
|
-
|
93
|
-
|
97
|
+
// Fills the initial seed buffer the underlying SSeq::generate() call,
|
98
|
+
// then mixes in the salt material.
|
99
|
+
template <typename Contiguous>
|
100
|
+
void generate_impl(ContiguousAndUint32Tag, Contiguous begin, Contiguous end,
|
101
|
+
size_t n) {
|
102
|
+
seq_->generate(begin, end);
|
103
|
+
const uint32_t salt = absl::random_internal::GetSaltMaterial().value_or(0);
|
104
|
+
auto span = absl::Span<uint32_t>(&*begin, n);
|
105
|
+
MixIntoSeedMaterial(absl::MakeConstSpan(&salt, 1), span);
|
94
106
|
}
|
95
107
|
|
96
108
|
// The uncommon case for generate is that it is called with iterators over
|
@@ -98,27 +110,13 @@ class SaltedSeedSeq {
|
|
98
110
|
// case we allocate a temporary 32-bit buffer and then copy-assign back
|
99
111
|
// to the initial inputs.
|
100
112
|
template <typename RandomAccessIterator>
|
101
|
-
void generate_impl(
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
// Fills the initial seed buffer the underlying SSeq::generate() call,
|
107
|
-
// mixing in the salt material.
|
108
|
-
void generate_contiguous(absl::Span<uint32_t> buffer) {
|
109
|
-
seq_->generate(buffer.begin(), buffer.end());
|
110
|
-
const uint32_t salt = absl::random_internal::GetSaltMaterial().value_or(0);
|
111
|
-
MixIntoSeedMaterial(absl::MakeConstSpan(&salt, 1), buffer);
|
112
|
-
}
|
113
|
-
|
114
|
-
// Allocates a seed buffer of `n` elements, generates the seed, then
|
115
|
-
// copies the result into the `out` iterator.
|
116
|
-
template <typename Iterator>
|
117
|
-
void generate_and_copy(size_t n, Iterator out) {
|
118
|
-
// Allocate a temporary buffer, generate, and then copy.
|
113
|
+
void generate_impl(DefaultTag, RandomAccessIterator begin,
|
114
|
+
RandomAccessIterator, size_t n) {
|
115
|
+
// Allocates a seed buffer of `n` elements, generates the seed, then
|
116
|
+
// copies the result into the `out` iterator.
|
119
117
|
absl::InlinedVector<uint32_t, 8> data(n, 0);
|
120
|
-
|
121
|
-
std::copy(data.begin(), data.end(),
|
118
|
+
generate_impl(ContiguousAndUint32Tag{}, data.begin(), data.end(), n);
|
119
|
+
std::copy(data.begin(), data.end(), begin);
|
122
120
|
}
|
123
121
|
|
124
122
|
// Because [rand.req.seedseq] is not required to be copy-constructible,
|
@@ -20,6 +20,8 @@
|
|
20
20
|
#include <type_traits>
|
21
21
|
|
22
22
|
#include "absl/base/config.h"
|
23
|
+
#include "absl/numeric/bits.h"
|
24
|
+
#include "absl/numeric/int128.h"
|
23
25
|
|
24
26
|
namespace absl {
|
25
27
|
ABSL_NAMESPACE_BEGIN
|
@@ -59,6 +61,31 @@ class is_widening_convertible {
|
|
59
61
|
rank<A>() <= rank<B>();
|
60
62
|
};
|
61
63
|
|
64
|
+
template <typename T>
|
65
|
+
struct IsIntegral : std::is_integral<T> {};
|
66
|
+
template <>
|
67
|
+
struct IsIntegral<absl::int128> : std::true_type {};
|
68
|
+
template <>
|
69
|
+
struct IsIntegral<absl::uint128> : std::true_type {};
|
70
|
+
|
71
|
+
template <typename T>
|
72
|
+
struct MakeUnsigned : std::make_unsigned<T> {};
|
73
|
+
template <>
|
74
|
+
struct MakeUnsigned<absl::int128> {
|
75
|
+
using type = absl::uint128;
|
76
|
+
};
|
77
|
+
template <>
|
78
|
+
struct MakeUnsigned<absl::uint128> {
|
79
|
+
using type = absl::uint128;
|
80
|
+
};
|
81
|
+
|
82
|
+
template <typename T>
|
83
|
+
struct IsUnsigned : std::is_unsigned<T> {};
|
84
|
+
template <>
|
85
|
+
struct IsUnsigned<absl::int128> : std::false_type {};
|
86
|
+
template <>
|
87
|
+
struct IsUnsigned<absl::uint128> : std::true_type {};
|
88
|
+
|
62
89
|
// unsigned_bits<N>::type returns the unsigned int type with the indicated
|
63
90
|
// number of bits.
|
64
91
|
template <size_t N>
|
@@ -81,19 +108,40 @@ struct unsigned_bits<64> {
|
|
81
108
|
using type = uint64_t;
|
82
109
|
};
|
83
110
|
|
84
|
-
#ifdef ABSL_HAVE_INTRINSIC_INT128
|
85
111
|
template <>
|
86
112
|
struct unsigned_bits<128> {
|
87
|
-
using type =
|
113
|
+
using type = absl::uint128;
|
114
|
+
};
|
115
|
+
|
116
|
+
// 256-bit wrapper for wide multiplications.
|
117
|
+
struct U256 {
|
118
|
+
uint128 hi;
|
119
|
+
uint128 lo;
|
120
|
+
};
|
121
|
+
template <>
|
122
|
+
struct unsigned_bits<256> {
|
123
|
+
using type = U256;
|
88
124
|
};
|
89
|
-
#endif
|
90
125
|
|
91
126
|
template <typename IntType>
|
92
127
|
struct make_unsigned_bits {
|
93
|
-
using type = typename unsigned_bits<
|
94
|
-
|
128
|
+
using type = typename unsigned_bits<
|
129
|
+
std::numeric_limits<typename MakeUnsigned<IntType>::type>::digits>::type;
|
95
130
|
};
|
96
131
|
|
132
|
+
template <typename T>
|
133
|
+
int BitWidth(T v) {
|
134
|
+
// Workaround for bit_width not supporting int128.
|
135
|
+
// Don't hardcode `64` to make sure this code does not trigger compiler
|
136
|
+
// warnings in smaller types.
|
137
|
+
constexpr int half_bits = sizeof(T) * 8 / 2;
|
138
|
+
if (sizeof(T) == 16 && (v >> half_bits) != 0) {
|
139
|
+
return bit_width(static_cast<uint64_t>(v >> half_bits)) + half_bits;
|
140
|
+
} else {
|
141
|
+
return bit_width(static_cast<uint64_t>(v));
|
142
|
+
}
|
143
|
+
}
|
144
|
+
|
97
145
|
} // namespace random_internal
|
98
146
|
ABSL_NAMESPACE_END
|
99
147
|
} // namespace absl
|
@@ -100,7 +100,7 @@ using uniform_inferred_return_t =
|
|
100
100
|
template <typename IntType, typename Tag>
|
101
101
|
typename absl::enable_if_t<
|
102
102
|
absl::conjunction<
|
103
|
-
|
103
|
+
IsIntegral<IntType>,
|
104
104
|
absl::disjunction<std::is_same<Tag, IntervalOpenClosedTag>,
|
105
105
|
std::is_same<Tag, IntervalOpenOpenTag>>>::value,
|
106
106
|
IntType>
|
@@ -131,7 +131,7 @@ uniform_lower_bound(Tag, NumType a, NumType) {
|
|
131
131
|
template <typename IntType, typename Tag>
|
132
132
|
typename absl::enable_if_t<
|
133
133
|
absl::conjunction<
|
134
|
-
|
134
|
+
IsIntegral<IntType>,
|
135
135
|
absl::disjunction<std::is_same<Tag, IntervalClosedOpenTag>,
|
136
136
|
std::is_same<Tag, IntervalOpenOpenTag>>>::value,
|
137
137
|
IntType>
|
@@ -153,7 +153,7 @@ uniform_upper_bound(Tag, FloatType, FloatType b) {
|
|
153
153
|
template <typename IntType, typename Tag>
|
154
154
|
typename absl::enable_if_t<
|
155
155
|
absl::conjunction<
|
156
|
-
|
156
|
+
IsIntegral<IntType>,
|
157
157
|
absl::disjunction<std::is_same<Tag, IntervalClosedClosedTag>,
|
158
158
|
std::is_same<Tag, IntervalOpenClosedTag>>>::value,
|
159
159
|
IntType>
|
@@ -201,7 +201,7 @@ is_uniform_range_valid(FloatType a, FloatType b) {
|
|
201
201
|
}
|
202
202
|
|
203
203
|
template <typename IntType>
|
204
|
-
absl::enable_if_t<
|
204
|
+
absl::enable_if_t<IsIntegral<IntType>::value, bool>
|
205
205
|
is_uniform_range_valid(IntType a, IntType b) {
|
206
206
|
return a <= b;
|
207
207
|
}
|
@@ -210,7 +210,7 @@ is_uniform_range_valid(IntType a, IntType b) {
|
|
210
210
|
// or absl::uniform_real_distribution depending on the NumType parameter.
|
211
211
|
template <typename NumType>
|
212
212
|
using UniformDistribution =
|
213
|
-
typename std::conditional<
|
213
|
+
typename std::conditional<IsIntegral<NumType>::value,
|
214
214
|
absl::uniform_int_distribution<NumType>,
|
215
215
|
absl::uniform_real_distribution<NumType>>::type;
|
216
216
|
|