grpc 1.57.0 → 1.58.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Makefile +534 -284
- data/include/grpc/event_engine/event_engine.h +0 -1
- data/include/grpc/event_engine/memory_allocator.h +2 -2
- data/include/grpc/impl/channel_arg_names.h +371 -0
- data/include/grpc/impl/grpc_types.h +1 -353
- data/include/grpc/module.modulemap +1 -0
- data/src/core/ext/filters/backend_metrics/backend_metric_filter.cc +1 -1
- data/src/core/ext/filters/channel_idle/channel_idle_filter.cc +2 -1
- data/src/core/ext/filters/client_channel/client_channel.cc +7 -3
- data/src/core/ext/filters/client_channel/http_proxy.cc +1 -1
- data/src/core/ext/filters/client_channel/lb_policy/address_filtering.cc +10 -5
- data/src/core/ext/filters/client_channel/lb_policy/address_filtering.h +7 -5
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +1 -0
- data/src/core/ext/filters/client_channel/lb_policy/health_check_client.cc +5 -3
- data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.cc +4 -2
- data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +115 -109
- data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.h +0 -5
- data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +7 -2
- data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +2 -1
- data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +1 -0
- data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +1 -1
- data/src/core/ext/filters/client_channel/lb_policy/weighted_round_robin/weighted_round_robin.cc +11 -3
- data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +6 -1
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +8 -5
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +1 -1
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +102 -11
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +9 -4
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +4 -1
- data/src/core/ext/filters/client_channel/resolver/dns/dns_resolver_plugin.cc +6 -0
- data/src/core/ext/filters/client_channel/resolver/dns/event_engine/event_engine_client_channel_resolver.cc +41 -14
- data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +1 -1
- data/src/core/ext/filters/client_channel/resolver/polling_resolver.cc +3 -2
- data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +1 -1
- data/src/core/ext/filters/client_channel/retry_filter.h +1 -0
- data/src/core/ext/filters/client_channel/retry_service_config.cc +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 +9 -5
- data/src/core/ext/filters/client_channel/subchannel.h +8 -2
- data/src/core/ext/filters/deadline/deadline_filter.cc +1 -1
- data/src/core/ext/filters/http/client/http_client_filter.cc +1 -0
- data/src/core/ext/filters/http/client_authority_filter.cc +1 -1
- data/src/core/ext/filters/http/message_compress/compression_filter.cc +1 -0
- data/src/core/ext/filters/http/server/http_server_filter.cc +1 -1
- data/src/core/ext/filters/message_size/message_size_filter.cc +1 -0
- data/src/core/ext/filters/rbac/rbac_service_config_parser.cc +4 -7
- data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +1 -0
- data/src/core/ext/transport/chttp2/server/chttp2_server.cc +8 -12
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +357 -358
- data/src/core/ext/transport/chttp2/transport/frame_ping.cc +5 -18
- data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +63 -4
- data/src/core/ext/transport/chttp2/transport/hpack_parser.h +7 -2
- data/src/core/ext/transport/chttp2/transport/internal.h +30 -57
- data/src/core/ext/transport/chttp2/transport/parsing.cc +16 -7
- data/src/core/ext/transport/chttp2/transport/ping_abuse_policy.cc +80 -0
- data/src/core/ext/transport/chttp2/transport/ping_abuse_policy.h +55 -0
- data/src/core/ext/transport/chttp2/transport/ping_rate_policy.cc +98 -0
- data/src/core/ext/transport/chttp2/transport/ping_rate_policy.h +73 -0
- data/src/core/ext/transport/chttp2/transport/writing.cc +81 -89
- data/src/core/ext/transport/inproc/inproc_transport.cc +1 -0
- data/src/core/ext/xds/xds_client_grpc.cc +1 -0
- data/src/core/ext/xds/xds_http_fault_filter.cc +1 -2
- data/src/core/ext/xds/xds_http_fault_filter.h +1 -2
- data/src/core/ext/xds/xds_http_filters.h +2 -4
- data/src/core/ext/xds/xds_http_rbac_filter.cc +3 -8
- data/src/core/ext/xds/xds_http_rbac_filter.h +1 -2
- data/src/core/ext/xds/xds_http_stateful_session_filter.cc +1 -2
- data/src/core/ext/xds/xds_http_stateful_session_filter.h +1 -2
- data/src/core/ext/xds/xds_lb_policy_registry.cc +3 -6
- data/src/core/ext/xds/xds_routing.cc +2 -2
- data/src/core/ext/xds/xds_transport_grpc.cc +1 -0
- data/src/core/lib/avl/avl.h +10 -173
- data/src/core/lib/channel/call_tracer.cc +289 -0
- data/src/core/lib/channel/call_tracer.h +35 -0
- data/src/core/lib/channel/channel_args.cc +84 -79
- data/src/core/lib/channel/channel_args.h +29 -17
- data/src/core/lib/channel/connected_channel.cc +0 -1
- data/src/core/lib/channel/promise_based_filter.cc +4 -1
- data/src/core/lib/compression/compression_internal.cc +8 -4
- data/src/core/lib/debug/stats_data.cc +93 -21
- data/src/core/lib/debug/stats_data.h +41 -0
- data/src/core/lib/event_engine/ares_resolver.cc +712 -0
- data/src/core/lib/event_engine/ares_resolver.h +150 -0
- data/src/core/lib/event_engine/cf_engine/cf_engine.cc +9 -3
- data/src/core/lib/event_engine/cf_engine/cfstream_endpoint.cc +2 -2
- data/src/core/lib/event_engine/cf_engine/dns_service_resolver.cc +229 -0
- data/src/core/lib/event_engine/cf_engine/dns_service_resolver.h +117 -0
- data/src/core/lib/event_engine/forkable.cc +15 -1
- data/src/core/lib/event_engine/forkable.h +15 -0
- data/src/core/lib/event_engine/grpc_polled_fd.h +73 -0
- data/src/core/lib/event_engine/posix_engine/ev_poll_posix.cc +25 -3
- data/src/core/lib/event_engine/posix_engine/ev_poll_posix.h +10 -1
- data/src/core/lib/event_engine/posix_engine/grpc_polled_fd_posix.h +197 -0
- data/src/core/lib/event_engine/posix_engine/posix_endpoint.cc +3 -3
- data/src/core/lib/event_engine/posix_engine/posix_engine.cc +47 -1
- data/src/core/lib/event_engine/posix_engine/posix_engine.h +12 -1
- data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.cc +1 -0
- data/src/core/lib/event_engine/posix_engine/traced_buffer_list.cc +2 -0
- data/src/core/lib/event_engine/thread_pool/thread_count.cc +58 -0
- data/src/core/lib/event_engine/thread_pool/thread_count.h +161 -0
- data/src/core/lib/event_engine/thread_pool/thread_pool_factory.cc +7 -0
- data/src/core/lib/event_engine/thread_pool/work_stealing_thread_pool.cc +86 -111
- data/src/core/lib/event_engine/thread_pool/work_stealing_thread_pool.h +15 -61
- data/src/core/lib/event_engine/windows/windows_endpoint.cc +3 -4
- data/src/core/lib/experiments/config.cc +14 -0
- data/src/core/lib/experiments/experiments.cc +141 -304
- data/src/core/lib/experiments/experiments.h +16 -17
- data/src/core/lib/gprpp/ref_counted.h +3 -1
- data/src/core/lib/gprpp/ref_counted_string.cc +44 -0
- data/src/core/lib/gprpp/ref_counted_string.h +146 -0
- data/src/core/lib/gprpp/time.h +2 -2
- data/src/core/lib/gprpp/work_serializer.cc +36 -0
- data/src/core/lib/gprpp/work_serializer.h +5 -0
- data/src/core/lib/http/httpcli_security_connector.cc +1 -0
- data/src/core/lib/iomgr/buffer_list.cc +2 -0
- data/src/core/lib/iomgr/event_engine_shims/endpoint.cc +7 -22
- data/src/core/lib/iomgr/tcp_posix.cc +3 -3
- data/src/core/lib/promise/detail/basic_seq.h +1 -372
- data/src/core/lib/promise/detail/seq_state.h +2076 -0
- data/src/core/lib/promise/seq.h +19 -2
- data/src/core/lib/promise/sleep.h +5 -10
- data/src/core/lib/promise/try_seq.h +34 -2
- data/src/core/lib/resource_quota/api.cc +1 -0
- data/src/core/lib/resource_quota/arena.cc +2 -0
- data/src/core/lib/resource_quota/arena.h +42 -8
- data/src/core/lib/resource_quota/memory_quota.cc +0 -1
- data/src/core/lib/resource_quota/resource_quota.h +1 -0
- data/src/core/lib/security/authorization/authorization_policy_provider.h +1 -1
- data/src/core/lib/security/authorization/rbac_policy.h +1 -1
- data/src/core/lib/security/credentials/external/aws_request_signer.cc +8 -0
- data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +1 -0
- data/src/core/lib/security/credentials/jwt/json_token.cc +17 -0
- data/src/core/lib/security/credentials/jwt/json_token.h +4 -0
- data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +42 -0
- data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +1 -0
- data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc +4 -0
- data/src/core/lib/security/credentials/tls/tls_credentials.cc +1 -0
- data/src/core/lib/security/credentials/xds/xds_credentials.cc +1 -0
- data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +1 -0
- data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +1 -0
- data/src/core/lib/security/security_connector/ssl_utils.cc +1 -0
- data/src/core/lib/security/transport/client_auth_filter.cc +8 -5
- data/src/core/lib/security/transport/security_handshaker.cc +1 -0
- data/src/core/lib/security/transport/server_auth_filter.cc +2 -0
- data/src/core/lib/surface/call.cc +32 -8
- data/src/core/lib/surface/channel.cc +1 -0
- data/src/core/lib/surface/completion_queue.cc +10 -0
- data/src/core/lib/surface/init.cc +1 -0
- data/src/core/lib/surface/server.cc +67 -64
- data/src/core/lib/surface/server.h +1 -15
- data/src/core/lib/surface/version.cc +2 -2
- data/src/core/tsi/alts/crypt/aes_gcm.cc +27 -2
- data/src/core/tsi/ssl_transport_security.cc +11 -0
- data/src/ruby/lib/grpc/generic/active_call.rb +9 -14
- data/src/ruby/lib/grpc/version.rb +1 -1
- data/src/ruby/pb/test/client.rb +16 -0
- data/src/ruby/spec/generic/rpc_server_spec.rb +3 -3
- data/third_party/abseil-cpp/absl/algorithm/container.h +3 -2
- data/third_party/abseil-cpp/absl/base/attributes.h +58 -5
- data/third_party/abseil-cpp/absl/base/call_once.h +1 -1
- data/third_party/abseil-cpp/absl/base/casts.h +8 -8
- data/third_party/abseil-cpp/absl/base/config.h +89 -106
- data/third_party/abseil-cpp/absl/base/dynamic_annotations.h +26 -1
- data/third_party/abseil-cpp/absl/base/internal/direct_mmap.h +2 -2
- data/third_party/abseil-cpp/absl/base/internal/low_level_alloc.cc +50 -39
- data/third_party/abseil-cpp/absl/base/internal/low_level_alloc.h +2 -1
- data/third_party/abseil-cpp/absl/base/internal/prefetch.h +17 -18
- data/third_party/abseil-cpp/absl/base/internal/raw_logging.cc +32 -3
- data/third_party/abseil-cpp/absl/base/internal/raw_logging.h +24 -4
- data/third_party/abseil-cpp/absl/base/internal/sysinfo.cc +31 -73
- data/third_party/abseil-cpp/absl/base/internal/thread_identity.cc +9 -8
- data/third_party/abseil-cpp/absl/base/internal/thread_identity.h +11 -11
- data/third_party/abseil-cpp/absl/base/internal/throw_delegate.cc +23 -32
- data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.cc +2 -3
- data/third_party/abseil-cpp/absl/base/options.h +1 -1
- data/third_party/abseil-cpp/absl/base/policy_checks.h +3 -3
- data/third_party/abseil-cpp/absl/base/prefetch.h +198 -0
- data/third_party/abseil-cpp/absl/container/fixed_array.h +54 -29
- data/third_party/abseil-cpp/absl/container/flat_hash_map.h +5 -1
- data/third_party/abseil-cpp/absl/container/flat_hash_set.h +6 -2
- data/third_party/abseil-cpp/absl/container/inlined_vector.h +167 -79
- data/third_party/abseil-cpp/absl/container/internal/common_policy_traits.h +1 -1
- data/third_party/abseil-cpp/absl/container/internal/compressed_tuple.h +3 -21
- data/third_party/abseil-cpp/absl/container/internal/container_memory.h +1 -1
- data/third_party/abseil-cpp/absl/container/internal/hash_function_defaults.h +46 -0
- data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.cc +2 -0
- data/third_party/abseil-cpp/absl/container/internal/inlined_vector.h +85 -26
- data/third_party/abseil-cpp/absl/container/internal/raw_hash_map.h +35 -18
- data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.cc +70 -29
- data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.h +437 -236
- data/third_party/abseil-cpp/absl/crc/crc32c.h +8 -1
- data/third_party/abseil-cpp/absl/crc/internal/cpu_detect.cc +14 -8
- data/third_party/abseil-cpp/absl/crc/internal/crc.cc +4 -35
- data/third_party/abseil-cpp/absl/crc/internal/crc.h +2 -10
- data/third_party/abseil-cpp/absl/crc/internal/crc32_x86_arm_combined_simd.h +1 -1
- data/third_party/abseil-cpp/absl/crc/internal/crc_cord_state.cc +1 -1
- data/third_party/abseil-cpp/absl/crc/internal/crc_cord_state.h +4 -4
- data/third_party/abseil-cpp/absl/crc/internal/crc_internal.h +8 -10
- data/third_party/abseil-cpp/absl/crc/internal/crc_memcpy_x86_64.cc +17 -19
- data/third_party/abseil-cpp/absl/crc/internal/crc_x86_arm_combined.cc +8 -8
- data/third_party/abseil-cpp/absl/debugging/internal/elf_mem_image.h +2 -1
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_aarch64-inl.inc +59 -23
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_powerpc-inl.inc +1 -1
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_x86-inl.inc +1 -1
- data/third_party/abseil-cpp/absl/debugging/internal/symbolize.h +1 -1
- data/third_party/abseil-cpp/absl/debugging/symbolize_elf.inc +43 -19
- data/third_party/abseil-cpp/absl/debugging/symbolize_emscripten.inc +3 -0
- data/third_party/abseil-cpp/absl/flags/commandlineflag.h +1 -1
- data/third_party/abseil-cpp/absl/flags/internal/commandlineflag.cc +1 -1
- data/third_party/abseil-cpp/absl/flags/internal/flag.cc +2 -2
- data/third_party/abseil-cpp/absl/flags/internal/flag.h +16 -15
- data/third_party/abseil-cpp/absl/flags/internal/flag_msvc.inc +1 -1
- data/third_party/abseil-cpp/absl/flags/marshalling.cc +43 -2
- data/third_party/abseil-cpp/absl/flags/marshalling.h +5 -0
- data/third_party/abseil-cpp/absl/functional/any_invocable.h +9 -1
- data/third_party/abseil-cpp/absl/functional/bind_front.h +1 -1
- data/third_party/abseil-cpp/absl/functional/function_ref.h +3 -3
- data/third_party/abseil-cpp/absl/functional/internal/any_invocable.h +37 -24
- data/third_party/abseil-cpp/absl/functional/internal/function_ref.h +19 -9
- data/third_party/abseil-cpp/absl/hash/hash.h +7 -4
- data/third_party/abseil-cpp/absl/hash/internal/hash.h +38 -15
- data/third_party/abseil-cpp/absl/hash/internal/low_level_hash.cc +6 -0
- data/third_party/abseil-cpp/absl/meta/type_traits.h +48 -373
- data/third_party/abseil-cpp/absl/numeric/bits.h +4 -4
- data/third_party/abseil-cpp/absl/numeric/int128.cc +20 -8
- data/third_party/abseil-cpp/absl/numeric/int128.h +36 -39
- data/third_party/abseil-cpp/absl/numeric/int128_have_intrinsic.inc +0 -3
- data/third_party/abseil-cpp/absl/numeric/int128_no_intrinsic.inc +47 -30
- data/third_party/abseil-cpp/absl/random/internal/fast_uniform_bits.h +4 -3
- data/third_party/abseil-cpp/absl/random/internal/generate_real.h +1 -1
- data/third_party/abseil-cpp/absl/random/internal/platform.h +1 -1
- data/third_party/abseil-cpp/absl/random/internal/randen_detect.cc +4 -0
- data/third_party/abseil-cpp/absl/random/internal/randen_engine.h +1 -1
- data/third_party/abseil-cpp/absl/random/internal/randen_hwaes.cc +1 -1
- data/third_party/abseil-cpp/absl/random/internal/uniform_helper.h +1 -1
- data/third_party/abseil-cpp/absl/status/internal/status_internal.h +4 -0
- data/third_party/abseil-cpp/absl/status/internal/statusor_internal.h +12 -24
- data/third_party/abseil-cpp/absl/status/status.cc +11 -7
- data/third_party/abseil-cpp/absl/status/status.h +11 -2
- data/third_party/abseil-cpp/absl/status/statusor.h +22 -8
- data/third_party/abseil-cpp/absl/strings/ascii.cc +54 -6
- data/third_party/abseil-cpp/absl/strings/charconv.cc +21 -4
- data/third_party/abseil-cpp/absl/strings/charconv.h +2 -2
- data/third_party/abseil-cpp/absl/strings/cord.cc +1 -2
- data/third_party/abseil-cpp/absl/strings/cord.h +32 -5
- data/third_party/abseil-cpp/absl/strings/cord_analysis.cc +23 -1
- data/third_party/abseil-cpp/absl/strings/cord_analysis.h +18 -0
- data/third_party/abseil-cpp/absl/strings/cord_buffer.h +2 -5
- data/third_party/abseil-cpp/absl/strings/escaping.cc +10 -32
- data/third_party/abseil-cpp/absl/strings/escaping.h +1 -1
- data/third_party/abseil-cpp/absl/strings/internal/charconv_bigint.cc +2 -4
- data/third_party/abseil-cpp/absl/strings/internal/charconv_bigint.h +3 -3
- data/third_party/abseil-cpp/absl/strings/internal/cord_internal.cc +0 -1
- data/third_party/abseil-cpp/absl/strings/internal/cord_internal.h +15 -13
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree.cc +13 -4
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree.h +8 -0
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_consume.cc +5 -3
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_consume.h +4 -7
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_flat.h +8 -0
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring.h +2 -2
- data/third_party/abseil-cpp/absl/strings/internal/cordz_handle.cc +46 -20
- data/third_party/abseil-cpp/absl/strings/internal/cordz_handle.h +1 -34
- data/third_party/abseil-cpp/absl/strings/internal/cordz_info.cc +2 -1
- data/third_party/abseil-cpp/absl/strings/internal/escaping.cc +23 -0
- data/third_party/abseil-cpp/absl/strings/internal/escaping.h +1 -0
- data/third_party/abseil-cpp/absl/strings/internal/memutil.cc +2 -77
- data/third_party/abseil-cpp/absl/strings/internal/memutil.h +4 -112
- data/third_party/abseil-cpp/absl/strings/internal/stl_type_traits.h +1 -1
- data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.cc +10 -31
- data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.h +8 -8
- data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.h +5 -20
- data/third_party/abseil-cpp/absl/strings/internal/str_format/constexpr_parser.h +1 -0
- data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.h +1 -1
- data/third_party/abseil-cpp/absl/strings/internal/str_format/float_conversion.cc +9 -9
- data/third_party/abseil-cpp/absl/strings/internal/str_split_internal.h +56 -6
- data/third_party/abseil-cpp/absl/strings/match.cc +87 -0
- data/third_party/abseil-cpp/absl/strings/match.h +19 -0
- data/third_party/abseil-cpp/absl/strings/numbers.cc +154 -122
- data/third_party/abseil-cpp/absl/strings/numbers.h +1 -6
- data/third_party/abseil-cpp/absl/strings/str_cat.cc +7 -50
- data/third_party/abseil-cpp/absl/strings/str_cat.h +83 -15
- data/third_party/abseil-cpp/absl/strings/str_format.h +6 -3
- data/third_party/abseil-cpp/absl/strings/str_split.cc +9 -6
- data/third_party/abseil-cpp/absl/strings/string_view.cc +26 -4
- data/third_party/abseil-cpp/absl/synchronization/internal/create_thread_identity.cc +5 -0
- data/third_party/abseil-cpp/absl/synchronization/internal/futex.h +63 -43
- data/third_party/abseil-cpp/absl/synchronization/internal/futex_waiter.cc +111 -0
- data/third_party/abseil-cpp/absl/synchronization/internal/futex_waiter.h +63 -0
- data/third_party/abseil-cpp/absl/synchronization/internal/graphcycles.cc +11 -7
- data/third_party/abseil-cpp/absl/synchronization/internal/kernel_timeout.cc +225 -0
- data/third_party/abseil-cpp/absl/synchronization/internal/kernel_timeout.h +122 -114
- data/third_party/abseil-cpp/absl/synchronization/internal/per_thread_sem.cc +12 -8
- data/third_party/abseil-cpp/absl/synchronization/internal/per_thread_sem.h +10 -1
- data/third_party/abseil-cpp/absl/synchronization/internal/pthread_waiter.cc +167 -0
- data/third_party/abseil-cpp/absl/synchronization/internal/pthread_waiter.h +60 -0
- data/third_party/abseil-cpp/absl/synchronization/internal/sem_waiter.cc +122 -0
- data/third_party/abseil-cpp/absl/synchronization/internal/sem_waiter.h +65 -0
- data/third_party/abseil-cpp/absl/synchronization/internal/stdcpp_waiter.cc +91 -0
- data/third_party/abseil-cpp/absl/synchronization/internal/stdcpp_waiter.h +56 -0
- data/third_party/abseil-cpp/absl/synchronization/internal/waiter.h +19 -113
- data/third_party/abseil-cpp/absl/synchronization/internal/waiter_base.cc +42 -0
- data/third_party/abseil-cpp/absl/synchronization/internal/waiter_base.h +90 -0
- data/third_party/abseil-cpp/absl/synchronization/internal/win32_waiter.cc +151 -0
- data/third_party/abseil-cpp/absl/synchronization/internal/win32_waiter.h +70 -0
- data/third_party/abseil-cpp/absl/synchronization/mutex.cc +407 -411
- data/third_party/abseil-cpp/absl/synchronization/mutex.h +152 -118
- data/third_party/abseil-cpp/absl/time/clock.cc +6 -7
- data/third_party/abseil-cpp/absl/time/duration.cc +24 -26
- data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/time_zone.h +1 -0
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_fixed.cc +1 -1
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_format.cc +3 -3
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_if.cc +8 -6
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_if.h +6 -3
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_impl.cc +4 -2
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_impl.h +4 -0
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_info.cc +322 -295
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_info.h +8 -17
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_libc.cc +51 -33
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_libc.h +7 -2
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_lookup.cc +128 -2
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_posix.h +1 -1
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/tzfile.h +5 -1
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/zone_info_source.cc +34 -34
- data/third_party/abseil-cpp/absl/time/time.cc +9 -2
- data/third_party/abseil-cpp/absl/time/time.h +115 -15
- data/third_party/abseil-cpp/absl/types/internal/optional.h +0 -52
- data/third_party/abseil-cpp/absl/types/internal/span.h +2 -2
- data/third_party/abseil-cpp/absl/types/internal/variant.h +2 -2
- data/third_party/abseil-cpp/absl/types/optional.h +15 -13
- data/third_party/abseil-cpp/absl/types/span.h +1 -2
- data/third_party/boringssl-with-bazel/err_data.c +15 -14
- data/third_party/boringssl-with-bazel/src/crypto/asn1/a_gentm.c +7 -3
- data/third_party/boringssl-with-bazel/src/crypto/asn1/a_strex.c +7 -7
- data/third_party/boringssl-with-bazel/src/crypto/asn1/a_utctm.c +7 -3
- data/third_party/boringssl-with-bazel/src/crypto/bio/connect.c +5 -5
- data/third_party/boringssl-with-bazel/src/crypto/bio/errno.c +92 -0
- data/third_party/boringssl-with-bazel/src/crypto/bio/fd.c +4 -48
- data/third_party/boringssl-with-bazel/src/crypto/bio/file.c +11 -6
- data/third_party/boringssl-with-bazel/src/crypto/bio/internal.h +16 -6
- data/third_party/boringssl-with-bazel/src/crypto/bio/socket.c +2 -2
- data/third_party/boringssl-with-bazel/src/crypto/bio/socket_helper.c +9 -0
- data/third_party/boringssl-with-bazel/src/crypto/bytestring/cbs.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/conf/conf.c +3 -7
- data/third_party/boringssl-with-bazel/src/crypto/cpu_aarch64_apple.c +0 -2
- data/third_party/boringssl-with-bazel/src/crypto/cpu_aarch64_fuchsia.c +0 -1
- data/third_party/boringssl-with-bazel/src/crypto/cpu_aarch64_linux.c +0 -2
- data/third_party/boringssl-with-bazel/src/crypto/cpu_aarch64_openbsd.c +0 -1
- data/third_party/boringssl-with-bazel/src/crypto/cpu_aarch64_sysreg.c +93 -0
- data/third_party/boringssl-with-bazel/src/crypto/cpu_aarch64_win.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/cpu_arm_freebsd.c +0 -1
- data/third_party/boringssl-with-bazel/src/crypto/cpu_arm_linux.c +0 -2
- data/third_party/boringssl-with-bazel/src/crypto/dh_extra/dh_asn1.c +4 -0
- data/third_party/boringssl-with-bazel/src/crypto/dh_extra/params.c +5 -0
- data/third_party/boringssl-with-bazel/src/crypto/ec_extra/hash_to_curve.c +9 -14
- data/third_party/boringssl-with-bazel/src/crypto/ec_extra/internal.h +4 -6
- data/third_party/boringssl-with-bazel/src/crypto/err/err.c +10 -11
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/dh/check.c +37 -8
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/dh/dh.c +38 -19
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/dh/internal.h +7 -0
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/self_check/self_check.c +39 -16
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/service_indicator/service_indicator.c +4 -7
- data/third_party/boringssl-with-bazel/src/crypto/hpke/hpke.c +7 -0
- data/third_party/boringssl-with-bazel/src/crypto/internal.h +13 -21
- data/third_party/boringssl-with-bazel/src/crypto/obj/obj.c +6 -23
- data/third_party/boringssl-with-bazel/src/crypto/rand_extra/getentropy.c +4 -0
- data/third_party/boringssl-with-bazel/src/crypto/stack/stack.c +5 -0
- data/third_party/boringssl-with-bazel/src/crypto/x509/by_dir.c +1 -6
- data/third_party/boringssl-with-bazel/src/crypto/x509/by_file.c +0 -3
- data/third_party/boringssl-with-bazel/src/crypto/x509/x509_d2.c +1 -3
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_alt.c +2 -3
- data/third_party/boringssl-with-bazel/src/include/openssl/base.h +9 -1
- data/third_party/boringssl-with-bazel/src/include/openssl/bio.h +11 -1
- data/third_party/boringssl-with-bazel/src/include/openssl/dh.h +4 -1
- data/third_party/boringssl-with-bazel/src/include/openssl/ec.h +7 -9
- data/third_party/boringssl-with-bazel/src/include/openssl/hpke.h +6 -2
- data/third_party/boringssl-with-bazel/src/include/openssl/span.h +22 -20
- data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +4 -0
- data/third_party/boringssl-with-bazel/src/include/openssl/stack.h +20 -12
- data/third_party/boringssl-with-bazel/src/include/openssl/target.h +50 -3
- data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +0 -4
- data/third_party/boringssl-with-bazel/src/ssl/ssl_cipher.cc +2 -2
- data/third_party/boringssl-with-bazel/src/ssl/ssl_file.cc +4 -4
- data/third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc +2 -0
- metadata +39 -31
- data/src/core/lib/promise/detail/basic_join.h +0 -197
- data/src/core/lib/promise/detail/switch.h +0 -1455
- data/src/core/lib/promise/try_join.h +0 -82
- data/third_party/abseil-cpp/absl/synchronization/internal/waiter.cc +0 -403
- data/third_party/boringssl-with-bazel/src/crypto/cpu_aarch64_freebsd.c +0 -62
- data/third_party/boringssl-with-bazel/src/crypto/cpu_arm.c +0 -38
- data/third_party/boringssl-with-bazel/src/crypto/cpu_arm_openbsd.c +0 -31
- data/third_party/re2/util/benchmark.h +0 -156
- data/third_party/re2/util/flags.h +0 -26
- data/third_party/re2/util/malloc_counter.h +0 -19
- data/third_party/re2/util/pcre.cc +0 -1025
- data/third_party/re2/util/pcre.h +0 -681
- data/third_party/re2/util/test.h +0 -50
- data/third_party/upb/upb/mini_table.h +0 -36
- data/third_party/zlib/gzclose.c +0 -25
- data/third_party/zlib/gzlib.c +0 -639
- data/third_party/zlib/gzread.c +0 -650
- data/third_party/zlib/gzwrite.c +0 -677
@@ -31,7 +31,9 @@
|
|
31
31
|
#include <utility>
|
32
32
|
|
33
33
|
#include "absl/base/attributes.h"
|
34
|
+
#include "absl/base/internal/endian.h"
|
34
35
|
#include "absl/base/internal/raw_logging.h"
|
36
|
+
#include "absl/base/optimization.h"
|
35
37
|
#include "absl/numeric/bits.h"
|
36
38
|
#include "absl/strings/ascii.h"
|
37
39
|
#include "absl/strings/charconv.h"
|
@@ -136,82 +138,132 @@ bool SimpleAtob(absl::string_view str, bool* out) {
|
|
136
138
|
|
137
139
|
namespace {
|
138
140
|
|
139
|
-
//
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
141
|
+
// Various routines to encode integers to strings.
|
142
|
+
|
143
|
+
// We split data encodings into a group of 2 digits, 4 digits, 8 digits as
|
144
|
+
// it's easier to combine powers of two into scalar arithmetic.
|
145
|
+
|
146
|
+
// Previous implementation used a lookup table of 200 bytes for every 2 bytes
|
147
|
+
// and it was memory bound, any L1 cache miss would result in a much slower
|
148
|
+
// result. When benchmarking with a cache eviction rate of several percent,
|
149
|
+
// this implementation proved to be better.
|
150
|
+
|
151
|
+
// These constants represent '00', '0000' and '00000000' as ascii strings in
|
152
|
+
// integers. We can add these numbers if we encode to bytes from 0 to 9. as
|
153
|
+
// 'i' = '0' + i for 0 <= i <= 9.
|
154
|
+
constexpr uint32_t kTwoZeroBytes = 0x0101 * '0';
|
155
|
+
constexpr uint64_t kFourZeroBytes = 0x01010101 * '0';
|
156
|
+
constexpr uint64_t kEightZeroBytes = 0x0101010101010101ull * '0';
|
157
|
+
|
158
|
+
// * 103 / 1024 is a division by 10 for values from 0 to 99. It's also a
|
159
|
+
// division of a structure [k takes 2 bytes][m takes 2 bytes], then * 103 / 1024
|
160
|
+
// will be [k / 10][m / 10]. It allows parallel division.
|
161
|
+
constexpr uint64_t kDivisionBy10Mul = 103u;
|
162
|
+
constexpr uint64_t kDivisionBy10Div = 1 << 10;
|
163
|
+
|
164
|
+
// * 10486 / 1048576 is a division by 100 for values from 0 to 9999.
|
165
|
+
constexpr uint64_t kDivisionBy100Mul = 10486u;
|
166
|
+
constexpr uint64_t kDivisionBy100Div = 1 << 20;
|
167
|
+
|
168
|
+
// Encode functions write the ASCII output of input `n` to `out_str`.
|
169
|
+
inline char* EncodeHundred(uint32_t n, char* out_str) {
|
170
|
+
int num_digits = static_cast<int>(n - 10) >> 8;
|
171
|
+
uint32_t base = kTwoZeroBytes;
|
172
|
+
uint32_t div10 = (n * kDivisionBy10Mul) / kDivisionBy10Div;
|
173
|
+
uint32_t mod10 = n - 10u * div10;
|
174
|
+
base += div10 + (mod10 << 8);
|
175
|
+
base >>= num_digits & 8;
|
176
|
+
little_endian::Store16(out_str, static_cast<uint16_t>(base));
|
177
|
+
return out_str + 2 + num_digits;
|
178
|
+
}
|
144
179
|
|
145
|
-
|
180
|
+
inline char* EncodeTenThousand(uint32_t n, char* out_str) {
|
181
|
+
// We split lower 2 digits and upper 2 digits of n into 2 byte consecutive
|
182
|
+
// blocks. 123 -> [\0\1][\0\23]. We divide by 10 both blocks
|
183
|
+
// (it's 1 division + zeroing upper bits), and compute modulo 10 as well "in
|
184
|
+
// parallel". Then we combine both results to have both ASCII digits,
|
185
|
+
// strip trailing zeros, add ASCII '0000' and return.
|
186
|
+
uint32_t div100 = (n * kDivisionBy100Mul) / kDivisionBy100Div;
|
187
|
+
uint32_t mod100 = n - 100ull * div100;
|
188
|
+
uint32_t hundreds = (mod100 << 16) + div100;
|
189
|
+
uint32_t tens = (hundreds * kDivisionBy10Mul) / kDivisionBy10Div;
|
190
|
+
tens &= (0xFull << 16) | 0xFull;
|
191
|
+
tens += (hundreds - 10ull * tens) << 8;
|
192
|
+
ABSL_ASSUME(tens != 0);
|
193
|
+
// The result can contain trailing zero bits, we need to strip them to a first
|
194
|
+
// significant byte in a final representation. For example, for n = 123, we
|
195
|
+
// have tens to have representation \0\1\2\3. We do `& -8` to round
|
196
|
+
// to a multiple to 8 to strip zero bytes, not all zero bits.
|
197
|
+
// countr_zero to help.
|
198
|
+
// 0 minus 8 to make MSVC happy.
|
199
|
+
uint32_t zeroes = static_cast<uint32_t>(absl::countr_zero(tens)) & (0 - 8ull);
|
200
|
+
tens += kFourZeroBytes;
|
201
|
+
tens >>= zeroes;
|
202
|
+
little_endian::Store32(out_str, tens);
|
203
|
+
return out_str + sizeof(tens) - zeroes / 8;
|
204
|
+
}
|
146
205
|
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
i -= digits * 1000000;
|
163
|
-
PutTwoDigits(digits, buffer);
|
164
|
-
buffer += 2;
|
165
|
-
lt1_000_000:
|
166
|
-
digits = i / 10000; // 10,000
|
167
|
-
i -= digits * 10000;
|
168
|
-
PutTwoDigits(digits, buffer);
|
169
|
-
buffer += 2;
|
170
|
-
lt10_000:
|
171
|
-
digits = i / 100;
|
172
|
-
i -= digits * 100;
|
173
|
-
PutTwoDigits(digits, buffer);
|
174
|
-
buffer += 2;
|
175
|
-
lt100:
|
176
|
-
digits = i;
|
177
|
-
PutTwoDigits(digits, buffer);
|
178
|
-
buffer += 2;
|
179
|
-
*buffer = 0;
|
180
|
-
return buffer;
|
181
|
-
}
|
206
|
+
// Prepare functions return an integer that should be written to out_str
|
207
|
+
// (but possibly include trailing zeros).
|
208
|
+
// For hi < 10000, lo < 10000 returns uint64_t as encoded in ASCII with
|
209
|
+
// possibly trailing zeroes of the number hi * 10000 + lo.
|
210
|
+
inline uint64_t PrepareTenThousands(uint64_t hi, uint64_t lo) {
|
211
|
+
uint64_t merged = hi | (lo << 32);
|
212
|
+
uint64_t div100 = ((merged * kDivisionBy100Mul) / kDivisionBy100Div) &
|
213
|
+
((0x7Full << 32) | 0x7Full);
|
214
|
+
uint64_t mod100 = merged - 100ull * div100;
|
215
|
+
uint64_t hundreds = (mod100 << 16) + div100;
|
216
|
+
uint64_t tens = (hundreds * kDivisionBy10Mul) / kDivisionBy10Div;
|
217
|
+
tens &= (0xFull << 48) | (0xFull << 32) | (0xFull << 16) | 0xFull;
|
218
|
+
tens += (hundreds - 10ull * tens) << 8;
|
219
|
+
return tens;
|
220
|
+
}
|
182
221
|
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
222
|
+
inline char* EncodeFullU32(uint32_t n, char* out_str) {
|
223
|
+
if (n < 100'000'000) {
|
224
|
+
uint64_t bottom = PrepareTenThousands(n / 10000, n % 10000);
|
225
|
+
ABSL_ASSUME(bottom != 0);
|
226
|
+
// 0 minus 8 to make MSVC happy.
|
227
|
+
uint32_t zeroes = static_cast<uint32_t>(absl::countr_zero(bottom))
|
228
|
+
& (0 - 8ull);
|
229
|
+
uint64_t bottom_res = bottom + kEightZeroBytes;
|
230
|
+
bottom_res >>= zeroes;
|
231
|
+
little_endian::Store64(out_str, bottom_res);
|
232
|
+
return out_str + sizeof(bottom) - zeroes / 8;
|
188
233
|
}
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
234
|
+
uint32_t top = n / 100'000'000;
|
235
|
+
n %= 100'000'000;
|
236
|
+
uint64_t bottom = PrepareTenThousands(n / 10000, n % 10000);
|
237
|
+
uint64_t bottom_res = bottom + kEightZeroBytes;
|
238
|
+
out_str = EncodeHundred(top, out_str);
|
239
|
+
little_endian::Store64(out_str, bottom_res);
|
240
|
+
return out_str + sizeof(bottom);
|
241
|
+
}
|
242
|
+
|
243
|
+
} // namespace
|
244
|
+
|
245
|
+
void numbers_internal::PutTwoDigits(uint32_t i, char* buf) {
|
246
|
+
assert(i < 100);
|
247
|
+
uint32_t base = kTwoZeroBytes;
|
248
|
+
uint32_t div10 = (i * kDivisionBy10Mul) / kDivisionBy10Div;
|
249
|
+
uint32_t mod10 = i - 10u * div10;
|
250
|
+
base += div10 + (mod10 << 8);
|
251
|
+
little_endian::Store16(buf, static_cast<uint16_t>(base));
|
252
|
+
}
|
253
|
+
|
254
|
+
char* numbers_internal::FastIntToBuffer(uint32_t n, char* out_str) {
|
255
|
+
if (n < 100) {
|
256
|
+
out_str = EncodeHundred(n, out_str);
|
257
|
+
goto set_last_zero;
|
202
258
|
}
|
203
|
-
if (
|
204
|
-
|
205
|
-
|
206
|
-
i -= digits * 1000000;
|
207
|
-
*buffer++ = '0' + static_cast<char>(digits);
|
208
|
-
goto lt1_000_000;
|
259
|
+
if (n < 10000) {
|
260
|
+
out_str = EncodeTenThousand(n, out_str);
|
261
|
+
goto set_last_zero;
|
209
262
|
}
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
goto lt100_000_000;
|
263
|
+
out_str = EncodeFullU32(n, out_str);
|
264
|
+
set_last_zero:
|
265
|
+
*out_str = '\0';
|
266
|
+
return out_str;
|
215
267
|
}
|
216
268
|
|
217
269
|
char* numbers_internal::FastIntToBuffer(int32_t i, char* buffer) {
|
@@ -219,7 +271,7 @@ char* numbers_internal::FastIntToBuffer(int32_t i, char* buffer) {
|
|
219
271
|
if (i < 0) {
|
220
272
|
*buffer++ = '-';
|
221
273
|
// We need to do the negation in modular (i.e., "unsigned")
|
222
|
-
// arithmetic; MSVC++
|
274
|
+
// arithmetic; MSVC++ apparently warns for plain "-u", so
|
223
275
|
// we write the equivalent expression "0 - u" instead.
|
224
276
|
u = 0 - u;
|
225
277
|
}
|
@@ -230,41 +282,40 @@ char* numbers_internal::FastIntToBuffer(uint64_t i, char* buffer) {
|
|
230
282
|
uint32_t u32 = static_cast<uint32_t>(i);
|
231
283
|
if (u32 == i) return numbers_internal::FastIntToBuffer(u32, buffer);
|
232
284
|
|
233
|
-
//
|
234
|
-
uint64_t
|
235
|
-
|
236
|
-
|
285
|
+
// 10**9 < 2**32 <= i < 10**10, we can do 2+8
|
286
|
+
uint64_t div08 = i / 100'000'000ull;
|
287
|
+
uint64_t mod08 = i % 100'000'000ull;
|
288
|
+
uint64_t mod_result =
|
289
|
+
PrepareTenThousands(mod08 / 10000, mod08 % 10000) + kEightZeroBytes;
|
290
|
+
if (i < 10'000'000'000ull) {
|
291
|
+
buffer = EncodeHundred(static_cast<uint32_t>(div08), buffer);
|
292
|
+
little_endian::Store64(buffer, mod_result);
|
293
|
+
buffer += 8;
|
294
|
+
goto set_last_zero;
|
295
|
+
}
|
237
296
|
|
238
|
-
|
239
|
-
|
297
|
+
// i < 10**16, in this case 8+8
|
298
|
+
if (i < 10'000'000'000'000'000ull) {
|
299
|
+
buffer = EncodeFullU32(static_cast<uint32_t>(div08), buffer);
|
300
|
+
little_endian::Store64(buffer, mod_result);
|
301
|
+
buffer += 8;
|
302
|
+
goto set_last_zero;
|
240
303
|
} else {
|
241
|
-
//
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
304
|
+
// 4 + 8 + 8
|
305
|
+
uint64_t div016 = i / 10'000'000'000'000'000ull;
|
306
|
+
buffer = EncodeTenThousand(static_cast<uint32_t>(div016), buffer);
|
307
|
+
uint64_t mid_result = div08 - div016 * 100'000'000ull;
|
308
|
+
mid_result = PrepareTenThousands(mid_result / 10000, mid_result % 10000) +
|
309
|
+
kEightZeroBytes;
|
310
|
+
little_endian::Store64(buffer, mid_result);
|
311
|
+
buffer += 8;
|
312
|
+
little_endian::Store64(buffer, mod_result);
|
313
|
+
buffer += 8;
|
314
|
+
goto set_last_zero;
|
247
315
|
}
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
u32 -= digits * 10000000;
|
252
|
-
PutTwoDigits(digits, buffer);
|
253
|
-
buffer += 2;
|
254
|
-
digits = u32 / 100000; // 100,000
|
255
|
-
u32 -= digits * 100000;
|
256
|
-
PutTwoDigits(digits, buffer);
|
257
|
-
buffer += 2;
|
258
|
-
digits = u32 / 1000; // 1,000
|
259
|
-
u32 -= digits * 1000;
|
260
|
-
PutTwoDigits(digits, buffer);
|
261
|
-
buffer += 2;
|
262
|
-
digits = u32 / 10;
|
263
|
-
u32 -= digits * 10;
|
264
|
-
PutTwoDigits(digits, buffer);
|
265
|
-
buffer += 2;
|
266
|
-
memcpy(buffer, one_ASCII_final_digits[u32], 2);
|
267
|
-
return buffer + 1;
|
316
|
+
set_last_zero:
|
317
|
+
*buffer = '\0';
|
318
|
+
return buffer;
|
268
319
|
}
|
269
320
|
|
270
321
|
char* numbers_internal::FastIntToBuffer(int64_t i, char* buffer) {
|
@@ -1048,25 +1099,6 @@ ABSL_CONST_INIT ABSL_DLL const char kHexTable[513] =
|
|
1048
1099
|
"e0e1e2e3e4e5e6e7e8e9eaebecedeeef"
|
1049
1100
|
"f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff";
|
1050
1101
|
|
1051
|
-
ABSL_CONST_INIT ABSL_DLL const char two_ASCII_digits[100][2] = {
|
1052
|
-
{'0', '0'}, {'0', '1'}, {'0', '2'}, {'0', '3'}, {'0', '4'}, {'0', '5'},
|
1053
|
-
{'0', '6'}, {'0', '7'}, {'0', '8'}, {'0', '9'}, {'1', '0'}, {'1', '1'},
|
1054
|
-
{'1', '2'}, {'1', '3'}, {'1', '4'}, {'1', '5'}, {'1', '6'}, {'1', '7'},
|
1055
|
-
{'1', '8'}, {'1', '9'}, {'2', '0'}, {'2', '1'}, {'2', '2'}, {'2', '3'},
|
1056
|
-
{'2', '4'}, {'2', '5'}, {'2', '6'}, {'2', '7'}, {'2', '8'}, {'2', '9'},
|
1057
|
-
{'3', '0'}, {'3', '1'}, {'3', '2'}, {'3', '3'}, {'3', '4'}, {'3', '5'},
|
1058
|
-
{'3', '6'}, {'3', '7'}, {'3', '8'}, {'3', '9'}, {'4', '0'}, {'4', '1'},
|
1059
|
-
{'4', '2'}, {'4', '3'}, {'4', '4'}, {'4', '5'}, {'4', '6'}, {'4', '7'},
|
1060
|
-
{'4', '8'}, {'4', '9'}, {'5', '0'}, {'5', '1'}, {'5', '2'}, {'5', '3'},
|
1061
|
-
{'5', '4'}, {'5', '5'}, {'5', '6'}, {'5', '7'}, {'5', '8'}, {'5', '9'},
|
1062
|
-
{'6', '0'}, {'6', '1'}, {'6', '2'}, {'6', '3'}, {'6', '4'}, {'6', '5'},
|
1063
|
-
{'6', '6'}, {'6', '7'}, {'6', '8'}, {'6', '9'}, {'7', '0'}, {'7', '1'},
|
1064
|
-
{'7', '2'}, {'7', '3'}, {'7', '4'}, {'7', '5'}, {'7', '6'}, {'7', '7'},
|
1065
|
-
{'7', '8'}, {'7', '9'}, {'8', '0'}, {'8', '1'}, {'8', '2'}, {'8', '3'},
|
1066
|
-
{'8', '4'}, {'8', '5'}, {'8', '6'}, {'8', '7'}, {'8', '8'}, {'8', '9'},
|
1067
|
-
{'9', '0'}, {'9', '1'}, {'9', '2'}, {'9', '3'}, {'9', '4'}, {'9', '5'},
|
1068
|
-
{'9', '6'}, {'9', '7'}, {'9', '8'}, {'9', '9'}};
|
1069
|
-
|
1070
1102
|
bool safe_strto32_base(absl::string_view text, int32_t* value, int base) {
|
1071
1103
|
return safe_int_internal<int32_t>(text, value, base);
|
1072
1104
|
}
|
@@ -125,8 +125,6 @@ namespace numbers_internal {
|
|
125
125
|
ABSL_DLL extern const char kHexChar[17]; // 0123456789abcdef
|
126
126
|
ABSL_DLL extern const char
|
127
127
|
kHexTable[513]; // 000102030405060708090a0b0c0d0e0f1011...
|
128
|
-
ABSL_DLL extern const char
|
129
|
-
two_ASCII_digits[100][2]; // 00, 01, 02, 03...
|
130
128
|
|
131
129
|
// Writes a two-character representation of 'i' to 'buf'. 'i' must be in the
|
132
130
|
// range 0 <= i < 100, and buf must have space for two characters. Example:
|
@@ -134,10 +132,7 @@ ABSL_DLL extern const char
|
|
134
132
|
// PutTwoDigits(42, buf);
|
135
133
|
// // buf[0] == '4'
|
136
134
|
// // buf[1] == '2'
|
137
|
-
|
138
|
-
assert(i < 100);
|
139
|
-
memcpy(buf, two_ASCII_digits[i], 2);
|
140
|
-
}
|
135
|
+
void PutTwoDigits(uint32_t i, char* buf);
|
141
136
|
|
142
137
|
// safe_strto?() functions for implementing SimpleAtoi()
|
143
138
|
|
@@ -30,55 +30,6 @@
|
|
30
30
|
namespace absl {
|
31
31
|
ABSL_NAMESPACE_BEGIN
|
32
32
|
|
33
|
-
AlphaNum::AlphaNum(Hex hex) {
|
34
|
-
static_assert(numbers_internal::kFastToBufferSize >= 32,
|
35
|
-
"This function only works when output buffer >= 32 bytes long");
|
36
|
-
char* const end = &digits_[numbers_internal::kFastToBufferSize];
|
37
|
-
auto real_width =
|
38
|
-
absl::numbers_internal::FastHexToBufferZeroPad16(hex.value, end - 16);
|
39
|
-
if (real_width >= hex.width) {
|
40
|
-
piece_ = absl::string_view(end - real_width, real_width);
|
41
|
-
} else {
|
42
|
-
// Pad first 16 chars because FastHexToBufferZeroPad16 pads only to 16 and
|
43
|
-
// max pad width can be up to 20.
|
44
|
-
std::memset(end - 32, hex.fill, 16);
|
45
|
-
// Patch up everything else up to the real_width.
|
46
|
-
std::memset(end - real_width - 16, hex.fill, 16);
|
47
|
-
piece_ = absl::string_view(end - hex.width, hex.width);
|
48
|
-
}
|
49
|
-
}
|
50
|
-
|
51
|
-
AlphaNum::AlphaNum(Dec dec) {
|
52
|
-
assert(dec.width <= numbers_internal::kFastToBufferSize);
|
53
|
-
char* const end = &digits_[numbers_internal::kFastToBufferSize];
|
54
|
-
char* const minfill = end - dec.width;
|
55
|
-
char* writer = end;
|
56
|
-
uint64_t value = dec.value;
|
57
|
-
bool neg = dec.neg;
|
58
|
-
while (value > 9) {
|
59
|
-
*--writer = '0' + (value % 10);
|
60
|
-
value /= 10;
|
61
|
-
}
|
62
|
-
*--writer = '0' + static_cast<char>(value);
|
63
|
-
if (neg) *--writer = '-';
|
64
|
-
|
65
|
-
ptrdiff_t fillers = writer - minfill;
|
66
|
-
if (fillers > 0) {
|
67
|
-
// Tricky: if the fill character is ' ', then it's <fill><+/-><digits>
|
68
|
-
// But...: if the fill character is '0', then it's <+/-><fill><digits>
|
69
|
-
bool add_sign_again = false;
|
70
|
-
if (neg && dec.fill == '0') { // If filling with '0',
|
71
|
-
++writer; // ignore the sign we just added
|
72
|
-
add_sign_again = true; // and re-add the sign later.
|
73
|
-
}
|
74
|
-
writer -= fillers;
|
75
|
-
std::fill_n(writer, fillers, dec.fill);
|
76
|
-
if (add_sign_again) *--writer = '-';
|
77
|
-
}
|
78
|
-
|
79
|
-
piece_ = absl::string_view(writer, static_cast<size_t>(end - writer));
|
80
|
-
}
|
81
|
-
|
82
33
|
// ----------------------------------------------------------------------
|
83
34
|
// StrCat()
|
84
35
|
// This merges the given strings or integers, with no delimiter. This
|
@@ -195,7 +146,13 @@ void AppendPieces(std::string* dest,
|
|
195
146
|
|
196
147
|
void StrAppend(std::string* dest, const AlphaNum& a) {
|
197
148
|
ASSERT_NO_OVERLAP(*dest, a);
|
198
|
-
dest->
|
149
|
+
std::string::size_type old_size = dest->size();
|
150
|
+
strings_internal::STLStringResizeUninitializedAmortized(dest,
|
151
|
+
old_size + a.size());
|
152
|
+
char* const begin = &(*dest)[0];
|
153
|
+
char* out = begin + old_size;
|
154
|
+
out = Append(out, a);
|
155
|
+
assert(out == begin + dest->size());
|
199
156
|
}
|
200
157
|
|
201
158
|
void StrAppend(std::string* dest, const AlphaNum& a, const AlphaNum& b) {
|
@@ -87,13 +87,16 @@
|
|
87
87
|
#ifndef ABSL_STRINGS_STR_CAT_H_
|
88
88
|
#define ABSL_STRINGS_STR_CAT_H_
|
89
89
|
|
90
|
+
#include <algorithm>
|
90
91
|
#include <array>
|
91
92
|
#include <cstdint>
|
93
|
+
#include <cstring>
|
92
94
|
#include <string>
|
93
95
|
#include <type_traits>
|
94
96
|
#include <utility>
|
95
97
|
#include <vector>
|
96
98
|
|
99
|
+
#include "absl/base/attributes.h"
|
97
100
|
#include "absl/base/port.h"
|
98
101
|
#include "absl/strings/internal/has_absl_stringify.h"
|
99
102
|
#include "absl/strings/internal/stringify_sink.h"
|
@@ -201,6 +204,27 @@ struct Hex {
|
|
201
204
|
explicit Hex(Pointee* v, PadSpec spec = absl::kNoPad)
|
202
205
|
: Hex(spec, reinterpret_cast<uintptr_t>(v)) {}
|
203
206
|
|
207
|
+
template <typename S>
|
208
|
+
friend void AbslStringify(S& sink, Hex hex) {
|
209
|
+
static_assert(
|
210
|
+
numbers_internal::kFastToBufferSize >= 32,
|
211
|
+
"This function only works when output buffer >= 32 bytes long");
|
212
|
+
char buffer[numbers_internal::kFastToBufferSize];
|
213
|
+
char* const end = &buffer[numbers_internal::kFastToBufferSize];
|
214
|
+
auto real_width =
|
215
|
+
absl::numbers_internal::FastHexToBufferZeroPad16(hex.value, end - 16);
|
216
|
+
if (real_width >= hex.width) {
|
217
|
+
sink.Append(absl::string_view(end - real_width, real_width));
|
218
|
+
} else {
|
219
|
+
// Pad first 16 chars because FastHexToBufferZeroPad16 pads only to 16 and
|
220
|
+
// max pad width can be up to 20.
|
221
|
+
std::memset(end - 32, hex.fill, 16);
|
222
|
+
// Patch up everything else up to the real_width.
|
223
|
+
std::memset(end - real_width - 16, hex.fill, 16);
|
224
|
+
sink.Append(absl::string_view(end - hex.width, hex.width));
|
225
|
+
}
|
226
|
+
}
|
227
|
+
|
204
228
|
private:
|
205
229
|
Hex(PadSpec spec, uint64_t v)
|
206
230
|
: value(v),
|
@@ -235,6 +259,38 @@ struct Dec {
|
|
235
259
|
: spec - absl::kZeroPad2 + 2),
|
236
260
|
fill(spec >= absl::kSpacePad2 ? ' ' : '0'),
|
237
261
|
neg(v < 0) {}
|
262
|
+
|
263
|
+
template <typename S>
|
264
|
+
friend void AbslStringify(S& sink, Dec dec) {
|
265
|
+
assert(dec.width <= numbers_internal::kFastToBufferSize);
|
266
|
+
char buffer[numbers_internal::kFastToBufferSize];
|
267
|
+
char* const end = &buffer[numbers_internal::kFastToBufferSize];
|
268
|
+
char* const minfill = end - dec.width;
|
269
|
+
char* writer = end;
|
270
|
+
uint64_t val = dec.value;
|
271
|
+
while (val > 9) {
|
272
|
+
*--writer = '0' + (val % 10);
|
273
|
+
val /= 10;
|
274
|
+
}
|
275
|
+
*--writer = '0' + static_cast<char>(val);
|
276
|
+
if (dec.neg) *--writer = '-';
|
277
|
+
|
278
|
+
ptrdiff_t fillers = writer - minfill;
|
279
|
+
if (fillers > 0) {
|
280
|
+
// Tricky: if the fill character is ' ', then it's <fill><+/-><digits>
|
281
|
+
// But...: if the fill character is '0', then it's <+/-><fill><digits>
|
282
|
+
bool add_sign_again = false;
|
283
|
+
if (dec.neg && dec.fill == '0') { // If filling with '0',
|
284
|
+
++writer; // ignore the sign we just added
|
285
|
+
add_sign_again = true; // and re-add the sign later.
|
286
|
+
}
|
287
|
+
writer -= fillers;
|
288
|
+
std::fill_n(writer, fillers, dec.fill);
|
289
|
+
if (add_sign_again) *--writer = '-';
|
290
|
+
}
|
291
|
+
|
292
|
+
sink.Append(absl::string_view(writer, static_cast<size_t>(end - writer)));
|
293
|
+
}
|
238
294
|
};
|
239
295
|
|
240
296
|
// -----------------------------------------------------------------------------
|
@@ -282,28 +338,30 @@ class AlphaNum {
|
|
282
338
|
AlphaNum(double f) // NOLINT(runtime/explicit)
|
283
339
|
: piece_(digits_, numbers_internal::SixDigitsToBuffer(f, digits_)) {}
|
284
340
|
|
285
|
-
AlphaNum(Hex hex); // NOLINT(runtime/explicit)
|
286
|
-
AlphaNum(Dec dec); // NOLINT(runtime/explicit)
|
287
|
-
|
288
341
|
template <size_t size>
|
289
342
|
AlphaNum( // NOLINT(runtime/explicit)
|
290
|
-
const strings_internal::AlphaNumBuffer<size>& buf
|
343
|
+
const strings_internal::AlphaNumBuffer<size>& buf
|
344
|
+
ABSL_ATTRIBUTE_LIFETIME_BOUND)
|
291
345
|
: piece_(&buf.data[0], buf.size) {}
|
292
346
|
|
293
|
-
AlphaNum(const char* c_str
|
294
|
-
|
295
|
-
|
347
|
+
AlphaNum(const char* c_str // NOLINT(runtime/explicit)
|
348
|
+
ABSL_ATTRIBUTE_LIFETIME_BOUND)
|
349
|
+
: piece_(NullSafeStringView(c_str)) {}
|
350
|
+
AlphaNum(absl::string_view pc // NOLINT(runtime/explicit)
|
351
|
+
ABSL_ATTRIBUTE_LIFETIME_BOUND)
|
352
|
+
: piece_(pc) {}
|
296
353
|
|
297
354
|
template <typename T, typename = typename std::enable_if<
|
298
355
|
strings_internal::HasAbslStringify<T>::value>::type>
|
299
|
-
AlphaNum(
|
300
|
-
const T& v,
|
301
|
-
strings_internal::StringifySink&& sink = {})
|
356
|
+
AlphaNum( // NOLINT(runtime/explicit)
|
357
|
+
const T& v ABSL_ATTRIBUTE_LIFETIME_BOUND,
|
358
|
+
strings_internal::StringifySink&& sink ABSL_ATTRIBUTE_LIFETIME_BOUND = {})
|
302
359
|
: piece_(strings_internal::ExtractStringification(sink, v)) {}
|
303
360
|
|
304
361
|
template <typename Allocator>
|
305
362
|
AlphaNum( // NOLINT(runtime/explicit)
|
306
|
-
const std::basic_string<char, std::char_traits<char>, Allocator>& str
|
363
|
+
const std::basic_string<char, std::char_traits<char>, Allocator>& str
|
364
|
+
ABSL_ATTRIBUTE_LIFETIME_BOUND)
|
307
365
|
: piece_(str) {}
|
308
366
|
|
309
367
|
// Use string literals ":" instead of character literals ':'.
|
@@ -316,14 +374,24 @@ class AlphaNum {
|
|
316
374
|
const char* data() const { return piece_.data(); }
|
317
375
|
absl::string_view Piece() const { return piece_; }
|
318
376
|
|
319
|
-
//
|
320
|
-
//
|
377
|
+
// Match unscoped enums. Use integral promotion so that a `char`-backed
|
378
|
+
// enum becomes a wider integral type AlphaNum will accept.
|
321
379
|
template <typename T,
|
322
380
|
typename = typename std::enable_if<
|
323
|
-
std::is_enum<T>{} &&
|
381
|
+
std::is_enum<T>{} && std::is_convertible<T, int>{} &&
|
324
382
|
!strings_internal::HasAbslStringify<T>::value>::type>
|
325
383
|
AlphaNum(T e) // NOLINT(runtime/explicit)
|
326
|
-
: AlphaNum(
|
384
|
+
: AlphaNum(+e) {}
|
385
|
+
|
386
|
+
// This overload matches scoped enums. We must explicitly cast to the
|
387
|
+
// underlying type, but use integral promotion for the same reason as above.
|
388
|
+
template <typename T,
|
389
|
+
typename std::enable_if<
|
390
|
+
std::is_enum<T>{} && !std::is_convertible<T, int>{} &&
|
391
|
+
!strings_internal::HasAbslStringify<T>::value,
|
392
|
+
char*>::type = nullptr>
|
393
|
+
AlphaNum(T e) // NOLINT(runtime/explicit)
|
394
|
+
: AlphaNum(+static_cast<typename std::underlying_type<T>::type>(e)) {}
|
327
395
|
|
328
396
|
// vector<bool>::reference and const_reference require special help to
|
329
397
|
// convert to `AlphaNum` because it requires two user defined conversions.
|
@@ -36,10 +36,12 @@
|
|
36
36
|
// * `absl::StreamFormat()` to more efficiently write a format string to a
|
37
37
|
// stream, such as`std::cout`.
|
38
38
|
// * `absl::PrintF()`, `absl::FPrintF()` and `absl::SNPrintF()` as
|
39
|
-
// replacements for `std::printf()`, `std::fprintf()` and
|
39
|
+
// drop-in replacements for `std::printf()`, `std::fprintf()` and
|
40
|
+
// `std::snprintf()`.
|
40
41
|
//
|
41
|
-
// Note:
|
42
|
-
// generally unsafe due to buffer overflows.
|
42
|
+
// Note: An `absl::SPrintF()` drop-in replacement is not supported as it
|
43
|
+
// is generally unsafe due to buffer overflows. Use `absl::StrFormat` which
|
44
|
+
// returns the string as output instead of expecting a pre-allocated buffer.
|
43
45
|
//
|
44
46
|
// Additionally, you can provide a format string (and its associated arguments)
|
45
47
|
// using one of the following abstractions:
|
@@ -257,6 +259,7 @@ class FormatCountCapture {
|
|
257
259
|
// * Characters: `char`, `signed char`, `unsigned char`
|
258
260
|
// * Integers: `int`, `short`, `unsigned short`, `unsigned`, `long`,
|
259
261
|
// `unsigned long`, `long long`, `unsigned long long`
|
262
|
+
// * Enums: printed as their underlying integral value
|
260
263
|
// * Floating-point: `float`, `double`, `long double`
|
261
264
|
//
|
262
265
|
// However, in the `str_format` library, a format conversion specifies a broader
|
@@ -60,19 +60,23 @@ absl::string_view GenericFind(absl::string_view text,
|
|
60
60
|
// Finds using absl::string_view::find(), therefore the length of the found
|
61
61
|
// delimiter is delimiter.length().
|
62
62
|
struct LiteralPolicy {
|
63
|
-
size_t Find(absl::string_view text, absl::string_view delimiter,
|
63
|
+
static size_t Find(absl::string_view text, absl::string_view delimiter,
|
64
|
+
size_t pos) {
|
64
65
|
return text.find(delimiter, pos);
|
65
66
|
}
|
66
|
-
size_t Length(absl::string_view delimiter) {
|
67
|
+
static size_t Length(absl::string_view delimiter) {
|
68
|
+
return delimiter.length();
|
69
|
+
}
|
67
70
|
};
|
68
71
|
|
69
72
|
// Finds using absl::string_view::find_first_of(), therefore the length of the
|
70
73
|
// found delimiter is 1.
|
71
74
|
struct AnyOfPolicy {
|
72
|
-
size_t Find(absl::string_view text, absl::string_view delimiter,
|
75
|
+
static size_t Find(absl::string_view text, absl::string_view delimiter,
|
76
|
+
size_t pos) {
|
73
77
|
return text.find_first_of(delimiter, pos);
|
74
78
|
}
|
75
|
-
size_t Length(absl::string_view /* delimiter */) { return 1; }
|
79
|
+
static size_t Length(absl::string_view /* delimiter */) { return 1; }
|
76
80
|
};
|
77
81
|
|
78
82
|
} // namespace
|
@@ -123,8 +127,7 @@ ByLength::ByLength(ptrdiff_t length) : length_(length) {
|
|
123
127
|
ABSL_RAW_CHECK(length > 0, "");
|
124
128
|
}
|
125
129
|
|
126
|
-
absl::string_view ByLength::Find(absl::string_view text,
|
127
|
-
size_t pos) const {
|
130
|
+
absl::string_view ByLength::Find(absl::string_view text, size_t pos) const {
|
128
131
|
pos = std::min(pos, text.size()); // truncate `pos`
|
129
132
|
absl::string_view substr = text.substr(pos);
|
130
133
|
// If the string is shorter than the chunk size we say we
|