grpc 1.73.0 → 1.74.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (499) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +38 -17
  3. data/include/grpc/create_channel_from_endpoint.h +54 -0
  4. data/include/grpc/credentials.h +11 -5
  5. data/include/grpc/event_engine/event_engine.h +74 -17
  6. data/include/grpc/grpc_posix.h +20 -1
  7. data/include/grpc/impl/channel_arg_names.h +2 -4
  8. data/include/grpc/module.modulemap +1 -0
  9. data/include/grpc/support/json.h +24 -0
  10. data/src/core/call/interception_chain.h +7 -11
  11. data/src/core/channelz/channel_trace.cc +213 -115
  12. data/src/core/channelz/channel_trace.h +380 -86
  13. data/src/core/channelz/channelz.cc +270 -181
  14. data/src/core/channelz/channelz.h +168 -55
  15. data/src/core/channelz/channelz_registry.cc +2 -1
  16. data/src/core/channelz/channelz_registry.h +24 -0
  17. data/src/core/channelz/property_list.cc +357 -0
  18. data/src/core/channelz/property_list.h +202 -0
  19. data/src/core/channelz/ztrace_collector.h +3 -2
  20. data/src/core/client_channel/backup_poller.cc +17 -2
  21. data/src/core/client_channel/client_channel.cc +17 -28
  22. data/src/core/client_channel/client_channel_filter.cc +19 -29
  23. data/src/core/client_channel/config_selector.h +8 -2
  24. data/src/core/client_channel/dynamic_filters.cc +5 -6
  25. data/src/core/client_channel/dynamic_filters.h +1 -1
  26. data/src/core/client_channel/global_subchannel_pool.cc +4 -1
  27. data/src/core/client_channel/retry_filter.cc +21 -27
  28. data/src/core/client_channel/retry_filter.h +10 -7
  29. data/src/core/client_channel/retry_filter_legacy_call_data.cc +5 -5
  30. data/src/core/client_channel/retry_filter_legacy_call_data.h +1 -1
  31. data/src/core/client_channel/retry_interceptor.cc +30 -44
  32. data/src/core/client_channel/retry_interceptor.h +18 -17
  33. data/src/core/client_channel/retry_throttle.cc +46 -61
  34. data/src/core/client_channel/retry_throttle.h +17 -39
  35. data/src/core/client_channel/subchannel.cc +43 -19
  36. data/src/core/client_channel/subchannel.h +8 -0
  37. data/src/core/config/config_vars.cc +2 -0
  38. data/src/core/config/core_configuration.cc +1 -0
  39. data/src/core/config/core_configuration.h +11 -0
  40. data/src/core/credentials/call/call_creds_registry.h +125 -0
  41. data/src/core/credentials/call/call_creds_registry_init.cc +91 -0
  42. data/src/core/credentials/call/gcp_service_account_identity/gcp_service_account_identity_credentials.cc +6 -48
  43. data/src/core/credentials/call/jwt_token_file/jwt_token_file_call_credentials.cc +86 -0
  44. data/src/core/credentials/call/jwt_token_file/jwt_token_file_call_credentials.h +74 -0
  45. data/src/core/credentials/call/jwt_util.cc +70 -0
  46. data/src/core/credentials/call/jwt_util.h +32 -0
  47. data/src/core/credentials/transport/channel_creds_registry_init.cc +1 -1
  48. data/src/core/credentials/transport/google_default/google_default_credentials.cc +72 -4
  49. data/src/core/credentials/transport/ssl/ssl_credentials.cc +0 -1
  50. data/src/core/credentials/transport/tls/load_system_roots_supported.cc +1 -0
  51. data/src/core/credentials/transport/xds/xds_credentials.cc +0 -3
  52. data/src/core/ext/filters/gcp_authentication/gcp_authentication_filter.cc +8 -8
  53. data/src/core/ext/filters/gcp_authentication/gcp_authentication_filter.h +16 -16
  54. data/src/core/ext/filters/http/client_authority_filter.cc +2 -4
  55. data/src/core/ext/filters/http/message_compress/compression_filter.h +25 -22
  56. data/src/core/ext/filters/http/server/http_server_filter.h +12 -11
  57. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +120 -35
  58. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +6 -5
  59. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +162 -115
  60. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +0 -3
  61. data/src/core/ext/transport/chttp2/transport/decode_huff.cc +1239 -3514
  62. data/src/core/ext/transport/chttp2/transport/decode_huff.h +1008 -1486
  63. data/src/core/ext/transport/chttp2/transport/flow_control.h +22 -17
  64. data/src/core/ext/transport/chttp2/transport/frame.cc +10 -0
  65. data/src/core/ext/transport/chttp2/transport/frame.h +2 -2
  66. data/src/core/ext/transport/chttp2/transport/frame_data.cc +1 -1
  67. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +7 -8
  68. data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +4 -5
  69. data/src/core/ext/transport/chttp2/transport/header_assembler.h +299 -0
  70. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +1 -1
  71. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +11 -5
  72. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.h +12 -1
  73. data/src/core/ext/transport/chttp2/transport/http2_client_transport.cc +1017 -0
  74. data/src/core/ext/transport/chttp2/transport/http2_client_transport.h +593 -0
  75. data/src/core/ext/transport/chttp2/transport/http2_settings.h +19 -22
  76. data/{third_party/abseil-cpp/absl/strings/cord_buffer.cc → src/core/ext/transport/chttp2/transport/http2_stats_collector.cc} +14 -14
  77. data/src/core/ext/transport/chttp2/transport/http2_stats_collector.h +33 -0
  78. data/src/core/ext/transport/chttp2/transport/http2_status.h +6 -1
  79. data/src/core/ext/transport/chttp2/transport/http2_transport.cc +43 -0
  80. data/src/core/ext/transport/chttp2/transport/http2_transport.h +65 -0
  81. data/src/core/ext/transport/chttp2/transport/http2_ztrace_collector.h +0 -29
  82. data/src/core/ext/transport/chttp2/transport/internal.h +18 -8
  83. data/src/core/ext/transport/chttp2/transport/keepalive.cc +105 -0
  84. data/src/core/ext/transport/chttp2/transport/keepalive.h +138 -0
  85. data/src/core/ext/transport/chttp2/transport/message_assembler.h +185 -0
  86. data/src/core/ext/transport/chttp2/transport/parsing.cc +2 -4
  87. data/src/core/ext/transport/chttp2/transport/ping_callbacks.h +19 -0
  88. data/src/core/ext/transport/chttp2/transport/ping_promise.cc +151 -0
  89. data/src/core/ext/transport/chttp2/transport/ping_promise.h +180 -0
  90. data/src/core/ext/transport/chttp2/transport/ping_rate_policy.cc +5 -9
  91. data/src/core/ext/transport/chttp2/transport/ping_rate_policy.h +11 -0
  92. data/src/core/ext/transport/chttp2/transport/stream_lists.cc +39 -1
  93. data/src/core/ext/transport/chttp2/transport/transport_common.cc +19 -0
  94. data/src/core/ext/transport/chttp2/transport/transport_common.h +27 -0
  95. data/src/core/ext/transport/chttp2/transport/writing.cc +37 -11
  96. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/channelz.upb.h +571 -0
  97. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/channelz.upb_minitable.c +120 -0
  98. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/channelz.upb_minitable.h +36 -0
  99. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/promise.upb.h +1272 -0
  100. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/promise.upb_minitable.c +312 -0
  101. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/promise.upb_minitable.h +50 -0
  102. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/property_list.upb.h +984 -0
  103. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/property_list.upb_minitable.c +226 -0
  104. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/property_list.upb_minitable.h +44 -0
  105. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/promise.upbdefs.c +175 -0
  106. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/promise.upbdefs.h +82 -0
  107. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/property_list.upbdefs.c +135 -0
  108. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/property_list.upbdefs.h +67 -0
  109. data/src/core/filter/auth/auth_filters.h +0 -25
  110. data/src/core/filter/auth/client_auth_filter.cc +0 -118
  111. data/src/core/filter/filter_args.h +9 -23
  112. data/src/core/handshaker/handshaker.cc +23 -14
  113. data/src/core/handshaker/handshaker.h +3 -0
  114. data/src/core/handshaker/http_connect/http_connect_handshaker.cc +3 -1
  115. data/src/core/handshaker/security/legacy_secure_endpoint.cc +6 -5
  116. data/src/core/handshaker/security/secure_endpoint.cc +70 -25
  117. data/src/core/handshaker/security/security_handshaker.cc +4 -1
  118. data/src/core/handshaker/tcp_connect/tcp_connect_handshaker.cc +7 -1
  119. data/src/core/lib/channel/channel_args.cc +15 -0
  120. data/src/core/lib/channel/channel_args.h +3 -0
  121. data/src/core/lib/channel/channel_stack.cc +22 -23
  122. data/src/core/lib/channel/channel_stack.h +9 -7
  123. data/src/core/lib/channel/channel_stack_builder_impl.cc +1 -1
  124. data/src/core/lib/channel/channel_stack_builder_impl.h +2 -7
  125. data/src/core/lib/channel/promise_based_filter.h +5 -5
  126. data/src/core/lib/debug/trace_impl.h +0 -1
  127. data/src/core/lib/event_engine/ares_resolver.cc +165 -46
  128. data/src/core/lib/event_engine/ares_resolver.h +48 -2
  129. data/src/core/lib/event_engine/cf_engine/cf_engine.cc +3 -1
  130. data/src/core/lib/event_engine/cf_engine/cf_engine.h +1 -4
  131. data/src/core/lib/event_engine/cf_engine/cfstream_endpoint.h +2 -6
  132. data/src/core/lib/event_engine/endpoint_channel_arg_wrapper.cc +40 -0
  133. data/src/core/lib/event_engine/endpoint_channel_arg_wrapper.h +60 -0
  134. data/src/core/lib/event_engine/event_engine.cc +7 -0
  135. data/src/core/lib/event_engine/extensions/channelz.h +10 -6
  136. data/src/core/lib/event_engine/grpc_polled_fd.h +5 -0
  137. data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc +130 -162
  138. data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.h +11 -15
  139. data/src/core/lib/event_engine/posix_engine/ev_poll_posix.cc +75 -117
  140. data/src/core/lib/event_engine/posix_engine/ev_poll_posix.h +7 -9
  141. data/src/core/lib/event_engine/posix_engine/event_poller.h +18 -15
  142. data/src/core/lib/event_engine/posix_engine/event_poller_posix_default.cc +0 -18
  143. data/src/core/lib/event_engine/posix_engine/file_descriptor_collection.cc +124 -0
  144. data/src/core/lib/event_engine/posix_engine/file_descriptor_collection.h +243 -0
  145. data/src/core/lib/event_engine/posix_engine/grpc_polled_fd_posix.h +29 -19
  146. data/src/core/lib/event_engine/posix_engine/internal_errqueue.cc +6 -2
  147. data/src/core/lib/event_engine/posix_engine/internal_errqueue.h +6 -1
  148. data/src/core/lib/event_engine/posix_engine/posix_endpoint.cc +145 -92
  149. data/src/core/lib/event_engine/posix_engine/posix_endpoint.h +9 -19
  150. data/src/core/lib/event_engine/posix_engine/posix_engine.cc +333 -116
  151. data/src/core/lib/event_engine/posix_engine/posix_engine.h +61 -18
  152. data/src/core/lib/event_engine/posix_engine/posix_engine_listener.cc +45 -37
  153. data/src/core/lib/event_engine/posix_engine/posix_engine_listener.h +6 -4
  154. data/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.cc +32 -142
  155. data/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.h +6 -5
  156. data/src/core/lib/event_engine/posix_engine/posix_interface.h +211 -0
  157. data/src/core/lib/event_engine/posix_engine/posix_interface_posix.cc +1083 -0
  158. data/src/core/lib/event_engine/posix_engine/posix_interface_windows.cc +281 -0
  159. data/src/core/lib/event_engine/posix_engine/posix_write_event_sink.cc +154 -0
  160. data/src/core/lib/event_engine/posix_engine/posix_write_event_sink.h +174 -0
  161. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.cc +3 -719
  162. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.h +10 -170
  163. data/src/core/lib/event_engine/posix_engine/timer_manager.cc +33 -22
  164. data/src/core/lib/event_engine/posix_engine/timer_manager.h +13 -11
  165. data/src/core/lib/event_engine/posix_engine/traced_buffer_list.cc +117 -151
  166. data/src/core/lib/event_engine/posix_engine/traced_buffer_list.h +26 -94
  167. data/src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.cc +26 -25
  168. data/src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.h +6 -2
  169. data/src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.cc +36 -62
  170. data/src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.h +6 -2
  171. data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix.h +7 -6
  172. data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.cc +12 -6
  173. data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.h +3 -1
  174. data/src/core/lib/event_engine/shim.cc +9 -0
  175. data/src/core/lib/event_engine/shim.h +3 -0
  176. data/src/core/lib/event_engine/thread_pool/thread_pool.h +7 -3
  177. data/src/core/lib/event_engine/thread_pool/thread_pool_factory.cc +0 -17
  178. data/src/core/lib/event_engine/thread_pool/work_stealing_thread_pool.cc +4 -2
  179. data/src/core/lib/event_engine/thread_pool/work_stealing_thread_pool.h +3 -2
  180. data/src/core/lib/event_engine/windows/grpc_polled_fd_windows.cc +4 -0
  181. data/src/core/lib/event_engine/windows/grpc_polled_fd_windows.h +4 -0
  182. data/src/core/lib/event_engine/windows/windows_endpoint.h +2 -6
  183. data/src/core/lib/event_engine/windows/windows_engine.cc +0 -1
  184. data/src/core/lib/event_engine/windows/windows_engine.h +1 -3
  185. data/src/core/lib/event_engine/windows/windows_listener.cc +14 -2
  186. data/src/core/lib/experiments/experiments.cc +45 -93
  187. data/src/core/lib/experiments/experiments.h +21 -51
  188. data/src/core/lib/iomgr/endpoint.cc +4 -3
  189. data/src/core/lib/iomgr/endpoint.h +7 -4
  190. data/src/core/lib/iomgr/endpoint_cfstream.cc +3 -2
  191. data/src/core/lib/iomgr/ev_epoll1_linux.cc +7 -2
  192. data/src/core/lib/iomgr/ev_poll_posix.cc +7 -2
  193. data/src/core/lib/iomgr/event_engine_shims/endpoint.cc +4 -6
  194. data/src/core/lib/iomgr/tcp_posix.cc +12 -6
  195. data/src/core/lib/iomgr/tcp_windows.cc +3 -2
  196. data/src/core/lib/promise/activity.h +1 -0
  197. data/src/core/lib/promise/arena_promise.h +23 -7
  198. data/src/core/lib/promise/detail/promise_factory.h +10 -0
  199. data/src/core/lib/promise/detail/promise_like.h +118 -11
  200. data/src/core/lib/promise/detail/promise_variant.h +50 -0
  201. data/src/core/lib/promise/detail/seq_state.h +687 -548
  202. data/src/core/lib/promise/if.h +20 -0
  203. data/src/core/lib/promise/inter_activity_latch.h +147 -0
  204. data/src/core/lib/promise/inter_activity_mutex.h +547 -0
  205. data/src/core/lib/promise/loop.h +65 -3
  206. data/src/core/lib/promise/map.h +24 -0
  207. data/src/core/lib/promise/match_promise.h +103 -0
  208. data/src/core/lib/promise/mpsc.cc +425 -0
  209. data/src/core/lib/promise/mpsc.h +490 -0
  210. data/src/core/lib/promise/party.cc +50 -1
  211. data/src/core/lib/promise/party.h +66 -1
  212. data/src/core/lib/promise/race.h +31 -0
  213. data/src/core/lib/promise/seq.h +4 -1
  214. data/src/core/lib/promise/status_flag.h +7 -0
  215. data/src/core/lib/promise/try_seq.h +4 -1
  216. data/src/core/lib/promise/wait_set.cc +28 -0
  217. data/src/core/lib/promise/wait_set.h +86 -0
  218. data/src/core/lib/resource_quota/arena.h +19 -0
  219. data/src/core/lib/slice/slice.h +5 -0
  220. data/src/core/lib/surface/channel_create.cc +88 -13
  221. data/src/core/lib/surface/channel_create.h +4 -0
  222. data/src/core/lib/surface/channel_init.cc +164 -47
  223. data/src/core/lib/surface/channel_init.h +64 -1
  224. data/src/core/lib/surface/filter_stack_call.cc +18 -9
  225. data/src/core/lib/surface/init.cc +6 -15
  226. data/src/core/lib/surface/legacy_channel.cc +3 -5
  227. data/src/core/lib/surface/legacy_channel.h +3 -1
  228. data/src/core/lib/surface/version.cc +2 -2
  229. data/src/core/lib/transport/promise_endpoint.cc +110 -0
  230. data/src/core/lib/transport/promise_endpoint.h +307 -0
  231. data/src/core/load_balancing/child_policy_handler.cc +2 -4
  232. data/src/core/load_balancing/delegating_helper.h +2 -3
  233. data/src/core/load_balancing/health_check_client.cc +1 -5
  234. data/src/core/load_balancing/lb_policy.h +1 -3
  235. data/src/core/load_balancing/oob_backend_metric.cc +1 -5
  236. data/src/core/load_balancing/pick_first/pick_first.cc +3 -0
  237. data/src/core/load_balancing/xds/cds.cc +10 -1
  238. data/src/core/plugin_registry/grpc_plugin_registry_extra.cc +2 -0
  239. data/src/core/resolver/xds/xds_config.cc +6 -3
  240. data/src/core/resolver/xds/xds_config.h +9 -4
  241. data/src/core/resolver/xds/xds_dependency_manager.cc +21 -6
  242. data/src/core/resolver/xds/xds_dependency_manager.h +2 -1
  243. data/src/core/resolver/xds/xds_resolver.cc +31 -11
  244. data/src/core/server/server.cc +83 -12
  245. data/src/core/server/server.h +21 -2
  246. data/src/core/server/xds_server_config_fetcher.cc +63 -25
  247. data/src/core/service_config/service_config.h +1 -1
  248. data/src/core/service_config/service_config_impl.h +1 -1
  249. data/src/core/telemetry/context_list_entry.cc +38 -0
  250. data/src/core/telemetry/context_list_entry.h +42 -12
  251. data/src/core/telemetry/stats_data.cc +233 -207
  252. data/src/core/telemetry/stats_data.h +250 -153
  253. data/src/core/telemetry/tcp_tracer.h +1 -1
  254. data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +11 -3
  255. data/src/core/tsi/fake_transport_security.cc +17 -0
  256. data/src/core/tsi/ssl_transport_security.cc +2 -0
  257. data/src/core/tsi/transport_security_grpc.cc +8 -0
  258. data/src/core/tsi/transport_security_grpc.h +15 -0
  259. data/src/core/util/backoff.cc +1 -5
  260. data/src/core/util/backoff.h +1 -0
  261. data/src/core/util/down_cast.h +1 -1
  262. data/src/core/util/function_signature.h +15 -1
  263. data/src/core/util/http_client/httpcli.cc +12 -5
  264. data/src/core/util/http_client/httpcli.h +4 -1
  265. data/src/core/util/latent_see.h +8 -5
  266. data/src/core/util/log.cc +4 -0
  267. data/src/core/util/memory_usage.h +268 -0
  268. data/src/core/util/per_cpu.cc +2 -0
  269. data/src/core/util/per_cpu.h +7 -0
  270. data/src/core/util/shared_bit_gen.h +20 -0
  271. data/src/core/util/single_set_ptr.h +2 -2
  272. data/src/core/util/upb_utils.h +42 -0
  273. data/src/core/util/uri.cc +3 -2
  274. data/src/core/util/useful.h +53 -2
  275. data/src/core/util/wait_for_single_owner.cc +31 -0
  276. data/src/core/util/wait_for_single_owner.h +24 -0
  277. data/src/core/xds/grpc/xds_bootstrap_grpc.cc +2 -0
  278. data/src/core/xds/grpc/xds_bootstrap_grpc.h +5 -0
  279. data/src/core/xds/grpc/xds_client_grpc.cc +6 -2
  280. data/src/core/xds/grpc/xds_common_types_parser.cc +138 -50
  281. data/src/core/xds/grpc/xds_common_types_parser.h +12 -0
  282. data/src/core/xds/grpc/xds_http_filter.h +7 -0
  283. data/src/core/xds/grpc/xds_http_gcp_authn_filter.cc +22 -0
  284. data/src/core/xds/grpc/xds_http_gcp_authn_filter.h +3 -0
  285. data/src/core/xds/grpc/xds_route_config_parser.cc +15 -38
  286. data/src/core/xds/grpc/xds_server_grpc.cc +63 -13
  287. data/src/core/xds/grpc/xds_server_grpc.h +10 -2
  288. data/src/core/xds/grpc/xds_server_grpc_interface.h +4 -0
  289. data/src/core/xds/grpc/xds_transport_grpc.cc +18 -0
  290. data/src/core/xds/xds_client/xds_bootstrap.h +2 -0
  291. data/src/core/xds/xds_client/xds_client.cc +26 -5
  292. data/src/ruby/ext/grpc/extconf.rb +2 -0
  293. data/src/ruby/ext/grpc/rb_call.c +1 -8
  294. data/src/ruby/ext/grpc/rb_channel.c +72 -568
  295. data/src/ruby/ext/grpc/rb_channel.h +0 -3
  296. data/src/ruby/ext/grpc/rb_completion_queue.c +26 -14
  297. data/src/ruby/ext/grpc/rb_completion_queue.h +1 -7
  298. data/src/ruby/ext/grpc/rb_grpc.c +9 -5
  299. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +1 -1
  300. data/src/ruby/ext/grpc/rb_loader.c +0 -4
  301. data/src/ruby/ext/grpc/rb_server.c +31 -50
  302. data/src/ruby/lib/grpc/generic/client_stub.rb +4 -4
  303. data/src/ruby/lib/grpc/version.rb +1 -1
  304. data/src/ruby/spec/core_spec.rb +22 -0
  305. data/src/ruby/spec/generic/active_call_spec.rb +1 -1
  306. data/third_party/abseil-cpp/absl/algorithm/container.h +2 -19
  307. data/third_party/abseil-cpp/absl/base/attributes.h +76 -7
  308. data/third_party/abseil-cpp/absl/base/call_once.h +11 -12
  309. data/third_party/abseil-cpp/absl/base/config.h +20 -129
  310. data/third_party/abseil-cpp/absl/base/{internal/fast_type_id.h → fast_type_id.h} +11 -16
  311. data/third_party/abseil-cpp/absl/base/internal/cycleclock.cc +0 -5
  312. data/third_party/abseil-cpp/absl/base/internal/cycleclock_config.h +7 -7
  313. data/third_party/abseil-cpp/absl/base/internal/endian.h +34 -38
  314. data/third_party/abseil-cpp/absl/base/internal/iterator_traits.h +71 -0
  315. data/third_party/abseil-cpp/absl/base/internal/low_level_alloc.cc +6 -5
  316. data/third_party/abseil-cpp/absl/base/internal/{nullability_impl.h → nullability_deprecated.h} +45 -8
  317. data/third_party/abseil-cpp/absl/base/internal/spinlock.cc +0 -9
  318. data/third_party/abseil-cpp/absl/base/internal/spinlock.h +3 -13
  319. data/third_party/abseil-cpp/absl/base/internal/unaligned_access.h +6 -6
  320. data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.h +8 -3
  321. data/third_party/abseil-cpp/absl/base/no_destructor.h +11 -32
  322. data/third_party/abseil-cpp/absl/base/nullability.h +84 -72
  323. data/third_party/abseil-cpp/absl/base/options.h +3 -80
  324. data/third_party/abseil-cpp/absl/base/policy_checks.h +7 -7
  325. data/third_party/abseil-cpp/absl/cleanup/cleanup.h +1 -3
  326. data/third_party/abseil-cpp/absl/cleanup/internal/cleanup.h +3 -4
  327. data/third_party/abseil-cpp/absl/container/btree_map.h +4 -2
  328. data/third_party/abseil-cpp/absl/container/btree_set.h +4 -2
  329. data/third_party/abseil-cpp/absl/container/fixed_array.h +7 -14
  330. data/third_party/abseil-cpp/absl/container/flat_hash_map.h +5 -0
  331. data/third_party/abseil-cpp/absl/container/flat_hash_set.h +6 -1
  332. data/third_party/abseil-cpp/absl/container/inlined_vector.h +8 -5
  333. data/third_party/abseil-cpp/absl/container/internal/btree.h +132 -29
  334. data/third_party/abseil-cpp/absl/container/internal/btree_container.h +175 -71
  335. data/third_party/abseil-cpp/absl/container/internal/common.h +43 -0
  336. data/third_party/abseil-cpp/absl/container/internal/common_policy_traits.h +1 -2
  337. data/third_party/abseil-cpp/absl/container/internal/container_memory.h +9 -10
  338. data/third_party/abseil-cpp/absl/container/internal/hash_function_defaults.h +1 -8
  339. data/third_party/abseil-cpp/absl/container/internal/hash_policy_traits.h +0 -4
  340. data/third_party/abseil-cpp/absl/container/internal/hashtable_control_bytes.h +527 -0
  341. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.cc +20 -4
  342. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.h +31 -12
  343. data/third_party/abseil-cpp/absl/container/internal/inlined_vector.h +2 -7
  344. data/third_party/abseil-cpp/absl/container/internal/layout.h +26 -42
  345. data/third_party/abseil-cpp/absl/container/internal/raw_hash_map.h +199 -68
  346. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.cc +1354 -183
  347. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.h +881 -1424
  348. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set_resize_impl.h +80 -0
  349. data/third_party/abseil-cpp/absl/crc/crc32c.cc +0 -4
  350. data/third_party/abseil-cpp/absl/crc/crc32c.h +7 -5
  351. data/third_party/abseil-cpp/absl/crc/internal/crc32_x86_arm_combined_simd.h +0 -22
  352. data/third_party/abseil-cpp/absl/crc/internal/crc_x86_arm_combined.cc +45 -74
  353. data/third_party/abseil-cpp/absl/debugging/internal/addresses.h +57 -0
  354. data/third_party/abseil-cpp/absl/debugging/internal/decode_rust_punycode.cc +1 -1
  355. data/third_party/abseil-cpp/absl/debugging/internal/decode_rust_punycode.h +5 -5
  356. data/third_party/abseil-cpp/absl/debugging/internal/demangle.cc +8 -35
  357. data/third_party/abseil-cpp/absl/debugging/internal/demangle_rust.cc +16 -16
  358. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_aarch64-inl.inc +40 -37
  359. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_arm-inl.inc +16 -7
  360. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_emscripten-inl.inc +14 -5
  361. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_generic-inl.inc +10 -4
  362. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_powerpc-inl.inc +27 -16
  363. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_riscv-inl.inc +13 -4
  364. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_unimplemented-inl.inc +4 -3
  365. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_win32-inl.inc +15 -28
  366. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_x86-inl.inc +19 -9
  367. data/third_party/abseil-cpp/absl/debugging/stacktrace.cc +144 -27
  368. data/third_party/abseil-cpp/absl/debugging/stacktrace.h +73 -5
  369. data/third_party/abseil-cpp/absl/debugging/symbolize_elf.inc +19 -9
  370. data/third_party/abseil-cpp/absl/debugging/symbolize_emscripten.inc +3 -2
  371. data/third_party/abseil-cpp/absl/debugging/symbolize_win32.inc +25 -6
  372. data/third_party/abseil-cpp/absl/flags/commandlineflag.h +2 -2
  373. data/third_party/abseil-cpp/absl/flags/flag.h +4 -3
  374. data/third_party/abseil-cpp/absl/flags/internal/commandlineflag.h +2 -2
  375. data/third_party/abseil-cpp/absl/flags/internal/flag.cc +2 -1
  376. data/third_party/abseil-cpp/absl/flags/internal/flag.h +7 -6
  377. data/third_party/abseil-cpp/absl/flags/internal/registry.h +4 -3
  378. data/third_party/abseil-cpp/absl/flags/reflection.cc +2 -3
  379. data/third_party/abseil-cpp/absl/functional/any_invocable.h +8 -10
  380. data/third_party/abseil-cpp/absl/functional/function_ref.h +2 -9
  381. data/third_party/abseil-cpp/absl/functional/internal/any_invocable.h +110 -226
  382. data/third_party/abseil-cpp/absl/functional/internal/front_binder.h +10 -12
  383. data/third_party/abseil-cpp/absl/functional/internal/function_ref.h +2 -5
  384. data/third_party/abseil-cpp/absl/hash/hash.h +18 -0
  385. data/third_party/abseil-cpp/absl/hash/internal/hash.cc +1 -5
  386. data/third_party/abseil-cpp/absl/hash/internal/hash.h +86 -61
  387. data/third_party/abseil-cpp/absl/hash/internal/low_level_hash.cc +25 -68
  388. data/third_party/abseil-cpp/absl/hash/internal/low_level_hash.h +2 -6
  389. data/third_party/abseil-cpp/absl/hash/internal/weakly_mixed_integer.h +38 -0
  390. data/third_party/abseil-cpp/absl/log/check.h +2 -1
  391. data/third_party/abseil-cpp/absl/log/globals.h +4 -5
  392. data/third_party/abseil-cpp/absl/log/internal/append_truncated.h +28 -0
  393. data/third_party/abseil-cpp/absl/log/internal/check_op.cc +22 -22
  394. data/third_party/abseil-cpp/absl/log/internal/check_op.h +65 -62
  395. data/third_party/abseil-cpp/absl/log/internal/conditions.cc +5 -3
  396. data/third_party/abseil-cpp/absl/log/internal/conditions.h +7 -2
  397. data/third_party/abseil-cpp/absl/log/internal/log_message.cc +85 -43
  398. data/third_party/abseil-cpp/absl/log/internal/log_message.h +84 -59
  399. data/third_party/abseil-cpp/absl/log/internal/nullstream.h +1 -0
  400. data/third_party/abseil-cpp/absl/log/internal/proto.cc +3 -2
  401. data/third_party/abseil-cpp/absl/log/internal/proto.h +3 -3
  402. data/third_party/abseil-cpp/absl/log/internal/strip.h +4 -12
  403. data/third_party/abseil-cpp/absl/log/internal/vlog_config.h +8 -6
  404. data/third_party/abseil-cpp/absl/log/internal/voidify.h +10 -4
  405. data/third_party/abseil-cpp/absl/log/log.h +48 -35
  406. data/third_party/abseil-cpp/absl/log/log_sink_registry.h +2 -2
  407. data/third_party/abseil-cpp/absl/meta/type_traits.h +46 -175
  408. data/third_party/abseil-cpp/absl/numeric/bits.h +68 -2
  409. data/third_party/abseil-cpp/absl/numeric/int128.cc +0 -52
  410. data/third_party/abseil-cpp/absl/numeric/internal/bits.h +7 -3
  411. data/third_party/abseil-cpp/absl/profiling/internal/exponential_biased.cc +1 -1
  412. data/third_party/abseil-cpp/absl/random/bit_gen_ref.h +10 -11
  413. data/third_party/abseil-cpp/absl/random/distributions.h +6 -8
  414. data/third_party/abseil-cpp/absl/random/gaussian_distribution.h +1 -1
  415. data/third_party/abseil-cpp/absl/random/internal/distribution_caller.h +5 -6
  416. data/third_party/abseil-cpp/absl/random/internal/{pool_urbg.cc → entropy_pool.cc} +22 -90
  417. data/third_party/abseil-cpp/absl/random/internal/entropy_pool.h +35 -0
  418. data/third_party/abseil-cpp/absl/random/internal/nonsecure_base.h +5 -6
  419. data/third_party/abseil-cpp/absl/random/internal/randen_detect.cc +1 -1
  420. data/third_party/abseil-cpp/absl/random/internal/seed_material.cc +20 -12
  421. data/third_party/abseil-cpp/absl/random/internal/seed_material.h +5 -5
  422. data/third_party/abseil-cpp/absl/random/random.h +88 -53
  423. data/third_party/abseil-cpp/absl/random/seed_sequences.cc +6 -2
  424. data/third_party/abseil-cpp/absl/status/internal/status_internal.cc +3 -4
  425. data/third_party/abseil-cpp/absl/status/internal/status_internal.h +3 -4
  426. data/third_party/abseil-cpp/absl/status/internal/statusor_internal.h +4 -3
  427. data/third_party/abseil-cpp/absl/status/status.cc +4 -8
  428. data/third_party/abseil-cpp/absl/status/status.h +8 -8
  429. data/third_party/abseil-cpp/absl/status/status_payload_printer.h +2 -2
  430. data/third_party/abseil-cpp/absl/status/statusor.cc +2 -2
  431. data/third_party/abseil-cpp/absl/status/statusor.h +6 -6
  432. data/third_party/abseil-cpp/absl/strings/ascii.cc +9 -9
  433. data/third_party/abseil-cpp/absl/strings/ascii.h +18 -18
  434. data/third_party/abseil-cpp/absl/strings/charconv.cc +21 -22
  435. data/third_party/abseil-cpp/absl/strings/charconv.h +5 -5
  436. data/third_party/abseil-cpp/absl/strings/cord.cc +54 -58
  437. data/third_party/abseil-cpp/absl/strings/cord.h +94 -83
  438. data/third_party/abseil-cpp/absl/strings/cord_analysis.cc +11 -11
  439. data/third_party/abseil-cpp/absl/strings/cord_analysis.h +3 -3
  440. data/third_party/abseil-cpp/absl/strings/escaping.cc +130 -149
  441. data/third_party/abseil-cpp/absl/strings/escaping.h +9 -10
  442. data/third_party/abseil-cpp/absl/strings/internal/charconv_bigint.cc +1 -1
  443. data/third_party/abseil-cpp/absl/strings/internal/cord_internal.h +6 -8
  444. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree.cc +0 -4
  445. data/third_party/abseil-cpp/absl/strings/internal/cordz_info.cc +0 -4
  446. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.cc +7 -63
  447. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.h +1 -11
  448. data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.cc +0 -22
  449. data/third_party/abseil-cpp/absl/strings/internal/str_format/output.cc +5 -3
  450. data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.h +4 -2
  451. data/third_party/abseil-cpp/absl/strings/internal/str_join_internal.h +3 -3
  452. data/third_party/abseil-cpp/absl/strings/internal/string_constant.h +0 -5
  453. data/third_party/abseil-cpp/absl/strings/internal/utf8.cc +96 -1
  454. data/third_party/abseil-cpp/absl/strings/internal/utf8.h +15 -1
  455. data/third_party/abseil-cpp/absl/strings/numbers.cc +53 -32
  456. data/third_party/abseil-cpp/absl/strings/numbers.h +87 -58
  457. data/third_party/abseil-cpp/absl/strings/str_cat.cc +6 -7
  458. data/third_party/abseil-cpp/absl/strings/str_cat.h +32 -32
  459. data/third_party/abseil-cpp/absl/strings/str_format.h +18 -18
  460. data/third_party/abseil-cpp/absl/strings/str_replace.cc +3 -3
  461. data/third_party/abseil-cpp/absl/strings/str_replace.h +6 -6
  462. data/third_party/abseil-cpp/absl/strings/string_view.cc +4 -9
  463. data/third_party/abseil-cpp/absl/strings/string_view.h +27 -32
  464. data/third_party/abseil-cpp/absl/strings/strip.h +4 -4
  465. data/third_party/abseil-cpp/absl/strings/substitute.cc +5 -4
  466. data/third_party/abseil-cpp/absl/strings/substitute.h +66 -64
  467. data/third_party/abseil-cpp/absl/synchronization/internal/futex_waiter.cc +0 -4
  468. data/third_party/abseil-cpp/absl/synchronization/internal/kernel_timeout.cc +0 -5
  469. data/third_party/abseil-cpp/absl/synchronization/internal/pthread_waiter.cc +0 -4
  470. data/third_party/abseil-cpp/absl/synchronization/internal/sem_waiter.cc +0 -4
  471. data/third_party/abseil-cpp/absl/synchronization/internal/stdcpp_waiter.cc +0 -4
  472. data/third_party/abseil-cpp/absl/synchronization/internal/waiter_base.cc +0 -4
  473. data/third_party/abseil-cpp/absl/synchronization/internal/win32_waiter.cc +0 -4
  474. data/third_party/abseil-cpp/absl/synchronization/mutex.cc +1 -1
  475. data/third_party/abseil-cpp/absl/synchronization/mutex.h +97 -69
  476. data/third_party/abseil-cpp/absl/synchronization/notification.h +1 -1
  477. data/third_party/abseil-cpp/absl/time/civil_time.cc +1 -0
  478. data/third_party/abseil-cpp/absl/time/duration.cc +12 -7
  479. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/time_zone.h +1 -1
  480. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_lookup.cc +90 -111
  481. data/third_party/abseil-cpp/absl/time/time.h +20 -15
  482. data/third_party/abseil-cpp/absl/types/optional.h +7 -747
  483. data/third_party/abseil-cpp/absl/types/span.h +13 -11
  484. data/third_party/abseil-cpp/absl/types/variant.h +5 -784
  485. data/third_party/abseil-cpp/absl/utility/utility.h +10 -185
  486. metadata +72 -20
  487. data/src/core/lib/event_engine/forkable.cc +0 -105
  488. data/src/core/lib/event_engine/forkable.h +0 -67
  489. data/src/core/lib/iomgr/python_util.h +0 -46
  490. data/third_party/abseil-cpp/absl/base/internal/inline_variable.h +0 -108
  491. data/third_party/abseil-cpp/absl/base/internal/invoke.h +0 -241
  492. data/third_party/abseil-cpp/absl/log/log_entry.cc +0 -41
  493. data/third_party/abseil-cpp/absl/random/internal/pool_urbg.h +0 -131
  494. data/third_party/abseil-cpp/absl/types/bad_optional_access.cc +0 -66
  495. data/third_party/abseil-cpp/absl/types/bad_optional_access.h +0 -78
  496. data/third_party/abseil-cpp/absl/types/bad_variant_access.cc +0 -82
  497. data/third_party/abseil-cpp/absl/types/bad_variant_access.h +0 -82
  498. data/third_party/abseil-cpp/absl/types/internal/optional.h +0 -352
  499. data/third_party/abseil-cpp/absl/types/internal/variant.h +0 -1622
@@ -192,7 +192,6 @@
192
192
  #include <typeinfo>
193
193
  #include <utility>
194
194
 
195
- #include "absl/base/attributes.h"
196
195
  #include "absl/base/config.h"
197
196
  #include "absl/debugging/internal/demangle.h"
198
197
  #include "absl/meta/type_traits.h"
@@ -316,9 +315,6 @@ std::string TypeName() {
316
315
 
317
316
  } // namespace adl_barrier
318
317
 
319
- template <bool C>
320
- using EnableIf = typename std::enable_if<C, int>::type;
321
-
322
318
  // Can `T` be a template argument of `Layout`?
323
319
  template <class T>
324
320
  using IsLegalElementType = std::integral_constant<
@@ -418,17 +414,16 @@ class LayoutImpl<
418
414
  // assert(x.Offset<1>() == 16); // The doubles starts from 16.
419
415
  //
420
416
  // Requires: `N <= NumSizes && N < sizeof...(Ts)`.
421
- template <size_t N, EnableIf<N == 0> = 0>
422
- constexpr size_t Offset() const {
423
- return 0;
424
- }
425
-
426
- template <size_t N, EnableIf<N != 0> = 0>
417
+ template <size_t N>
427
418
  constexpr size_t Offset() const {
428
- static_assert(N < NumOffsets, "Index out of bounds");
429
- return adl_barrier::Align(
430
- Offset<N - 1>() + SizeOf<ElementType<N - 1>>::value * Size<N - 1>(),
431
- ElementAlignment<N>::value);
419
+ if constexpr (N == 0) {
420
+ return 0;
421
+ } else {
422
+ static_assert(N < NumOffsets, "Index out of bounds");
423
+ return adl_barrier::Align(
424
+ Offset<N - 1>() + SizeOf<ElementType<N - 1>>::value * Size<N - 1>(),
425
+ ElementAlignment<N>::value);
426
+ }
432
427
  }
433
428
 
434
429
  // Offset in bytes of the array with the specified element type. There must
@@ -457,15 +452,14 @@ class LayoutImpl<
457
452
  // assert(x.Size<1>() == 4);
458
453
  //
459
454
  // Requires: `N < NumSizes`.
460
- template <size_t N, EnableIf<(N < NumStaticSizes)> = 0>
461
- constexpr size_t Size() const {
462
- return kStaticSizes[N];
463
- }
464
-
465
- template <size_t N, EnableIf<(N >= NumStaticSizes)> = 0>
455
+ template <size_t N>
466
456
  constexpr size_t Size() const {
467
- static_assert(N < NumSizes, "Index out of bounds");
468
- return size_[N - NumStaticSizes];
457
+ if constexpr (N < NumStaticSizes) {
458
+ return kStaticSizes[N];
459
+ } else {
460
+ static_assert(N < NumSizes, "Index out of bounds");
461
+ return size_[N - NumStaticSizes];
462
+ }
469
463
  }
470
464
 
471
465
  // The number of elements in the array with the specified element type.
@@ -596,10 +590,10 @@ class LayoutImpl<
596
590
  //
597
591
  // Requires: `p` is aligned to `Alignment()`.
598
592
  //
599
- // Note: We mark the parameter as unused because GCC detects it is not used
600
- // when `SizeSeq` is empty [-Werror=unused-but-set-parameter].
593
+ // Note: We mark the parameter as maybe_unused because GCC detects it is not
594
+ // used when `SizeSeq` is empty [-Werror=unused-but-set-parameter].
601
595
  template <class Char>
602
- auto Slices(ABSL_ATTRIBUTE_UNUSED Char* p) const {
596
+ auto Slices([[maybe_unused]] Char* p) const {
603
597
  return std::tuple<SliceType<CopyConst<Char, ElementType<SizeSeq>>>...>(
604
598
  Slice<SizeSeq>(p)...);
605
599
  }
@@ -624,15 +618,13 @@ class LayoutImpl<
624
618
  // `Char` must be `[const] [signed|unsigned] char`.
625
619
  //
626
620
  // Requires: `p` is aligned to `Alignment()`.
627
- template <class Char, size_t N = NumOffsets - 1, EnableIf<N == 0> = 0>
628
- void PoisonPadding(const Char* p) const {
629
- Pointer<0>(p); // verify the requirements on `Char` and `p`
630
- }
631
-
632
- template <class Char, size_t N = NumOffsets - 1, EnableIf<N != 0> = 0>
621
+ template <class Char, size_t N = NumOffsets - 1>
633
622
  void PoisonPadding(const Char* p) const {
634
- static_assert(N < NumOffsets, "Index out of bounds");
635
- (void)p;
623
+ if constexpr (N == 0) {
624
+ Pointer<0>(p); // verify the requirements on `Char` and `p`
625
+ } else {
626
+ static_assert(N < NumOffsets, "Index out of bounds");
627
+ (void)p;
636
628
  #ifdef ABSL_HAVE_ADDRESS_SANITIZER
637
629
  PoisonPadding<Char, N - 1>(p);
638
630
  // The `if` is an optimization. It doesn't affect the observable behaviour.
@@ -642,6 +634,7 @@ class LayoutImpl<
642
634
  ASAN_POISON_MEMORY_REGION(p + start, Offset<N>() - start);
643
635
  }
644
636
  #endif
637
+ }
645
638
  }
646
639
 
647
640
  // Human-readable description of the memory layout. Useful for debugging.
@@ -692,15 +685,6 @@ class LayoutImpl<
692
685
  size_t size_[NumRuntimeSizes > 0 ? NumRuntimeSizes : 1];
693
686
  };
694
687
 
695
- // Defining a constexpr static class member variable is redundant and deprecated
696
- // in C++17, but required in C++14.
697
- template <class... Elements, size_t... StaticSizeSeq, size_t... RuntimeSizeSeq,
698
- size_t... SizeSeq, size_t... OffsetSeq>
699
- constexpr std::array<size_t, sizeof...(StaticSizeSeq)> LayoutImpl<
700
- std::tuple<Elements...>, absl::index_sequence<StaticSizeSeq...>,
701
- absl::index_sequence<RuntimeSizeSeq...>, absl::index_sequence<SizeSeq...>,
702
- absl::index_sequence<OffsetSeq...>>::kStaticSizes;
703
-
704
688
  template <class StaticSizeSeq, size_t NumRuntimeSizes, class... Ts>
705
689
  using LayoutType = LayoutImpl<
706
690
  std::tuple<Ts...>, StaticSizeSeq,
@@ -22,8 +22,10 @@
22
22
  #include "absl/base/attributes.h"
23
23
  #include "absl/base/config.h"
24
24
  #include "absl/base/internal/throw_delegate.h"
25
+ #include "absl/container/internal/common_policy_traits.h"
25
26
  #include "absl/container/internal/container_memory.h"
26
27
  #include "absl/container/internal/raw_hash_set.h" // IWYU pragma: export
28
+ #include "absl/meta/type_traits.h"
27
29
 
28
30
  namespace absl {
29
31
  ABSL_NAMESPACE_BEGIN
@@ -43,14 +45,39 @@ class raw_hash_map : public raw_hash_set<Policy, Hash, Eq, Alloc> {
43
45
  using MappedConstReference = decltype(P::value(
44
46
  std::addressof(std::declval<typename raw_hash_map::const_reference>())));
45
47
 
46
- using KeyArgImpl =
47
- KeyArg<IsTransparent<Eq>::value && IsTransparent<Hash>::value>;
48
+ template <class K>
49
+ using key_arg =
50
+ typename KeyArg<IsTransparent<Eq>::value && IsTransparent<Hash>::value>::
51
+ template type<K, typename Policy::key_type>;
52
+
53
+ // NOTE: The mess here is to shorten the code for the (very repetitive)
54
+ // function overloads, and to allow the lifetime-bound overloads to dispatch
55
+ // to the non-lifetime-bound overloads, to ensure there is a single source of
56
+ // truth for each overload set.
57
+ //
58
+ // Enabled if an assignment from the given type would require the
59
+ // source object to remain alive for the life of the element.
60
+ //
61
+ // TODO(b/402804213): Remove these traits and simplify the overloads whenever
62
+ // we have a better mechanism available to handle lifetime analysis.
63
+ template <class K, bool Value, typename = void>
64
+ using LifetimeBoundK = HasValue<
65
+ Value, std::conditional_t<policy_trait_element_is_owner<Policy>::value,
66
+ std::false_type,
67
+ type_traits_internal::IsLifetimeBoundAssignment<
68
+ typename Policy::key_type, K>>>;
69
+ template <class V, bool Value, typename = void>
70
+ using LifetimeBoundV =
71
+ HasValue<Value, type_traits_internal::IsLifetimeBoundAssignment<
72
+ typename Policy::mapped_type, V>>;
73
+ template <class K, bool KValue, class V, bool VValue, typename... Dummy>
74
+ using LifetimeBoundKV =
75
+ absl::conjunction<LifetimeBoundK<K, KValue, absl::void_t<Dummy...>>,
76
+ LifetimeBoundV<V, VValue>>;
48
77
 
49
78
  public:
50
79
  using key_type = typename Policy::key_type;
51
80
  using mapped_type = typename Policy::mapped_type;
52
- template <class K>
53
- using key_arg = typename KeyArgImpl::template type<K, key_type>;
54
81
 
55
82
  static_assert(!std::is_reference<key_type>::value, "");
56
83
 
@@ -71,87 +98,175 @@ class raw_hash_map : public raw_hash_set<Policy, Hash, Eq, Alloc> {
71
98
  // union { int n : 1; };
72
99
  // flat_hash_map<int, int> m;
73
100
  // m.insert_or_assign(n, n);
74
- template <class K = key_type, class V = mapped_type, K* = nullptr,
75
- V* = nullptr>
76
- std::pair<iterator, bool> insert_or_assign(key_arg<K>&& k, V&& v)
77
- ABSL_ATTRIBUTE_LIFETIME_BOUND {
78
- return insert_or_assign_impl(std::forward<K>(k), std::forward<V>(v));
79
- }
80
-
81
- template <class K = key_type, class V = mapped_type, K* = nullptr>
82
- std::pair<iterator, bool> insert_or_assign(key_arg<K>&& k, const V& v)
83
- ABSL_ATTRIBUTE_LIFETIME_BOUND {
84
- return insert_or_assign_impl(std::forward<K>(k), v);
85
- }
86
-
87
- template <class K = key_type, class V = mapped_type, V* = nullptr>
88
- std::pair<iterator, bool> insert_or_assign(const key_arg<K>& k, V&& v)
89
- ABSL_ATTRIBUTE_LIFETIME_BOUND {
90
- return insert_or_assign_impl(k, std::forward<V>(v));
91
- }
92
-
93
- template <class K = key_type, class V = mapped_type>
94
- std::pair<iterator, bool> insert_or_assign(const key_arg<K>& k, const V& v)
95
- ABSL_ATTRIBUTE_LIFETIME_BOUND {
96
- return insert_or_assign_impl(k, v);
97
- }
98
-
99
- template <class K = key_type, class V = mapped_type, K* = nullptr,
100
- V* = nullptr>
101
- iterator insert_or_assign(const_iterator, key_arg<K>&& k,
102
- V&& v) ABSL_ATTRIBUTE_LIFETIME_BOUND {
103
- return insert_or_assign(std::forward<K>(k), std::forward<V>(v)).first;
104
- }
105
-
106
- template <class K = key_type, class V = mapped_type, K* = nullptr>
107
- iterator insert_or_assign(const_iterator, key_arg<K>&& k,
108
- const V& v) ABSL_ATTRIBUTE_LIFETIME_BOUND {
109
- return insert_or_assign(std::forward<K>(k), v).first;
110
- }
111
-
112
- template <class K = key_type, class V = mapped_type, V* = nullptr>
113
- iterator insert_or_assign(const_iterator, const key_arg<K>& k,
114
- V&& v) ABSL_ATTRIBUTE_LIFETIME_BOUND {
115
- return insert_or_assign(k, std::forward<V>(v)).first;
116
- }
117
-
118
- template <class K = key_type, class V = mapped_type>
119
- iterator insert_or_assign(const_iterator, const key_arg<K>& k,
120
- const V& v) ABSL_ATTRIBUTE_LIFETIME_BOUND {
121
- return insert_or_assign(k, v).first;
122
- }
101
+ //
102
+ // TODO(b/402804213): Remove these macros whenever we have a better mechanism
103
+ // available to handle lifetime analysis.
104
+ #define ABSL_INTERNAL_X(Func, Callee, KQual, VQual, KValue, VValue, Tail, ...) \
105
+ template < \
106
+ typename K = key_type, class V = mapped_type, \
107
+ ABSL_INTERNAL_IF_##KValue##_NOR_##VValue( \
108
+ int = (EnableIf<LifetimeBoundKV<K, KValue, V, VValue, \
109
+ IfRRef<int KQual>::AddPtr<K>, \
110
+ IfRRef<int VQual>::AddPtr<V>>>()), \
111
+ ABSL_INTERNAL_SINGLE_ARG( \
112
+ int &..., \
113
+ decltype(EnableIf<LifetimeBoundKV<K, KValue, V, VValue>>()) = \
114
+ 0))> \
115
+ decltype(auto) Func( \
116
+ __VA_ARGS__ key_arg<K> KQual k ABSL_INTERNAL_IF_##KValue( \
117
+ ABSL_INTERNAL_ATTRIBUTE_CAPTURED_BY(this)), \
118
+ V VQual v ABSL_INTERNAL_IF_##VValue(ABSL_INTERNAL_ATTRIBUTE_CAPTURED_BY( \
119
+ this))) ABSL_ATTRIBUTE_LIFETIME_BOUND { \
120
+ return ABSL_INTERNAL_IF_##KValue##_OR_##VValue( \
121
+ (this->template Func<K, V, 0>), Callee)( \
122
+ std::forward<decltype(k)>(k), std::forward<decltype(v)>(v)) Tail; \
123
+ } \
124
+ static_assert(true, "This is to force a semicolon.")
125
+
126
+ ABSL_INTERNAL_X(insert_or_assign, insert_or_assign_impl, const &, const &,
127
+ false, false, ABSL_INTERNAL_SINGLE_ARG());
128
+ ABSL_INTERNAL_X(insert_or_assign, insert_or_assign_impl, const &, const &,
129
+ false, true, ABSL_INTERNAL_SINGLE_ARG());
130
+ ABSL_INTERNAL_X(insert_or_assign, insert_or_assign_impl, const &, const &,
131
+ true, false, ABSL_INTERNAL_SINGLE_ARG());
132
+ ABSL_INTERNAL_X(insert_or_assign, insert_or_assign_impl, const &, const &,
133
+ true, true, ABSL_INTERNAL_SINGLE_ARG());
134
+
135
+ ABSL_INTERNAL_X(insert_or_assign, insert_or_assign_impl, const &, &&, false,
136
+ false, ABSL_INTERNAL_SINGLE_ARG());
137
+ ABSL_INTERNAL_X(insert_or_assign, insert_or_assign_impl, const &, &&, false,
138
+ true, ABSL_INTERNAL_SINGLE_ARG());
139
+ ABSL_INTERNAL_X(insert_or_assign, insert_or_assign_impl, const &, &&, true,
140
+ false, ABSL_INTERNAL_SINGLE_ARG());
141
+ ABSL_INTERNAL_X(insert_or_assign, insert_or_assign_impl, const &, &&, true,
142
+ true, ABSL_INTERNAL_SINGLE_ARG());
143
+
144
+ ABSL_INTERNAL_X(insert_or_assign, insert_or_assign_impl, &&, const &, false,
145
+ false, ABSL_INTERNAL_SINGLE_ARG());
146
+ ABSL_INTERNAL_X(insert_or_assign, insert_or_assign_impl, &&, const &, false,
147
+ true, ABSL_INTERNAL_SINGLE_ARG());
148
+ ABSL_INTERNAL_X(insert_or_assign, insert_or_assign_impl, &&, const &, true,
149
+ false, ABSL_INTERNAL_SINGLE_ARG());
150
+ ABSL_INTERNAL_X(insert_or_assign, insert_or_assign_impl, &&, const &, true,
151
+ true, ABSL_INTERNAL_SINGLE_ARG());
152
+
153
+ ABSL_INTERNAL_X(insert_or_assign, insert_or_assign_impl, &&, &&, false, false,
154
+ ABSL_INTERNAL_SINGLE_ARG());
155
+ ABSL_INTERNAL_X(insert_or_assign, insert_or_assign_impl, &&, &&, false, true,
156
+ ABSL_INTERNAL_SINGLE_ARG());
157
+ ABSL_INTERNAL_X(insert_or_assign, insert_or_assign_impl, &&, &&, true, false,
158
+ ABSL_INTERNAL_SINGLE_ARG());
159
+ ABSL_INTERNAL_X(insert_or_assign, insert_or_assign_impl, &&, &&, true, true,
160
+ ABSL_INTERNAL_SINGLE_ARG());
161
+
162
+ ABSL_INTERNAL_X(insert_or_assign, insert_or_assign_impl, const &, const &,
163
+ false, false, .first, const_iterator ABSL_INTERNAL_COMMA);
164
+ ABSL_INTERNAL_X(insert_or_assign, insert_or_assign_impl, const &, const &,
165
+ false, true, .first, const_iterator ABSL_INTERNAL_COMMA);
166
+ ABSL_INTERNAL_X(insert_or_assign, insert_or_assign_impl, const &, const &,
167
+ true, false, .first, const_iterator ABSL_INTERNAL_COMMA);
168
+ ABSL_INTERNAL_X(insert_or_assign, insert_or_assign_impl, const &, const &,
169
+ true, true, .first, const_iterator ABSL_INTERNAL_COMMA);
170
+
171
+ ABSL_INTERNAL_X(insert_or_assign, insert_or_assign_impl, const &, &&, false,
172
+ false, .first, const_iterator ABSL_INTERNAL_COMMA);
173
+ ABSL_INTERNAL_X(insert_or_assign, insert_or_assign_impl, const &, &&, false,
174
+ true, .first, const_iterator ABSL_INTERNAL_COMMA);
175
+ ABSL_INTERNAL_X(insert_or_assign, insert_or_assign_impl, const &, &&, true,
176
+ false, .first, const_iterator ABSL_INTERNAL_COMMA);
177
+ ABSL_INTERNAL_X(insert_or_assign, insert_or_assign_impl, const &, &&, true,
178
+ true, .first, const_iterator ABSL_INTERNAL_COMMA);
179
+
180
+ ABSL_INTERNAL_X(insert_or_assign, insert_or_assign_impl, &&, const &, false,
181
+ false, .first, const_iterator ABSL_INTERNAL_COMMA);
182
+ ABSL_INTERNAL_X(insert_or_assign, insert_or_assign_impl, &&, const &, false,
183
+ true, .first, const_iterator ABSL_INTERNAL_COMMA);
184
+ ABSL_INTERNAL_X(insert_or_assign, insert_or_assign_impl, &&, const &, true,
185
+ false, .first, const_iterator ABSL_INTERNAL_COMMA);
186
+ ABSL_INTERNAL_X(insert_or_assign, insert_or_assign_impl, &&, const &, true,
187
+ true, .first, const_iterator ABSL_INTERNAL_COMMA);
188
+
189
+ ABSL_INTERNAL_X(insert_or_assign, insert_or_assign_impl, &&, &&, false, false,
190
+ .first, const_iterator ABSL_INTERNAL_COMMA);
191
+ ABSL_INTERNAL_X(insert_or_assign, insert_or_assign_impl, &&, &&, false, true,
192
+ .first, const_iterator ABSL_INTERNAL_COMMA);
193
+ ABSL_INTERNAL_X(insert_or_assign, insert_or_assign_impl, &&, &&, true, false,
194
+ .first, const_iterator ABSL_INTERNAL_COMMA);
195
+ ABSL_INTERNAL_X(insert_or_assign, insert_or_assign_impl, &&, &&, true, true,
196
+ .first, const_iterator ABSL_INTERNAL_COMMA);
197
+ #undef ABSL_INTERNAL_X
123
198
 
124
199
  // All `try_emplace()` overloads make the same guarantees regarding rvalue
125
200
  // arguments as `std::unordered_map::try_emplace()`, namely that these
126
201
  // functions will not move from rvalue arguments if insertions do not happen.
127
- template <class K = key_type, class... Args,
202
+ template <class K = key_type, int = EnableIf<LifetimeBoundK<K, false, K *>>(),
203
+ class... Args,
128
204
  typename std::enable_if<
129
- !std::is_convertible<K, const_iterator>::value, int>::type = 0,
130
- K* = nullptr>
131
- std::pair<iterator, bool> try_emplace(key_arg<K>&& k, Args&&... args)
205
+ !std::is_convertible<K, const_iterator>::value, int>::type = 0>
206
+ std::pair<iterator, bool> try_emplace(key_arg<K> &&k, Args &&...args)
132
207
  ABSL_ATTRIBUTE_LIFETIME_BOUND {
133
208
  return try_emplace_impl(std::forward<K>(k), std::forward<Args>(args)...);
134
209
  }
135
210
 
136
211
  template <class K = key_type, class... Args,
212
+ EnableIf<LifetimeBoundK<K, true, K *>> = 0,
137
213
  typename std::enable_if<
138
214
  !std::is_convertible<K, const_iterator>::value, int>::type = 0>
139
- std::pair<iterator, bool> try_emplace(const key_arg<K>& k, Args&&... args)
215
+ std::pair<iterator, bool> try_emplace(
216
+ key_arg<K> &&k ABSL_INTERNAL_ATTRIBUTE_CAPTURED_BY(this),
217
+ Args &&...args) ABSL_ATTRIBUTE_LIFETIME_BOUND {
218
+ return this->template try_emplace<K, 0>(std::forward<K>(k),
219
+ std::forward<Args>(args)...);
220
+ }
221
+
222
+ template <class K = key_type, int = EnableIf<LifetimeBoundK<K, false>>(),
223
+ class... Args,
224
+ typename std::enable_if<
225
+ !std::is_convertible<K, const_iterator>::value, int>::type = 0>
226
+ std::pair<iterator, bool> try_emplace(const key_arg<K> &k, Args &&...args)
140
227
  ABSL_ATTRIBUTE_LIFETIME_BOUND {
141
228
  return try_emplace_impl(k, std::forward<Args>(args)...);
142
229
  }
230
+ template <class K = key_type, class... Args,
231
+ EnableIf<LifetimeBoundK<K, true>> = 0,
232
+ typename std::enable_if<
233
+ !std::is_convertible<K, const_iterator>::value, int>::type = 0>
234
+ std::pair<iterator, bool> try_emplace(
235
+ const key_arg<K> &k ABSL_INTERNAL_ATTRIBUTE_CAPTURED_BY(this),
236
+ Args &&...args) ABSL_ATTRIBUTE_LIFETIME_BOUND {
237
+ return this->template try_emplace<K, 0>(k, std::forward<Args>(args)...);
238
+ }
143
239
 
144
- template <class K = key_type, class... Args, K* = nullptr>
145
- iterator try_emplace(const_iterator, key_arg<K>&& k,
146
- Args&&... args) ABSL_ATTRIBUTE_LIFETIME_BOUND {
240
+ template <class K = key_type, int = EnableIf<LifetimeBoundK<K, false, K *>>(),
241
+ class... Args>
242
+ iterator try_emplace(const_iterator, key_arg<K> &&k,
243
+ Args &&...args) ABSL_ATTRIBUTE_LIFETIME_BOUND {
147
244
  return try_emplace(std::forward<K>(k), std::forward<Args>(args)...).first;
148
245
  }
246
+ template <class K = key_type, class... Args,
247
+ EnableIf<LifetimeBoundK<K, true, K *>> = 0>
248
+ iterator try_emplace(const_iterator hint,
249
+ key_arg<K> &&k ABSL_INTERNAL_ATTRIBUTE_CAPTURED_BY(this),
250
+ Args &&...args) ABSL_ATTRIBUTE_LIFETIME_BOUND {
251
+ return this->template try_emplace<K, 0>(hint, std::forward<K>(k),
252
+ std::forward<Args>(args)...);
253
+ }
149
254
 
150
- template <class K = key_type, class... Args>
151
- iterator try_emplace(const_iterator, const key_arg<K>& k,
152
- Args&&... args) ABSL_ATTRIBUTE_LIFETIME_BOUND {
255
+ template <class K = key_type, int = EnableIf<LifetimeBoundK<K, false>>(),
256
+ class... Args>
257
+ iterator try_emplace(const_iterator, const key_arg<K> &k,
258
+ Args &&...args) ABSL_ATTRIBUTE_LIFETIME_BOUND {
153
259
  return try_emplace(k, std::forward<Args>(args)...).first;
154
260
  }
261
+ template <class K = key_type, class... Args,
262
+ EnableIf<LifetimeBoundK<K, true>> = 0>
263
+ iterator try_emplace(const_iterator hint,
264
+ const key_arg<K> &k
265
+ ABSL_INTERNAL_ATTRIBUTE_CAPTURED_BY(this),
266
+ Args &&...args) ABSL_ATTRIBUTE_LIFETIME_BOUND {
267
+ return this->template try_emplace<K, 0>(hint, std::forward<K>(k),
268
+ std::forward<Args>(args)...);
269
+ }
155
270
 
156
271
  template <class K = key_type, class P = Policy>
157
272
  MappedReference<P> at(const key_arg<K>& key) ABSL_ATTRIBUTE_LIFETIME_BOUND {
@@ -174,8 +289,9 @@ class raw_hash_map : public raw_hash_set<Policy, Hash, Eq, Alloc> {
174
289
  return Policy::value(&*it);
175
290
  }
176
291
 
177
- template <class K = key_type, class P = Policy, K* = nullptr>
178
- MappedReference<P> operator[](key_arg<K>&& key)
292
+ template <class K = key_type, class P = Policy,
293
+ int = EnableIf<LifetimeBoundK<K, false, K *>>()>
294
+ MappedReference<P> operator[](key_arg<K> &&key)
179
295
  ABSL_ATTRIBUTE_LIFETIME_BOUND {
180
296
  // It is safe to use unchecked_deref here because try_emplace
181
297
  // will always return an iterator pointing to a valid item in the table,
@@ -183,15 +299,30 @@ class raw_hash_map : public raw_hash_set<Policy, Hash, Eq, Alloc> {
183
299
  return Policy::value(
184
300
  &this->unchecked_deref(try_emplace(std::forward<K>(key)).first));
185
301
  }
302
+ template <class K = key_type, class P = Policy, int &...,
303
+ EnableIf<LifetimeBoundK<K, true, K *>> = 0>
304
+ MappedReference<P> operator[](
305
+ key_arg<K> &&key ABSL_INTERNAL_ATTRIBUTE_CAPTURED_BY(this))
306
+ ABSL_ATTRIBUTE_LIFETIME_BOUND {
307
+ return this->template operator[]<K, P, 0>(std::forward<K>(key));
308
+ }
186
309
 
187
- template <class K = key_type, class P = Policy>
188
- MappedReference<P> operator[](const key_arg<K>& key)
310
+ template <class K = key_type, class P = Policy,
311
+ int = EnableIf<LifetimeBoundK<K, false>>()>
312
+ MappedReference<P> operator[](const key_arg<K> &key)
189
313
  ABSL_ATTRIBUTE_LIFETIME_BOUND {
190
314
  // It is safe to use unchecked_deref here because try_emplace
191
315
  // will always return an iterator pointing to a valid item in the table,
192
316
  // since it inserts if nothing is found for the given key.
193
317
  return Policy::value(&this->unchecked_deref(try_emplace(key).first));
194
318
  }
319
+ template <class K = key_type, class P = Policy, int &...,
320
+ EnableIf<LifetimeBoundK<K, true>> = 0>
321
+ MappedReference<P> operator[](
322
+ const key_arg<K> &key ABSL_INTERNAL_ATTRIBUTE_CAPTURED_BY(this))
323
+ ABSL_ATTRIBUTE_LIFETIME_BOUND {
324
+ return this->template operator[]<K, P, 0>(key);
325
+ }
195
326
 
196
327
  private:
197
328
  template <class K, class V>