grpc 1.42.0 → 1.43.1

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of grpc might be problematic. Click here for more details.

Files changed (739) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +85 -34
  3. data/include/grpc/event_engine/event_engine.h +37 -13
  4. data/include/grpc/event_engine/internal/memory_allocator_impl.h +1 -31
  5. data/include/grpc/event_engine/memory_allocator.h +27 -11
  6. data/include/grpc/event_engine/memory_request.h +57 -0
  7. data/include/grpc/grpc_security.h +276 -145
  8. data/include/grpc/grpc_security_constants.h +1 -14
  9. data/include/grpc/impl/codegen/port_platform.h +7 -3
  10. data/src/core/ext/filters/client_channel/backend_metric.cc +6 -7
  11. data/src/core/ext/filters/client_channel/backend_metric.h +3 -2
  12. data/src/core/ext/filters/client_channel/client_channel.cc +81 -40
  13. data/src/core/ext/filters/client_channel/client_channel.h +5 -4
  14. data/src/core/ext/filters/client_channel/client_channel_plugin.cc +1 -2
  15. data/src/core/ext/filters/client_channel/dynamic_filters.cc +4 -4
  16. data/src/core/ext/filters/client_channel/health/health_check_client.h +1 -1
  17. data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +12 -14
  18. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +1 -2
  19. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc +1 -2
  20. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h +2 -2
  21. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +2 -3
  22. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +27 -80
  23. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +82 -34
  24. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +47 -91
  25. data/src/core/ext/filters/client_channel/lb_policy.h +75 -59
  26. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +3 -3
  27. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +2 -2
  28. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +8 -12
  29. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +3 -3
  30. data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +6 -12
  31. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +222 -294
  32. data/src/core/ext/filters/client_channel/resolver_registry.cc +6 -7
  33. data/src/core/ext/filters/client_channel/resolver_registry.h +1 -2
  34. data/src/core/ext/filters/client_channel/subchannel.cc +4 -4
  35. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +1 -1
  36. data/src/core/ext/filters/http/client/http_client_filter.cc +14 -30
  37. data/src/core/ext/filters/http/http_filters_plugin.cc +3 -5
  38. data/src/core/ext/filters/http/server/http_server_filter.cc +11 -28
  39. data/src/core/ext/filters/server_config_selector/server_config_selector.cc +67 -0
  40. data/src/core/ext/filters/server_config_selector/server_config_selector.h +70 -0
  41. data/src/core/ext/filters/server_config_selector/server_config_selector_filter.cc +265 -0
  42. data/src/core/ext/filters/server_config_selector/server_config_selector_filter.h +32 -0
  43. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +4 -20
  44. data/src/core/ext/transport/chttp2/client/chttp2_connector.h +0 -2
  45. data/src/core/ext/transport/chttp2/client/insecure/channel_create.cc +8 -5
  46. data/src/core/ext/transport/chttp2/client/insecure/channel_create_posix.cc +11 -14
  47. data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +6 -3
  48. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +54 -79
  49. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2.cc +2 -3
  50. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.cc +9 -13
  51. data/src/core/ext/transport/chttp2/server/secure/server_secure_chttp2.cc +6 -6
  52. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +53 -62
  53. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +1 -2
  54. data/src/core/ext/transport/chttp2/transport/context_list.cc +2 -3
  55. data/src/core/ext/transport/chttp2/transport/context_list.h +2 -3
  56. data/src/core/ext/transport/chttp2/transport/flow_control.cc +8 -8
  57. data/src/core/ext/transport/chttp2/transport/flow_control.h +2 -2
  58. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +83 -19
  59. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +33 -1
  60. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +66 -92
  61. data/src/core/ext/transport/chttp2/transport/internal.h +8 -4
  62. data/src/core/ext/transport/inproc/inproc_transport.cc +16 -7
  63. data/src/core/ext/transport/inproc/inproc_transport.h +1 -1
  64. data/src/core/ext/upb-generated/envoy/admin/v3/config_dump.upb.c +197 -165
  65. data/src/core/ext/upb-generated/envoy/admin/v3/config_dump.upb.h +2 -0
  66. data/src/core/ext/upb-generated/envoy/annotations/deprecation.upb.c +41 -0
  67. data/src/core/ext/upb-generated/envoy/annotations/deprecation.upb.h +18 -0
  68. data/src/core/ext/upb-generated/envoy/annotations/resource.upb.c +26 -2
  69. data/src/core/ext/upb-generated/envoy/annotations/resource.upb.h +7 -0
  70. data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.c +107 -82
  71. data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.h +2 -0
  72. data/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.c +188 -160
  73. data/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.h +2 -0
  74. data/src/core/ext/upb-generated/envoy/config/cluster/v3/circuit_breaker.upb.c +35 -22
  75. data/src/core/ext/upb-generated/envoy/config/cluster/v3/circuit_breaker.upb.h +2 -0
  76. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.c +253 -218
  77. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.h +2 -0
  78. data/src/core/ext/upb-generated/envoy/config/cluster/v3/filter.upb.c +16 -5
  79. data/src/core/ext/upb-generated/envoy/config/cluster/v3/filter.upb.h +2 -0
  80. data/src/core/ext/upb-generated/envoy/config/cluster/v3/outlier_detection.upb.c +36 -25
  81. data/src/core/ext/upb-generated/envoy/config/cluster/v3/outlier_detection.upb.h +2 -0
  82. data/src/core/ext/upb-generated/envoy/config/core/v3/address.upb.c +56 -39
  83. data/src/core/ext/upb-generated/envoy/config/core/v3/address.upb.h +2 -0
  84. data/src/core/ext/upb-generated/envoy/config/core/v3/backoff.upb.c +16 -5
  85. data/src/core/ext/upb-generated/envoy/config/core/v3/backoff.upb.h +2 -0
  86. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.c +162 -128
  87. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.h +2 -0
  88. data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.c +51 -36
  89. data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.h +2 -0
  90. data/src/core/ext/upb-generated/envoy/config/core/v3/event_service_config.upb.c +15 -4
  91. data/src/core/ext/upb-generated/envoy/config/core/v3/event_service_config.upb.h +2 -0
  92. data/src/core/ext/upb-generated/envoy/config/core/v3/extension.upb.c +25 -13
  93. data/src/core/ext/upb-generated/envoy/config/core/v3/extension.upb.h +2 -0
  94. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.c +114 -90
  95. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.h +2 -0
  96. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.c +89 -71
  97. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.h +2 -0
  98. data/src/core/ext/upb-generated/envoy/config/core/v3/http_uri.upb.c +17 -6
  99. data/src/core/ext/upb-generated/envoy/config/core/v3/http_uri.upb.h +2 -0
  100. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.c +117 -93
  101. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.h +2 -0
  102. data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.c +13 -2
  103. data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.h +2 -0
  104. data/src/core/ext/upb-generated/envoy/config/core/v3/resolver.upb.c +21 -9
  105. data/src/core/ext/upb-generated/envoy/config/core/v3/resolver.upb.h +2 -0
  106. data/src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.c +18 -7
  107. data/src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.h +2 -0
  108. data/src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.c +22 -11
  109. data/src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.h +2 -0
  110. data/src/core/ext/upb-generated/envoy/config/core/v3/udp_socket_config.upb.c +17 -6
  111. data/src/core/ext/upb-generated/envoy/config/core/v3/udp_socket_config.upb.h +2 -0
  112. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.c +41 -27
  113. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.h +2 -0
  114. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.c +59 -43
  115. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.h +2 -0
  116. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.c +58 -43
  117. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.h +2 -0
  118. data/src/core/ext/upb-generated/envoy/config/listener/v3/api_listener.upb.c +15 -4
  119. data/src/core/ext/upb-generated/envoy/config/listener/v3/api_listener.upb.h +2 -0
  120. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.c +73 -57
  121. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.h +2 -0
  122. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.c +81 -64
  123. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.h +2 -0
  124. data/src/core/ext/upb-generated/envoy/config/listener/v3/quic_config.upb.c +25 -14
  125. data/src/core/ext/upb-generated/envoy/config/listener/v3/quic_config.upb.h +2 -0
  126. data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.c +19 -7
  127. data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.h +2 -0
  128. data/src/core/ext/upb-generated/envoy/config/metrics/v3/stats.upb.c +63 -45
  129. data/src/core/ext/upb-generated/envoy/config/metrics/v3/stats.upb.h +2 -0
  130. data/src/core/ext/upb-generated/envoy/config/overload/v3/overload.upb.c +66 -47
  131. data/src/core/ext/upb-generated/envoy/config/overload/v3/overload.upb.h +2 -0
  132. data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.c +93 -75
  133. data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.h +2 -0
  134. data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.c +41 -28
  135. data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.h +2 -0
  136. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.c +503 -440
  137. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.h +2 -0
  138. data/src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.c +26 -13
  139. data/src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.h +2 -0
  140. data/src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.c +21 -9
  141. data/src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.h +2 -0
  142. data/src/core/ext/upb-generated/envoy/extensions/clusters/aggregate/v3/cluster.upb.c +13 -2
  143. data/src/core/ext/upb-generated/envoy/extensions/clusters/aggregate/v3/cluster.upb.h +2 -0
  144. data/src/core/ext/upb-generated/envoy/extensions/filters/common/fault/v3/fault.upb.c +35 -20
  145. data/src/core/ext/upb-generated/envoy/extensions/filters/common/fault/v3/fault.upb.h +2 -0
  146. data/src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.c +44 -31
  147. data/src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.h +2 -0
  148. data/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.c +22 -11
  149. data/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.h +2 -0
  150. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.c +210 -181
  151. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h +2 -0
  152. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.c +7 -0
  153. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.h +5 -3
  154. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.c +64 -48
  155. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.h +2 -0
  156. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.c +33 -20
  157. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.h +2 -0
  158. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.c +81 -65
  159. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.h +2 -0
  160. data/src/core/ext/upb-generated/envoy/service/cluster/v3/cds.upb.c +12 -1
  161. data/src/core/ext/upb-generated/envoy/service/cluster/v3/cds.upb.h +2 -0
  162. data/src/core/ext/upb-generated/envoy/service/discovery/v3/ads.upb.c +12 -1
  163. data/src/core/ext/upb-generated/envoy/service/discovery/v3/ads.upb.h +2 -0
  164. data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.c +75 -58
  165. data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.h +2 -0
  166. data/src/core/ext/upb-generated/envoy/service/endpoint/v3/eds.upb.c +12 -1
  167. data/src/core/ext/upb-generated/envoy/service/endpoint/v3/eds.upb.h +2 -0
  168. data/src/core/ext/upb-generated/envoy/service/listener/v3/lds.upb.c +12 -1
  169. data/src/core/ext/upb-generated/envoy/service/listener/v3/lds.upb.h +2 -0
  170. data/src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.c +25 -13
  171. data/src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.h +2 -0
  172. data/src/core/ext/upb-generated/envoy/service/route/v3/rds.upb.c +12 -1
  173. data/src/core/ext/upb-generated/envoy/service/route/v3/rds.upb.h +2 -0
  174. data/src/core/ext/upb-generated/envoy/service/route/v3/srds.upb.c +12 -1
  175. data/src/core/ext/upb-generated/envoy/service/route/v3/srds.upb.h +2 -0
  176. data/src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.c +61 -46
  177. data/src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.h +2 -0
  178. data/src/core/ext/upb-generated/envoy/type/http/v3/path_transformation.upb.c +26 -12
  179. data/src/core/ext/upb-generated/envoy/type/http/v3/path_transformation.upb.h +2 -0
  180. data/src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.c +22 -10
  181. data/src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.h +2 -0
  182. data/src/core/ext/upb-generated/envoy/type/matcher/v3/node.upb.c +17 -6
  183. data/src/core/ext/upb-generated/envoy/type/matcher/v3/node.upb.h +2 -0
  184. data/src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.c +16 -5
  185. data/src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.h +2 -0
  186. data/src/core/ext/upb-generated/envoy/type/matcher/v3/path.upb.c +15 -4
  187. data/src/core/ext/upb-generated/envoy/type/matcher/v3/path.upb.h +2 -0
  188. data/src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.c +27 -14
  189. data/src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.h +2 -0
  190. data/src/core/ext/upb-generated/envoy/type/matcher/v3/string.upb.c +25 -13
  191. data/src/core/ext/upb-generated/envoy/type/matcher/v3/string.upb.h +2 -0
  192. data/src/core/ext/upb-generated/envoy/type/matcher/v3/struct.upb.c +20 -8
  193. data/src/core/ext/upb-generated/envoy/type/matcher/v3/struct.upb.h +2 -0
  194. data/src/core/ext/upb-generated/envoy/type/matcher/v3/value.upb.c +30 -17
  195. data/src/core/ext/upb-generated/envoy/type/matcher/v3/value.upb.h +2 -0
  196. data/src/core/ext/upb-generated/envoy/type/metadata/v3/metadata.upb.c +38 -21
  197. data/src/core/ext/upb-generated/envoy/type/metadata/v3/metadata.upb.h +2 -0
  198. data/src/core/ext/upb-generated/envoy/type/tracing/v3/custom_tag.upb.c +41 -26
  199. data/src/core/ext/upb-generated/envoy/type/tracing/v3/custom_tag.upb.h +2 -0
  200. data/src/core/ext/upb-generated/envoy/type/v3/http.upb.c +7 -0
  201. data/src/core/ext/upb-generated/envoy/type/v3/http.upb.h +2 -0
  202. data/src/core/ext/upb-generated/envoy/type/v3/percent.upb.c +17 -5
  203. data/src/core/ext/upb-generated/envoy/type/v3/percent.upb.h +2 -0
  204. data/src/core/ext/upb-generated/envoy/type/v3/range.upb.c +22 -9
  205. data/src/core/ext/upb-generated/envoy/type/v3/range.upb.h +2 -0
  206. data/src/core/ext/upb-generated/envoy/type/v3/semantic_version.upb.c +15 -4
  207. data/src/core/ext/upb-generated/envoy/type/v3/semantic_version.upb.h +2 -0
  208. data/src/core/ext/upb-generated/google/api/annotations.upb.c +20 -0
  209. data/src/core/ext/upb-generated/google/api/annotations.upb.h +7 -0
  210. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/checked.upb.c +116 -93
  211. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/checked.upb.h +2 -0
  212. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/eval.upb.c +102 -0
  213. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/eval.upb.h +306 -0
  214. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/explain.upb.c +56 -0
  215. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/explain.upb.h +135 -0
  216. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.c +122 -98
  217. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.h +2 -0
  218. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/value.upb.c +115 -0
  219. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/value.upb.h +371 -0
  220. data/src/core/ext/upb-generated/google/api/http.upb.c +35 -22
  221. data/src/core/ext/upb-generated/google/api/http.upb.h +2 -0
  222. data/src/core/ext/upb-generated/google/protobuf/any.upb.c +14 -3
  223. data/src/core/ext/upb-generated/google/protobuf/any.upb.h +2 -0
  224. data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.c +247 -210
  225. data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.h +2 -0
  226. data/src/core/ext/upb-generated/google/protobuf/duration.upb.c +14 -3
  227. data/src/core/ext/upb-generated/google/protobuf/duration.upb.h +2 -0
  228. data/src/core/ext/upb-generated/google/protobuf/empty.upb.c +12 -1
  229. data/src/core/ext/upb-generated/google/protobuf/empty.upb.h +2 -0
  230. data/src/core/ext/upb-generated/google/protobuf/struct.upb.c +37 -23
  231. data/src/core/ext/upb-generated/google/protobuf/struct.upb.h +2 -0
  232. data/src/core/ext/upb-generated/google/protobuf/timestamp.upb.c +14 -3
  233. data/src/core/ext/upb-generated/google/protobuf/timestamp.upb.h +2 -0
  234. data/src/core/ext/upb-generated/google/protobuf/wrappers.upb.c +37 -18
  235. data/src/core/ext/upb-generated/google/protobuf/wrappers.upb.h +2 -0
  236. data/src/core/ext/upb-generated/google/rpc/status.upb.c +17 -6
  237. data/src/core/ext/upb-generated/google/rpc/status.upb.h +2 -0
  238. data/src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.c +26 -14
  239. data/src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.h +2 -0
  240. data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.c +105 -83
  241. data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.h +2 -0
  242. data/src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.c +20 -8
  243. data/src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.h +2 -0
  244. data/src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.c +16 -4
  245. data/src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.h +2 -0
  246. data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.c +65 -47
  247. data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.h +34 -36
  248. data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.c +26 -13
  249. data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.h +2 -0
  250. data/src/core/ext/upb-generated/udpa/annotations/migrate.upb.c +67 -7
  251. data/src/core/ext/upb-generated/udpa/annotations/migrate.upb.h +27 -0
  252. data/src/core/ext/upb-generated/udpa/annotations/security.upb.c +27 -3
  253. data/src/core/ext/upb-generated/udpa/annotations/security.upb.h +7 -0
  254. data/src/core/ext/upb-generated/udpa/annotations/sensitive.upb.c +19 -0
  255. data/src/core/ext/upb-generated/udpa/annotations/sensitive.upb.h +7 -0
  256. data/src/core/ext/upb-generated/udpa/annotations/status.upb.c +27 -3
  257. data/src/core/ext/upb-generated/udpa/annotations/status.upb.h +7 -0
  258. data/src/core/ext/upb-generated/udpa/annotations/versioning.upb.c +26 -2
  259. data/src/core/ext/upb-generated/udpa/annotations/versioning.upb.h +7 -0
  260. data/src/core/ext/upb-generated/validate/validate.upb.c +320 -251
  261. data/src/core/ext/upb-generated/validate/validate.upb.h +20 -0
  262. data/src/core/ext/upb-generated/xds/annotations/v3/status.upb.c +54 -9
  263. data/src/core/ext/upb-generated/xds/annotations/v3/status.upb.h +17 -0
  264. data/src/core/ext/upb-generated/xds/core/v3/authority.upb.c +13 -2
  265. data/src/core/ext/upb-generated/xds/core/v3/authority.upb.h +2 -0
  266. data/src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.c +24 -12
  267. data/src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.h +2 -0
  268. data/src/core/ext/upb-generated/xds/core/v3/context_params.upb.c +19 -7
  269. data/src/core/ext/upb-generated/xds/core/v3/context_params.upb.h +2 -0
  270. data/src/core/ext/upb-generated/xds/core/v3/resource.upb.c +18 -7
  271. data/src/core/ext/upb-generated/xds/core/v3/resource.upb.h +2 -0
  272. data/src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.c +27 -15
  273. data/src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.h +2 -0
  274. data/src/core/ext/upb-generated/xds/core/v3/resource_name.upb.c +18 -7
  275. data/src/core/ext/upb-generated/xds/core/v3/resource_name.upb.h +2 -0
  276. data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.c +28 -15
  277. data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.h +2 -0
  278. data/src/core/ext/upb-generated/xds/type/v3/typed_struct.upb.c +16 -5
  279. data/src/core/ext/upb-generated/xds/type/v3/typed_struct.upb.h +2 -0
  280. data/src/core/ext/upbdefs-generated/envoy/admin/v3/config_dump.upbdefs.c +2 -49
  281. data/src/core/ext/upbdefs-generated/envoy/annotations/deprecation.upbdefs.c +2 -2
  282. data/src/core/ext/upbdefs-generated/envoy/annotations/resource.upbdefs.c +2 -7
  283. data/src/core/ext/upbdefs-generated/envoy/config/accesslog/v3/accesslog.upbdefs.c +2 -35
  284. data/src/core/ext/upbdefs-generated/envoy/config/bootstrap/v3/bootstrap.upbdefs.c +2 -41
  285. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/circuit_breaker.upbdefs.c +2 -11
  286. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.c +2 -55
  287. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/filter.upbdefs.c +2 -7
  288. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/outlier_detection.upbdefs.c +2 -7
  289. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/address.upbdefs.c +2 -19
  290. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/backoff.upbdefs.c +2 -7
  291. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.c +2 -53
  292. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/config_source.upbdefs.c +2 -15
  293. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/event_service_config.upbdefs.c +2 -7
  294. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/extension.upbdefs.c +2 -9
  295. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/grpc_service.upbdefs.c +2 -33
  296. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/health_check.upbdefs.c +2 -21
  297. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/http_uri.upbdefs.c +2 -7
  298. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.c +2 -33
  299. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/proxy_protocol.upbdefs.c +2 -7
  300. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/resolver.upbdefs.c +2 -9
  301. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/socket_option.upbdefs.c +2 -7
  302. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/substitution_format_string.upbdefs.c +2 -7
  303. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/udp_socket_config.upbdefs.c +2 -7
  304. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint.upbdefs.c +2 -13
  305. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint_components.upbdefs.c +2 -17
  306. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/load_report.upbdefs.c +2 -15
  307. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/api_listener.upbdefs.c +2 -7
  308. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.c +2 -17
  309. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener_components.upbdefs.c +2 -19
  310. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/quic_config.upbdefs.c +2 -7
  311. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/udp_listener_config.upbdefs.c +2 -9
  312. data/src/core/ext/upbdefs-generated/envoy/config/metrics/v3/stats.upbdefs.c +2 -21
  313. data/src/core/ext/upbdefs-generated/envoy/config/overload/v3/overload.upbdefs.c +2 -23
  314. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.c +2 -11
  315. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.c +2 -111
  316. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/scoped_route.upbdefs.c +2 -11
  317. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/http_tracer.upbdefs.c +2 -9
  318. data/src/core/ext/upbdefs-generated/envoy/extensions/clusters/aggregate/v3/cluster.upbdefs.c +2 -7
  319. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/common/fault/v3/fault.upbdefs.c +2 -15
  320. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/fault/v3/fault.upbdefs.c +2 -11
  321. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/router/v3/router.upbdefs.c +2 -7
  322. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c +2 -43
  323. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/cert.upbdefs.c +2 -2
  324. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.c +2 -17
  325. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/secret.upbdefs.c +2 -11
  326. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls.upbdefs.c +2 -17
  327. data/src/core/ext/upbdefs-generated/envoy/service/cluster/v3/cds.upbdefs.c +2 -7
  328. data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/ads.upbdefs.c +2 -7
  329. data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/discovery.upbdefs.c +2 -19
  330. data/src/core/ext/upbdefs-generated/envoy/service/endpoint/v3/eds.upbdefs.c +2 -7
  331. data/src/core/ext/upbdefs-generated/envoy/service/listener/v3/lds.upbdefs.c +2 -7
  332. data/src/core/ext/upbdefs-generated/envoy/service/load_stats/v3/lrs.upbdefs.c +2 -9
  333. data/src/core/ext/upbdefs-generated/envoy/service/route/v3/rds.upbdefs.c +2 -7
  334. data/src/core/ext/upbdefs-generated/envoy/service/route/v3/srds.upbdefs.c +2 -7
  335. data/src/core/ext/upbdefs-generated/envoy/service/status/v3/csds.upbdefs.c +2 -15
  336. data/src/core/ext/upbdefs-generated/envoy/type/http/v3/path_transformation.upbdefs.c +2 -13
  337. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/metadata.upbdefs.c +2 -9
  338. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/node.upbdefs.c +2 -7
  339. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/number.upbdefs.c +2 -7
  340. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/path.upbdefs.c +2 -7
  341. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/regex.upbdefs.c +2 -11
  342. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/string.upbdefs.c +2 -9
  343. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/struct.upbdefs.c +2 -9
  344. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/value.upbdefs.c +2 -11
  345. data/src/core/ext/upbdefs-generated/envoy/type/metadata/v3/metadata.upbdefs.c +2 -19
  346. data/src/core/ext/upbdefs-generated/envoy/type/tracing/v3/custom_tag.upbdefs.c +2 -15
  347. data/src/core/ext/upbdefs-generated/envoy/type/v3/http.upbdefs.c +2 -2
  348. data/src/core/ext/upbdefs-generated/envoy/type/v3/percent.upbdefs.c +2 -9
  349. data/src/core/ext/upbdefs-generated/envoy/type/v3/range.upbdefs.c +2 -11
  350. data/src/core/ext/upbdefs-generated/envoy/type/v3/semantic_version.upbdefs.c +2 -7
  351. data/src/core/ext/upbdefs-generated/google/api/annotations.upbdefs.c +2 -2
  352. data/src/core/ext/upbdefs-generated/google/api/http.upbdefs.c +2 -11
  353. data/src/core/ext/upbdefs-generated/google/protobuf/any.upbdefs.c +2 -7
  354. data/src/core/ext/upbdefs-generated/google/protobuf/descriptor.upbdefs.c +2 -59
  355. data/src/core/ext/upbdefs-generated/google/protobuf/duration.upbdefs.c +2 -7
  356. data/src/core/ext/upbdefs-generated/google/protobuf/empty.upbdefs.c +2 -7
  357. data/src/core/ext/upbdefs-generated/google/protobuf/struct.upbdefs.c +2 -13
  358. data/src/core/ext/upbdefs-generated/google/protobuf/timestamp.upbdefs.c +2 -7
  359. data/src/core/ext/upbdefs-generated/google/protobuf/wrappers.upbdefs.c +2 -23
  360. data/src/core/ext/upbdefs-generated/google/rpc/status.upbdefs.c +2 -7
  361. data/src/core/ext/upbdefs-generated/udpa/annotations/migrate.upbdefs.c +2 -11
  362. data/src/core/ext/upbdefs-generated/udpa/annotations/security.upbdefs.c +2 -7
  363. data/src/core/ext/upbdefs-generated/udpa/annotations/sensitive.upbdefs.c +2 -2
  364. data/src/core/ext/upbdefs-generated/udpa/annotations/status.upbdefs.c +2 -7
  365. data/src/core/ext/upbdefs-generated/udpa/annotations/versioning.upbdefs.c +2 -7
  366. data/src/core/ext/upbdefs-generated/validate/validate.upbdefs.c +2 -51
  367. data/src/core/ext/upbdefs-generated/xds/annotations/v3/status.upbdefs.c +2 -13
  368. data/src/core/ext/upbdefs-generated/xds/core/v3/authority.upbdefs.c +2 -7
  369. data/src/core/ext/upbdefs-generated/xds/core/v3/collection_entry.upbdefs.c +2 -9
  370. data/src/core/ext/upbdefs-generated/xds/core/v3/context_params.upbdefs.c +2 -9
  371. data/src/core/ext/upbdefs-generated/xds/core/v3/resource.upbdefs.c +2 -7
  372. data/src/core/ext/upbdefs-generated/xds/core/v3/resource_locator.upbdefs.c +2 -9
  373. data/src/core/ext/upbdefs-generated/xds/core/v3/resource_name.upbdefs.c +2 -7
  374. data/src/core/ext/upbdefs-generated/xds/type/v3/typed_struct.upbdefs.c +2 -7
  375. data/src/core/ext/xds/certificate_provider_registry.cc +1 -1
  376. data/src/core/ext/xds/certificate_provider_store.h +1 -1
  377. data/src/core/ext/xds/xds_api.cc +409 -304
  378. data/src/core/ext/xds/xds_api.h +3 -1
  379. data/src/core/ext/xds/xds_bootstrap.cc +6 -3
  380. data/src/core/ext/xds/xds_certificate_provider.h +1 -2
  381. data/src/core/ext/xds/xds_channel_stack_modifier.cc +3 -4
  382. data/src/core/ext/xds/xds_client.cc +395 -291
  383. data/src/core/ext/xds/xds_client.h +47 -38
  384. data/src/core/ext/xds/xds_routing.cc +247 -0
  385. data/src/core/ext/xds/xds_routing.h +98 -0
  386. data/src/core/ext/xds/xds_server_config_fetcher.cc +975 -261
  387. data/src/core/lib/avl/avl.h +389 -88
  388. data/src/core/lib/backoff/backoff.cc +2 -2
  389. data/src/core/lib/channel/channel_args.cc +17 -17
  390. data/src/core/lib/channel/channel_args.h +11 -10
  391. data/src/core/lib/channel/channel_args_preconditioning.cc +47 -0
  392. data/src/core/lib/channel/channel_args_preconditioning.h +62 -0
  393. data/src/core/lib/channel/channel_stack_builder.cc +0 -2
  394. data/src/core/lib/channel/channel_trace.cc +6 -6
  395. data/src/core/lib/channel/channelz.cc +1 -1
  396. data/src/core/lib/compression/compression_args.cc +7 -5
  397. data/src/core/lib/compression/compression_args.h +6 -4
  398. data/src/core/lib/config/core_configuration.cc +3 -1
  399. data/src/core/lib/config/core_configuration.h +11 -0
  400. data/src/core/lib/debug/trace.h +2 -2
  401. data/src/core/lib/event_engine/{endpoint_config.cc → channel_args_endpoint_config.cc} +2 -1
  402. data/src/core/lib/event_engine/{endpoint_config_internal.h → channel_args_endpoint_config.h} +3 -3
  403. data/src/core/lib/event_engine/event_engine.cc +0 -13
  404. data/src/core/lib/event_engine/event_engine_factory.cc +49 -0
  405. data/src/core/lib/event_engine/event_engine_factory.h +33 -0
  406. data/src/core/lib/event_engine/memory_allocator.cc +70 -0
  407. data/src/core/lib/gpr/tls.h +6 -0
  408. data/src/core/lib/gprpp/cpp_impl_of.h +45 -0
  409. data/src/core/lib/gprpp/global_config_env.cc +7 -7
  410. data/src/core/lib/gprpp/global_config_env.h +2 -2
  411. data/src/core/lib/gprpp/manual_constructor.h +2 -3
  412. data/src/core/lib/gprpp/orphanable.h +1 -1
  413. data/src/core/lib/gprpp/ref_counted.h +1 -1
  414. data/src/core/lib/gprpp/ref_counted_ptr.h +2 -4
  415. data/src/core/lib/gprpp/status_helper.h +1 -1
  416. data/src/core/lib/gprpp/table.h +13 -1
  417. data/src/core/lib/http/httpcli.cc +30 -26
  418. data/src/core/lib/http/httpcli.h +14 -12
  419. data/src/core/lib/iomgr/buffer_list.cc +9 -9
  420. data/src/core/lib/iomgr/buffer_list.h +13 -13
  421. data/src/core/lib/iomgr/call_combiner.cc +2 -3
  422. data/src/core/lib/iomgr/endpoint.h +0 -1
  423. data/src/core/lib/iomgr/endpoint_cfstream.cc +7 -24
  424. data/src/core/lib/iomgr/endpoint_cfstream.h +4 -4
  425. data/src/core/lib/iomgr/endpoint_pair_posix.cc +9 -11
  426. data/src/core/lib/iomgr/endpoint_pair_windows.cc +5 -14
  427. data/src/core/lib/iomgr/event_engine/endpoint.cc +2 -3
  428. data/src/core/lib/iomgr/event_engine/iomgr.cc +5 -25
  429. data/src/core/lib/iomgr/event_engine/resolver.cc +3 -2
  430. data/src/core/lib/iomgr/event_engine/tcp.cc +7 -5
  431. data/src/core/lib/iomgr/event_engine/timer.cc +4 -3
  432. data/src/core/lib/iomgr/exec_ctx.h +11 -11
  433. data/src/core/lib/iomgr/executor.cc +12 -15
  434. data/src/core/lib/iomgr/executor.h +1 -1
  435. data/src/core/lib/iomgr/tcp_client.cc +2 -4
  436. data/src/core/lib/iomgr/tcp_client.h +1 -3
  437. data/src/core/lib/iomgr/tcp_client_cfstream.cc +1 -9
  438. data/src/core/lib/iomgr/tcp_client_custom.cc +4 -10
  439. data/src/core/lib/iomgr/tcp_client_posix.cc +7 -23
  440. data/src/core/lib/iomgr/tcp_client_posix.h +3 -4
  441. data/src/core/lib/iomgr/tcp_client_windows.cc +1 -10
  442. data/src/core/lib/iomgr/tcp_custom.cc +9 -36
  443. data/src/core/lib/iomgr/tcp_custom.h +0 -1
  444. data/src/core/lib/iomgr/tcp_posix.cc +28 -33
  445. data/src/core/lib/iomgr/tcp_posix.h +1 -3
  446. data/src/core/lib/iomgr/tcp_server.cc +4 -6
  447. data/src/core/lib/iomgr/tcp_server.h +6 -8
  448. data/src/core/lib/iomgr/tcp_server_custom.cc +5 -15
  449. data/src/core/lib/iomgr/tcp_server_posix.cc +18 -22
  450. data/src/core/lib/iomgr/tcp_server_utils_posix.h +19 -18
  451. data/src/core/lib/iomgr/tcp_server_windows.cc +5 -12
  452. data/src/core/lib/iomgr/tcp_windows.cc +2 -7
  453. data/src/core/lib/iomgr/tcp_windows.h +1 -2
  454. data/src/core/lib/iomgr/unix_sockets_posix.cc +1 -1
  455. data/src/core/lib/iomgr/unix_sockets_posix.h +1 -1
  456. data/src/core/lib/iomgr/unix_sockets_posix_noop.cc +1 -1
  457. data/src/core/lib/iomgr/work_serializer.cc +115 -44
  458. data/src/core/lib/iomgr/work_serializer.h +16 -4
  459. data/src/core/lib/json/json_reader.cc +83 -35
  460. data/src/core/lib/json/json_util.cc +1 -1
  461. data/src/core/lib/promise/activity.cc +115 -0
  462. data/src/core/lib/promise/activity.h +499 -0
  463. data/src/core/lib/promise/context.h +86 -0
  464. data/src/core/lib/promise/detail/basic_seq.h +407 -0
  465. data/src/core/lib/promise/detail/promise_factory.h +189 -0
  466. data/src/core/lib/promise/detail/promise_like.h +85 -0
  467. data/src/core/lib/promise/detail/status.h +44 -0
  468. data/src/core/lib/promise/detail/switch.h +1455 -0
  469. data/src/core/lib/promise/exec_ctx_wakeup_scheduler.h +48 -0
  470. data/src/core/lib/promise/loop.h +108 -0
  471. data/src/core/lib/promise/map.h +88 -0
  472. data/src/core/lib/promise/poll.h +60 -0
  473. data/src/core/lib/promise/race.h +84 -0
  474. data/src/core/lib/promise/seq.h +71 -0
  475. data/src/core/lib/resource_quota/api.cc +108 -0
  476. data/src/core/lib/resource_quota/api.h +41 -0
  477. data/src/core/lib/resource_quota/memory_quota.cc +454 -0
  478. data/src/core/lib/resource_quota/memory_quota.h +421 -0
  479. data/src/core/lib/resource_quota/resource_quota.cc +33 -0
  480. data/src/core/lib/resource_quota/resource_quota.h +58 -0
  481. data/src/core/lib/resource_quota/thread_quota.cc +43 -0
  482. data/src/core/lib/resource_quota/thread_quota.h +57 -0
  483. data/src/core/lib/resource_quota/trace.cc +19 -0
  484. data/src/core/lib/resource_quota/trace.h +24 -0
  485. data/src/core/lib/security/authorization/evaluate_args.cc +13 -19
  486. data/src/core/lib/security/authorization/evaluate_args.h +2 -1
  487. data/src/core/lib/security/authorization/sdk_server_authz_filter.cc +3 -1
  488. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +11 -12
  489. data/src/core/lib/security/credentials/external/external_account_credentials.cc +9 -10
  490. data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +3 -4
  491. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +4 -6
  492. data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +1 -1
  493. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +4 -6
  494. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +18 -22
  495. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc +11 -12
  496. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h +7 -8
  497. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.cc +201 -0
  498. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.h +106 -0
  499. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +11 -90
  500. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h +19 -82
  501. data/src/core/lib/security/credentials/tls/tls_credentials.cc +21 -10
  502. data/src/core/lib/security/credentials/xds/xds_credentials.cc +28 -33
  503. data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +3 -3
  504. data/src/core/lib/security/security_connector/alts/alts_security_connector.h +2 -2
  505. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +3 -4
  506. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.cc +2 -2
  507. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.h +7 -7
  508. data/src/core/lib/security/security_connector/load_system_roots_linux.cc +1 -2
  509. data/src/core/lib/security/security_connector/local/local_security_connector.cc +4 -1
  510. data/src/core/lib/security/security_connector/ssl_utils.cc +10 -2
  511. data/src/core/lib/security/security_connector/ssl_utils.h +1 -1
  512. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +344 -195
  513. data/src/core/lib/security/security_connector/tls/tls_security_connector.h +64 -41
  514. data/src/core/lib/security/transport/security_handshaker.cc +2 -2
  515. data/src/core/lib/slice/percent_encoding.cc +30 -86
  516. data/src/core/lib/slice/percent_encoding.h +5 -11
  517. data/src/core/lib/slice/slice.cc +7 -7
  518. data/src/core/lib/slice/slice.h +341 -0
  519. data/src/core/lib/slice/slice_buffer.cc +4 -0
  520. data/src/core/lib/slice/slice_intern.cc +1 -1
  521. data/src/core/lib/slice/slice_refcount.h +5 -1
  522. data/src/core/lib/slice/slice_refcount_base.h +19 -11
  523. data/src/core/lib/slice/static_slice.cc +331 -483
  524. data/src/core/lib/slice/static_slice.h +101 -132
  525. data/src/core/lib/surface/builtins.cc +1 -1
  526. data/src/core/lib/surface/call.cc +85 -59
  527. data/src/core/lib/surface/channel.cc +4 -29
  528. data/src/core/lib/surface/channel.h +2 -12
  529. data/src/core/lib/surface/completion_queue.cc +2 -2
  530. data/src/core/lib/surface/init.cc +0 -1
  531. data/src/core/lib/surface/lame_client.cc +24 -17
  532. data/src/core/lib/surface/server.cc +22 -22
  533. data/src/core/lib/surface/server.h +8 -9
  534. data/src/core/lib/surface/validate_metadata.cc +2 -2
  535. data/src/core/lib/surface/version.cc +2 -2
  536. data/src/core/lib/transport/bdp_estimator.cc +1 -1
  537. data/src/core/lib/transport/byte_stream.cc +4 -0
  538. data/src/core/lib/transport/metadata.h +4 -4
  539. data/src/core/lib/transport/metadata_batch.cc +5 -0
  540. data/src/core/lib/transport/metadata_batch.h +174 -99
  541. data/src/core/lib/transport/parsed_metadata.cc +35 -0
  542. data/src/core/lib/transport/parsed_metadata.h +180 -61
  543. data/src/core/lib/transport/pid_controller.cc +4 -4
  544. data/src/core/lib/transport/static_metadata.cc +529 -614
  545. data/src/core/lib/transport/static_metadata.h +0 -18
  546. data/src/core/lib/transport/transport.cc +4 -26
  547. data/src/core/lib/transport/transport.h +0 -1
  548. data/src/core/lib/transport/transport_op_string.cc +1 -1
  549. data/src/core/lib/uri/uri_parser.cc +19 -19
  550. data/src/core/lib/uri/uri_parser.h +2 -0
  551. data/src/core/plugin_registry/grpc_plugin_registry.cc +4 -2
  552. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +1 -1
  553. data/src/core/tsi/local_transport_security.cc +15 -15
  554. data/src/core/tsi/ssl_transport_security.cc +30 -1
  555. data/src/core/tsi/ssl_transport_security.h +1 -0
  556. data/src/ruby/ext/grpc/extconf.rb +1 -1
  557. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +6 -10
  558. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +9 -15
  559. data/src/ruby/lib/grpc/version.rb +1 -1
  560. data/third_party/abseil-cpp/absl/algorithm/container.h +101 -91
  561. data/third_party/abseil-cpp/absl/base/attributes.h +64 -31
  562. data/third_party/abseil-cpp/absl/base/config.h +67 -37
  563. data/third_party/abseil-cpp/absl/base/dynamic_annotations.h +1 -26
  564. data/third_party/abseil-cpp/absl/base/internal/spinlock.h +3 -1
  565. data/third_party/abseil-cpp/absl/base/internal/spinlock_wait.h +2 -0
  566. data/third_party/abseil-cpp/absl/base/internal/sysinfo.cc +69 -0
  567. data/third_party/abseil-cpp/absl/base/internal/thread_identity.h +4 -4
  568. data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.cc +16 -0
  569. data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.h +4 -4
  570. data/third_party/abseil-cpp/absl/base/options.h +1 -1
  571. data/third_party/abseil-cpp/absl/container/fixed_array.h +0 -5
  572. data/third_party/abseil-cpp/absl/container/inlined_vector.h +105 -97
  573. data/third_party/abseil-cpp/absl/container/internal/hash_function_defaults.h +17 -15
  574. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.cc +18 -102
  575. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.h +37 -78
  576. data/third_party/abseil-cpp/absl/container/internal/inlined_vector.h +388 -423
  577. data/third_party/abseil-cpp/absl/container/internal/raw_hash_map.h +3 -2
  578. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.cc +14 -8
  579. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.h +251 -120
  580. data/third_party/abseil-cpp/absl/debugging/internal/demangle.cc +11 -1
  581. data/third_party/abseil-cpp/absl/debugging/internal/elf_mem_image.cc +12 -11
  582. data/third_party/abseil-cpp/absl/debugging/internal/elf_mem_image.h +6 -2
  583. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_config.h +12 -5
  584. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_emscripten-inl.inc +110 -0
  585. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_riscv-inl.inc +234 -0
  586. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_x86-inl.inc +25 -7
  587. data/third_party/abseil-cpp/absl/debugging/internal/symbolize.h +8 -2
  588. data/third_party/abseil-cpp/absl/debugging/internal/vdso_support.cc +21 -3
  589. data/third_party/abseil-cpp/absl/debugging/stacktrace.cc +2 -0
  590. data/third_party/abseil-cpp/absl/debugging/symbolize.cc +2 -0
  591. data/third_party/abseil-cpp/absl/debugging/symbolize_elf.inc +14 -0
  592. data/third_party/abseil-cpp/absl/debugging/symbolize_emscripten.inc +72 -0
  593. data/third_party/abseil-cpp/absl/functional/function_ref.h +4 -1
  594. data/third_party/abseil-cpp/absl/hash/hash.h +22 -0
  595. data/third_party/abseil-cpp/absl/hash/internal/hash.cc +15 -16
  596. data/third_party/abseil-cpp/absl/hash/internal/hash.h +88 -37
  597. data/third_party/abseil-cpp/absl/hash/internal/{wyhash.cc → low_level_hash.cc} +23 -11
  598. data/third_party/abseil-cpp/absl/hash/internal/{wyhash.h → low_level_hash.h} +14 -12
  599. data/third_party/abseil-cpp/absl/memory/memory.h +1 -1
  600. data/third_party/abseil-cpp/absl/meta/type_traits.h +32 -2
  601. data/third_party/abseil-cpp/absl/numeric/int128.cc +3 -10
  602. data/third_party/abseil-cpp/absl/numeric/int128.h +146 -73
  603. data/third_party/abseil-cpp/absl/numeric/int128_have_intrinsic.inc +19 -25
  604. data/third_party/abseil-cpp/absl/numeric/int128_no_intrinsic.inc +73 -70
  605. data/third_party/abseil-cpp/absl/{base → profiling}/internal/exponential_biased.cc +4 -4
  606. data/third_party/abseil-cpp/absl/{base → profiling}/internal/exponential_biased.h +6 -6
  607. data/third_party/abseil-cpp/absl/profiling/internal/sample_recorder.h +230 -0
  608. data/third_party/abseil-cpp/absl/status/internal/status_internal.h +5 -5
  609. data/third_party/abseil-cpp/absl/status/status.cc +9 -17
  610. data/third_party/abseil-cpp/absl/status/status.h +19 -15
  611. data/third_party/abseil-cpp/absl/status/statusor.cc +34 -2
  612. data/third_party/abseil-cpp/absl/status/statusor.h +31 -21
  613. data/third_party/abseil-cpp/absl/strings/charconv.cc +3 -3
  614. data/third_party/abseil-cpp/absl/strings/charconv.h +3 -2
  615. data/third_party/abseil-cpp/absl/strings/cord.cc +453 -359
  616. data/third_party/abseil-cpp/absl/strings/cord.h +197 -70
  617. data/third_party/abseil-cpp/absl/strings/internal/charconv_parse.cc +1 -1
  618. data/third_party/abseil-cpp/absl/strings/internal/cord_internal.cc +6 -0
  619. data/third_party/abseil-cpp/absl/strings/internal/cord_internal.h +140 -63
  620. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree.cc +1128 -0
  621. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree.h +939 -0
  622. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_navigator.cc +185 -0
  623. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_navigator.h +265 -0
  624. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_reader.cc +68 -0
  625. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_reader.h +211 -0
  626. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_consume.cc +129 -0
  627. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_consume.h +50 -0
  628. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_flat.h +7 -7
  629. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring.cc +55 -181
  630. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring.h +42 -24
  631. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring_reader.h +4 -0
  632. data/third_party/abseil-cpp/absl/strings/internal/cordz_functions.cc +96 -0
  633. data/third_party/abseil-cpp/absl/strings/internal/cordz_functions.h +85 -0
  634. data/third_party/abseil-cpp/absl/strings/internal/cordz_handle.cc +139 -0
  635. data/third_party/abseil-cpp/absl/strings/internal/cordz_handle.h +131 -0
  636. data/third_party/abseil-cpp/absl/strings/internal/cordz_info.cc +445 -0
  637. data/third_party/abseil-cpp/absl/strings/internal/cordz_info.h +298 -0
  638. data/third_party/abseil-cpp/absl/strings/internal/cordz_statistics.h +87 -0
  639. data/third_party/abseil-cpp/absl/strings/internal/cordz_update_scope.h +71 -0
  640. data/third_party/abseil-cpp/absl/strings/internal/cordz_update_tracker.h +121 -0
  641. data/third_party/abseil-cpp/absl/strings/internal/resize_uninitialized.h +48 -2
  642. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.h +8 -0
  643. data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.cc +3 -4
  644. data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.h +1 -1
  645. data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.cc +6 -6
  646. data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.h +36 -18
  647. data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.cc +62 -73
  648. data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.h +24 -16
  649. data/third_party/abseil-cpp/absl/strings/internal/str_split_internal.h +35 -35
  650. data/third_party/abseil-cpp/absl/strings/numbers.cc +1 -1
  651. data/third_party/abseil-cpp/absl/strings/numbers.h +34 -0
  652. data/third_party/abseil-cpp/absl/strings/str_cat.cc +4 -4
  653. data/third_party/abseil-cpp/absl/strings/str_format.h +1 -2
  654. data/third_party/abseil-cpp/absl/strings/string_view.cc +16 -21
  655. data/third_party/abseil-cpp/absl/strings/string_view.h +120 -39
  656. data/third_party/abseil-cpp/absl/strings/substitute.cc +2 -1
  657. data/third_party/abseil-cpp/absl/strings/substitute.h +99 -74
  658. data/third_party/abseil-cpp/absl/synchronization/blocking_counter.cc +25 -15
  659. data/third_party/abseil-cpp/absl/synchronization/blocking_counter.h +5 -3
  660. data/third_party/abseil-cpp/absl/synchronization/internal/waiter.cc +1 -1
  661. data/third_party/abseil-cpp/absl/synchronization/mutex.h +3 -3
  662. data/third_party/abseil-cpp/absl/time/civil_time.cc +1 -3
  663. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/time_zone.h +93 -20
  664. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_fixed.cc +1 -1
  665. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_if.h +2 -1
  666. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_info.cc +83 -21
  667. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_lookup.cc +49 -0
  668. data/third_party/abseil-cpp/absl/time/internal/cctz/src/tzfile.h +1 -1
  669. data/third_party/abseil-cpp/absl/time/internal/cctz/src/zone_info_source.cc +2 -3
  670. data/third_party/abseil-cpp/absl/time/time.h +67 -36
  671. data/third_party/abseil-cpp/absl/types/bad_optional_access.h +1 -1
  672. data/third_party/abseil-cpp/absl/types/bad_variant_access.h +2 -2
  673. data/third_party/abseil-cpp/absl/types/span.h +3 -3
  674. data/third_party/boringssl-with-bazel/err_data.c +681 -677
  675. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_bitstr.c +19 -11
  676. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_object.c +41 -30
  677. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_time.c +1 -1
  678. data/third_party/boringssl-with-bazel/src/crypto/asn1/asn1_lib.c +59 -47
  679. data/third_party/boringssl-with-bazel/src/crypto/asn1/asn_pack.c +24 -28
  680. data/third_party/boringssl-with-bazel/src/crypto/asn1/f_int.c +5 -0
  681. data/third_party/boringssl-with-bazel/src/crypto/asn1/internal.h +28 -0
  682. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_dec.c +48 -272
  683. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_typ.c +8 -6
  684. data/third_party/boringssl-with-bazel/src/crypto/bytestring/ber.c +3 -1
  685. data/third_party/boringssl-with-bazel/src/crypto/evp/evp_asn1.c +2 -2
  686. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/self_check/self_check.c +7 -7
  687. data/third_party/boringssl-with-bazel/src/crypto/mem.c +18 -0
  688. data/third_party/boringssl-with-bazel/src/crypto/pool/internal.h +5 -1
  689. data/third_party/boringssl-with-bazel/src/crypto/pool/pool.c +59 -23
  690. data/third_party/boringssl-with-bazel/src/crypto/x509/asn1_gen.c +2 -18
  691. data/third_party/boringssl-with-bazel/src/crypto/x509/internal.h +8 -2
  692. data/third_party/boringssl-with-bazel/src/crypto/x509v3/internal.h +216 -11
  693. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_cache.c +1 -1
  694. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_data.c +1 -1
  695. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_lib.c +1 -1
  696. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_map.c +1 -1
  697. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_node.c +1 -1
  698. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_tree.c +1 -1
  699. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_alt.c +1 -0
  700. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_cpols.c +0 -1
  701. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_lib.c +21 -4
  702. data/third_party/boringssl-with-bazel/src/include/openssl/asn1.h +971 -253
  703. data/third_party/boringssl-with-bazel/src/include/openssl/asn1t.h +3 -3
  704. data/third_party/boringssl-with-bazel/src/include/openssl/base.h +0 -1
  705. data/third_party/boringssl-with-bazel/src/include/openssl/dh.h +4 -12
  706. data/third_party/boringssl-with-bazel/src/include/openssl/dsa.h +17 -41
  707. data/third_party/boringssl-with-bazel/src/include/openssl/ec_key.h +12 -27
  708. data/third_party/boringssl-with-bazel/src/include/openssl/ecdsa.h +8 -10
  709. data/third_party/boringssl-with-bazel/src/include/openssl/evp.h +29 -55
  710. data/third_party/boringssl-with-bazel/src/include/openssl/pkcs7.h +3 -9
  711. data/third_party/boringssl-with-bazel/src/include/openssl/pool.h +7 -1
  712. data/third_party/boringssl-with-bazel/src/include/openssl/rsa.h +24 -28
  713. data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +6 -9
  714. data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +12 -43
  715. data/third_party/boringssl-with-bazel/src/include/openssl/x509v3.h +4 -3
  716. data/third_party/boringssl-with-bazel/src/ssl/internal.h +3 -3
  717. data/third_party/boringssl-with-bazel/src/ssl/ssl_versions.cc +4 -0
  718. data/third_party/upb/upb/decode.c +309 -178
  719. data/third_party/upb/upb/decode_fast.c +1 -1
  720. data/third_party/upb/upb/decode_internal.h +1 -0
  721. data/third_party/upb/upb/def.c +330 -85
  722. data/third_party/upb/upb/def.h +45 -14
  723. data/third_party/upb/upb/def.hpp +17 -4
  724. data/third_party/upb/upb/encode.c +100 -40
  725. data/third_party/upb/upb/msg.c +22 -9
  726. data/third_party/upb/upb/msg_internal.h +90 -8
  727. data/third_party/upb/upb/reflection.c +98 -58
  728. data/third_party/upb/upb/reflection.h +6 -2
  729. data/third_party/upb/upb/text_encode.c +3 -3
  730. data/third_party/upb/upb/upb.c +8 -0
  731. metadata +116 -56
  732. data/src/core/lib/avl/avl.cc +0 -306
  733. data/src/core/lib/gprpp/match.h +0 -73
  734. data/src/core/lib/gprpp/overload.h +0 -59
  735. data/src/core/lib/iomgr/event_engine/iomgr.h +0 -42
  736. data/src/core/lib/iomgr/resource_quota.cc +0 -1106
  737. data/src/core/lib/iomgr/resource_quota.h +0 -226
  738. data/third_party/boringssl-with-bazel/src/crypto/asn1/f_enum.c +0 -93
  739. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_int.h +0 -217
@@ -21,8 +21,11 @@
21
21
  #include <iterator>
22
22
  #include <limits>
23
23
  #include <memory>
24
+ #include <new>
25
+ #include <type_traits>
24
26
  #include <utility>
25
27
 
28
+ #include "absl/base/attributes.h"
26
29
  #include "absl/base/macros.h"
27
30
  #include "absl/container/internal/compressed_tuple.h"
28
31
  #include "absl/memory/memory.h"
@@ -36,116 +39,132 @@ namespace inlined_vector_internal {
36
39
  // GCC does not deal very well with the below code
37
40
  #if !defined(__clang__) && defined(__GNUC__)
38
41
  #pragma GCC diagnostic push
42
+ #pragma GCC diagnostic ignored "-Warray-bounds"
39
43
  #pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
40
44
  #endif
41
45
 
46
+ template <typename A>
47
+ using AllocatorTraits = std::allocator_traits<A>;
48
+ template <typename A>
49
+ using ValueType = typename AllocatorTraits<A>::value_type;
50
+ template <typename A>
51
+ using SizeType = typename AllocatorTraits<A>::size_type;
52
+ template <typename A>
53
+ using Pointer = typename AllocatorTraits<A>::pointer;
54
+ template <typename A>
55
+ using ConstPointer = typename AllocatorTraits<A>::const_pointer;
56
+ template <typename A>
57
+ using SizeType = typename AllocatorTraits<A>::size_type;
58
+ template <typename A>
59
+ using DifferenceType = typename AllocatorTraits<A>::difference_type;
60
+ template <typename A>
61
+ using Reference = ValueType<A>&;
62
+ template <typename A>
63
+ using ConstReference = const ValueType<A>&;
64
+ template <typename A>
65
+ using Iterator = Pointer<A>;
66
+ template <typename A>
67
+ using ConstIterator = ConstPointer<A>;
68
+ template <typename A>
69
+ using ReverseIterator = typename std::reverse_iterator<Iterator<A>>;
70
+ template <typename A>
71
+ using ConstReverseIterator = typename std::reverse_iterator<ConstIterator<A>>;
72
+ template <typename A>
73
+ using MoveIterator = typename std::move_iterator<Iterator<A>>;
74
+
42
75
  template <typename Iterator>
43
76
  using IsAtLeastForwardIterator = std::is_convertible<
44
77
  typename std::iterator_traits<Iterator>::iterator_category,
45
78
  std::forward_iterator_tag>;
46
79
 
47
- template <typename AllocatorType,
48
- typename ValueType =
49
- typename absl::allocator_traits<AllocatorType>::value_type>
80
+ template <typename A>
50
81
  using IsMemcpyOk =
51
- absl::conjunction<std::is_same<AllocatorType, std::allocator<ValueType>>,
52
- absl::is_trivially_copy_constructible<ValueType>,
53
- absl::is_trivially_copy_assignable<ValueType>,
54
- absl::is_trivially_destructible<ValueType>>;
82
+ absl::conjunction<std::is_same<A, std::allocator<ValueType<A>>>,
83
+ absl::is_trivially_copy_constructible<ValueType<A>>,
84
+ absl::is_trivially_copy_assignable<ValueType<A>>,
85
+ absl::is_trivially_destructible<ValueType<A>>>;
86
+
87
+ template <typename T>
88
+ struct TypeIdentity {
89
+ using type = T;
90
+ };
55
91
 
56
- template <typename AllocatorType, typename Pointer, typename SizeType>
57
- void DestroyElements(AllocatorType* alloc_ptr, Pointer destroy_first,
58
- SizeType destroy_size) {
59
- using AllocatorTraits = absl::allocator_traits<AllocatorType>;
92
+ // Used for function arguments in template functions to prevent ADL by forcing
93
+ // callers to explicitly specify the template parameter.
94
+ template <typename T>
95
+ using NoTypeDeduction = typename TypeIdentity<T>::type;
60
96
 
97
+ template <typename A>
98
+ void DestroyElements(NoTypeDeduction<A>& allocator, Pointer<A> destroy_first,
99
+ SizeType<A> destroy_size) {
61
100
  if (destroy_first != nullptr) {
62
- for (auto i = destroy_size; i != 0;) {
101
+ for (SizeType<A> i = destroy_size; i != 0;) {
63
102
  --i;
64
- AllocatorTraits::destroy(*alloc_ptr, destroy_first + i);
65
- }
66
-
67
- #if !defined(NDEBUG)
68
- {
69
- using ValueType = typename AllocatorTraits::value_type;
70
-
71
- // Overwrite unused memory with `0xab` so we can catch uninitialized
72
- // usage.
73
- //
74
- // Cast to `void*` to tell the compiler that we don't care that we might
75
- // be scribbling on a vtable pointer.
76
- void* memory_ptr = destroy_first;
77
- auto memory_size = destroy_size * sizeof(ValueType);
78
- std::memset(memory_ptr, 0xab, memory_size);
103
+ AllocatorTraits<A>::destroy(allocator, destroy_first + i);
79
104
  }
80
- #endif // !defined(NDEBUG)
81
105
  }
82
106
  }
83
107
 
84
- // If kUseMemcpy is true, memcpy(dst, src, n); else do nothing.
85
- // Useful to avoid compiler warnings when memcpy() is used for T values
86
- // that are not trivially copyable in non-reachable code.
87
- template <bool kUseMemcpy>
88
- inline void MemcpyIfAllowed(void* dst, const void* src, size_t n);
108
+ template <typename A>
109
+ struct Allocation {
110
+ Pointer<A> data;
111
+ SizeType<A> capacity;
112
+ };
89
113
 
90
- // memcpy when allowed.
91
- template <>
92
- inline void MemcpyIfAllowed<true>(void* dst, const void* src, size_t n) {
93
- memcpy(dst, src, n);
94
- }
114
+ template <typename A,
115
+ bool IsOverAligned =
116
+ (alignof(ValueType<A>) > ABSL_INTERNAL_DEFAULT_NEW_ALIGNMENT)>
117
+ struct MallocAdapter {
118
+ static Allocation<A> Allocate(A& allocator, SizeType<A> requested_capacity) {
119
+ return {AllocatorTraits<A>::allocate(allocator, requested_capacity),
120
+ requested_capacity};
121
+ }
95
122
 
96
- // Do nothing for types that are not memcpy-able. This function is only
97
- // called from non-reachable branches.
98
- template <>
99
- inline void MemcpyIfAllowed<false>(void*, const void*, size_t) {}
123
+ static void Deallocate(A& allocator, Pointer<A> pointer,
124
+ SizeType<A> capacity) {
125
+ AllocatorTraits<A>::deallocate(allocator, pointer, capacity);
126
+ }
127
+ };
100
128
 
101
- template <typename AllocatorType, typename Pointer, typename ValueAdapter,
102
- typename SizeType>
103
- void ConstructElements(AllocatorType* alloc_ptr, Pointer construct_first,
104
- ValueAdapter* values_ptr, SizeType construct_size) {
105
- for (SizeType i = 0; i < construct_size; ++i) {
106
- ABSL_INTERNAL_TRY {
107
- values_ptr->ConstructNext(alloc_ptr, construct_first + i);
108
- }
129
+ template <typename A, typename ValueAdapter>
130
+ void ConstructElements(NoTypeDeduction<A>& allocator,
131
+ Pointer<A> construct_first, ValueAdapter& values,
132
+ SizeType<A> construct_size) {
133
+ for (SizeType<A> i = 0; i < construct_size; ++i) {
134
+ ABSL_INTERNAL_TRY { values.ConstructNext(allocator, construct_first + i); }
109
135
  ABSL_INTERNAL_CATCH_ANY {
110
- inlined_vector_internal::DestroyElements(alloc_ptr, construct_first, i);
136
+ DestroyElements<A>(allocator, construct_first, i);
111
137
  ABSL_INTERNAL_RETHROW;
112
138
  }
113
139
  }
114
140
  }
115
141
 
116
- template <typename Pointer, typename ValueAdapter, typename SizeType>
117
- void AssignElements(Pointer assign_first, ValueAdapter* values_ptr,
118
- SizeType assign_size) {
119
- for (SizeType i = 0; i < assign_size; ++i) {
120
- values_ptr->AssignNext(assign_first + i);
142
+ template <typename A, typename ValueAdapter>
143
+ void AssignElements(Pointer<A> assign_first, ValueAdapter& values,
144
+ SizeType<A> assign_size) {
145
+ for (SizeType<A> i = 0; i < assign_size; ++i) {
146
+ values.AssignNext(assign_first + i);
121
147
  }
122
148
  }
123
149
 
124
- template <typename AllocatorType>
150
+ template <typename A>
125
151
  struct StorageView {
126
- using AllocatorTraits = absl::allocator_traits<AllocatorType>;
127
- using Pointer = typename AllocatorTraits::pointer;
128
- using SizeType = typename AllocatorTraits::size_type;
129
-
130
- Pointer data;
131
- SizeType size;
132
- SizeType capacity;
152
+ Pointer<A> data;
153
+ SizeType<A> size;
154
+ SizeType<A> capacity;
133
155
  };
134
156
 
135
- template <typename AllocatorType, typename Iterator>
157
+ template <typename A, typename Iterator>
136
158
  class IteratorValueAdapter {
137
- using AllocatorTraits = absl::allocator_traits<AllocatorType>;
138
- using Pointer = typename AllocatorTraits::pointer;
139
-
140
159
  public:
141
160
  explicit IteratorValueAdapter(const Iterator& it) : it_(it) {}
142
161
 
143
- void ConstructNext(AllocatorType* alloc_ptr, Pointer construct_at) {
144
- AllocatorTraits::construct(*alloc_ptr, construct_at, *it_);
162
+ void ConstructNext(A& allocator, Pointer<A> construct_at) {
163
+ AllocatorTraits<A>::construct(allocator, construct_at, *it_);
145
164
  ++it_;
146
165
  }
147
166
 
148
- void AssignNext(Pointer assign_at) {
167
+ void AssignNext(Pointer<A> assign_at) {
149
168
  *assign_at = *it_;
150
169
  ++it_;
151
170
  }
@@ -154,166 +173,123 @@ class IteratorValueAdapter {
154
173
  Iterator it_;
155
174
  };
156
175
 
157
- template <typename AllocatorType>
176
+ template <typename A>
158
177
  class CopyValueAdapter {
159
- using AllocatorTraits = absl::allocator_traits<AllocatorType>;
160
- using ValueType = typename AllocatorTraits::value_type;
161
- using Pointer = typename AllocatorTraits::pointer;
162
- using ConstPointer = typename AllocatorTraits::const_pointer;
163
-
164
178
  public:
165
- explicit CopyValueAdapter(const ValueType& v) : ptr_(std::addressof(v)) {}
179
+ explicit CopyValueAdapter(ConstPointer<A> p) : ptr_(p) {}
166
180
 
167
- void ConstructNext(AllocatorType* alloc_ptr, Pointer construct_at) {
168
- AllocatorTraits::construct(*alloc_ptr, construct_at, *ptr_);
181
+ void ConstructNext(A& allocator, Pointer<A> construct_at) {
182
+ AllocatorTraits<A>::construct(allocator, construct_at, *ptr_);
169
183
  }
170
184
 
171
- void AssignNext(Pointer assign_at) { *assign_at = *ptr_; }
185
+ void AssignNext(Pointer<A> assign_at) { *assign_at = *ptr_; }
172
186
 
173
187
  private:
174
- ConstPointer ptr_;
188
+ ConstPointer<A> ptr_;
175
189
  };
176
190
 
177
- template <typename AllocatorType>
191
+ template <typename A>
178
192
  class DefaultValueAdapter {
179
- using AllocatorTraits = absl::allocator_traits<AllocatorType>;
180
- using ValueType = typename AllocatorTraits::value_type;
181
- using Pointer = typename AllocatorTraits::pointer;
182
-
183
193
  public:
184
194
  explicit DefaultValueAdapter() {}
185
195
 
186
- void ConstructNext(AllocatorType* alloc_ptr, Pointer construct_at) {
187
- AllocatorTraits::construct(*alloc_ptr, construct_at);
196
+ void ConstructNext(A& allocator, Pointer<A> construct_at) {
197
+ AllocatorTraits<A>::construct(allocator, construct_at);
188
198
  }
189
199
 
190
- void AssignNext(Pointer assign_at) { *assign_at = ValueType(); }
200
+ void AssignNext(Pointer<A> assign_at) { *assign_at = ValueType<A>(); }
191
201
  };
192
202
 
193
- template <typename AllocatorType>
203
+ template <typename A>
194
204
  class AllocationTransaction {
195
- using AllocatorTraits = absl::allocator_traits<AllocatorType>;
196
- using Pointer = typename AllocatorTraits::pointer;
197
- using SizeType = typename AllocatorTraits::size_type;
198
-
199
205
  public:
200
- explicit AllocationTransaction(AllocatorType* alloc_ptr)
201
- : alloc_data_(*alloc_ptr, nullptr) {}
206
+ explicit AllocationTransaction(A& allocator)
207
+ : allocator_data_(allocator, nullptr), capacity_(0) {}
202
208
 
203
209
  ~AllocationTransaction() {
204
210
  if (DidAllocate()) {
205
- AllocatorTraits::deallocate(GetAllocator(), GetData(), GetCapacity());
211
+ MallocAdapter<A>::Deallocate(GetAllocator(), GetData(), GetCapacity());
206
212
  }
207
213
  }
208
214
 
209
215
  AllocationTransaction(const AllocationTransaction&) = delete;
210
216
  void operator=(const AllocationTransaction&) = delete;
211
217
 
212
- AllocatorType& GetAllocator() { return alloc_data_.template get<0>(); }
213
- Pointer& GetData() { return alloc_data_.template get<1>(); }
214
- SizeType& GetCapacity() { return capacity_; }
218
+ A& GetAllocator() { return allocator_data_.template get<0>(); }
219
+ Pointer<A>& GetData() { return allocator_data_.template get<1>(); }
220
+ SizeType<A>& GetCapacity() { return capacity_; }
215
221
 
216
222
  bool DidAllocate() { return GetData() != nullptr; }
217
- Pointer Allocate(SizeType capacity) {
218
- GetData() = AllocatorTraits::allocate(GetAllocator(), capacity);
219
- GetCapacity() = capacity;
220
- return GetData();
223
+
224
+ Pointer<A> Allocate(SizeType<A> requested_capacity) {
225
+ Allocation<A> result =
226
+ MallocAdapter<A>::Allocate(GetAllocator(), requested_capacity);
227
+ GetData() = result.data;
228
+ GetCapacity() = result.capacity;
229
+ return result.data;
230
+ }
231
+
232
+ ABSL_MUST_USE_RESULT Allocation<A> Release() && {
233
+ Allocation<A> result = {GetData(), GetCapacity()};
234
+ Reset();
235
+ return result;
221
236
  }
222
237
 
238
+ private:
223
239
  void Reset() {
224
240
  GetData() = nullptr;
225
241
  GetCapacity() = 0;
226
242
  }
227
243
 
228
- private:
229
- container_internal::CompressedTuple<AllocatorType, Pointer> alloc_data_;
230
- SizeType capacity_ = 0;
244
+ container_internal::CompressedTuple<A, Pointer<A>> allocator_data_;
245
+ SizeType<A> capacity_;
231
246
  };
232
247
 
233
- template <typename AllocatorType>
248
+ template <typename A>
234
249
  class ConstructionTransaction {
235
- using AllocatorTraits = absl::allocator_traits<AllocatorType>;
236
- using Pointer = typename AllocatorTraits::pointer;
237
- using SizeType = typename AllocatorTraits::size_type;
238
-
239
250
  public:
240
- explicit ConstructionTransaction(AllocatorType* alloc_ptr)
241
- : alloc_data_(*alloc_ptr, nullptr) {}
251
+ explicit ConstructionTransaction(A& allocator)
252
+ : allocator_data_(allocator, nullptr), size_(0) {}
242
253
 
243
254
  ~ConstructionTransaction() {
244
255
  if (DidConstruct()) {
245
- inlined_vector_internal::DestroyElements(std::addressof(GetAllocator()),
246
- GetData(), GetSize());
256
+ DestroyElements<A>(GetAllocator(), GetData(), GetSize());
247
257
  }
248
258
  }
249
259
 
250
260
  ConstructionTransaction(const ConstructionTransaction&) = delete;
251
261
  void operator=(const ConstructionTransaction&) = delete;
252
262
 
253
- AllocatorType& GetAllocator() { return alloc_data_.template get<0>(); }
254
- Pointer& GetData() { return alloc_data_.template get<1>(); }
255
- SizeType& GetSize() { return size_; }
263
+ A& GetAllocator() { return allocator_data_.template get<0>(); }
264
+ Pointer<A>& GetData() { return allocator_data_.template get<1>(); }
265
+ SizeType<A>& GetSize() { return size_; }
256
266
 
257
267
  bool DidConstruct() { return GetData() != nullptr; }
258
268
  template <typename ValueAdapter>
259
- void Construct(Pointer data, ValueAdapter* values_ptr, SizeType size) {
260
- inlined_vector_internal::ConstructElements(std::addressof(GetAllocator()),
261
- data, values_ptr, size);
269
+ void Construct(Pointer<A> data, ValueAdapter& values, SizeType<A> size) {
270
+ ConstructElements<A>(GetAllocator(), data, values, size);
262
271
  GetData() = data;
263
272
  GetSize() = size;
264
273
  }
265
- void Commit() {
274
+ void Commit() && {
266
275
  GetData() = nullptr;
267
276
  GetSize() = 0;
268
277
  }
269
278
 
270
279
  private:
271
- container_internal::CompressedTuple<AllocatorType, Pointer> alloc_data_;
272
- SizeType size_ = 0;
280
+ container_internal::CompressedTuple<A, Pointer<A>> allocator_data_;
281
+ SizeType<A> size_;
273
282
  };
274
283
 
275
284
  template <typename T, size_t N, typename A>
276
285
  class Storage {
277
286
  public:
278
- using AllocatorTraits = absl::allocator_traits<A>;
279
- using allocator_type = typename AllocatorTraits::allocator_type;
280
- using value_type = typename AllocatorTraits::value_type;
281
- using pointer = typename AllocatorTraits::pointer;
282
- using const_pointer = typename AllocatorTraits::const_pointer;
283
- using size_type = typename AllocatorTraits::size_type;
284
- using difference_type = typename AllocatorTraits::difference_type;
285
-
286
- using reference = value_type&;
287
- using const_reference = const value_type&;
288
- using RValueReference = value_type&&;
289
- using iterator = pointer;
290
- using const_iterator = const_pointer;
291
- using reverse_iterator = std::reverse_iterator<iterator>;
292
- using const_reverse_iterator = std::reverse_iterator<const_iterator>;
293
- using MoveIterator = std::move_iterator<iterator>;
294
- using IsMemcpyOk = inlined_vector_internal::IsMemcpyOk<allocator_type>;
295
-
296
- using StorageView = inlined_vector_internal::StorageView<allocator_type>;
297
-
298
- template <typename Iterator>
299
- using IteratorValueAdapter =
300
- inlined_vector_internal::IteratorValueAdapter<allocator_type, Iterator>;
301
- using CopyValueAdapter =
302
- inlined_vector_internal::CopyValueAdapter<allocator_type>;
303
- using DefaultValueAdapter =
304
- inlined_vector_internal::DefaultValueAdapter<allocator_type>;
305
-
306
- using AllocationTransaction =
307
- inlined_vector_internal::AllocationTransaction<allocator_type>;
308
- using ConstructionTransaction =
309
- inlined_vector_internal::ConstructionTransaction<allocator_type>;
310
-
311
- static size_type NextCapacity(size_type current_capacity) {
287
+ static SizeType<A> NextCapacity(SizeType<A> current_capacity) {
312
288
  return current_capacity * 2;
313
289
  }
314
290
 
315
- static size_type ComputeCapacity(size_type current_capacity,
316
- size_type requested_capacity) {
291
+ static SizeType<A> ComputeCapacity(SizeType<A> current_capacity,
292
+ SizeType<A> requested_capacity) {
317
293
  return (std::max)(NextCapacity(current_capacity), requested_capacity);
318
294
  }
319
295
 
@@ -321,15 +297,15 @@ class Storage {
321
297
  // Storage Constructors and Destructor
322
298
  // ---------------------------------------------------------------------------
323
299
 
324
- Storage() : metadata_(allocator_type(), /* size and is_allocated */ 0) {}
300
+ Storage() : metadata_(A(), /* size and is_allocated */ 0) {}
325
301
 
326
- explicit Storage(const allocator_type& alloc)
327
- : metadata_(alloc, /* size and is_allocated */ 0) {}
302
+ explicit Storage(const A& allocator)
303
+ : metadata_(allocator, /* size and is_allocated */ 0) {}
328
304
 
329
305
  ~Storage() {
330
306
  if (GetSizeAndIsAllocated() == 0) {
331
307
  // Empty and not allocated; nothing to do.
332
- } else if (IsMemcpyOk::value) {
308
+ } else if (IsMemcpyOk<A>::value) {
333
309
  // No destructors need to be run; just deallocate if necessary.
334
310
  DeallocateIfAllocated();
335
311
  } else {
@@ -341,52 +317,48 @@ class Storage {
341
317
  // Storage Member Accessors
342
318
  // ---------------------------------------------------------------------------
343
319
 
344
- size_type& GetSizeAndIsAllocated() { return metadata_.template get<1>(); }
320
+ SizeType<A>& GetSizeAndIsAllocated() { return metadata_.template get<1>(); }
345
321
 
346
- const size_type& GetSizeAndIsAllocated() const {
322
+ const SizeType<A>& GetSizeAndIsAllocated() const {
347
323
  return metadata_.template get<1>();
348
324
  }
349
325
 
350
- size_type GetSize() const { return GetSizeAndIsAllocated() >> 1; }
326
+ SizeType<A> GetSize() const { return GetSizeAndIsAllocated() >> 1; }
351
327
 
352
328
  bool GetIsAllocated() const { return GetSizeAndIsAllocated() & 1; }
353
329
 
354
- pointer GetAllocatedData() { return data_.allocated.allocated_data; }
330
+ Pointer<A> GetAllocatedData() { return data_.allocated.allocated_data; }
355
331
 
356
- const_pointer GetAllocatedData() const {
332
+ ConstPointer<A> GetAllocatedData() const {
357
333
  return data_.allocated.allocated_data;
358
334
  }
359
335
 
360
- pointer GetInlinedData() {
361
- return reinterpret_cast<pointer>(
336
+ Pointer<A> GetInlinedData() {
337
+ return reinterpret_cast<Pointer<A>>(
362
338
  std::addressof(data_.inlined.inlined_data[0]));
363
339
  }
364
340
 
365
- const_pointer GetInlinedData() const {
366
- return reinterpret_cast<const_pointer>(
341
+ ConstPointer<A> GetInlinedData() const {
342
+ return reinterpret_cast<ConstPointer<A>>(
367
343
  std::addressof(data_.inlined.inlined_data[0]));
368
344
  }
369
345
 
370
- size_type GetAllocatedCapacity() const {
346
+ SizeType<A> GetAllocatedCapacity() const {
371
347
  return data_.allocated.allocated_capacity;
372
348
  }
373
349
 
374
- size_type GetInlinedCapacity() const { return static_cast<size_type>(N); }
350
+ SizeType<A> GetInlinedCapacity() const { return static_cast<SizeType<A>>(N); }
375
351
 
376
- StorageView MakeStorageView() {
377
- return GetIsAllocated()
378
- ? StorageView{GetAllocatedData(), GetSize(),
379
- GetAllocatedCapacity()}
380
- : StorageView{GetInlinedData(), GetSize(), GetInlinedCapacity()};
352
+ StorageView<A> MakeStorageView() {
353
+ return GetIsAllocated() ? StorageView<A>{GetAllocatedData(), GetSize(),
354
+ GetAllocatedCapacity()}
355
+ : StorageView<A>{GetInlinedData(), GetSize(),
356
+ GetInlinedCapacity()};
381
357
  }
382
358
 
383
- allocator_type* GetAllocPtr() {
384
- return std::addressof(metadata_.template get<0>());
385
- }
359
+ A& GetAllocator() { return metadata_.template get<0>(); }
386
360
 
387
- const allocator_type* GetAllocPtr() const {
388
- return std::addressof(metadata_.template get<0>());
389
- }
361
+ const A& GetAllocator() const { return metadata_.template get<0>(); }
390
362
 
391
363
  // ---------------------------------------------------------------------------
392
364
  // Storage Member Mutators
@@ -395,74 +367,67 @@ class Storage {
395
367
  ABSL_ATTRIBUTE_NOINLINE void InitFrom(const Storage& other);
396
368
 
397
369
  template <typename ValueAdapter>
398
- void Initialize(ValueAdapter values, size_type new_size);
370
+ void Initialize(ValueAdapter values, SizeType<A> new_size);
399
371
 
400
372
  template <typename ValueAdapter>
401
- void Assign(ValueAdapter values, size_type new_size);
373
+ void Assign(ValueAdapter values, SizeType<A> new_size);
402
374
 
403
375
  template <typename ValueAdapter>
404
- void Resize(ValueAdapter values, size_type new_size);
376
+ void Resize(ValueAdapter values, SizeType<A> new_size);
405
377
 
406
378
  template <typename ValueAdapter>
407
- iterator Insert(const_iterator pos, ValueAdapter values,
408
- size_type insert_count);
379
+ Iterator<A> Insert(ConstIterator<A> pos, ValueAdapter values,
380
+ SizeType<A> insert_count);
409
381
 
410
382
  template <typename... Args>
411
- reference EmplaceBack(Args&&... args);
383
+ Reference<A> EmplaceBack(Args&&... args);
412
384
 
413
- iterator Erase(const_iterator from, const_iterator to);
385
+ Iterator<A> Erase(ConstIterator<A> from, ConstIterator<A> to);
414
386
 
415
- void Reserve(size_type requested_capacity);
387
+ void Reserve(SizeType<A> requested_capacity);
416
388
 
417
389
  void ShrinkToFit();
418
390
 
419
391
  void Swap(Storage* other_storage_ptr);
420
392
 
421
393
  void SetIsAllocated() {
422
- GetSizeAndIsAllocated() |= static_cast<size_type>(1);
394
+ GetSizeAndIsAllocated() |= static_cast<SizeType<A>>(1);
423
395
  }
424
396
 
425
397
  void UnsetIsAllocated() {
426
- GetSizeAndIsAllocated() &= ((std::numeric_limits<size_type>::max)() - 1);
398
+ GetSizeAndIsAllocated() &= ((std::numeric_limits<SizeType<A>>::max)() - 1);
427
399
  }
428
400
 
429
- void SetSize(size_type size) {
401
+ void SetSize(SizeType<A> size) {
430
402
  GetSizeAndIsAllocated() =
431
- (size << 1) | static_cast<size_type>(GetIsAllocated());
403
+ (size << 1) | static_cast<SizeType<A>>(GetIsAllocated());
432
404
  }
433
405
 
434
- void SetAllocatedSize(size_type size) {
435
- GetSizeAndIsAllocated() = (size << 1) | static_cast<size_type>(1);
406
+ void SetAllocatedSize(SizeType<A> size) {
407
+ GetSizeAndIsAllocated() = (size << 1) | static_cast<SizeType<A>>(1);
436
408
  }
437
409
 
438
- void SetInlinedSize(size_type size) {
439
- GetSizeAndIsAllocated() = size << static_cast<size_type>(1);
410
+ void SetInlinedSize(SizeType<A> size) {
411
+ GetSizeAndIsAllocated() = size << static_cast<SizeType<A>>(1);
440
412
  }
441
413
 
442
- void AddSize(size_type count) {
443
- GetSizeAndIsAllocated() += count << static_cast<size_type>(1);
414
+ void AddSize(SizeType<A> count) {
415
+ GetSizeAndIsAllocated() += count << static_cast<SizeType<A>>(1);
444
416
  }
445
417
 
446
- void SubtractSize(size_type count) {
418
+ void SubtractSize(SizeType<A> count) {
447
419
  assert(count <= GetSize());
448
420
 
449
- GetSizeAndIsAllocated() -= count << static_cast<size_type>(1);
450
- }
451
-
452
- void SetAllocatedData(pointer data, size_type capacity) {
453
- data_.allocated.allocated_data = data;
454
- data_.allocated.allocated_capacity = capacity;
421
+ GetSizeAndIsAllocated() -= count << static_cast<SizeType<A>>(1);
455
422
  }
456
423
 
457
- void AcquireAllocatedData(AllocationTransaction* allocation_tx_ptr) {
458
- SetAllocatedData(allocation_tx_ptr->GetData(),
459
- allocation_tx_ptr->GetCapacity());
460
-
461
- allocation_tx_ptr->Reset();
424
+ void SetAllocation(Allocation<A> allocation) {
425
+ data_.allocated.allocated_data = allocation.data;
426
+ data_.allocated.allocated_capacity = allocation.capacity;
462
427
  }
463
428
 
464
429
  void MemcpyFrom(const Storage& other_storage) {
465
- assert(IsMemcpyOk::value || other_storage.GetIsAllocated());
430
+ assert(IsMemcpyOk<A>::value || other_storage.GetIsAllocated());
466
431
 
467
432
  GetSizeAndIsAllocated() = other_storage.GetSizeAndIsAllocated();
468
433
  data_ = other_storage.data_;
@@ -470,24 +435,23 @@ class Storage {
470
435
 
471
436
  void DeallocateIfAllocated() {
472
437
  if (GetIsAllocated()) {
473
- AllocatorTraits::deallocate(*GetAllocPtr(), GetAllocatedData(),
474
- GetAllocatedCapacity());
438
+ MallocAdapter<A>::Deallocate(GetAllocator(), GetAllocatedData(),
439
+ GetAllocatedCapacity());
475
440
  }
476
441
  }
477
442
 
478
443
  private:
479
444
  ABSL_ATTRIBUTE_NOINLINE void DestroyContents();
480
445
 
481
- using Metadata =
482
- container_internal::CompressedTuple<allocator_type, size_type>;
446
+ using Metadata = container_internal::CompressedTuple<A, SizeType<A>>;
483
447
 
484
448
  struct Allocated {
485
- pointer allocated_data;
486
- size_type allocated_capacity;
449
+ Pointer<A> allocated_data;
450
+ SizeType<A> allocated_capacity;
487
451
  };
488
452
 
489
453
  struct Inlined {
490
- alignas(value_type) char inlined_data[sizeof(value_type[N])];
454
+ alignas(ValueType<A>) char inlined_data[sizeof(ValueType<A>[N])];
491
455
  };
492
456
 
493
457
  union Data {
@@ -496,7 +460,7 @@ class Storage {
496
460
  };
497
461
 
498
462
  template <typename... Args>
499
- ABSL_ATTRIBUTE_NOINLINE reference EmplaceBackSlow(Args&&... args);
463
+ ABSL_ATTRIBUTE_NOINLINE Reference<A> EmplaceBackSlow(Args&&... args);
500
464
 
501
465
  Metadata metadata_;
502
466
  Data data_;
@@ -504,17 +468,17 @@ class Storage {
504
468
 
505
469
  template <typename T, size_t N, typename A>
506
470
  void Storage<T, N, A>::DestroyContents() {
507
- pointer data = GetIsAllocated() ? GetAllocatedData() : GetInlinedData();
508
- inlined_vector_internal::DestroyElements(GetAllocPtr(), data, GetSize());
471
+ Pointer<A> data = GetIsAllocated() ? GetAllocatedData() : GetInlinedData();
472
+ DestroyElements<A>(GetAllocator(), data, GetSize());
509
473
  DeallocateIfAllocated();
510
474
  }
511
475
 
512
476
  template <typename T, size_t N, typename A>
513
477
  void Storage<T, N, A>::InitFrom(const Storage& other) {
514
- const auto n = other.GetSize();
478
+ const SizeType<A> n = other.GetSize();
515
479
  assert(n > 0); // Empty sources handled handled in caller.
516
- const_pointer src;
517
- pointer dst;
480
+ ConstPointer<A> src;
481
+ Pointer<A> dst;
518
482
  if (!other.GetIsAllocated()) {
519
483
  dst = GetInlinedData();
520
484
  src = other.GetInlinedData();
@@ -522,43 +486,48 @@ void Storage<T, N, A>::InitFrom(const Storage& other) {
522
486
  // Because this is only called from the `InlinedVector` constructors, it's
523
487
  // safe to take on the allocation with size `0`. If `ConstructElements(...)`
524
488
  // throws, deallocation will be automatically handled by `~Storage()`.
525
- size_type new_capacity = ComputeCapacity(GetInlinedCapacity(), n);
526
- dst = AllocatorTraits::allocate(*GetAllocPtr(), new_capacity);
527
- SetAllocatedData(dst, new_capacity);
489
+ SizeType<A> requested_capacity = ComputeCapacity(GetInlinedCapacity(), n);
490
+ Allocation<A> allocation =
491
+ MallocAdapter<A>::Allocate(GetAllocator(), requested_capacity);
492
+ SetAllocation(allocation);
493
+ dst = allocation.data;
528
494
  src = other.GetAllocatedData();
529
495
  }
530
- if (IsMemcpyOk::value) {
531
- MemcpyIfAllowed<IsMemcpyOk::value>(dst, src, sizeof(dst[0]) * n);
496
+ if (IsMemcpyOk<A>::value) {
497
+ std::memcpy(reinterpret_cast<char*>(dst),
498
+ reinterpret_cast<const char*>(src), n * sizeof(ValueType<A>));
532
499
  } else {
533
- auto values = IteratorValueAdapter<const_pointer>(src);
534
- inlined_vector_internal::ConstructElements(GetAllocPtr(), dst, &values, n);
500
+ auto values = IteratorValueAdapter<A, ConstPointer<A>>(src);
501
+ ConstructElements<A>(GetAllocator(), dst, values, n);
535
502
  }
536
503
  GetSizeAndIsAllocated() = other.GetSizeAndIsAllocated();
537
504
  }
538
505
 
539
506
  template <typename T, size_t N, typename A>
540
507
  template <typename ValueAdapter>
541
- auto Storage<T, N, A>::Initialize(ValueAdapter values, size_type new_size)
508
+ auto Storage<T, N, A>::Initialize(ValueAdapter values, SizeType<A> new_size)
542
509
  -> void {
543
510
  // Only callable from constructors!
544
511
  assert(!GetIsAllocated());
545
512
  assert(GetSize() == 0);
546
513
 
547
- pointer construct_data;
514
+ Pointer<A> construct_data;
548
515
  if (new_size > GetInlinedCapacity()) {
549
516
  // Because this is only called from the `InlinedVector` constructors, it's
550
517
  // safe to take on the allocation with size `0`. If `ConstructElements(...)`
551
518
  // throws, deallocation will be automatically handled by `~Storage()`.
552
- size_type new_capacity = ComputeCapacity(GetInlinedCapacity(), new_size);
553
- construct_data = AllocatorTraits::allocate(*GetAllocPtr(), new_capacity);
554
- SetAllocatedData(construct_data, new_capacity);
519
+ SizeType<A> requested_capacity =
520
+ ComputeCapacity(GetInlinedCapacity(), new_size);
521
+ Allocation<A> allocation =
522
+ MallocAdapter<A>::Allocate(GetAllocator(), requested_capacity);
523
+ construct_data = allocation.data;
524
+ SetAllocation(allocation);
555
525
  SetIsAllocated();
556
526
  } else {
557
527
  construct_data = GetInlinedData();
558
528
  }
559
529
 
560
- inlined_vector_internal::ConstructElements(GetAllocPtr(), construct_data,
561
- &values, new_size);
530
+ ConstructElements<A>(GetAllocator(), construct_data, values, new_size);
562
531
 
563
532
  // Since the initial size was guaranteed to be `0` and the allocated bit is
564
533
  // already correct for either case, *adding* `new_size` gives us the correct
@@ -568,18 +537,20 @@ auto Storage<T, N, A>::Initialize(ValueAdapter values, size_type new_size)
568
537
 
569
538
  template <typename T, size_t N, typename A>
570
539
  template <typename ValueAdapter>
571
- auto Storage<T, N, A>::Assign(ValueAdapter values, size_type new_size) -> void {
572
- StorageView storage_view = MakeStorageView();
540
+ auto Storage<T, N, A>::Assign(ValueAdapter values, SizeType<A> new_size)
541
+ -> void {
542
+ StorageView<A> storage_view = MakeStorageView();
573
543
 
574
- AllocationTransaction allocation_tx(GetAllocPtr());
544
+ AllocationTransaction<A> allocation_tx(GetAllocator());
575
545
 
576
- absl::Span<value_type> assign_loop;
577
- absl::Span<value_type> construct_loop;
578
- absl::Span<value_type> destroy_loop;
546
+ absl::Span<ValueType<A>> assign_loop;
547
+ absl::Span<ValueType<A>> construct_loop;
548
+ absl::Span<ValueType<A>> destroy_loop;
579
549
 
580
550
  if (new_size > storage_view.capacity) {
581
- size_type new_capacity = ComputeCapacity(storage_view.capacity, new_size);
582
- construct_loop = {allocation_tx.Allocate(new_capacity), new_size};
551
+ SizeType<A> requested_capacity =
552
+ ComputeCapacity(storage_view.capacity, new_size);
553
+ construct_loop = {allocation_tx.Allocate(requested_capacity), new_size};
583
554
  destroy_loop = {storage_view.data, storage_view.size};
584
555
  } else if (new_size > storage_view.size) {
585
556
  assign_loop = {storage_view.data, storage_view.size};
@@ -590,18 +561,16 @@ auto Storage<T, N, A>::Assign(ValueAdapter values, size_type new_size) -> void {
590
561
  destroy_loop = {storage_view.data + new_size, storage_view.size - new_size};
591
562
  }
592
563
 
593
- inlined_vector_internal::AssignElements(assign_loop.data(), &values,
594
- assign_loop.size());
564
+ AssignElements<A>(assign_loop.data(), values, assign_loop.size());
595
565
 
596
- inlined_vector_internal::ConstructElements(
597
- GetAllocPtr(), construct_loop.data(), &values, construct_loop.size());
566
+ ConstructElements<A>(GetAllocator(), construct_loop.data(), values,
567
+ construct_loop.size());
598
568
 
599
- inlined_vector_internal::DestroyElements(GetAllocPtr(), destroy_loop.data(),
600
- destroy_loop.size());
569
+ DestroyElements<A>(GetAllocator(), destroy_loop.data(), destroy_loop.size());
601
570
 
602
571
  if (allocation_tx.DidAllocate()) {
603
572
  DeallocateIfAllocated();
604
- AcquireAllocatedData(&allocation_tx);
573
+ SetAllocation(std::move(allocation_tx).Release());
605
574
  SetIsAllocated();
606
575
  }
607
576
 
@@ -610,19 +579,18 @@ auto Storage<T, N, A>::Assign(ValueAdapter values, size_type new_size) -> void {
610
579
 
611
580
  template <typename T, size_t N, typename A>
612
581
  template <typename ValueAdapter>
613
- auto Storage<T, N, A>::Resize(ValueAdapter values, size_type new_size) -> void {
614
- StorageView storage_view = MakeStorageView();
615
- auto* const base = storage_view.data;
616
- const size_type size = storage_view.size;
617
- auto* alloc = GetAllocPtr();
582
+ auto Storage<T, N, A>::Resize(ValueAdapter values, SizeType<A> new_size)
583
+ -> void {
584
+ StorageView<A> storage_view = MakeStorageView();
585
+ Pointer<A> const base = storage_view.data;
586
+ const SizeType<A> size = storage_view.size;
587
+ A& alloc = GetAllocator();
618
588
  if (new_size <= size) {
619
589
  // Destroy extra old elements.
620
- inlined_vector_internal::DestroyElements(alloc, base + new_size,
621
- size - new_size);
590
+ DestroyElements<A>(alloc, base + new_size, size - new_size);
622
591
  } else if (new_size <= storage_view.capacity) {
623
592
  // Construct new elements in place.
624
- inlined_vector_internal::ConstructElements(alloc, base + size, &values,
625
- new_size - size);
593
+ ConstructElements<A>(alloc, base + size, values, new_size - size);
626
594
  } else {
627
595
  // Steps:
628
596
  // a. Allocate new backing store.
@@ -631,21 +599,22 @@ auto Storage<T, N, A>::Resize(ValueAdapter values, size_type new_size) -> void {
631
599
  // d. Destroy all elements in old backing store.
632
600
  // Use transactional wrappers for the first two steps so we can roll
633
601
  // back if necessary due to exceptions.
634
- AllocationTransaction allocation_tx(alloc);
635
- size_type new_capacity = ComputeCapacity(storage_view.capacity, new_size);
636
- pointer new_data = allocation_tx.Allocate(new_capacity);
602
+ AllocationTransaction<A> allocation_tx(alloc);
603
+ SizeType<A> requested_capacity =
604
+ ComputeCapacity(storage_view.capacity, new_size);
605
+ Pointer<A> new_data = allocation_tx.Allocate(requested_capacity);
637
606
 
638
- ConstructionTransaction construction_tx(alloc);
639
- construction_tx.Construct(new_data + size, &values, new_size - size);
607
+ ConstructionTransaction<A> construction_tx(alloc);
608
+ construction_tx.Construct(new_data + size, values, new_size - size);
640
609
 
641
- IteratorValueAdapter<MoveIterator> move_values((MoveIterator(base)));
642
- inlined_vector_internal::ConstructElements(alloc, new_data, &move_values,
643
- size);
610
+ IteratorValueAdapter<A, MoveIterator<A>> move_values(
611
+ (MoveIterator<A>(base)));
612
+ ConstructElements<A>(alloc, new_data, move_values, size);
644
613
 
645
- inlined_vector_internal::DestroyElements(alloc, base, size);
646
- construction_tx.Commit();
614
+ DestroyElements<A>(alloc, base, size);
615
+ std::move(construction_tx).Commit();
647
616
  DeallocateIfAllocated();
648
- AcquireAllocatedData(&allocation_tx);
617
+ SetAllocation(std::move(allocation_tx).Release());
649
618
  SetIsAllocated();
650
619
  }
651
620
  SetSize(new_size);
@@ -653,76 +622,76 @@ auto Storage<T, N, A>::Resize(ValueAdapter values, size_type new_size) -> void {
653
622
 
654
623
  template <typename T, size_t N, typename A>
655
624
  template <typename ValueAdapter>
656
- auto Storage<T, N, A>::Insert(const_iterator pos, ValueAdapter values,
657
- size_type insert_count) -> iterator {
658
- StorageView storage_view = MakeStorageView();
625
+ auto Storage<T, N, A>::Insert(ConstIterator<A> pos, ValueAdapter values,
626
+ SizeType<A> insert_count) -> Iterator<A> {
627
+ StorageView<A> storage_view = MakeStorageView();
659
628
 
660
- size_type insert_index =
661
- std::distance(const_iterator(storage_view.data), pos);
662
- size_type insert_end_index = insert_index + insert_count;
663
- size_type new_size = storage_view.size + insert_count;
629
+ SizeType<A> insert_index =
630
+ std::distance(ConstIterator<A>(storage_view.data), pos);
631
+ SizeType<A> insert_end_index = insert_index + insert_count;
632
+ SizeType<A> new_size = storage_view.size + insert_count;
664
633
 
665
634
  if (new_size > storage_view.capacity) {
666
- AllocationTransaction allocation_tx(GetAllocPtr());
667
- ConstructionTransaction construction_tx(GetAllocPtr());
668
- ConstructionTransaction move_construciton_tx(GetAllocPtr());
635
+ AllocationTransaction<A> allocation_tx(GetAllocator());
636
+ ConstructionTransaction<A> construction_tx(GetAllocator());
637
+ ConstructionTransaction<A> move_construction_tx(GetAllocator());
669
638
 
670
- IteratorValueAdapter<MoveIterator> move_values(
671
- MoveIterator(storage_view.data));
639
+ IteratorValueAdapter<A, MoveIterator<A>> move_values(
640
+ MoveIterator<A>(storage_view.data));
672
641
 
673
- size_type new_capacity = ComputeCapacity(storage_view.capacity, new_size);
674
- pointer new_data = allocation_tx.Allocate(new_capacity);
642
+ SizeType<A> requested_capacity =
643
+ ComputeCapacity(storage_view.capacity, new_size);
644
+ Pointer<A> new_data = allocation_tx.Allocate(requested_capacity);
675
645
 
676
- construction_tx.Construct(new_data + insert_index, &values, insert_count);
646
+ construction_tx.Construct(new_data + insert_index, values, insert_count);
677
647
 
678
- move_construciton_tx.Construct(new_data, &move_values, insert_index);
648
+ move_construction_tx.Construct(new_data, move_values, insert_index);
679
649
 
680
- inlined_vector_internal::ConstructElements(
681
- GetAllocPtr(), new_data + insert_end_index, &move_values,
682
- storage_view.size - insert_index);
650
+ ConstructElements<A>(GetAllocator(), new_data + insert_end_index,
651
+ move_values, storage_view.size - insert_index);
683
652
 
684
- inlined_vector_internal::DestroyElements(GetAllocPtr(), storage_view.data,
685
- storage_view.size);
653
+ DestroyElements<A>(GetAllocator(), storage_view.data, storage_view.size);
686
654
 
687
- construction_tx.Commit();
688
- move_construciton_tx.Commit();
655
+ std::move(construction_tx).Commit();
656
+ std::move(move_construction_tx).Commit();
689
657
  DeallocateIfAllocated();
690
- AcquireAllocatedData(&allocation_tx);
658
+ SetAllocation(std::move(allocation_tx).Release());
691
659
 
692
660
  SetAllocatedSize(new_size);
693
- return iterator(new_data + insert_index);
661
+ return Iterator<A>(new_data + insert_index);
694
662
  } else {
695
- size_type move_construction_destination_index =
663
+ SizeType<A> move_construction_destination_index =
696
664
  (std::max)(insert_end_index, storage_view.size);
697
665
 
698
- ConstructionTransaction move_construction_tx(GetAllocPtr());
666
+ ConstructionTransaction<A> move_construction_tx(GetAllocator());
699
667
 
700
- IteratorValueAdapter<MoveIterator> move_construction_values(
701
- MoveIterator(storage_view.data +
702
- (move_construction_destination_index - insert_count)));
703
- absl::Span<value_type> move_construction = {
668
+ IteratorValueAdapter<A, MoveIterator<A>> move_construction_values(
669
+ MoveIterator<A>(storage_view.data +
670
+ (move_construction_destination_index - insert_count)));
671
+ absl::Span<ValueType<A>> move_construction = {
704
672
  storage_view.data + move_construction_destination_index,
705
673
  new_size - move_construction_destination_index};
706
674
 
707
- pointer move_assignment_values = storage_view.data + insert_index;
708
- absl::Span<value_type> move_assignment = {
675
+ Pointer<A> move_assignment_values = storage_view.data + insert_index;
676
+ absl::Span<ValueType<A>> move_assignment = {
709
677
  storage_view.data + insert_end_index,
710
678
  move_construction_destination_index - insert_end_index};
711
679
 
712
- absl::Span<value_type> insert_assignment = {move_assignment_values,
713
- move_construction.size()};
680
+ absl::Span<ValueType<A>> insert_assignment = {move_assignment_values,
681
+ move_construction.size()};
714
682
 
715
- absl::Span<value_type> insert_construction = {
683
+ absl::Span<ValueType<A>> insert_construction = {
716
684
  insert_assignment.data() + insert_assignment.size(),
717
685
  insert_count - insert_assignment.size()};
718
686
 
719
687
  move_construction_tx.Construct(move_construction.data(),
720
- &move_construction_values,
688
+ move_construction_values,
721
689
  move_construction.size());
722
690
 
723
- for (pointer destination = move_assignment.data() + move_assignment.size(),
724
- last_destination = move_assignment.data(),
725
- source = move_assignment_values + move_assignment.size();
691
+ for (Pointer<A>
692
+ destination = move_assignment.data() + move_assignment.size(),
693
+ last_destination = move_assignment.data(),
694
+ source = move_assignment_values + move_assignment.size();
726
695
  ;) {
727
696
  --destination;
728
697
  --source;
@@ -730,30 +699,29 @@ auto Storage<T, N, A>::Insert(const_iterator pos, ValueAdapter values,
730
699
  *destination = std::move(*source);
731
700
  }
732
701
 
733
- inlined_vector_internal::AssignElements(insert_assignment.data(), &values,
734
- insert_assignment.size());
702
+ AssignElements<A>(insert_assignment.data(), values,
703
+ insert_assignment.size());
735
704
 
736
- inlined_vector_internal::ConstructElements(
737
- GetAllocPtr(), insert_construction.data(), &values,
738
- insert_construction.size());
705
+ ConstructElements<A>(GetAllocator(), insert_construction.data(), values,
706
+ insert_construction.size());
739
707
 
740
- move_construction_tx.Commit();
708
+ std::move(move_construction_tx).Commit();
741
709
 
742
710
  AddSize(insert_count);
743
- return iterator(storage_view.data + insert_index);
711
+ return Iterator<A>(storage_view.data + insert_index);
744
712
  }
745
713
  }
746
714
 
747
715
  template <typename T, size_t N, typename A>
748
716
  template <typename... Args>
749
- auto Storage<T, N, A>::EmplaceBack(Args&&... args) -> reference {
750
- StorageView storage_view = MakeStorageView();
751
- const auto n = storage_view.size;
717
+ auto Storage<T, N, A>::EmplaceBack(Args&&... args) -> Reference<A> {
718
+ StorageView<A> storage_view = MakeStorageView();
719
+ const SizeType<A> n = storage_view.size;
752
720
  if (ABSL_PREDICT_TRUE(n != storage_view.capacity)) {
753
721
  // Fast path; new element fits.
754
- pointer last_ptr = storage_view.data + n;
755
- AllocatorTraits::construct(*GetAllocPtr(), last_ptr,
756
- std::forward<Args>(args)...);
722
+ Pointer<A> last_ptr = storage_view.data + n;
723
+ AllocatorTraits<A>::construct(GetAllocator(), last_ptr,
724
+ std::forward<Args>(args)...);
757
725
  AddSize(1);
758
726
  return *last_ptr;
759
727
  }
@@ -763,87 +731,83 @@ auto Storage<T, N, A>::EmplaceBack(Args&&... args) -> reference {
763
731
 
764
732
  template <typename T, size_t N, typename A>
765
733
  template <typename... Args>
766
- auto Storage<T, N, A>::EmplaceBackSlow(Args&&... args) -> reference {
767
- StorageView storage_view = MakeStorageView();
768
- AllocationTransaction allocation_tx(GetAllocPtr());
769
- IteratorValueAdapter<MoveIterator> move_values(
770
- MoveIterator(storage_view.data));
771
- size_type new_capacity = NextCapacity(storage_view.capacity);
772
- pointer construct_data = allocation_tx.Allocate(new_capacity);
773
- pointer last_ptr = construct_data + storage_view.size;
734
+ auto Storage<T, N, A>::EmplaceBackSlow(Args&&... args) -> Reference<A> {
735
+ StorageView<A> storage_view = MakeStorageView();
736
+ AllocationTransaction<A> allocation_tx(GetAllocator());
737
+ IteratorValueAdapter<A, MoveIterator<A>> move_values(
738
+ MoveIterator<A>(storage_view.data));
739
+ SizeType<A> requested_capacity = NextCapacity(storage_view.capacity);
740
+ Pointer<A> construct_data = allocation_tx.Allocate(requested_capacity);
741
+ Pointer<A> last_ptr = construct_data + storage_view.size;
774
742
 
775
743
  // Construct new element.
776
- AllocatorTraits::construct(*GetAllocPtr(), last_ptr,
777
- std::forward<Args>(args)...);
744
+ AllocatorTraits<A>::construct(GetAllocator(), last_ptr,
745
+ std::forward<Args>(args)...);
778
746
  // Move elements from old backing store to new backing store.
779
747
  ABSL_INTERNAL_TRY {
780
- inlined_vector_internal::ConstructElements(
781
- GetAllocPtr(), allocation_tx.GetData(), &move_values,
782
- storage_view.size);
748
+ ConstructElements<A>(GetAllocator(), allocation_tx.GetData(), move_values,
749
+ storage_view.size);
783
750
  }
784
751
  ABSL_INTERNAL_CATCH_ANY {
785
- AllocatorTraits::destroy(*GetAllocPtr(), last_ptr);
752
+ AllocatorTraits<A>::destroy(GetAllocator(), last_ptr);
786
753
  ABSL_INTERNAL_RETHROW;
787
754
  }
788
755
  // Destroy elements in old backing store.
789
- inlined_vector_internal::DestroyElements(GetAllocPtr(), storage_view.data,
790
- storage_view.size);
756
+ DestroyElements<A>(GetAllocator(), storage_view.data, storage_view.size);
791
757
 
792
758
  DeallocateIfAllocated();
793
- AcquireAllocatedData(&allocation_tx);
759
+ SetAllocation(std::move(allocation_tx).Release());
794
760
  SetIsAllocated();
795
761
  AddSize(1);
796
762
  return *last_ptr;
797
763
  }
798
764
 
799
765
  template <typename T, size_t N, typename A>
800
- auto Storage<T, N, A>::Erase(const_iterator from, const_iterator to)
801
- -> iterator {
802
- StorageView storage_view = MakeStorageView();
766
+ auto Storage<T, N, A>::Erase(ConstIterator<A> from, ConstIterator<A> to)
767
+ -> Iterator<A> {
768
+ StorageView<A> storage_view = MakeStorageView();
803
769
 
804
- size_type erase_size = std::distance(from, to);
805
- size_type erase_index =
806
- std::distance(const_iterator(storage_view.data), from);
807
- size_type erase_end_index = erase_index + erase_size;
770
+ SizeType<A> erase_size = std::distance(from, to);
771
+ SizeType<A> erase_index =
772
+ std::distance(ConstIterator<A>(storage_view.data), from);
773
+ SizeType<A> erase_end_index = erase_index + erase_size;
808
774
 
809
- IteratorValueAdapter<MoveIterator> move_values(
810
- MoveIterator(storage_view.data + erase_end_index));
775
+ IteratorValueAdapter<A, MoveIterator<A>> move_values(
776
+ MoveIterator<A>(storage_view.data + erase_end_index));
811
777
 
812
- inlined_vector_internal::AssignElements(storage_view.data + erase_index,
813
- &move_values,
814
- storage_view.size - erase_end_index);
778
+ AssignElements<A>(storage_view.data + erase_index, move_values,
779
+ storage_view.size - erase_end_index);
815
780
 
816
- inlined_vector_internal::DestroyElements(
817
- GetAllocPtr(), storage_view.data + (storage_view.size - erase_size),
818
- erase_size);
781
+ DestroyElements<A>(GetAllocator(),
782
+ storage_view.data + (storage_view.size - erase_size),
783
+ erase_size);
819
784
 
820
785
  SubtractSize(erase_size);
821
- return iterator(storage_view.data + erase_index);
786
+ return Iterator<A>(storage_view.data + erase_index);
822
787
  }
823
788
 
824
789
  template <typename T, size_t N, typename A>
825
- auto Storage<T, N, A>::Reserve(size_type requested_capacity) -> void {
826
- StorageView storage_view = MakeStorageView();
790
+ auto Storage<T, N, A>::Reserve(SizeType<A> requested_capacity) -> void {
791
+ StorageView<A> storage_view = MakeStorageView();
827
792
 
828
793
  if (ABSL_PREDICT_FALSE(requested_capacity <= storage_view.capacity)) return;
829
794
 
830
- AllocationTransaction allocation_tx(GetAllocPtr());
795
+ AllocationTransaction<A> allocation_tx(GetAllocator());
831
796
 
832
- IteratorValueAdapter<MoveIterator> move_values(
833
- MoveIterator(storage_view.data));
797
+ IteratorValueAdapter<A, MoveIterator<A>> move_values(
798
+ MoveIterator<A>(storage_view.data));
834
799
 
835
- size_type new_capacity =
800
+ SizeType<A> new_requested_capacity =
836
801
  ComputeCapacity(storage_view.capacity, requested_capacity);
837
- pointer new_data = allocation_tx.Allocate(new_capacity);
802
+ Pointer<A> new_data = allocation_tx.Allocate(new_requested_capacity);
838
803
 
839
- inlined_vector_internal::ConstructElements(GetAllocPtr(), new_data,
840
- &move_values, storage_view.size);
804
+ ConstructElements<A>(GetAllocator(), new_data, move_values,
805
+ storage_view.size);
841
806
 
842
- inlined_vector_internal::DestroyElements(GetAllocPtr(), storage_view.data,
843
- storage_view.size);
807
+ DestroyElements<A>(GetAllocator(), storage_view.data, storage_view.size);
844
808
 
845
809
  DeallocateIfAllocated();
846
- AcquireAllocatedData(&allocation_tx);
810
+ SetAllocation(std::move(allocation_tx).Release());
847
811
  SetIsAllocated();
848
812
  }
849
813
 
@@ -852,41 +816,44 @@ auto Storage<T, N, A>::ShrinkToFit() -> void {
852
816
  // May only be called on allocated instances!
853
817
  assert(GetIsAllocated());
854
818
 
855
- StorageView storage_view{GetAllocatedData(), GetSize(),
856
- GetAllocatedCapacity()};
819
+ StorageView<A> storage_view{GetAllocatedData(), GetSize(),
820
+ GetAllocatedCapacity()};
857
821
 
858
822
  if (ABSL_PREDICT_FALSE(storage_view.size == storage_view.capacity)) return;
859
823
 
860
- AllocationTransaction allocation_tx(GetAllocPtr());
824
+ AllocationTransaction<A> allocation_tx(GetAllocator());
861
825
 
862
- IteratorValueAdapter<MoveIterator> move_values(
863
- MoveIterator(storage_view.data));
826
+ IteratorValueAdapter<A, MoveIterator<A>> move_values(
827
+ MoveIterator<A>(storage_view.data));
864
828
 
865
- pointer construct_data;
829
+ Pointer<A> construct_data;
866
830
  if (storage_view.size > GetInlinedCapacity()) {
867
- size_type new_capacity = storage_view.size;
868
- construct_data = allocation_tx.Allocate(new_capacity);
831
+ SizeType<A> requested_capacity = storage_view.size;
832
+ construct_data = allocation_tx.Allocate(requested_capacity);
833
+ if (allocation_tx.GetCapacity() >= storage_view.capacity) {
834
+ // Already using the smallest available heap allocation.
835
+ return;
836
+ }
869
837
  } else {
870
838
  construct_data = GetInlinedData();
871
839
  }
872
840
 
873
841
  ABSL_INTERNAL_TRY {
874
- inlined_vector_internal::ConstructElements(GetAllocPtr(), construct_data,
875
- &move_values, storage_view.size);
842
+ ConstructElements<A>(GetAllocator(), construct_data, move_values,
843
+ storage_view.size);
876
844
  }
877
845
  ABSL_INTERNAL_CATCH_ANY {
878
- SetAllocatedData(storage_view.data, storage_view.capacity);
846
+ SetAllocation({storage_view.data, storage_view.capacity});
879
847
  ABSL_INTERNAL_RETHROW;
880
848
  }
881
849
 
882
- inlined_vector_internal::DestroyElements(GetAllocPtr(), storage_view.data,
883
- storage_view.size);
850
+ DestroyElements<A>(GetAllocator(), storage_view.data, storage_view.size);
884
851
 
885
- AllocatorTraits::deallocate(*GetAllocPtr(), storage_view.data,
886
- storage_view.capacity);
852
+ MallocAdapter<A>::Deallocate(GetAllocator(), storage_view.data,
853
+ storage_view.capacity);
887
854
 
888
855
  if (allocation_tx.DidAllocate()) {
889
- AcquireAllocatedData(&allocation_tx);
856
+ SetAllocation(std::move(allocation_tx).Release());
890
857
  } else {
891
858
  UnsetIsAllocated();
892
859
  }
@@ -904,58 +871,56 @@ auto Storage<T, N, A>::Swap(Storage* other_storage_ptr) -> void {
904
871
  Storage* large_ptr = other_storage_ptr;
905
872
  if (small_ptr->GetSize() > large_ptr->GetSize()) swap(small_ptr, large_ptr);
906
873
 
907
- for (size_type i = 0; i < small_ptr->GetSize(); ++i) {
874
+ for (SizeType<A> i = 0; i < small_ptr->GetSize(); ++i) {
908
875
  swap(small_ptr->GetInlinedData()[i], large_ptr->GetInlinedData()[i]);
909
876
  }
910
877
 
911
- IteratorValueAdapter<MoveIterator> move_values(
912
- MoveIterator(large_ptr->GetInlinedData() + small_ptr->GetSize()));
878
+ IteratorValueAdapter<A, MoveIterator<A>> move_values(
879
+ MoveIterator<A>(large_ptr->GetInlinedData() + small_ptr->GetSize()));
913
880
 
914
- inlined_vector_internal::ConstructElements(
915
- large_ptr->GetAllocPtr(),
916
- small_ptr->GetInlinedData() + small_ptr->GetSize(), &move_values,
917
- large_ptr->GetSize() - small_ptr->GetSize());
881
+ ConstructElements<A>(large_ptr->GetAllocator(),
882
+ small_ptr->GetInlinedData() + small_ptr->GetSize(),
883
+ move_values,
884
+ large_ptr->GetSize() - small_ptr->GetSize());
918
885
 
919
- inlined_vector_internal::DestroyElements(
920
- large_ptr->GetAllocPtr(),
921
- large_ptr->GetInlinedData() + small_ptr->GetSize(),
922
- large_ptr->GetSize() - small_ptr->GetSize());
886
+ DestroyElements<A>(large_ptr->GetAllocator(),
887
+ large_ptr->GetInlinedData() + small_ptr->GetSize(),
888
+ large_ptr->GetSize() - small_ptr->GetSize());
923
889
  } else {
924
890
  Storage* allocated_ptr = this;
925
891
  Storage* inlined_ptr = other_storage_ptr;
926
892
  if (!allocated_ptr->GetIsAllocated()) swap(allocated_ptr, inlined_ptr);
927
893
 
928
- StorageView allocated_storage_view{allocated_ptr->GetAllocatedData(),
929
- allocated_ptr->GetSize(),
930
- allocated_ptr->GetAllocatedCapacity()};
894
+ StorageView<A> allocated_storage_view{
895
+ allocated_ptr->GetAllocatedData(), allocated_ptr->GetSize(),
896
+ allocated_ptr->GetAllocatedCapacity()};
931
897
 
932
- IteratorValueAdapter<MoveIterator> move_values(
933
- MoveIterator(inlined_ptr->GetInlinedData()));
898
+ IteratorValueAdapter<A, MoveIterator<A>> move_values(
899
+ MoveIterator<A>(inlined_ptr->GetInlinedData()));
934
900
 
935
901
  ABSL_INTERNAL_TRY {
936
- inlined_vector_internal::ConstructElements(
937
- inlined_ptr->GetAllocPtr(), allocated_ptr->GetInlinedData(),
938
- &move_values, inlined_ptr->GetSize());
902
+ ConstructElements<A>(inlined_ptr->GetAllocator(),
903
+ allocated_ptr->GetInlinedData(), move_values,
904
+ inlined_ptr->GetSize());
939
905
  }
940
906
  ABSL_INTERNAL_CATCH_ANY {
941
- allocated_ptr->SetAllocatedData(allocated_storage_view.data,
942
- allocated_storage_view.capacity);
907
+ allocated_ptr->SetAllocation(
908
+ {allocated_storage_view.data, allocated_storage_view.capacity});
943
909
  ABSL_INTERNAL_RETHROW;
944
910
  }
945
911
 
946
- inlined_vector_internal::DestroyElements(inlined_ptr->GetAllocPtr(),
947
- inlined_ptr->GetInlinedData(),
948
- inlined_ptr->GetSize());
912
+ DestroyElements<A>(inlined_ptr->GetAllocator(),
913
+ inlined_ptr->GetInlinedData(), inlined_ptr->GetSize());
949
914
 
950
- inlined_ptr->SetAllocatedData(allocated_storage_view.data,
951
- allocated_storage_view.capacity);
915
+ inlined_ptr->SetAllocation(
916
+ {allocated_storage_view.data, allocated_storage_view.capacity});
952
917
  }
953
918
 
954
919
  swap(GetSizeAndIsAllocated(), other_storage_ptr->GetSizeAndIsAllocated());
955
- swap(*GetAllocPtr(), *other_storage_ptr->GetAllocPtr());
920
+ swap(GetAllocator(), other_storage_ptr->GetAllocator());
956
921
  }
957
922
 
958
- // End ignore "maybe-uninitialized"
923
+ // End ignore "array-bounds" and "maybe-uninitialized"
959
924
  #if !defined(__clang__) && defined(__GNUC__)
960
925
  #pragma GCC diagnostic pop
961
926
  #endif