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
@@ -18,12 +18,14 @@
18
18
  #include <algorithm>
19
19
  #include <initializer_list>
20
20
  #include <iterator>
21
+ #include <type_traits>
21
22
  #include <utility>
22
23
 
23
24
  #include "absl/base/attributes.h"
24
25
  #include "absl/base/internal/throw_delegate.h"
25
26
  #include "absl/container/internal/btree.h" // IWYU pragma: export
26
27
  #include "absl/container/internal/common.h"
28
+ #include "absl/hash/internal/weakly_mixed_integer.h"
27
29
  #include "absl/memory/memory.h"
28
30
  #include "absl/meta/type_traits.h"
29
31
 
@@ -266,7 +268,8 @@ class btree_container {
266
268
  for (const auto &v : b) {
267
269
  h = State::combine(std::move(h), v);
268
270
  }
269
- return State::combine(std::move(h), b.size());
271
+ return State::combine(std::move(h),
272
+ hash_internal::WeaklyMixedInteger{b.size()});
270
273
  }
271
274
 
272
275
  protected:
@@ -451,6 +454,29 @@ class btree_map_container : public btree_set_container<Tree> {
451
454
  template <class K>
452
455
  using key_arg = typename super_type::template key_arg<K>;
453
456
 
457
+ // NOTE: The mess here is to shorten the code for the (very repetitive)
458
+ // function overloads, and to allow the lifetime-bound overloads to dispatch
459
+ // to the non-lifetime-bound overloads, to ensure there is a single source of
460
+ // truth for each overload set.
461
+ //
462
+ // Enabled if an assignment from the given type would require the
463
+ // source object to remain alive for the life of the element.
464
+ //
465
+ // TODO(b/402804213): Remove these traits and simplify the overloads whenever
466
+ // we have a better mechanism available to handle lifetime analysis.
467
+ template <class K, bool Value, typename = void>
468
+ using LifetimeBoundK =
469
+ HasValue<Value, type_traits_internal::IsLifetimeBoundAssignment<
470
+ typename Tree::key_type, K>>;
471
+ template <class M, bool Value, typename = void>
472
+ using LifetimeBoundV =
473
+ HasValue<Value, type_traits_internal::IsLifetimeBoundAssignment<
474
+ typename Tree::params_type::mapped_type, M>>;
475
+ template <class K, bool KValue, class M, bool MValue, typename... Dummy>
476
+ using LifetimeBoundKV =
477
+ absl::conjunction<LifetimeBoundK<K, KValue, absl::void_t<Dummy...>>,
478
+ LifetimeBoundV<M, MValue>>;
479
+
454
480
  public:
455
481
  using key_type = typename Tree::key_type;
456
482
  using mapped_type = typename params_type::mapped_type;
@@ -464,85 +490,163 @@ class btree_map_container : public btree_set_container<Tree> {
464
490
  using super_type::super_type;
465
491
  btree_map_container() {}
466
492
 
493
+ // TODO(b/402804213): Remove these macros whenever we have a better mechanism
494
+ // available to handle lifetime analysis.
495
+ #define ABSL_INTERNAL_X(Func, Callee, KQual, MQual, KValue, MValue, ...) \
496
+ template < \
497
+ typename K = key_type, class M, \
498
+ ABSL_INTERNAL_IF_##KValue##_NOR_##MValue( \
499
+ int = (EnableIf<LifetimeBoundKV<K, KValue, M, MValue, \
500
+ IfRRef<int KQual>::AddPtr<K>, \
501
+ IfRRef<int MQual>::AddPtr<M>>>()), \
502
+ ABSL_INTERNAL_SINGLE_ARG( \
503
+ int &..., \
504
+ decltype(EnableIf<LifetimeBoundKV<K, KValue, M, MValue>>()) = \
505
+ 0))> \
506
+ decltype(auto) Func( \
507
+ __VA_ARGS__ key_arg<K> KQual k ABSL_INTERNAL_IF_##KValue( \
508
+ ABSL_INTERNAL_ATTRIBUTE_CAPTURED_BY(this)), \
509
+ M MQual obj ABSL_INTERNAL_IF_##MValue( \
510
+ ABSL_INTERNAL_ATTRIBUTE_CAPTURED_BY(this))) \
511
+ ABSL_ATTRIBUTE_LIFETIME_BOUND { \
512
+ return ABSL_INTERNAL_IF_##KValue##_OR_##MValue( \
513
+ (this->template Func<K, M, 0>), Callee)( \
514
+ __VA_ARGS__ std::forward<decltype(k)>(k), \
515
+ std::forward<decltype(obj)>(obj)); \
516
+ } \
517
+ friend struct std::enable_if<false> /* just to force a semicolon */
467
518
  // Insertion routines.
468
519
  // Note: the nullptr template arguments and extra `const M&` overloads allow
469
520
  // for supporting bitfield arguments.
470
- template <typename K = key_type, class M>
471
- std::pair<iterator, bool> insert_or_assign(const key_arg<K> &k, const M &obj)
472
- ABSL_ATTRIBUTE_LIFETIME_BOUND {
473
- return insert_or_assign_impl(k, obj);
474
- }
475
- template <typename K = key_type, class M, K * = nullptr>
476
- std::pair<iterator, bool> insert_or_assign(key_arg<K> &&k, const M &obj)
477
- ABSL_ATTRIBUTE_LIFETIME_BOUND {
478
- return insert_or_assign_impl(std::forward<K>(k), obj);
479
- }
480
- template <typename K = key_type, class M, M * = nullptr>
481
- std::pair<iterator, bool> insert_or_assign(const key_arg<K> &k, M &&obj)
482
- ABSL_ATTRIBUTE_LIFETIME_BOUND {
483
- return insert_or_assign_impl(k, std::forward<M>(obj));
484
- }
485
- template <typename K = key_type, class M, K * = nullptr, M * = nullptr>
486
- std::pair<iterator, bool> insert_or_assign(key_arg<K> &&k, M &&obj)
487
- ABSL_ATTRIBUTE_LIFETIME_BOUND {
488
- return insert_or_assign_impl(std::forward<K>(k), std::forward<M>(obj));
489
- }
490
- template <typename K = key_type, class M>
491
- iterator insert_or_assign(const_iterator hint, const key_arg<K> &k,
492
- const M &obj) ABSL_ATTRIBUTE_LIFETIME_BOUND {
493
- return insert_or_assign_hint_impl(hint, k, obj);
494
- }
495
- template <typename K = key_type, class M, K * = nullptr>
496
- iterator insert_or_assign(const_iterator hint, key_arg<K> &&k,
497
- const M &obj) ABSL_ATTRIBUTE_LIFETIME_BOUND {
498
- return insert_or_assign_hint_impl(hint, std::forward<K>(k), obj);
499
- }
500
- template <typename K = key_type, class M, M * = nullptr>
501
- iterator insert_or_assign(const_iterator hint, const key_arg<K> &k,
502
- M &&obj) ABSL_ATTRIBUTE_LIFETIME_BOUND {
503
- return insert_or_assign_hint_impl(hint, k, std::forward<M>(obj));
504
- }
505
- template <typename K = key_type, class M, K * = nullptr, M * = nullptr>
506
- iterator insert_or_assign(const_iterator hint, key_arg<K> &&k,
507
- M &&obj) ABSL_ATTRIBUTE_LIFETIME_BOUND {
508
- return insert_or_assign_hint_impl(hint, std::forward<K>(k),
509
- std::forward<M>(obj));
510
- }
511
-
512
- template <typename K = key_type, typename... Args,
513
- typename absl::enable_if_t<
514
- !std::is_convertible<K, const_iterator>::value, int> = 0>
515
- std::pair<iterator, bool> try_emplace(const key_arg<K> &k, Args &&...args)
516
- ABSL_ATTRIBUTE_LIFETIME_BOUND {
517
- return try_emplace_impl(k, std::forward<Args>(args)...);
518
- }
519
- template <typename K = key_type, typename... Args,
520
- typename absl::enable_if_t<
521
- !std::is_convertible<K, const_iterator>::value, int> = 0>
522
- std::pair<iterator, bool> try_emplace(key_arg<K> &&k, Args &&...args)
523
- ABSL_ATTRIBUTE_LIFETIME_BOUND {
524
- return try_emplace_impl(std::forward<K>(k), std::forward<Args>(args)...);
525
- }
526
- template <typename K = key_type, typename... Args>
527
- iterator try_emplace(const_iterator hint, const key_arg<K> &k,
528
- Args &&...args) ABSL_ATTRIBUTE_LIFETIME_BOUND {
529
- return try_emplace_hint_impl(hint, k, std::forward<Args>(args)...);
530
- }
531
- template <typename K = key_type, typename... Args>
532
- iterator try_emplace(const_iterator hint, key_arg<K> &&k,
533
- Args &&...args) ABSL_ATTRIBUTE_LIFETIME_BOUND {
534
- return try_emplace_hint_impl(hint, std::forward<K>(k),
535
- std::forward<Args>(args)...);
536
- }
537
-
538
- template <typename K = key_type>
521
+ ABSL_INTERNAL_X(insert_or_assign, insert_or_assign_impl, const &, const &,
522
+ false, false);
523
+ ABSL_INTERNAL_X(insert_or_assign, insert_or_assign_impl, const &, const &,
524
+ false, true);
525
+ ABSL_INTERNAL_X(insert_or_assign, insert_or_assign_impl, const &, const &,
526
+ true, false);
527
+ ABSL_INTERNAL_X(insert_or_assign, insert_or_assign_impl, const &, const &,
528
+ true, true);
529
+
530
+ ABSL_INTERNAL_X(insert_or_assign, insert_or_assign_impl, const &, &&, false,
531
+ false);
532
+ ABSL_INTERNAL_X(insert_or_assign, insert_or_assign_impl, const &, &&, false,
533
+ true);
534
+ ABSL_INTERNAL_X(insert_or_assign, insert_or_assign_impl, const &, &&, true,
535
+ false);
536
+ ABSL_INTERNAL_X(insert_or_assign, insert_or_assign_impl, const &, &&, true,
537
+ true);
538
+
539
+ ABSL_INTERNAL_X(insert_or_assign, insert_or_assign_impl, &&, const &, false,
540
+ false);
541
+ ABSL_INTERNAL_X(insert_or_assign, insert_or_assign_impl, &&, const &, false,
542
+ true);
543
+ ABSL_INTERNAL_X(insert_or_assign, insert_or_assign_impl, &&, const &, true,
544
+ false);
545
+ ABSL_INTERNAL_X(insert_or_assign, insert_or_assign_impl, &&, const &, true,
546
+ true);
547
+
548
+ ABSL_INTERNAL_X(insert_or_assign, insert_or_assign_impl, &&, &&, false,
549
+ false);
550
+ ABSL_INTERNAL_X(insert_or_assign, insert_or_assign_impl, &&, &&, false, true);
551
+ ABSL_INTERNAL_X(insert_or_assign, insert_or_assign_impl, &&, &&, true, false);
552
+ ABSL_INTERNAL_X(insert_or_assign, insert_or_assign_impl, &&, &&, true, true);
553
+
554
+ ABSL_INTERNAL_X(insert_or_assign, insert_or_assign_hint_impl, const &,
555
+ const &, false, false,
556
+ const_iterator(hint) ABSL_INTERNAL_COMMA);
557
+ ABSL_INTERNAL_X(insert_or_assign, insert_or_assign_hint_impl, const &,
558
+ const &, false, true,
559
+ const_iterator(hint) ABSL_INTERNAL_COMMA);
560
+ ABSL_INTERNAL_X(insert_or_assign, insert_or_assign_hint_impl, const &,
561
+ const &, true, false,
562
+ const_iterator(hint) ABSL_INTERNAL_COMMA);
563
+ ABSL_INTERNAL_X(insert_or_assign, insert_or_assign_hint_impl, const &,
564
+ const &, true, true,
565
+ const_iterator(hint) ABSL_INTERNAL_COMMA);
566
+
567
+ ABSL_INTERNAL_X(insert_or_assign, insert_or_assign_hint_impl, const &, &&,
568
+ false, false, const_iterator(hint) ABSL_INTERNAL_COMMA);
569
+ ABSL_INTERNAL_X(insert_or_assign, insert_or_assign_hint_impl, const &, &&,
570
+ false, true, const_iterator(hint) ABSL_INTERNAL_COMMA);
571
+ ABSL_INTERNAL_X(insert_or_assign, insert_or_assign_hint_impl, const &, &&,
572
+ true, false, const_iterator(hint) ABSL_INTERNAL_COMMA);
573
+ ABSL_INTERNAL_X(insert_or_assign, insert_or_assign_hint_impl, const &, &&,
574
+ true, true, const_iterator(hint) ABSL_INTERNAL_COMMA);
575
+
576
+ ABSL_INTERNAL_X(insert_or_assign, insert_or_assign_hint_impl, &&, const &,
577
+ false, false, const_iterator(hint) ABSL_INTERNAL_COMMA);
578
+ ABSL_INTERNAL_X(insert_or_assign, insert_or_assign_hint_impl, &&, const &,
579
+ false, true, const_iterator(hint) ABSL_INTERNAL_COMMA);
580
+ ABSL_INTERNAL_X(insert_or_assign, insert_or_assign_hint_impl, &&, const &,
581
+ true, false, const_iterator(hint) ABSL_INTERNAL_COMMA);
582
+ ABSL_INTERNAL_X(insert_or_assign, insert_or_assign_hint_impl, &&, const &,
583
+ true, true, const_iterator(hint) ABSL_INTERNAL_COMMA);
584
+
585
+ ABSL_INTERNAL_X(insert_or_assign, insert_or_assign_hint_impl, &&, &&, false,
586
+ false, const_iterator(hint) ABSL_INTERNAL_COMMA);
587
+ ABSL_INTERNAL_X(insert_or_assign, insert_or_assign_hint_impl, &&, &&, false,
588
+ true, const_iterator(hint) ABSL_INTERNAL_COMMA);
589
+ ABSL_INTERNAL_X(insert_or_assign, insert_or_assign_hint_impl, &&, &&, true,
590
+ false, const_iterator(hint) ABSL_INTERNAL_COMMA);
591
+ ABSL_INTERNAL_X(insert_or_assign, insert_or_assign_hint_impl, &&, &&, true,
592
+ true, const_iterator(hint) ABSL_INTERNAL_COMMA);
593
+ #undef ABSL_INTERNAL_X
594
+
595
+ #define ABSL_INTERNAL_X(Func, Callee, KQual, KValue, ...) \
596
+ template < \
597
+ class K = key_type, \
598
+ ABSL_INTERNAL_IF_##KValue( \
599
+ class... Args, \
600
+ int = (EnableIf< \
601
+ LifetimeBoundK<K, KValue, IfRRef<int KQual>::AddPtr<K>>>())), \
602
+ ABSL_INTERNAL_IF_##KValue( \
603
+ decltype(EnableIf<LifetimeBoundK< \
604
+ K, KValue, IfRRef<int KQual>::AddPtr<K>>>()) = 0, \
605
+ class... Args), \
606
+ std::enable_if_t<!std::is_convertible<K, const_iterator>::value, int> = \
607
+ 0> \
608
+ decltype(auto) Func( \
609
+ __VA_ARGS__ key_arg<K> KQual k ABSL_INTERNAL_IF_##KValue( \
610
+ ABSL_INTERNAL_ATTRIBUTE_CAPTURED_BY(this)), \
611
+ Args &&...args) ABSL_ATTRIBUTE_LIFETIME_BOUND { \
612
+ return ABSL_INTERNAL_IF_##KValue((this->template Func<K, 0>), Callee)( \
613
+ __VA_ARGS__ std::forward<decltype(k)>(k), \
614
+ std::forward<decltype(args)>(args)...); \
615
+ } \
616
+ friend struct std::enable_if<false> /* just to force a semicolon */
617
+ ABSL_INTERNAL_X(try_emplace, try_emplace_impl, const &, false);
618
+ ABSL_INTERNAL_X(try_emplace, try_emplace_impl, const &, true);
619
+ ABSL_INTERNAL_X(try_emplace, try_emplace_impl, &&, false);
620
+ ABSL_INTERNAL_X(try_emplace, try_emplace_impl, &&, true);
621
+ ABSL_INTERNAL_X(try_emplace, try_emplace_hint_impl, const &, false,
622
+ const_iterator(hint) ABSL_INTERNAL_COMMA);
623
+ ABSL_INTERNAL_X(try_emplace, try_emplace_hint_impl, const &, true,
624
+ const_iterator(hint) ABSL_INTERNAL_COMMA);
625
+ ABSL_INTERNAL_X(try_emplace, try_emplace_hint_impl, &&, false,
626
+ const_iterator(hint) ABSL_INTERNAL_COMMA);
627
+ ABSL_INTERNAL_X(try_emplace, try_emplace_hint_impl, &&, true,
628
+ const_iterator(hint) ABSL_INTERNAL_COMMA);
629
+ #undef ABSL_INTERNAL_X
630
+
631
+ template <class K = key_type, int = EnableIf<LifetimeBoundK<K, false>>()>
539
632
  mapped_type &operator[](const key_arg<K> &k) ABSL_ATTRIBUTE_LIFETIME_BOUND {
540
633
  return try_emplace(k).first->second;
541
634
  }
542
- template <typename K = key_type>
635
+ template <class K = key_type, int &..., EnableIf<LifetimeBoundK<K, true>> = 0>
636
+ mapped_type &operator[](
637
+ const key_arg<K> &k ABSL_INTERNAL_ATTRIBUTE_CAPTURED_BY(this))
638
+ ABSL_ATTRIBUTE_LIFETIME_BOUND {
639
+ return this->template operator[]<K, 0>(k);
640
+ }
641
+ template <class K = key_type, int = EnableIf<LifetimeBoundK<K, false>>()>
543
642
  mapped_type &operator[](key_arg<K> &&k) ABSL_ATTRIBUTE_LIFETIME_BOUND {
544
643
  return try_emplace(std::forward<K>(k)).first->second;
545
644
  }
645
+ template <class K = key_type, int &..., EnableIf<LifetimeBoundK<K, true>> = 0>
646
+ mapped_type &operator[](key_arg<K> &&k ABSL_INTERNAL_ATTRIBUTE_CAPTURED_BY(
647
+ this)) ABSL_ATTRIBUTE_LIFETIME_BOUND {
648
+ return this->template operator[]<K, 0>(std::forward<K>(k));
649
+ }
546
650
 
547
651
  template <typename K = key_type>
548
652
  mapped_type &at(const key_arg<K> &key) ABSL_ATTRIBUTE_LIFETIME_BOUND {
@@ -21,10 +21,53 @@
21
21
  #include "absl/meta/type_traits.h"
22
22
  #include "absl/types/optional.h"
23
23
 
24
+ // TODO(b/402804213): Clean up these macros when no longer needed.
25
+ #define ABSL_INTERNAL_SINGLE_ARG(...) __VA_ARGS__
26
+
27
+ #define ABSL_INTERNAL_IF_true(if_satisfied, ...) if_satisfied
28
+ #define ABSL_INTERNAL_IF_false(if_satisfied, ...) __VA_ARGS__
29
+
30
+ #define ABSL_INTERNAL_IF_true_AND_true ABSL_INTERNAL_IF_true
31
+ #define ABSL_INTERNAL_IF_false_AND_false ABSL_INTERNAL_IF_false
32
+ #define ABSL_INTERNAL_IF_true_AND_false ABSL_INTERNAL_IF_false_AND_false
33
+ #define ABSL_INTERNAL_IF_false_AND_true ABSL_INTERNAL_IF_false_AND_false
34
+
35
+ #define ABSL_INTERNAL_IF_true_OR_true ABSL_INTERNAL_IF_true
36
+ #define ABSL_INTERNAL_IF_false_OR_false ABSL_INTERNAL_IF_false
37
+ #define ABSL_INTERNAL_IF_true_OR_false ABSL_INTERNAL_IF_true_OR_true
38
+ #define ABSL_INTERNAL_IF_false_OR_true ABSL_INTERNAL_IF_true_OR_true
39
+
40
+ #define ABSL_INTERNAL_IF_true_NOR_true ABSL_INTERNAL_IF_false_AND_false
41
+ #define ABSL_INTERNAL_IF_false_NOR_false ABSL_INTERNAL_IF_true_AND_true
42
+ #define ABSL_INTERNAL_IF_true_NOR_false ABSL_INTERNAL_IF_false_AND_true
43
+ #define ABSL_INTERNAL_IF_false_NOR_true ABSL_INTERNAL_IF_true_AND_false
44
+
45
+ #define ABSL_INTERNAL_COMMA ,
46
+
24
47
  namespace absl {
25
48
  ABSL_NAMESPACE_BEGIN
26
49
  namespace container_internal {
27
50
 
51
+ // TODO(b/402804213): Clean up these traits when no longer needed or
52
+ // deduplicate them with absl::functional_internal::EnableIf.
53
+ template <class Cond>
54
+ using EnableIf = std::enable_if_t<Cond::value, int>;
55
+
56
+ template <bool Value, class T>
57
+ using HasValue = std::conditional_t<Value, T, absl::negation<T>>;
58
+
59
+ template <class T>
60
+ struct IfRRef {
61
+ template <class Other>
62
+ using AddPtr = Other;
63
+ };
64
+
65
+ template <class T>
66
+ struct IfRRef<T&&> {
67
+ template <class Other>
68
+ using AddPtr = Other*;
69
+ };
70
+
28
71
  template <class, class = void>
29
72
  struct IsTransparent : std::false_type {};
30
73
  template <class T>
@@ -119,7 +119,7 @@ struct common_policy_traits {
119
119
  old_slot)) {
120
120
  return P::transfer(alloc, new_slot, old_slot);
121
121
  }
122
- #if defined(__cpp_lib_launder) && __cpp_lib_launder >= 201606
122
+
123
123
  // This overload returns true_type for the trait below.
124
124
  // The conditional_t is to make the enabler type dependent.
125
125
  template <class Alloc,
@@ -135,7 +135,6 @@ struct common_policy_traits {
135
135
  static_cast<const void*>(&element(old_slot)), sizeof(value_type));
136
136
  return {};
137
137
  }
138
- #endif
139
138
 
140
139
  template <class Alloc>
141
140
  static void transfer_impl(Alloc* alloc, slot_type* new_slot,
@@ -374,9 +374,6 @@ struct map_slot_policy {
374
374
  return slot->value;
375
375
  }
376
376
 
377
- // When C++17 is available, we can use std::launder to provide mutable
378
- // access to the key for use in node handle.
379
- #if defined(__cpp_lib_launder) && __cpp_lib_launder >= 201606
380
377
  static K& mutable_key(slot_type* slot) {
381
378
  // Still check for kMutableKeys so that we can avoid calling std::launder
382
379
  // unless necessary because it can interfere with optimizations.
@@ -384,9 +381,6 @@ struct map_slot_policy {
384
381
  : *std::launder(const_cast<K*>(
385
382
  std::addressof(slot->value.first)));
386
383
  }
387
- #else // !(defined(__cpp_lib_launder) && __cpp_lib_launder >= 201606)
388
- static const K& mutable_key(slot_type* slot) { return key(slot); }
389
- #endif
390
384
 
391
385
  static const K& key(const slot_type* slot) {
392
386
  return kMutableKeys::value ? slot->key : slot->value.first;
@@ -439,11 +433,17 @@ struct map_slot_policy {
439
433
  template <class Allocator>
440
434
  static auto transfer(Allocator* alloc, slot_type* new_slot,
441
435
  slot_type* old_slot) {
442
- auto is_relocatable =
443
- typename absl::is_trivially_relocatable<value_type>::type();
436
+ // This should really just be
437
+ // typename absl::is_trivially_relocatable<value_type>::type()
438
+ // but std::pair is not trivially copyable in C++23 in some standard
439
+ // library versions.
440
+ // See https://github.com/llvm/llvm-project/pull/95444 for instance.
441
+ auto is_relocatable = typename std::conjunction<
442
+ absl::is_trivially_relocatable<typename value_type::first_type>,
443
+ absl::is_trivially_relocatable<typename value_type::second_type>>::
444
+ type();
444
445
 
445
446
  emplace(new_slot);
446
- #if defined(__cpp_lib_launder) && __cpp_lib_launder >= 201606
447
447
  if (is_relocatable) {
448
448
  // TODO(b/247130232,b/251814870): remove casts after fixing warnings.
449
449
  std::memcpy(static_cast<void*>(std::launder(&new_slot->value)),
@@ -451,7 +451,6 @@ struct map_slot_policy {
451
451
  sizeof(value_type));
452
452
  return is_relocatable;
453
453
  }
454
- #endif
455
454
 
456
455
  if (kMutableKeys::value) {
457
456
  absl::allocator_traits<Allocator>::construct(
@@ -49,6 +49,7 @@
49
49
  #include <functional>
50
50
  #include <memory>
51
51
  #include <string>
52
+ #include <string_view>
52
53
  #include <type_traits>
53
54
 
54
55
  #include "absl/base/config.h"
@@ -58,10 +59,6 @@
58
59
  #include "absl/strings/cord.h"
59
60
  #include "absl/strings/string_view.h"
60
61
 
61
- #ifdef ABSL_HAVE_STD_STRING_VIEW
62
- #include <string_view>
63
- #endif
64
-
65
62
  namespace absl {
66
63
  ABSL_NAMESPACE_BEGIN
67
64
  namespace container_internal {
@@ -113,8 +110,6 @@ struct HashEq<absl::string_view> : StringHashEq {};
113
110
  template <>
114
111
  struct HashEq<absl::Cord> : StringHashEq {};
115
112
 
116
- #ifdef ABSL_HAVE_STD_STRING_VIEW
117
-
118
113
  template <typename TChar>
119
114
  struct BasicStringHash {
120
115
  using is_transparent = void;
@@ -153,8 +148,6 @@ struct HashEq<std::u32string> : BasicStringHashEq<char32_t> {};
153
148
  template <>
154
149
  struct HashEq<std::u32string_view> : BasicStringHashEq<char32_t> {};
155
150
 
156
- #endif // ABSL_HAVE_STD_STRING_VIEW
157
-
158
151
  // Supports heterogeneous lookup for pointers and smart pointers.
159
152
  template <class T>
160
153
  struct HashEq<T*> {
@@ -36,16 +36,12 @@ struct hash_policy_traits : common_policy_traits<Policy> {
36
36
 
37
37
  private:
38
38
  struct ReturnKey {
39
- // When C++17 is available, we can use std::launder to provide mutable
40
- // access to the key for use in node handle.
41
- #if defined(__cpp_lib_launder) && __cpp_lib_launder >= 201606
42
39
  template <class Key,
43
40
  absl::enable_if_t<std::is_lvalue_reference<Key>::value, int> = 0>
44
41
  static key_type& Impl(Key&& k, int) {
45
42
  return *std::launder(
46
43
  const_cast<key_type*>(std::addressof(std::forward<Key>(k))));
47
44
  }
48
- #endif
49
45
 
50
46
  template <class Key>
51
47
  static Key Impl(Key&& k, char) {