grpc 1.75.0.pre1 → 1.76.0.pre1

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 (387) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +18 -5
  3. data/include/grpc/credentials.h +21 -5
  4. data/src/core/call/call_filters.cc +4 -4
  5. data/src/core/call/call_filters.h +36 -36
  6. data/src/core/call/call_spine.h +27 -27
  7. data/src/core/call/client_call.cc +6 -5
  8. data/src/core/call/filter_fusion.h +5 -5
  9. data/src/core/call/metadata_batch.h +3 -3
  10. data/src/core/call/security_context.cc +1 -1
  11. data/src/core/call/server_call.cc +4 -4
  12. data/src/core/call/server_call.h +1 -1
  13. data/src/core/channelz/channelz.cc +12 -18
  14. data/src/core/channelz/channelz.h +32 -16
  15. data/src/core/channelz/channelz_registry.h +11 -0
  16. data/src/core/channelz/property_list.cc +18 -0
  17. data/src/core/channelz/property_list.h +10 -1
  18. data/src/core/channelz/text_encode.cc +66 -0
  19. data/src/core/channelz/text_encode.h +29 -0
  20. data/src/core/channelz/v2tov1/convert.cc +11 -0
  21. data/src/core/channelz/v2tov1/legacy_api.cc +15 -8
  22. data/src/core/channelz/ztrace_collector.h +247 -86
  23. data/src/core/client_channel/backup_poller.cc +5 -6
  24. data/src/core/client_channel/client_channel.cc +20 -13
  25. data/src/core/client_channel/client_channel_filter.cc +53 -45
  26. data/src/core/client_channel/client_channel_filter.h +2 -2
  27. data/src/core/client_channel/client_channel_internal.h +3 -4
  28. data/src/core/client_channel/config_selector.h +3 -3
  29. data/src/core/client_channel/dynamic_filters.cc +3 -3
  30. data/src/core/client_channel/global_subchannel_pool.cc +0 -37
  31. data/src/core/client_channel/global_subchannel_pool.h +0 -27
  32. data/src/core/client_channel/load_balanced_call_destination.cc +7 -7
  33. data/src/core/client_channel/local_subchannel_pool.cc +4 -4
  34. data/src/core/client_channel/retry_filter.h +3 -3
  35. data/src/core/client_channel/retry_filter_legacy_call_data.cc +5 -5
  36. data/src/core/client_channel/subchannel.cc +8 -8
  37. data/src/core/client_channel/subchannel_stream_client.cc +4 -4
  38. data/src/core/config/config_vars.cc +30 -1
  39. data/src/core/config/config_vars.h +21 -0
  40. data/src/core/config/core_configuration.cc +5 -5
  41. data/src/core/config/core_configuration.h +7 -7
  42. data/src/core/config/load_config.cc +12 -0
  43. data/src/core/config/load_config.h +2 -0
  44. data/src/core/credentials/call/call_credentials.h +2 -2
  45. data/src/core/credentials/call/call_creds_util.cc +4 -3
  46. data/src/core/credentials/call/composite/composite_call_credentials.cc +4 -4
  47. data/src/core/credentials/call/external/aws_external_account_credentials.cc +3 -3
  48. data/src/core/credentials/call/external/external_account_credentials.cc +1 -1
  49. data/src/core/credentials/call/external/url_external_account_credentials.cc +1 -1
  50. data/src/core/credentials/call/iam/iam_credentials.cc +4 -4
  51. data/src/core/credentials/call/jwt/json_token.cc +3 -3
  52. data/src/core/credentials/call/jwt/jwt_credentials.cc +2 -2
  53. data/src/core/credentials/call/jwt/jwt_verifier.cc +14 -13
  54. data/src/core/credentials/call/oauth2/oauth2_credentials.cc +20 -12
  55. data/src/core/credentials/call/plugin/plugin_credentials.cc +2 -2
  56. data/src/core/credentials/transport/alts/alts_credentials.cc +4 -4
  57. data/src/core/credentials/transport/alts/alts_security_connector.cc +14 -12
  58. data/src/core/credentials/transport/alts/grpc_alts_credentials_client_options.cc +22 -2
  59. data/src/core/credentials/transport/alts/grpc_alts_credentials_options.cc +10 -1
  60. data/src/core/credentials/transport/alts/grpc_alts_credentials_options.h +31 -0
  61. data/src/core/credentials/transport/alts/grpc_alts_credentials_server_options.cc +8 -3
  62. data/src/core/credentials/transport/composite/composite_channel_credentials.cc +5 -5
  63. data/src/core/credentials/transport/fake/fake_security_connector.cc +2 -2
  64. data/src/core/credentials/transport/google_default/google_default_credentials.cc +78 -28
  65. data/src/core/credentials/transport/insecure/insecure_security_connector.cc +3 -3
  66. data/src/core/credentials/transport/local/local_security_connector.cc +8 -8
  67. data/src/core/credentials/transport/security_connector.cc +5 -5
  68. data/src/core/credentials/transport/ssl/ssl_credentials.cc +12 -12
  69. data/src/core/credentials/transport/ssl/ssl_credentials.h +2 -2
  70. data/src/core/credentials/transport/ssl/ssl_security_connector.cc +3 -3
  71. data/src/core/credentials/transport/tls/certificate_provider_registry.cc +2 -2
  72. data/src/core/credentials/transport/tls/grpc_tls_certificate_distributor.cc +24 -24
  73. data/src/core/credentials/transport/tls/grpc_tls_certificate_provider.cc +5 -5
  74. data/src/core/credentials/transport/tls/grpc_tls_certificate_provider.h +2 -2
  75. data/src/core/credentials/transport/tls/grpc_tls_certificate_verifier.cc +2 -2
  76. data/src/core/credentials/transport/tls/grpc_tls_certificate_verifier.h +2 -2
  77. data/src/core/credentials/transport/tls/grpc_tls_credentials_options.cc +17 -17
  78. data/src/core/credentials/transport/tls/ssl_utils.cc +14 -9
  79. data/src/core/credentials/transport/tls/tls_credentials.cc +2 -2
  80. data/src/core/credentials/transport/tls/tls_security_connector.cc +11 -11
  81. data/src/core/credentials/transport/transport_credentials.cc +2 -2
  82. data/src/core/credentials/transport/transport_credentials.h +2 -2
  83. data/src/core/credentials/transport/xds/xds_credentials.cc +5 -5
  84. data/src/core/ext/filters/channel_idle/legacy_channel_idle_filter.cc +2 -0
  85. data/src/core/ext/filters/gcp_authentication/gcp_authentication_filter.cc +1 -1
  86. data/src/core/ext/filters/http/message_compress/compression_filter.cc +8 -8
  87. data/src/core/ext/filters/http/message_compress/compression_filter.h +3 -3
  88. data/src/core/ext/filters/stateful_session/stateful_session_filter.cc +7 -7
  89. data/src/core/ext/transport/chttp2/alpn/alpn.cc +2 -2
  90. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +10 -9
  91. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +10 -7
  92. data/src/core/ext/transport/chttp2/transport/bin_decoder.cc +5 -5
  93. data/src/core/ext/transport/chttp2/transport/bin_encoder.cc +6 -6
  94. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +96 -88
  95. data/src/core/ext/transport/chttp2/transport/flow_control.cc +3 -3
  96. data/src/core/ext/transport/chttp2/transport/flow_control.h +12 -7
  97. data/src/core/ext/transport/chttp2/transport/flow_control_manager.h +60 -0
  98. data/src/core/ext/transport/chttp2/transport/frame.cc +32 -10
  99. data/src/core/ext/transport/chttp2/transport/frame.h +16 -2
  100. data/src/core/ext/transport/chttp2/transport/frame_data.cc +2 -2
  101. data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +4 -4
  102. data/src/core/ext/transport/chttp2/transport/frame_ping.cc +2 -2
  103. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +2 -2
  104. data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +3 -3
  105. data/src/core/ext/transport/chttp2/transport/header_assembler.h +28 -12
  106. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +2 -2
  107. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +4 -2
  108. data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.cc +8 -8
  109. data/src/core/ext/transport/chttp2/transport/hpack_parse_result.cc +2 -2
  110. data/src/core/ext/transport/chttp2/transport/hpack_parse_result.h +2 -2
  111. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +27 -27
  112. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +2 -3
  113. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +4 -4
  114. data/src/core/ext/transport/chttp2/transport/http2_client_transport.cc +543 -366
  115. data/src/core/ext/transport/chttp2/transport/http2_client_transport.h +198 -277
  116. data/src/core/ext/transport/chttp2/transport/http2_settings_manager.cc +3 -0
  117. data/src/core/ext/transport/chttp2/transport/http2_settings_manager.h +11 -0
  118. data/src/core/ext/transport/chttp2/transport/http2_settings_promises.h +179 -0
  119. data/src/core/ext/transport/chttp2/transport/http2_transport.cc +51 -23
  120. data/src/core/ext/transport/chttp2/transport/http2_transport.h +13 -6
  121. data/src/core/ext/transport/chttp2/transport/http2_ztrace_collector.h +115 -71
  122. data/src/core/ext/transport/chttp2/transport/internal.h +6 -14
  123. data/src/core/ext/transport/chttp2/transport/message_assembler.h +7 -7
  124. data/src/core/ext/transport/chttp2/transport/parsing.cc +17 -15
  125. data/src/core/ext/transport/chttp2/transport/ping_callbacks.cc +2 -2
  126. data/src/core/ext/transport/chttp2/transport/ping_promise.cc +62 -26
  127. data/src/core/ext/transport/chttp2/transport/ping_promise.h +58 -22
  128. data/src/core/ext/transport/chttp2/transport/stream.h +207 -0
  129. data/src/core/ext/transport/chttp2/transport/stream_data_queue.h +328 -187
  130. data/src/core/ext/transport/chttp2/transport/stream_lists.cc +7 -7
  131. data/src/core/ext/transport/chttp2/transport/transport_common.cc +17 -1
  132. data/src/core/ext/transport/chttp2/transport/transport_common.h +52 -0
  133. data/src/core/ext/transport/chttp2/transport/varint.h +2 -2
  134. data/src/core/ext/transport/chttp2/transport/writable_streams.h +181 -79
  135. data/src/core/ext/transport/chttp2/transport/write_size_policy.cc +2 -2
  136. data/src/core/ext/transport/chttp2/transport/writing.cc +3 -3
  137. data/src/core/ext/transport/inproc/inproc_transport.cc +1 -1
  138. data/src/core/ext/transport/inproc/legacy_inproc_transport.cc +3 -3
  139. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/service.upb.h +740 -0
  140. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/service.upb_minitable.c +218 -0
  141. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/service.upb_minitable.h +46 -0
  142. data/src/core/ext/upb-gen/src/proto/grpc/gcp/handshaker.upb.h +87 -55
  143. data/src/core/ext/upb-gen/src/proto/grpc/gcp/handshaker.upb_minitable.c +23 -21
  144. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/channelz.upbdefs.c +80 -0
  145. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/channelz.upbdefs.h +47 -0
  146. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/service.upbdefs.c +129 -0
  147. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/service.upbdefs.h +72 -0
  148. data/src/core/filter/auth/server_auth_filter.cc +2 -2
  149. data/src/core/handshaker/handshaker.cc +3 -3
  150. data/src/core/handshaker/http_connect/http_proxy_mapper.cc +2 -2
  151. data/src/core/handshaker/security/legacy_secure_endpoint.cc +2 -2
  152. data/src/core/handshaker/security/pipelined_secure_endpoint.cc +31 -8
  153. data/src/core/handshaker/security/secure_endpoint.cc +16 -6
  154. data/src/core/handshaker/security/security_handshaker.cc +3 -3
  155. data/src/core/handshaker/tcp_connect/tcp_connect_handshaker.cc +2 -2
  156. data/src/core/lib/channel/channel_stack.cc +8 -5
  157. data/src/core/lib/channel/channel_stack.h +3 -0
  158. data/src/core/lib/channel/channel_stack_builder_impl.cc +1 -0
  159. data/src/core/lib/channel/connected_channel.cc +2 -2
  160. data/src/core/lib/channel/promise_based_filter.cc +69 -64
  161. data/src/core/lib/channel/promise_based_filter.h +16 -15
  162. data/src/core/lib/compression/compression_internal.cc +2 -2
  163. data/src/core/lib/compression/message_compress.cc +7 -7
  164. data/src/core/lib/event_engine/ares_resolver.cc +22 -20
  165. data/src/core/lib/event_engine/cf_engine/cf_engine.cc +2 -2
  166. data/src/core/lib/event_engine/cf_engine/dns_service_resolver.cc +2 -2
  167. data/src/core/lib/event_engine/cf_engine/dns_service_resolver.h +2 -2
  168. data/src/core/lib/event_engine/extensions/channelz.h +2 -2
  169. data/src/core/lib/event_engine/extensions/supports_fd.h +5 -5
  170. data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc +8 -8
  171. data/src/core/lib/event_engine/posix_engine/ev_poll_posix.cc +10 -10
  172. data/src/core/lib/event_engine/posix_engine/lockfree_event.cc +2 -2
  173. data/src/core/lib/event_engine/posix_engine/posix_endpoint.cc +23 -22
  174. data/src/core/lib/event_engine/posix_engine/posix_endpoint.h +11 -11
  175. data/src/core/lib/event_engine/posix_engine/posix_engine.cc +168 -170
  176. data/src/core/lib/event_engine/posix_engine/posix_engine.h +33 -54
  177. data/src/core/lib/event_engine/posix_engine/posix_engine_listener.cc +4 -3
  178. data/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.cc +5 -5
  179. data/src/core/lib/event_engine/posix_engine/posix_interface.h +1 -1
  180. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.cc +1 -1
  181. data/src/core/lib/event_engine/posix_engine/timer_manager.cc +3 -3
  182. data/src/core/lib/event_engine/resolved_address.cc +3 -3
  183. data/src/core/lib/event_engine/shim.cc +8 -11
  184. data/src/core/lib/event_engine/shim.h +2 -1
  185. data/src/core/lib/event_engine/slice.cc +2 -2
  186. data/src/core/lib/event_engine/tcp_socket_utils.cc +11 -11
  187. data/src/core/lib/event_engine/thread_pool/work_stealing_thread_pool.cc +7 -7
  188. data/src/core/lib/event_engine/windows/grpc_polled_fd_windows.cc +31 -31
  189. data/src/core/lib/event_engine/windows/iocp.cc +10 -10
  190. data/src/core/lib/event_engine/windows/win_socket.cc +6 -6
  191. data/src/core/lib/event_engine/windows/windows_endpoint.cc +11 -11
  192. data/src/core/lib/event_engine/windows/windows_engine.cc +16 -14
  193. data/src/core/lib/event_engine/windows/windows_listener.cc +7 -7
  194. data/src/core/lib/experiments/experiments.cc +105 -18
  195. data/src/core/lib/experiments/experiments.h +43 -11
  196. data/src/core/lib/iomgr/call_combiner.cc +3 -3
  197. data/src/core/lib/iomgr/endpoint_cfstream.cc +6 -6
  198. data/src/core/lib/iomgr/endpoint_pair_posix.cc +5 -5
  199. data/src/core/lib/iomgr/endpoint_pair_windows.cc +15 -14
  200. data/src/core/lib/iomgr/ev_epoll1_linux.cc +15 -15
  201. data/src/core/lib/iomgr/ev_poll_posix.cc +11 -11
  202. data/src/core/lib/iomgr/event_engine_shims/endpoint.cc +5 -4
  203. data/src/core/lib/iomgr/event_engine_shims/endpoint.h +1 -1
  204. data/src/core/lib/iomgr/iocp_windows.cc +8 -8
  205. data/src/core/lib/iomgr/iomgr_windows.cc +3 -3
  206. data/src/core/lib/iomgr/lockfree_event.cc +2 -2
  207. data/src/core/lib/iomgr/polling_entity.cc +3 -3
  208. data/src/core/lib/iomgr/socket_utils_common_posix.cc +2 -2
  209. data/src/core/lib/iomgr/socket_windows.cc +4 -4
  210. data/src/core/lib/iomgr/tcp_client_posix.cc +4 -4
  211. data/src/core/lib/iomgr/tcp_client_windows.cc +4 -4
  212. data/src/core/lib/iomgr/tcp_posix.cc +42 -42
  213. data/src/core/lib/iomgr/tcp_server.cc +5 -0
  214. data/src/core/lib/iomgr/tcp_server.h +7 -0
  215. data/src/core/lib/iomgr/tcp_server_posix.cc +47 -27
  216. data/src/core/lib/iomgr/tcp_server_utils_posix.h +3 -0
  217. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +5 -5
  218. data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +2 -2
  219. data/src/core/lib/iomgr/tcp_server_windows.cc +68 -29
  220. data/src/core/lib/iomgr/tcp_windows.cc +7 -7
  221. data/src/core/lib/iomgr/timer_generic.cc +2 -2
  222. data/src/core/lib/iomgr/timer_manager.cc +2 -2
  223. data/src/core/lib/iomgr/unix_sockets_posix.cc +2 -2
  224. data/src/core/lib/iomgr/unix_sockets_posix_noop.cc +2 -2
  225. data/src/core/lib/promise/activity.cc +2 -2
  226. data/src/core/lib/promise/activity.h +6 -6
  227. data/src/core/lib/promise/context.h +2 -2
  228. data/src/core/lib/promise/detail/join_state.h +9 -9
  229. data/src/core/lib/promise/detail/seq_state.h +13 -13
  230. data/src/core/lib/promise/detail/status.h +2 -2
  231. data/src/core/lib/promise/for_each.h +5 -5
  232. data/src/core/lib/promise/interceptor_list.h +2 -2
  233. data/src/core/lib/promise/latch.h +7 -7
  234. data/src/core/lib/promise/mpsc.cc +26 -26
  235. data/src/core/lib/promise/mpsc.h +2 -2
  236. data/src/core/lib/promise/observable.h +4 -4
  237. data/src/core/lib/promise/party.cc +32 -25
  238. data/src/core/lib/promise/party.h +16 -19
  239. data/src/core/lib/promise/pipe.h +15 -15
  240. data/src/core/lib/promise/poll.h +5 -4
  241. data/src/core/lib/promise/promise.h +0 -2
  242. data/src/core/lib/promise/sleep.cc +3 -1
  243. data/src/core/lib/promise/status_flag.h +7 -7
  244. data/src/core/lib/promise/try_join.h +2 -2
  245. data/src/core/lib/promise/try_seq.h +2 -2
  246. data/src/core/lib/resource_quota/arena.h +15 -2
  247. data/src/core/lib/resource_quota/connection_quota.cc +9 -7
  248. data/src/core/lib/resource_quota/memory_quota.cc +45 -24
  249. data/src/core/lib/resource_quota/memory_quota.h +48 -16
  250. data/src/core/lib/resource_quota/telemetry.h +54 -0
  251. data/src/core/lib/resource_quota/thread_quota.cc +2 -2
  252. data/src/core/lib/resource_tracker/resource_tracker.cc +33 -0
  253. data/src/core/lib/resource_tracker/resource_tracker.h +46 -0
  254. data/src/core/lib/security/authorization/audit_logging.cc +5 -5
  255. data/src/core/lib/security/authorization/grpc_authorization_engine.cc +2 -2
  256. data/src/core/lib/security/authorization/stdout_logger.cc +3 -3
  257. data/src/core/lib/surface/byte_buffer_reader.cc +2 -2
  258. data/src/core/lib/surface/call.cc +16 -14
  259. data/src/core/lib/surface/call.h +1 -1
  260. data/src/core/lib/surface/call_utils.cc +2 -2
  261. data/src/core/lib/surface/call_utils.h +2 -2
  262. data/src/core/lib/surface/channel.cc +4 -4
  263. data/src/core/lib/surface/channel_create.cc +10 -6
  264. data/src/core/lib/surface/channel_init.cc +80 -23
  265. data/src/core/lib/surface/channel_init.h +26 -11
  266. data/src/core/lib/surface/completion_queue.cc +17 -16
  267. data/src/core/lib/surface/completion_queue_factory.cc +7 -7
  268. data/src/core/lib/surface/connection_context.h +45 -2
  269. data/src/core/lib/surface/filter_stack_call.cc +12 -23
  270. data/src/core/lib/surface/filter_stack_call.h +3 -4
  271. data/src/core/lib/surface/legacy_channel.cc +7 -7
  272. data/src/core/lib/surface/validate_metadata.h +2 -2
  273. data/src/core/lib/surface/version.cc +2 -2
  274. data/src/core/lib/transport/bdp_estimator.cc +2 -2
  275. data/src/core/lib/transport/bdp_estimator.h +3 -3
  276. data/src/core/lib/transport/promise_endpoint.cc +3 -3
  277. data/src/core/lib/transport/promise_endpoint.h +8 -8
  278. data/src/core/lib/transport/timeout_encoding.cc +4 -4
  279. data/src/core/load_balancing/child_policy_handler.cc +4 -4
  280. data/src/core/load_balancing/endpoint_list.cc +2 -2
  281. data/src/core/load_balancing/grpclb/grpclb.cc +24 -24
  282. data/src/core/load_balancing/health_check_client.cc +4 -4
  283. data/src/core/load_balancing/health_check_client_internal.h +2 -2
  284. data/src/core/load_balancing/lb_policy_registry.cc +2 -2
  285. data/src/core/load_balancing/oob_backend_metric.cc +4 -4
  286. data/src/core/load_balancing/oob_backend_metric_internal.h +2 -2
  287. data/src/core/load_balancing/outlier_detection/outlier_detection.cc +2 -2
  288. data/src/core/load_balancing/pick_first/pick_first.cc +14 -14
  289. data/src/core/load_balancing/priority/priority.cc +23 -24
  290. data/src/core/load_balancing/ring_hash/ring_hash.cc +3 -3
  291. data/src/core/load_balancing/rls/rls.cc +13 -13
  292. data/src/core/load_balancing/round_robin/round_robin.cc +9 -9
  293. data/src/core/load_balancing/weighted_round_robin/static_stride_scheduler.cc +3 -3
  294. data/src/core/load_balancing/weighted_round_robin/weighted_round_robin.cc +33 -26
  295. data/src/core/load_balancing/weighted_target/weighted_target.cc +5 -5
  296. data/src/core/load_balancing/xds/cds.cc +76 -32
  297. data/src/core/load_balancing/xds/xds_cluster_impl.cc +3 -3
  298. data/src/core/load_balancing/xds/xds_override_host.cc +4 -4
  299. data/src/core/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +2 -2
  300. data/src/core/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +33 -33
  301. data/src/core/resolver/dns/c_ares/grpc_ares_wrapper.cc +10 -10
  302. data/src/core/resolver/dns/dns_resolver_plugin.cc +6 -3
  303. data/src/core/resolver/dns/event_engine/event_engine_client_channel_resolver.cc +2 -2
  304. data/src/core/resolver/endpoint_addresses.cc +3 -3
  305. data/src/core/resolver/endpoint_addresses.h +3 -0
  306. data/src/core/resolver/fake/fake_resolver.cc +2 -2
  307. data/src/core/resolver/google_c2p/google_c2p_resolver.cc +41 -54
  308. data/src/core/resolver/polling_resolver.cc +3 -3
  309. data/src/core/resolver/resolver_registry.cc +5 -4
  310. data/src/core/resolver/xds/xds_dependency_manager.cc +5 -5
  311. data/src/core/resolver/xds/xds_resolver.cc +9 -9
  312. data/src/core/server/server.cc +38 -38
  313. data/src/core/server/server_call_tracer_filter.h +4 -4
  314. data/src/core/server/server_config_selector_filter.cc +2 -2
  315. data/src/core/server/xds_server_config_fetcher.cc +9 -8
  316. data/src/core/service_config/service_config_impl.h +2 -2
  317. data/src/core/telemetry/call_tracer.cc +39 -49
  318. data/src/core/telemetry/call_tracer.h +199 -22
  319. data/src/core/telemetry/histogram.h +205 -0
  320. data/src/core/telemetry/instrument.cc +719 -0
  321. data/src/core/telemetry/instrument.h +932 -0
  322. data/src/core/telemetry/metrics.cc +13 -5
  323. data/src/core/telemetry/metrics.h +3 -1
  324. data/src/core/telemetry/stats_data.cc +0 -19
  325. data/src/core/telemetry/stats_data.h +0 -19
  326. data/src/core/transport/auth_context.cc +2 -2
  327. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +78 -45
  328. data/src/core/tsi/alts/handshaker/alts_handshaker_client.h +1 -0
  329. data/src/core/tsi/alts/handshaker/alts_shared_resource.cc +3 -3
  330. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +39 -31
  331. data/src/core/tsi/alts/handshaker/alts_tsi_utils.cc +3 -3
  332. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_integrity_only_record_protocol.cc +3 -3
  333. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.cc +7 -7
  334. data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +3 -3
  335. data/src/core/tsi/fake_transport_security.cc +4 -4
  336. data/src/core/tsi/ssl/key_logging/ssl_key_logging.cc +4 -4
  337. data/src/core/tsi/ssl/session_cache/ssl_session_cache.cc +9 -9
  338. data/src/core/tsi/ssl/session_cache/ssl_session_openssl.cc +3 -3
  339. data/src/core/tsi/ssl_transport_security.cc +26 -25
  340. data/src/core/tsi/ssl_transport_security_utils.cc +9 -9
  341. data/src/core/util/chunked_vector.h +4 -4
  342. data/src/core/util/event_log.cc +2 -2
  343. data/src/core/util/gcp_metadata_query.cc +2 -2
  344. data/src/core/util/grpc_check.cc +22 -0
  345. data/src/core/util/grpc_check.h +103 -0
  346. data/src/core/util/http_client/httpcli.cc +3 -3
  347. data/src/core/util/http_client/parser.cc +4 -4
  348. data/src/core/util/latent_see.h +7 -4
  349. data/src/core/util/lru_cache.h +4 -4
  350. data/src/core/util/memory_usage.h +16 -0
  351. data/src/core/util/posix/directory_reader.cc +3 -2
  352. data/src/core/util/posix/sync.cc +24 -24
  353. data/src/core/util/postmortem_emit.cc +52 -0
  354. data/src/core/util/postmortem_emit.h +30 -0
  355. data/src/core/util/ref_counted_ptr.h +5 -0
  356. data/src/core/util/trie_lookup.h +170 -0
  357. data/src/core/util/unique_ptr_with_bitset.h +5 -5
  358. data/src/core/xds/grpc/xds_bootstrap_grpc.h +6 -1
  359. data/src/core/xds/grpc/xds_certificate_provider.cc +3 -3
  360. data/src/core/xds/grpc/xds_client_grpc.cc +34 -15
  361. data/src/core/xds/grpc/xds_client_grpc.h +4 -1
  362. data/src/core/xds/grpc/xds_cluster_parser.cc +2 -2
  363. data/src/core/xds/grpc/xds_cluster_specifier_plugin.cc +2 -2
  364. data/src/core/xds/grpc/xds_endpoint_parser.cc +2 -2
  365. data/src/core/xds/grpc/xds_http_filter_registry.cc +4 -3
  366. data/src/core/xds/grpc/xds_listener_parser.cc +3 -3
  367. data/src/core/xds/grpc/xds_matcher.cc +277 -0
  368. data/src/core/xds/grpc/xds_matcher.h +432 -0
  369. data/src/core/xds/grpc/xds_matcher_action.cc +47 -0
  370. data/src/core/xds/grpc/xds_matcher_action.h +48 -0
  371. data/src/core/xds/grpc/xds_matcher_context.cc +29 -0
  372. data/src/core/xds/grpc/xds_matcher_context.h +46 -0
  373. data/src/core/xds/grpc/xds_matcher_input.cc +79 -0
  374. data/src/core/xds/grpc/xds_matcher_input.h +105 -0
  375. data/src/core/xds/grpc/xds_matcher_parse.cc +356 -0
  376. data/src/core/xds/grpc/xds_matcher_parse.h +39 -0
  377. data/src/core/xds/grpc/xds_metadata.cc +4 -3
  378. data/src/core/xds/grpc/xds_route_config_parser.cc +6 -6
  379. data/src/core/xds/grpc/xds_routing.cc +3 -3
  380. data/src/core/xds/grpc/xds_transport_grpc.cc +10 -10
  381. data/src/core/xds/xds_client/lrs_client.cc +6 -6
  382. data/src/core/xds/xds_client/xds_client.cc +9 -9
  383. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +2 -2
  384. data/src/ruby/lib/grpc/version.rb +1 -1
  385. data/third_party/abseil-cpp/absl/container/internal/node_slot_policy.h +95 -0
  386. data/third_party/abseil-cpp/absl/container/node_hash_map.h +687 -0
  387. metadata +37 -2
@@ -0,0 +1,687 @@
1
+ // Copyright 2018 The Abseil Authors.
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // https://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+ //
15
+ // -----------------------------------------------------------------------------
16
+ // File: node_hash_map.h
17
+ // -----------------------------------------------------------------------------
18
+ //
19
+ // An `absl::node_hash_map<K, V>` is an unordered associative container of
20
+ // unique keys and associated values designed to be a more efficient replacement
21
+ // for `std::unordered_map`. Like `unordered_map`, search, insertion, and
22
+ // deletion of map elements can be done as an `O(1)` operation. However,
23
+ // `node_hash_map` (and other unordered associative containers known as the
24
+ // collection of Abseil "Swiss tables") contain other optimizations that result
25
+ // in both memory and computation advantages.
26
+ //
27
+ // In most cases, your default choice for a hash map should be a map of type
28
+ // `flat_hash_map`. However, if you need pointer stability and cannot store
29
+ // a `flat_hash_map` with `unique_ptr` elements, a `node_hash_map` may be a
30
+ // valid alternative. As well, if you are migrating your code from using
31
+ // `std::unordered_map`, a `node_hash_map` provides a more straightforward
32
+ // migration, because it guarantees pointer stability. Consider migrating to
33
+ // `node_hash_map` and perhaps converting to a more efficient `flat_hash_map`
34
+ // upon further review.
35
+ //
36
+ // `node_hash_map` is not exception-safe.
37
+
38
+ #ifndef ABSL_CONTAINER_NODE_HASH_MAP_H_
39
+ #define ABSL_CONTAINER_NODE_HASH_MAP_H_
40
+
41
+ #include <cstddef>
42
+ #include <memory>
43
+ #include <type_traits>
44
+ #include <utility>
45
+
46
+ #include "absl/algorithm/container.h"
47
+ #include "absl/base/attributes.h"
48
+ #include "absl/container/hash_container_defaults.h"
49
+ #include "absl/container/internal/container_memory.h"
50
+ #include "absl/container/internal/node_slot_policy.h"
51
+ #include "absl/container/internal/raw_hash_map.h" // IWYU pragma: export
52
+ #include "absl/memory/memory.h"
53
+ #include "absl/meta/type_traits.h"
54
+
55
+ namespace absl {
56
+ ABSL_NAMESPACE_BEGIN
57
+ namespace container_internal {
58
+ template <class Key, class Value>
59
+ class NodeHashMapPolicy;
60
+ } // namespace container_internal
61
+
62
+ // -----------------------------------------------------------------------------
63
+ // absl::node_hash_map
64
+ // -----------------------------------------------------------------------------
65
+ //
66
+ // An `absl::node_hash_map<K, V>` is an unordered associative container which
67
+ // has been optimized for both speed and memory footprint in most common use
68
+ // cases. Its interface is similar to that of `std::unordered_map<K, V>` with
69
+ // the following notable differences:
70
+ //
71
+ // * Supports heterogeneous lookup, through `find()`, `operator[]()` and
72
+ // `insert()`, provided that the map is provided a compatible heterogeneous
73
+ // hashing function and equality operator. See below for details.
74
+ // * Contains a `capacity()` member function indicating the number of element
75
+ // slots (open, deleted, and empty) within the hash map.
76
+ // * Returns `void` from the `erase(iterator)` overload.
77
+ //
78
+ // By default, `node_hash_map` uses the `absl::Hash` hashing framework.
79
+ // All fundamental and Abseil types that support the `absl::Hash` framework have
80
+ // a compatible equality operator for comparing insertions into `node_hash_map`.
81
+ // If your type is not yet supported by the `absl::Hash` framework, see
82
+ // absl/hash/hash.h for information on extending Abseil hashing to user-defined
83
+ // types.
84
+ //
85
+ // Using `absl::node_hash_map` at interface boundaries in dynamically loaded
86
+ // libraries (e.g. .dll, .so) is unsupported due to way `absl::Hash` values may
87
+ // be randomized across dynamically loaded libraries.
88
+ //
89
+ // To achieve heterogeneous lookup for custom types either `Hash` and `Eq` type
90
+ // parameters can be used or `T` should have public inner types
91
+ // `absl_container_hash` and (optionally) `absl_container_eq`. In either case,
92
+ // `typename Hash::is_transparent` and `typename Eq::is_transparent` should be
93
+ // well-formed. Both types are basically functors:
94
+ // * `Hash` should support `size_t operator()(U val) const` that returns a hash
95
+ // for the given `val`.
96
+ // * `Eq` should support `bool operator()(U lhs, V rhs) const` that returns true
97
+ // if `lhs` is equal to `rhs`.
98
+ //
99
+ // In most cases `T` needs only to provide the `absl_container_hash`. In this
100
+ // case `std::equal_to<void>` will be used instead of `eq` part.
101
+ //
102
+ // PERFORMANCE WARNING: Erasure & sparsity can negatively affect performance:
103
+ // * Iteration takes O(capacity) time, not O(size).
104
+ // * erase() slows down begin() and ++iterator.
105
+ // * Capacity only shrinks on rehash() or clear() -- not on erase().
106
+ //
107
+ // Example:
108
+ //
109
+ // // Create a node hash map of three strings (that map to strings)
110
+ // absl::node_hash_map<std::string, std::string> ducks =
111
+ // {{"a", "huey"}, {"b", "dewey"}, {"c", "louie"}};
112
+ //
113
+ // // Insert a new element into the node hash map
114
+ // ducks.insert({"d", "donald"}};
115
+ //
116
+ // // Force a rehash of the node hash map
117
+ // ducks.rehash(0);
118
+ //
119
+ // // Find the element with the key "b"
120
+ // std::string search_key = "b";
121
+ // auto result = ducks.find(search_key);
122
+ // if (result != ducks.end()) {
123
+ // std::cout << "Result: " << result->second << std::endl;
124
+ // }
125
+ template <class Key, class Value, class Hash = DefaultHashContainerHash<Key>,
126
+ class Eq = DefaultHashContainerEq<Key>,
127
+ class Alloc = std::allocator<std::pair<const Key, Value>>>
128
+ class ABSL_ATTRIBUTE_OWNER node_hash_map
129
+ : public absl::container_internal::raw_hash_map<
130
+ absl::container_internal::NodeHashMapPolicy<Key, Value>, Hash, Eq,
131
+ Alloc> {
132
+ using Base = typename node_hash_map::raw_hash_map;
133
+
134
+ public:
135
+ // Constructors and Assignment Operators
136
+ //
137
+ // A node_hash_map supports the same overload set as `std::unordered_map`
138
+ // for construction and assignment:
139
+ //
140
+ // * Default constructor
141
+ //
142
+ // // No allocation for the table's elements is made.
143
+ // absl::node_hash_map<int, std::string> map1;
144
+ //
145
+ // * Initializer List constructor
146
+ //
147
+ // absl::node_hash_map<int, std::string> map2 =
148
+ // {{1, "huey"}, {2, "dewey"}, {3, "louie"},};
149
+ //
150
+ // * Copy constructor
151
+ //
152
+ // absl::node_hash_map<int, std::string> map3(map2);
153
+ //
154
+ // * Copy assignment operator
155
+ //
156
+ // // Hash functor and Comparator are copied as well
157
+ // absl::node_hash_map<int, std::string> map4;
158
+ // map4 = map3;
159
+ //
160
+ // * Move constructor
161
+ //
162
+ // // Move is guaranteed efficient
163
+ // absl::node_hash_map<int, std::string> map5(std::move(map4));
164
+ //
165
+ // * Move assignment operator
166
+ //
167
+ // // May be efficient if allocators are compatible
168
+ // absl::node_hash_map<int, std::string> map6;
169
+ // map6 = std::move(map5);
170
+ //
171
+ // * Range constructor
172
+ //
173
+ // std::vector<std::pair<int, std::string>> v = {{1, "a"}, {2, "b"}};
174
+ // absl::node_hash_map<int, std::string> map7(v.begin(), v.end());
175
+ node_hash_map() {}
176
+ using Base::Base;
177
+
178
+ // node_hash_map::begin()
179
+ //
180
+ // Returns an iterator to the beginning of the `node_hash_map`.
181
+ using Base::begin;
182
+
183
+ // node_hash_map::cbegin()
184
+ //
185
+ // Returns a const iterator to the beginning of the `node_hash_map`.
186
+ using Base::cbegin;
187
+
188
+ // node_hash_map::cend()
189
+ //
190
+ // Returns a const iterator to the end of the `node_hash_map`.
191
+ using Base::cend;
192
+
193
+ // node_hash_map::end()
194
+ //
195
+ // Returns an iterator to the end of the `node_hash_map`.
196
+ using Base::end;
197
+
198
+ // node_hash_map::capacity()
199
+ //
200
+ // Returns the number of element slots (assigned, deleted, and empty)
201
+ // available within the `node_hash_map`.
202
+ //
203
+ // NOTE: this member function is particular to `absl::node_hash_map` and is
204
+ // not provided in the `std::unordered_map` API.
205
+ using Base::capacity;
206
+
207
+ // node_hash_map::empty()
208
+ //
209
+ // Returns whether or not the `node_hash_map` is empty.
210
+ using Base::empty;
211
+
212
+ // node_hash_map::max_size()
213
+ //
214
+ // Returns the largest theoretical possible number of elements within a
215
+ // `node_hash_map` under current memory constraints. This value can be thought
216
+ // of as the largest value of `std::distance(begin(), end())` for a
217
+ // `node_hash_map<K, V>`.
218
+ using Base::max_size;
219
+
220
+ // node_hash_map::size()
221
+ //
222
+ // Returns the number of elements currently within the `node_hash_map`.
223
+ using Base::size;
224
+
225
+ // node_hash_map::clear()
226
+ //
227
+ // Removes all elements from the `node_hash_map`. Invalidates any references,
228
+ // pointers, or iterators referring to contained elements.
229
+ //
230
+ // NOTE: this operation may shrink the underlying buffer. To avoid shrinking
231
+ // the underlying buffer call `erase(begin(), end())`.
232
+ using Base::clear;
233
+
234
+ // node_hash_map::erase()
235
+ //
236
+ // Erases elements within the `node_hash_map`. Erasing does not trigger a
237
+ // rehash. Overloads are listed below.
238
+ //
239
+ // void erase(const_iterator pos):
240
+ //
241
+ // Erases the element at `position` of the `node_hash_map`, returning
242
+ // `void`.
243
+ //
244
+ // NOTE: Returning `void` in this case is different than that of STL
245
+ // containers in general and `std::unordered_map` in particular (which
246
+ // return an iterator to the element following the erased element). If that
247
+ // iterator is needed, simply post increment the iterator:
248
+ //
249
+ // map.erase(it++);
250
+ //
251
+ //
252
+ // iterator erase(const_iterator first, const_iterator last):
253
+ //
254
+ // Erases the elements in the open interval [`first`, `last`), returning an
255
+ // iterator pointing to `last`. The special case of calling
256
+ // `erase(begin(), end())` resets the reserved growth such that if
257
+ // `reserve(N)` has previously been called and there has been no intervening
258
+ // call to `clear()`, then after calling `erase(begin(), end())`, it is safe
259
+ // to assume that inserting N elements will not cause a rehash.
260
+ //
261
+ // size_type erase(const key_type& key):
262
+ //
263
+ // Erases the element with the matching key, if it exists, returning the
264
+ // number of elements erased (0 or 1).
265
+ using Base::erase;
266
+
267
+ // node_hash_map::insert()
268
+ //
269
+ // Inserts an element of the specified value into the `node_hash_map`,
270
+ // returning an iterator pointing to the newly inserted element, provided that
271
+ // an element with the given key does not already exist. If rehashing occurs
272
+ // due to the insertion, all iterators are invalidated. Overloads are listed
273
+ // below.
274
+ //
275
+ // std::pair<iterator,bool> insert(const init_type& value):
276
+ //
277
+ // Inserts a value into the `node_hash_map`. Returns a pair consisting of an
278
+ // iterator to the inserted element (or to the element that prevented the
279
+ // insertion) and a `bool` denoting whether the insertion took place.
280
+ //
281
+ // std::pair<iterator,bool> insert(T&& value):
282
+ // std::pair<iterator,bool> insert(init_type&& value):
283
+ //
284
+ // Inserts a moveable value into the `node_hash_map`. Returns a `std::pair`
285
+ // consisting of an iterator to the inserted element (or to the element that
286
+ // prevented the insertion) and a `bool` denoting whether the insertion took
287
+ // place.
288
+ //
289
+ // iterator insert(const_iterator hint, const init_type& value):
290
+ // iterator insert(const_iterator hint, T&& value):
291
+ // iterator insert(const_iterator hint, init_type&& value);
292
+ //
293
+ // Inserts a value, using the position of `hint` as a non-binding suggestion
294
+ // for where to begin the insertion search. Returns an iterator to the
295
+ // inserted element, or to the existing element that prevented the
296
+ // insertion.
297
+ //
298
+ // void insert(InputIterator first, InputIterator last):
299
+ //
300
+ // Inserts a range of values [`first`, `last`).
301
+ //
302
+ // NOTE: Although the STL does not specify which element may be inserted if
303
+ // multiple keys compare equivalently, for `node_hash_map` we guarantee the
304
+ // first match is inserted.
305
+ //
306
+ // void insert(std::initializer_list<init_type> ilist):
307
+ //
308
+ // Inserts the elements within the initializer list `ilist`.
309
+ //
310
+ // NOTE: Although the STL does not specify which element may be inserted if
311
+ // multiple keys compare equivalently within the initializer list, for
312
+ // `node_hash_map` we guarantee the first match is inserted.
313
+ using Base::insert;
314
+
315
+ // node_hash_map::insert_or_assign()
316
+ //
317
+ // Inserts an element of the specified value into the `node_hash_map` provided
318
+ // that a value with the given key does not already exist, or replaces it with
319
+ // the element value if a key for that value already exists, returning an
320
+ // iterator pointing to the newly inserted element. If rehashing occurs due to
321
+ // the insertion, all iterators are invalidated. Overloads are listed
322
+ // below.
323
+ //
324
+ // std::pair<iterator, bool> insert_or_assign(const init_type& k, T&& obj):
325
+ // std::pair<iterator, bool> insert_or_assign(init_type&& k, T&& obj):
326
+ //
327
+ // Inserts/Assigns (or moves) the element of the specified key into the
328
+ // `node_hash_map`.
329
+ //
330
+ // iterator insert_or_assign(const_iterator hint,
331
+ // const init_type& k, T&& obj):
332
+ // iterator insert_or_assign(const_iterator hint, init_type&& k, T&& obj):
333
+ //
334
+ // Inserts/Assigns (or moves) the element of the specified key into the
335
+ // `node_hash_map` using the position of `hint` as a non-binding suggestion
336
+ // for where to begin the insertion search.
337
+ using Base::insert_or_assign;
338
+
339
+ // node_hash_map::emplace()
340
+ //
341
+ // Inserts an element of the specified value by constructing it in-place
342
+ // within the `node_hash_map`, provided that no element with the given key
343
+ // already exists.
344
+ //
345
+ // The element may be constructed even if there already is an element with the
346
+ // key in the container, in which case the newly constructed element will be
347
+ // destroyed immediately. Prefer `try_emplace()` unless your key is not
348
+ // copyable or moveable.
349
+ //
350
+ // If rehashing occurs due to the insertion, all iterators are invalidated.
351
+ using Base::emplace;
352
+
353
+ // node_hash_map::emplace_hint()
354
+ //
355
+ // Inserts an element of the specified value by constructing it in-place
356
+ // within the `node_hash_map`, using the position of `hint` as a non-binding
357
+ // suggestion for where to begin the insertion search, and only inserts
358
+ // provided that no element with the given key already exists.
359
+ //
360
+ // The element may be constructed even if there already is an element with the
361
+ // key in the container, in which case the newly constructed element will be
362
+ // destroyed immediately. Prefer `try_emplace()` unless your key is not
363
+ // copyable or moveable.
364
+ //
365
+ // If rehashing occurs due to the insertion, all iterators are invalidated.
366
+ using Base::emplace_hint;
367
+
368
+ // node_hash_map::try_emplace()
369
+ //
370
+ // Inserts an element of the specified value by constructing it in-place
371
+ // within the `node_hash_map`, provided that no element with the given key
372
+ // already exists. Unlike `emplace()`, if an element with the given key
373
+ // already exists, we guarantee that no element is constructed.
374
+ //
375
+ // If rehashing occurs due to the insertion, all iterators are invalidated.
376
+ // Overloads are listed below.
377
+ //
378
+ // std::pair<iterator, bool> try_emplace(const key_type& k, Args&&... args):
379
+ // std::pair<iterator, bool> try_emplace(key_type&& k, Args&&... args):
380
+ //
381
+ // Inserts (via copy or move) the element of the specified key into the
382
+ // `node_hash_map`.
383
+ //
384
+ // iterator try_emplace(const_iterator hint,
385
+ // const key_type& k, Args&&... args):
386
+ // iterator try_emplace(const_iterator hint, key_type&& k, Args&&... args):
387
+ //
388
+ // Inserts (via copy or move) the element of the specified key into the
389
+ // `node_hash_map` using the position of `hint` as a non-binding suggestion
390
+ // for where to begin the insertion search.
391
+ //
392
+ // All `try_emplace()` overloads make the same guarantees regarding rvalue
393
+ // arguments as `std::unordered_map::try_emplace()`, namely that these
394
+ // functions will not move from rvalue arguments if insertions do not happen.
395
+ using Base::try_emplace;
396
+
397
+ // node_hash_map::extract()
398
+ //
399
+ // Extracts the indicated element, erasing it in the process, and returns it
400
+ // as a C++17-compatible node handle. Overloads are listed below.
401
+ //
402
+ // node_type extract(const_iterator position):
403
+ //
404
+ // Extracts the key,value pair of the element at the indicated position and
405
+ // returns a node handle owning that extracted data.
406
+ //
407
+ // node_type extract(const key_type& x):
408
+ //
409
+ // Extracts the key,value pair of the element with a key matching the passed
410
+ // key value and returns a node handle owning that extracted data. If the
411
+ // `node_hash_map` does not contain an element with a matching key, this
412
+ // function returns an empty node handle.
413
+ //
414
+ // NOTE: when compiled in an earlier version of C++ than C++17,
415
+ // `node_type::key()` returns a const reference to the key instead of a
416
+ // mutable reference. We cannot safely return a mutable reference without
417
+ // std::launder (which is not available before C++17).
418
+ using Base::extract;
419
+
420
+ // node_hash_map::merge()
421
+ //
422
+ // Extracts elements from a given `source` node hash map into this
423
+ // `node_hash_map`. If the destination `node_hash_map` already contains an
424
+ // element with an equivalent key, that element is not extracted.
425
+ using Base::merge;
426
+
427
+ // node_hash_map::swap(node_hash_map& other)
428
+ //
429
+ // Exchanges the contents of this `node_hash_map` with those of the `other`
430
+ // node hash map.
431
+ //
432
+ // All iterators and references on the `node_hash_map` remain valid, excepting
433
+ // for the past-the-end iterator, which is invalidated.
434
+ //
435
+ // `swap()` requires that the node hash map's hashing and key equivalence
436
+ // functions be Swappable, and are exchanged using unqualified calls to
437
+ // non-member `swap()`. If the map's allocator has
438
+ // `std::allocator_traits<allocator_type>::propagate_on_container_swap::value`
439
+ // set to `true`, the allocators are also exchanged using an unqualified call
440
+ // to non-member `swap()`; otherwise, the allocators are not swapped.
441
+ using Base::swap;
442
+
443
+ // node_hash_map::rehash(count)
444
+ //
445
+ // Rehashes the `node_hash_map`, setting the number of slots to be at least
446
+ // the passed value. If the new number of slots increases the load factor more
447
+ // than the current maximum load factor
448
+ // (`count` < `size()` / `max_load_factor()`), then the new number of slots
449
+ // will be at least `size()` / `max_load_factor()`.
450
+ //
451
+ // To force a rehash, pass rehash(0).
452
+ using Base::rehash;
453
+
454
+ // node_hash_map::reserve(count)
455
+ //
456
+ // Sets the number of slots in the `node_hash_map` to the number needed to
457
+ // accommodate at least `count` total elements without exceeding the current
458
+ // maximum load factor, and may rehash the container if needed.
459
+ using Base::reserve;
460
+
461
+ // node_hash_map::at()
462
+ //
463
+ // Returns a reference to the mapped value of the element with key equivalent
464
+ // to the passed key.
465
+ using Base::at;
466
+
467
+ // node_hash_map::contains()
468
+ //
469
+ // Determines whether an element with a key comparing equal to the given `key`
470
+ // exists within the `node_hash_map`, returning `true` if so or `false`
471
+ // otherwise.
472
+ using Base::contains;
473
+
474
+ // node_hash_map::count(const Key& key) const
475
+ //
476
+ // Returns the number of elements with a key comparing equal to the given
477
+ // `key` within the `node_hash_map`. note that this function will return
478
+ // either `1` or `0` since duplicate keys are not allowed within a
479
+ // `node_hash_map`.
480
+ using Base::count;
481
+
482
+ // node_hash_map::equal_range()
483
+ //
484
+ // Returns a closed range [first, last], defined by a `std::pair` of two
485
+ // iterators, containing all elements with the passed key in the
486
+ // `node_hash_map`.
487
+ using Base::equal_range;
488
+
489
+ // node_hash_map::find()
490
+ //
491
+ // Finds an element with the passed `key` within the `node_hash_map`.
492
+ using Base::find;
493
+
494
+ // node_hash_map::operator[]()
495
+ //
496
+ // Returns a reference to the value mapped to the passed key within the
497
+ // `node_hash_map`, performing an `insert()` if the key does not already
498
+ // exist. If an insertion occurs and results in a rehashing of the container,
499
+ // all iterators are invalidated. Otherwise iterators are not affected and
500
+ // references are not invalidated. Overloads are listed below.
501
+ //
502
+ // T& operator[](const Key& key):
503
+ //
504
+ // Inserts an init_type object constructed in-place if the element with the
505
+ // given key does not exist.
506
+ //
507
+ // T& operator[](Key&& key):
508
+ //
509
+ // Inserts an init_type object constructed in-place provided that an element
510
+ // with the given key does not exist.
511
+ using Base::operator[];
512
+
513
+ // node_hash_map::bucket_count()
514
+ //
515
+ // Returns the number of "buckets" within the `node_hash_map`.
516
+ using Base::bucket_count;
517
+
518
+ // node_hash_map::load_factor()
519
+ //
520
+ // Returns the current load factor of the `node_hash_map` (the average number
521
+ // of slots occupied with a value within the hash map).
522
+ using Base::load_factor;
523
+
524
+ // node_hash_map::max_load_factor()
525
+ //
526
+ // Manages the maximum load factor of the `node_hash_map`. Overloads are
527
+ // listed below.
528
+ //
529
+ // float node_hash_map::max_load_factor()
530
+ //
531
+ // Returns the current maximum load factor of the `node_hash_map`.
532
+ //
533
+ // void node_hash_map::max_load_factor(float ml)
534
+ //
535
+ // Sets the maximum load factor of the `node_hash_map` to the passed value.
536
+ //
537
+ // NOTE: This overload is provided only for API compatibility with the STL;
538
+ // `node_hash_map` will ignore any set load factor and manage its rehashing
539
+ // internally as an implementation detail.
540
+ using Base::max_load_factor;
541
+
542
+ // node_hash_map::get_allocator()
543
+ //
544
+ // Returns the allocator function associated with this `node_hash_map`.
545
+ using Base::get_allocator;
546
+
547
+ // node_hash_map::hash_function()
548
+ //
549
+ // Returns the hashing function used to hash the keys within this
550
+ // `node_hash_map`.
551
+ using Base::hash_function;
552
+
553
+ // node_hash_map::key_eq()
554
+ //
555
+ // Returns the function used for comparing keys equality.
556
+ using Base::key_eq;
557
+ };
558
+
559
+ // erase_if(node_hash_map<>, Pred)
560
+ //
561
+ // Erases all elements that satisfy the predicate `pred` from the container `c`.
562
+ // Returns the number of erased elements.
563
+ template <typename K, typename V, typename H, typename E, typename A,
564
+ typename Predicate>
565
+ typename node_hash_map<K, V, H, E, A>::size_type erase_if(
566
+ node_hash_map<K, V, H, E, A>& c, Predicate pred) {
567
+ return container_internal::EraseIf(pred, &c);
568
+ }
569
+
570
+ // swap(node_hash_map<>, node_hash_map<>)
571
+ //
572
+ // Swaps the contents of two `node_hash_map` containers.
573
+ //
574
+ // NOTE: we need to define this function template in order for
575
+ // `flat_hash_set::swap` to be called instead of `std::swap`. Even though we
576
+ // have `swap(raw_hash_set&, raw_hash_set&)` defined, that function requires a
577
+ // derived-to-base conversion, whereas `std::swap` is a function template so
578
+ // `std::swap` will be preferred by compiler.
579
+ template <typename K, typename V, typename H, typename E, typename A>
580
+ void swap(node_hash_map<K, V, H, E, A>& x,
581
+ node_hash_map<K, V, H, E, A>& y) noexcept(noexcept(x.swap(y))) {
582
+ return x.swap(y);
583
+ }
584
+
585
+ namespace container_internal {
586
+
587
+ // c_for_each_fast(node_hash_map<>, Function)
588
+ //
589
+ // Container-based version of the <algorithm> `std::for_each()` function to
590
+ // apply a function to a container's elements.
591
+ // There is no guarantees on the order of the function calls.
592
+ // Erasure and/or insertion of elements in the function is not allowed.
593
+ template <typename K, typename V, typename H, typename E, typename A,
594
+ typename Function>
595
+ decay_t<Function> c_for_each_fast(const node_hash_map<K, V, H, E, A>& c,
596
+ Function&& f) {
597
+ container_internal::ForEach(f, &c);
598
+ return f;
599
+ }
600
+ template <typename K, typename V, typename H, typename E, typename A,
601
+ typename Function>
602
+ decay_t<Function> c_for_each_fast(node_hash_map<K, V, H, E, A>& c,
603
+ Function&& f) {
604
+ container_internal::ForEach(f, &c);
605
+ return f;
606
+ }
607
+ template <typename K, typename V, typename H, typename E, typename A,
608
+ typename Function>
609
+ decay_t<Function> c_for_each_fast(node_hash_map<K, V, H, E, A>&& c,
610
+ Function&& f) {
611
+ container_internal::ForEach(f, &c);
612
+ return f;
613
+ }
614
+
615
+ } // namespace container_internal
616
+
617
+ namespace container_internal {
618
+
619
+ template <class Key, class Value>
620
+ class NodeHashMapPolicy
621
+ : public absl::container_internal::node_slot_policy<
622
+ std::pair<const Key, Value>&, NodeHashMapPolicy<Key, Value>> {
623
+ using value_type = std::pair<const Key, Value>;
624
+
625
+ public:
626
+ using key_type = Key;
627
+ using mapped_type = Value;
628
+ using init_type = std::pair</*non const*/ key_type, mapped_type>;
629
+
630
+ template <class Allocator, class... Args>
631
+ static value_type* new_element(Allocator* alloc, Args&&... args) {
632
+ using PairAlloc = typename absl::allocator_traits<
633
+ Allocator>::template rebind_alloc<value_type>;
634
+ PairAlloc pair_alloc(*alloc);
635
+ value_type* res =
636
+ absl::allocator_traits<PairAlloc>::allocate(pair_alloc, 1);
637
+ absl::allocator_traits<PairAlloc>::construct(pair_alloc, res,
638
+ std::forward<Args>(args)...);
639
+ return res;
640
+ }
641
+
642
+ template <class Allocator>
643
+ static void delete_element(Allocator* alloc, value_type* pair) {
644
+ using PairAlloc = typename absl::allocator_traits<
645
+ Allocator>::template rebind_alloc<value_type>;
646
+ PairAlloc pair_alloc(*alloc);
647
+ absl::allocator_traits<PairAlloc>::destroy(pair_alloc, pair);
648
+ absl::allocator_traits<PairAlloc>::deallocate(pair_alloc, pair, 1);
649
+ }
650
+
651
+ template <class F, class... Args>
652
+ static decltype(absl::container_internal::DecomposePair(
653
+ std::declval<F>(), std::declval<Args>()...))
654
+ apply(F&& f, Args&&... args) {
655
+ return absl::container_internal::DecomposePair(std::forward<F>(f),
656
+ std::forward<Args>(args)...);
657
+ }
658
+
659
+ static size_t element_space_used(const value_type*) {
660
+ return sizeof(value_type);
661
+ }
662
+
663
+ static Value& value(value_type* elem) { return elem->second; }
664
+ static const Value& value(const value_type* elem) { return elem->second; }
665
+
666
+ template <class Hash>
667
+ static constexpr HashSlotFn get_hash_slot_fn() {
668
+ return memory_internal::IsLayoutCompatible<Key, Value>::value
669
+ ? &TypeErasedDerefAndApplyToSlotFn<Hash, Key>
670
+ : nullptr;
671
+ }
672
+ };
673
+ } // namespace container_internal
674
+
675
+ namespace container_algorithm_internal {
676
+
677
+ // Specialization of trait in absl/algorithm/container.h
678
+ template <class Key, class T, class Hash, class KeyEqual, class Allocator>
679
+ struct IsUnorderedContainer<
680
+ absl::node_hash_map<Key, T, Hash, KeyEqual, Allocator>> : std::true_type {};
681
+
682
+ } // namespace container_algorithm_internal
683
+
684
+ ABSL_NAMESPACE_END
685
+ } // namespace absl
686
+
687
+ #endif // ABSL_CONTAINER_NODE_HASH_MAP_H_