grpc 1.47.0 → 1.48.0.pre1

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 (574) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +105 -47
  3. data/include/grpc/compression.h +1 -1
  4. data/include/grpc/event_engine/event_engine.h +20 -11
  5. data/include/grpc/event_engine/slice_buffer.h +8 -2
  6. data/include/grpc/grpc.h +3 -3
  7. data/include/grpc/impl/codegen/compression_types.h +2 -1
  8. data/include/grpc/impl/codegen/connectivity_state.h +2 -1
  9. data/include/grpc/impl/codegen/gpr_types.h +2 -1
  10. data/include/grpc/impl/codegen/grpc_types.h +2 -1
  11. data/include/grpc/impl/codegen/port_platform.h +6 -3
  12. data/src/core/ext/filters/census/grpc_context.cc +3 -0
  13. data/src/core/ext/filters/channel_idle/channel_idle_filter.cc +17 -5
  14. data/src/core/ext/filters/channel_idle/channel_idle_filter.h +16 -0
  15. data/src/core/ext/filters/channel_idle/idle_filter_state.h +2 -0
  16. data/src/core/ext/filters/client_channel/backup_poller.cc +3 -1
  17. data/src/core/ext/filters/client_channel/channel_connectivity.cc +2 -2
  18. data/src/core/ext/filters/client_channel/client_channel.cc +51 -65
  19. data/src/core/ext/filters/client_channel/client_channel.h +19 -4
  20. data/src/core/ext/filters/client_channel/config_selector.h +1 -1
  21. data/src/core/ext/filters/client_channel/connector.h +1 -1
  22. data/src/core/ext/filters/client_channel/dynamic_filters.cc +6 -4
  23. data/src/core/ext/filters/client_channel/dynamic_filters.h +1 -1
  24. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.cc +1 -1
  25. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +2 -2
  26. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.h +1 -0
  27. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +73 -43
  28. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc +1 -1
  29. data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.cc +0 -1
  30. data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.cc +33 -35
  31. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +106 -112
  32. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +91 -42
  33. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +177 -138
  34. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.h +4 -1
  35. data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +47 -44
  36. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +118 -103
  37. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +83 -78
  38. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +57 -67
  39. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +2 -2
  40. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +5 -7
  41. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +13 -17
  42. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +3 -3
  43. data/src/core/ext/filters/client_channel/lb_policy.h +0 -7
  44. data/src/core/ext/filters/client_channel/lb_policy_registry.cc +3 -5
  45. data/src/core/ext/filters/client_channel/proxy_mapper_registry.cc +0 -1
  46. data/src/core/ext/filters/client_channel/resolver/binder/binder_resolver.cc +3 -1
  47. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +6 -6
  48. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +5 -5
  49. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +10 -5
  50. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +12 -3
  51. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +5 -5
  52. data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +3 -4
  53. data/src/core/ext/filters/client_channel/resolver/polling_resolver.cc +1 -1
  54. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +1 -0
  55. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +24 -15
  56. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.h +3 -1
  57. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +7 -7
  58. data/src/core/ext/filters/client_channel/retry_filter.cc +35 -36
  59. data/src/core/ext/filters/client_channel/retry_filter.h +1 -0
  60. data/src/core/ext/filters/client_channel/retry_service_config.cc +4 -4
  61. data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +2 -1
  62. data/src/core/ext/filters/client_channel/subchannel.cc +53 -50
  63. data/src/core/ext/filters/client_channel/subchannel.h +6 -22
  64. data/src/core/ext/filters/client_channel/subchannel_interface.h +10 -18
  65. data/src/core/ext/filters/client_channel/subchannel_stream_client.cc +12 -97
  66. data/src/core/ext/filters/client_channel/subchannel_stream_client.h +5 -9
  67. data/src/core/ext/filters/deadline/deadline_filter.cc +12 -7
  68. data/src/core/ext/filters/deadline/deadline_filter.h +8 -1
  69. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +21 -2
  70. data/src/core/ext/filters/fault_injection/fault_injection_filter.h +8 -3
  71. data/src/core/ext/filters/fault_injection/service_config_parser.cc +7 -4
  72. data/src/core/ext/filters/fault_injection/service_config_parser.h +17 -3
  73. data/src/core/ext/filters/http/client/http_client_filter.cc +16 -5
  74. data/src/core/ext/filters/http/client/http_client_filter.h +8 -1
  75. data/src/core/ext/filters/http/client_authority_filter.cc +11 -10
  76. data/src/core/ext/filters/http/client_authority_filter.h +5 -2
  77. data/src/core/ext/filters/http/http_filters_plugin.cc +9 -1
  78. data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +64 -187
  79. data/src/core/ext/filters/http/message_compress/message_compress_filter.h +1 -2
  80. data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +42 -106
  81. data/src/core/ext/filters/http/message_compress/message_decompress_filter.h +1 -0
  82. data/src/core/ext/filters/http/server/http_server_filter.cc +16 -9
  83. data/src/core/ext/filters/http/server/http_server_filter.h +6 -1
  84. data/src/core/ext/filters/message_size/message_size_filter.cc +25 -15
  85. data/src/core/ext/filters/message_size/message_size_filter.h +13 -0
  86. data/src/core/ext/filters/rbac/rbac_filter.cc +14 -3
  87. data/src/core/ext/filters/rbac/rbac_filter.h +8 -0
  88. data/src/core/ext/filters/rbac/rbac_service_config_parser.cc +13 -2
  89. data/src/core/ext/filters/rbac/rbac_service_config_parser.h +14 -2
  90. data/src/core/ext/filters/server_config_selector/server_config_selector.cc +1 -0
  91. data/src/core/ext/filters/server_config_selector/server_config_selector.h +9 -0
  92. data/src/core/ext/filters/server_config_selector/server_config_selector_filter.cc +22 -2
  93. data/src/core/ext/filters/server_config_selector/server_config_selector_filter.h +1 -0
  94. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +4 -4
  95. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +15 -15
  96. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +196 -476
  97. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +1 -1
  98. data/src/core/ext/transport/chttp2/transport/flow_control.cc +141 -261
  99. data/src/core/ext/transport/chttp2/transport/flow_control.h +176 -289
  100. data/src/core/ext/transport/chttp2/transport/frame_data.cc +57 -215
  101. data/src/core/ext/transport/chttp2/transport/frame_data.h +10 -36
  102. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +0 -41
  103. data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +7 -12
  104. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +7 -6
  105. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +0 -2
  106. data/src/core/ext/transport/chttp2/transport/internal.h +9 -111
  107. data/src/core/ext/transport/chttp2/transport/parsing.cc +51 -38
  108. data/src/core/ext/transport/chttp2/transport/stream_lists.cc +0 -4
  109. data/src/core/ext/transport/chttp2/transport/writing.cc +18 -21
  110. data/src/core/ext/transport/inproc/inproc_plugin.cc +0 -1
  111. data/src/core/ext/transport/inproc/inproc_transport.cc +85 -81
  112. data/src/core/ext/transport/inproc/inproc_transport.h +3 -1
  113. data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/ring_hash/v3/ring_hash.upb.c +52 -0
  114. data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/ring_hash/v3/ring_hash.upb.h +164 -0
  115. data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/wrr_locality/v3/wrr_locality.upb.c +46 -0
  116. data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/wrr_locality/v3/wrr_locality.upb.h +94 -0
  117. data/src/core/ext/xds/certificate_provider_factory.h +6 -1
  118. data/src/core/ext/xds/certificate_provider_registry.cc +8 -8
  119. data/src/core/ext/xds/certificate_provider_registry.h +3 -1
  120. data/src/core/ext/xds/certificate_provider_store.cc +2 -0
  121. data/src/core/ext/xds/certificate_provider_store.h +9 -0
  122. data/src/core/ext/xds/file_watcher_certificate_provider_factory.cc +9 -0
  123. data/src/core/ext/xds/file_watcher_certificate_provider_factory.h +8 -0
  124. data/src/core/ext/xds/upb_utils.h +1 -2
  125. data/src/core/ext/xds/xds_api.cc +16 -18
  126. data/src/core/ext/xds/xds_api.h +12 -5
  127. data/src/core/ext/xds/xds_bootstrap.cc +37 -24
  128. data/src/core/ext/xds/xds_bootstrap.h +9 -11
  129. data/src/core/ext/xds/xds_certificate_provider.cc +12 -3
  130. data/src/core/ext/xds/xds_certificate_provider.h +16 -1
  131. data/src/core/ext/xds/xds_channel_stack_modifier.cc +9 -0
  132. data/src/core/ext/xds/xds_channel_stack_modifier.h +5 -1
  133. data/src/core/ext/xds/xds_client.cc +71 -22
  134. data/src/core/ext/xds/xds_client.h +17 -3
  135. data/src/core/ext/xds/xds_client_stats.cc +3 -4
  136. data/src/core/ext/xds/xds_client_stats.h +4 -3
  137. data/src/core/ext/xds/xds_cluster.cc +21 -10
  138. data/src/core/ext/xds/xds_cluster.h +9 -1
  139. data/src/core/ext/xds/xds_cluster_specifier_plugin.cc +16 -7
  140. data/src/core/ext/xds/xds_cluster_specifier_plugin.h +1 -8
  141. data/src/core/ext/xds/xds_common_types.cc +36 -22
  142. data/src/core/ext/xds/xds_common_types.h +12 -4
  143. data/src/core/ext/xds/xds_endpoint.cc +25 -15
  144. data/src/core/ext/xds/xds_endpoint.h +13 -5
  145. data/src/core/ext/xds/xds_http_fault_filter.cc +7 -5
  146. data/src/core/ext/xds/xds_http_fault_filter.h +3 -1
  147. data/src/core/ext/xds/xds_http_filters.cc +7 -0
  148. data/src/core/ext/xds/xds_http_filters.h +3 -3
  149. data/src/core/ext/xds/xds_http_rbac_filter.cc +16 -0
  150. data/src/core/ext/xds/xds_http_rbac_filter.h +7 -0
  151. data/src/core/ext/xds/xds_lb_policy_registry.cc +291 -0
  152. data/src/core/ext/xds/xds_lb_policy_registry.h +72 -0
  153. data/src/core/ext/xds/xds_listener.cc +51 -33
  154. data/src/core/ext/xds/xds_listener.h +10 -1
  155. data/src/core/ext/xds/xds_resource_type.h +3 -3
  156. data/src/core/ext/xds/xds_resource_type_impl.h +7 -3
  157. data/src/core/ext/xds/xds_route_config.cc +56 -28
  158. data/src/core/ext/xds/xds_route_config.h +11 -2
  159. data/src/core/ext/xds/xds_routing.cc +16 -0
  160. data/src/core/ext/xds/xds_routing.h +7 -2
  161. data/src/core/ext/xds/xds_server_config_fetcher.cc +54 -6
  162. data/src/core/lib/address_utils/parse_address.cc +5 -8
  163. data/src/core/lib/address_utils/parse_address.h +3 -2
  164. data/src/core/lib/address_utils/sockaddr_utils.cc +8 -7
  165. data/src/core/lib/address_utils/sockaddr_utils.h +2 -0
  166. data/src/core/lib/avl/avl.h +3 -3
  167. data/src/core/lib/backoff/backoff.cc +1 -1
  168. data/src/core/lib/backoff/backoff.h +1 -1
  169. data/src/core/lib/channel/call_tracer.h +3 -3
  170. data/src/core/lib/channel/channel_args.h +1 -0
  171. data/src/core/lib/channel/channel_args_preconditioning.cc +1 -0
  172. data/src/core/lib/channel/channel_fwd.h +26 -0
  173. data/src/core/lib/channel/channel_stack.cc +4 -4
  174. data/src/core/lib/channel/channel_stack.h +1 -11
  175. data/src/core/lib/channel/channel_stack_builder.h +2 -5
  176. data/src/core/lib/channel/channel_stack_builder_impl.cc +1 -1
  177. data/src/core/lib/channel/channel_stack_builder_impl.h +1 -0
  178. data/src/core/lib/channel/channelz.cc +2 -1
  179. data/src/core/lib/channel/channelz.h +2 -3
  180. data/src/core/lib/channel/channelz_registry.cc +4 -5
  181. data/src/core/lib/channel/connected_channel.cc +1 -0
  182. data/src/core/lib/channel/connected_channel.h +1 -0
  183. data/src/core/lib/channel/promise_based_filter.cc +11 -5
  184. data/src/core/lib/channel/promise_based_filter.h +2 -0
  185. data/src/core/lib/compression/compression.cc +6 -1
  186. data/src/core/lib/compression/compression_internal.cc +3 -6
  187. data/src/core/lib/compression/compression_internal.h +3 -2
  188. data/src/core/lib/compression/message_compress.cc +3 -1
  189. data/src/core/lib/compression/message_compress.h +2 -3
  190. data/src/core/lib/debug/stats.cc +9 -9
  191. data/src/core/lib/debug/stats.h +2 -1
  192. data/src/core/lib/debug/stats_data.cc +2 -1
  193. data/src/core/lib/debug/stats_data.h +0 -4
  194. data/src/core/lib/debug/trace.h +13 -12
  195. data/src/core/lib/event_engine/default_event_engine_factory.cc +1 -1
  196. data/src/core/lib/event_engine/event_engine.cc +24 -19
  197. data/src/core/lib/event_engine/event_engine_factory.h +2 -2
  198. data/src/core/lib/event_engine/{iomgr_engine.cc → iomgr_engine/iomgr_engine.cc} +44 -91
  199. data/src/core/lib/event_engine/{iomgr_engine.h → iomgr_engine/iomgr_engine.h} +20 -16
  200. data/src/core/lib/event_engine/iomgr_engine/thread_pool.cc +123 -0
  201. data/src/core/lib/event_engine/iomgr_engine/thread_pool.h +70 -0
  202. data/src/core/lib/event_engine/iomgr_engine/time_averaged_stats.cc +62 -0
  203. data/src/core/lib/event_engine/iomgr_engine/time_averaged_stats.h +81 -0
  204. data/src/core/lib/event_engine/iomgr_engine/timer.cc +312 -0
  205. data/src/core/lib/event_engine/iomgr_engine/timer.h +193 -0
  206. data/src/core/lib/event_engine/iomgr_engine/timer_heap.cc +107 -0
  207. data/src/core/lib/event_engine/iomgr_engine/timer_heap.h +56 -0
  208. data/src/core/lib/event_engine/iomgr_engine/timer_manager.cc +254 -0
  209. data/src/core/lib/event_engine/iomgr_engine/timer_manager.h +111 -0
  210. data/src/core/lib/event_engine/promise.h +69 -0
  211. data/src/core/lib/gpr/time_posix.cc +6 -9
  212. data/src/core/lib/gpr/time_windows.cc +10 -7
  213. data/src/core/lib/gprpp/manual_constructor.h +0 -67
  214. data/src/core/lib/gprpp/status_helper.cc +44 -30
  215. data/src/core/lib/gprpp/time.cc +8 -0
  216. data/src/core/lib/gprpp/time.h +4 -0
  217. data/src/core/lib/http/format_request.cc +5 -4
  218. data/src/core/lib/http/format_request.h +1 -1
  219. data/src/core/lib/http/httpcli.cc +18 -12
  220. data/src/core/lib/http/httpcli.h +19 -3
  221. data/src/core/lib/http/httpcli_security_connector.cc +16 -4
  222. data/src/core/lib/http/httpcli_ssl_credentials.h +3 -1
  223. data/src/core/lib/http/parser.cc +6 -7
  224. data/src/core/lib/http/parser.h +3 -0
  225. data/src/core/lib/iomgr/call_combiner.cc +2 -2
  226. data/src/core/lib/iomgr/endpoint.h +1 -1
  227. data/src/core/lib/iomgr/endpoint_cfstream.cc +2 -2
  228. data/src/core/lib/iomgr/error.cc +11 -9
  229. data/src/core/lib/iomgr/error.h +9 -5
  230. data/src/core/lib/iomgr/ev_epoll1_linux.cc +57 -18
  231. data/src/core/lib/iomgr/ev_epoll1_linux.h +1 -1
  232. data/src/core/lib/iomgr/ev_poll_posix.cc +77 -52
  233. data/src/core/lib/iomgr/ev_poll_posix.h +2 -2
  234. data/src/core/lib/iomgr/ev_posix.cc +54 -92
  235. data/src/core/lib/iomgr/ev_posix.h +5 -3
  236. data/src/core/lib/iomgr/fork_posix.cc +1 -1
  237. data/src/core/lib/iomgr/iomgr.cc +7 -0
  238. data/src/core/lib/iomgr/iomgr_posix.cc +1 -0
  239. data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +1 -0
  240. data/src/core/lib/iomgr/load_file.cc +1 -1
  241. data/src/core/lib/iomgr/resolve_address_posix.cc +1 -1
  242. data/src/core/lib/iomgr/resolve_address_windows.cc +1 -1
  243. data/src/core/lib/iomgr/tcp_client.cc +12 -7
  244. data/src/core/lib/iomgr/tcp_client.h +24 -13
  245. data/src/core/lib/iomgr/tcp_client_cfstream.cc +15 -9
  246. data/src/core/lib/iomgr/tcp_client_posix.cc +143 -25
  247. data/src/core/lib/iomgr/tcp_client_posix.h +1 -1
  248. data/src/core/lib/iomgr/tcp_client_windows.cc +14 -10
  249. data/src/core/lib/iomgr/tcp_posix.cc +91 -29
  250. data/src/core/lib/iomgr/tcp_server_posix.cc +7 -7
  251. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +12 -12
  252. data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +2 -2
  253. data/src/core/lib/iomgr/tcp_server_windows.cc +7 -7
  254. data/src/core/lib/iomgr/tcp_windows.cc +5 -5
  255. data/src/core/lib/iomgr/unix_sockets_posix.cc +2 -2
  256. data/src/core/lib/iomgr/wakeup_fd_pipe.cc +2 -2
  257. data/src/core/lib/iomgr/wakeup_fd_posix.cc +15 -12
  258. data/src/core/lib/iomgr/wakeup_fd_posix.h +0 -2
  259. data/src/core/lib/iomgr/work_serializer.h +2 -3
  260. data/src/core/lib/matchers/matchers.cc +6 -3
  261. data/src/core/lib/matchers/matchers.h +2 -0
  262. data/src/core/lib/promise/activity.cc +0 -1
  263. data/src/core/lib/promise/activity.h +7 -13
  264. data/src/core/lib/promise/loop.h +1 -0
  265. data/src/core/lib/promise/promise.h +1 -0
  266. data/src/core/lib/promise/sleep.cc +36 -31
  267. data/src/core/lib/promise/sleep.h +25 -25
  268. data/src/core/lib/resolver/resolver.cc +5 -0
  269. data/src/core/lib/resolver/resolver.h +3 -0
  270. data/src/core/lib/resolver/resolver_factory.h +5 -2
  271. data/src/core/lib/resolver/resolver_registry.cc +2 -9
  272. data/src/core/lib/resolver/resolver_registry.h +12 -1
  273. data/src/core/lib/resolver/server_address.cc +8 -0
  274. data/src/core/lib/resolver/server_address.h +9 -2
  275. data/src/core/lib/resource_quota/memory_quota.cc +18 -60
  276. data/src/core/lib/resource_quota/memory_quota.h +11 -25
  277. data/src/core/lib/security/authorization/authorization_policy_provider.h +7 -0
  278. data/src/core/lib/security/authorization/authorization_policy_provider_vtable.cc +4 -0
  279. data/src/core/lib/security/authorization/evaluate_args.cc +9 -3
  280. data/src/core/lib/security/authorization/evaluate_args.h +6 -3
  281. data/src/core/lib/security/authorization/grpc_authorization_engine.cc +6 -0
  282. data/src/core/lib/security/authorization/grpc_authorization_engine.h +7 -0
  283. data/src/core/lib/security/authorization/grpc_server_authz_filter.cc +12 -0
  284. data/src/core/lib/security/authorization/grpc_server_authz_filter.h +12 -1
  285. data/src/core/lib/security/authorization/matchers.cc +9 -1
  286. data/src/core/lib/security/authorization/matchers.h +7 -0
  287. data/src/core/lib/security/authorization/rbac_policy.cc +5 -0
  288. data/src/core/lib/security/authorization/rbac_policy.h +7 -0
  289. data/src/core/lib/security/context/security_context.cc +5 -2
  290. data/src/core/lib/security/context/security_context.h +14 -2
  291. data/src/core/lib/security/credentials/alts/alts_credentials.cc +4 -2
  292. data/src/core/lib/security/credentials/alts/alts_credentials.h +6 -1
  293. data/src/core/lib/security/credentials/alts/grpc_alts_credentials_client_options.cc +1 -3
  294. data/src/core/lib/security/credentials/alts/grpc_alts_credentials_server_options.cc +1 -4
  295. data/src/core/lib/security/credentials/call_creds_util.cc +8 -0
  296. data/src/core/lib/security/credentials/call_creds_util.h +1 -0
  297. data/src/core/lib/security/credentials/channel_creds_registry.h +6 -1
  298. data/src/core/lib/security/credentials/channel_creds_registry_init.cc +10 -0
  299. data/src/core/lib/security/credentials/composite/composite_credentials.cc +4 -4
  300. data/src/core/lib/security/credentials/composite/composite_credentials.h +16 -2
  301. data/src/core/lib/security/credentials/credentials.cc +4 -8
  302. data/src/core/lib/security/credentials/credentials.h +10 -8
  303. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +28 -10
  304. data/src/core/lib/security/credentials/external/aws_external_account_credentials.h +10 -0
  305. data/src/core/lib/security/credentials/external/aws_request_signer.cc +9 -0
  306. data/src/core/lib/security/credentials/external/external_account_credentials.cc +24 -9
  307. data/src/core/lib/security/credentials/external/external_account_credentials.h +11 -0
  308. data/src/core/lib/security/credentials/external/file_external_account_credentials.cc +12 -4
  309. data/src/core/lib/security/credentials/external/file_external_account_credentials.h +6 -0
  310. data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +20 -4
  311. data/src/core/lib/security/credentials/external/url_external_account_credentials.h +10 -0
  312. data/src/core/lib/security/credentials/fake/fake_credentials.cc +8 -6
  313. data/src/core/lib/security/credentials/fake/fake_credentials.h +13 -1
  314. data/src/core/lib/security/credentials/google_default/credentials_generic.cc +1 -0
  315. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +27 -10
  316. data/src/core/lib/security/credentials/google_default/google_default_credentials.h +10 -1
  317. data/src/core/lib/security/credentials/iam/iam_credentials.cc +9 -3
  318. data/src/core/lib/security/credentials/iam/iam_credentials.h +10 -0
  319. data/src/core/lib/security/credentials/insecure/insecure_credentials.cc +4 -0
  320. data/src/core/lib/security/credentials/insecure/insecure_credentials.h +5 -0
  321. data/src/core/lib/security/credentials/jwt/json_token.cc +5 -2
  322. data/src/core/lib/security/credentials/jwt/json_token.h +2 -2
  323. data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +11 -5
  324. data/src/core/lib/security/credentials/jwt/jwt_credentials.h +14 -0
  325. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +28 -3
  326. data/src/core/lib/security/credentials/jwt/jwt_verifier.h +4 -2
  327. data/src/core/lib/security/credentials/local/local_credentials.cc +4 -3
  328. data/src/core/lib/security/credentials/local/local_credentials.h +7 -0
  329. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +26 -13
  330. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +20 -0
  331. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +8 -7
  332. data/src/core/lib/security/credentials/plugin/plugin_credentials.h +24 -0
  333. data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +5 -0
  334. data/src/core/lib/security/credentials/ssl/ssl_credentials.h +13 -0
  335. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.cc +6 -6
  336. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.h +9 -3
  337. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc +29 -10
  338. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h +9 -4
  339. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.cc +9 -2
  340. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.h +6 -7
  341. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +4 -5
  342. data/src/core/lib/security/credentials/tls/tls_credentials.cc +7 -2
  343. data/src/core/lib/security/credentials/tls/tls_credentials.h +5 -1
  344. data/src/core/lib/security/credentials/tls/tls_utils.cc +2 -0
  345. data/src/core/lib/security/credentials/tls/tls_utils.h +1 -1
  346. data/src/core/lib/security/credentials/xds/xds_credentials.cc +8 -1
  347. data/src/core/lib/security/credentials/xds/xds_credentials.h +14 -0
  348. data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +22 -2
  349. data/src/core/lib/security/security_connector/alts/alts_security_connector.h +6 -3
  350. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +17 -1
  351. data/src/core/lib/security/security_connector/fake/fake_security_connector.h +2 -2
  352. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.cc +9 -0
  353. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.h +17 -2
  354. data/src/core/lib/security/security_connector/load_system_roots_fallback.cc +5 -3
  355. data/src/core/lib/security/security_connector/{load_system_roots_linux.cc → load_system_roots_supported.cc} +27 -19
  356. data/src/core/lib/security/security_connector/{load_system_roots_linux.h → load_system_roots_supported.h} +5 -5
  357. data/src/core/lib/security/security_connector/local/local_security_connector.cc +22 -3
  358. data/src/core/lib/security/security_connector/local/local_security_connector.h +6 -2
  359. data/src/core/lib/security/security_connector/security_connector.cc +20 -18
  360. data/src/core/lib/security/security_connector/security_connector.h +18 -6
  361. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +18 -6
  362. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.h +4 -2
  363. data/src/core/lib/security/security_connector/ssl_utils.cc +12 -2
  364. data/src/core/lib/security/security_connector/ssl_utils.h +10 -7
  365. data/src/core/lib/security/security_connector/ssl_utils_config.h +1 -1
  366. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +21 -13
  367. data/src/core/lib/security/security_connector/tls/tls_security_connector.h +23 -3
  368. data/src/core/lib/security/transport/auth_filters.h +7 -0
  369. data/src/core/lib/security/transport/client_auth_filter.cc +18 -9
  370. data/src/core/lib/security/transport/secure_endpoint.cc +63 -13
  371. data/src/core/lib/security/transport/secure_endpoint.h +4 -3
  372. data/src/core/lib/security/transport/security_handshaker.cc +44 -11
  373. data/src/core/lib/security/transport/security_handshaker.h +4 -0
  374. data/src/core/lib/security/transport/server_auth_filter.cc +26 -4
  375. data/src/core/lib/security/util/json_util.cc +3 -2
  376. data/src/core/lib/security/util/json_util.h +0 -2
  377. data/src/core/lib/service_config/service_config_call_data.h +2 -1
  378. data/src/core/lib/service_config/service_config_impl.cc +6 -6
  379. data/src/core/lib/service_config/service_config_impl.h +1 -3
  380. data/src/core/lib/service_config/service_config_parser.cc +2 -4
  381. data/src/core/lib/slice/slice_buffer.cc +30 -1
  382. data/src/core/lib/slice/slice_buffer.h +37 -6
  383. data/src/core/lib/slice/slice_string_helpers.cc +0 -20
  384. data/src/core/lib/slice/slice_string_helpers.h +0 -4
  385. data/src/core/lib/surface/call.cc +53 -115
  386. data/src/core/lib/surface/call.h +5 -1
  387. data/src/core/lib/surface/channel.h +2 -0
  388. data/src/core/lib/surface/channel_ping.cc +1 -1
  389. data/src/core/lib/surface/completion_queue.cc +15 -14
  390. data/src/core/lib/surface/completion_queue.h +2 -1
  391. data/src/core/lib/surface/init.cc +0 -1
  392. data/src/core/lib/surface/lame_client.cc +1 -1
  393. data/src/core/lib/surface/lame_client.h +1 -1
  394. data/src/core/lib/surface/server.cc +14 -8
  395. data/src/core/lib/surface/server.h +4 -1
  396. data/src/core/lib/surface/validate_metadata.cc +1 -1
  397. data/src/core/lib/surface/version.cc +2 -2
  398. data/src/core/lib/transport/error_utils.cc +13 -7
  399. data/src/core/lib/transport/handshaker.cc +3 -3
  400. data/src/core/lib/transport/http_connect_handshaker.cc +4 -4
  401. data/src/core/lib/transport/tcp_connect_handshaker.cc +2 -2
  402. data/src/core/lib/transport/transport.cc +0 -3
  403. data/src/core/lib/transport/transport.h +20 -14
  404. data/src/core/lib/transport/transport_fwd.h +20 -0
  405. data/src/core/lib/transport/transport_impl.h +1 -0
  406. data/src/core/lib/transport/transport_op_string.cc +9 -9
  407. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +1 -1
  408. data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +9 -1
  409. data/src/core/tsi/fake_transport_security.cc +13 -1
  410. data/src/core/tsi/fake_transport_security.h +6 -0
  411. data/src/core/tsi/ssl_transport_security.cc +1 -1
  412. data/src/core/tsi/transport_security_grpc.cc +3 -2
  413. data/src/core/tsi/transport_security_grpc.h +5 -2
  414. data/src/ruby/ext/grpc/ext-export-truffleruby.clang +2 -0
  415. data/src/ruby/ext/grpc/ext-export-truffleruby.gcc +7 -0
  416. data/src/ruby/ext/grpc/ext-export.clang +1 -0
  417. data/src/ruby/ext/grpc/ext-export.gcc +1 -0
  418. data/src/ruby/ext/grpc/extconf.rb +49 -18
  419. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +1 -1
  420. data/src/ruby/lib/grpc/errors.rb +1 -1
  421. data/src/ruby/lib/grpc/version.rb +1 -1
  422. data/src/ruby/spec/generic/client_stub_spec.rb +23 -23
  423. data/third_party/abseil-cpp/absl/algorithm/container.h +1 -1
  424. data/third_party/abseil-cpp/absl/base/attributes.h +49 -22
  425. data/third_party/abseil-cpp/absl/base/casts.h +61 -68
  426. data/third_party/abseil-cpp/absl/base/config.h +182 -41
  427. data/third_party/abseil-cpp/absl/base/internal/cycleclock.cc +12 -42
  428. data/third_party/abseil-cpp/absl/base/internal/cycleclock.h +67 -2
  429. data/third_party/abseil-cpp/absl/base/internal/direct_mmap.h +3 -3
  430. data/third_party/abseil-cpp/absl/base/internal/endian.h +17 -62
  431. data/third_party/abseil-cpp/absl/base/internal/fast_type_id.h +2 -0
  432. data/third_party/abseil-cpp/absl/base/internal/invoke.h +54 -0
  433. data/third_party/abseil-cpp/absl/base/internal/prefetch.h +138 -0
  434. data/third_party/abseil-cpp/absl/base/internal/raw_logging.cc +29 -22
  435. data/third_party/abseil-cpp/absl/base/internal/raw_logging.h +13 -12
  436. data/third_party/abseil-cpp/absl/base/internal/spinlock.cc +3 -0
  437. data/third_party/abseil-cpp/absl/base/internal/spinlock.h +8 -0
  438. data/third_party/abseil-cpp/absl/base/internal/spinlock_linux.inc +2 -5
  439. data/third_party/abseil-cpp/absl/base/internal/strerror.cc +88 -0
  440. data/third_party/abseil-cpp/absl/base/internal/strerror.h +39 -0
  441. data/third_party/abseil-cpp/absl/base/internal/sysinfo.cc +0 -1
  442. data/third_party/abseil-cpp/absl/base/internal/thread_identity.cc +2 -1
  443. data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.cc +6 -7
  444. data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.h +12 -3
  445. data/third_party/abseil-cpp/absl/base/log_severity.cc +28 -0
  446. data/third_party/abseil-cpp/absl/base/log_severity.h +51 -0
  447. data/third_party/abseil-cpp/absl/base/optimization.h +19 -11
  448. data/third_party/abseil-cpp/absl/base/options.h +1 -1
  449. data/third_party/abseil-cpp/absl/base/thread_annotations.h +2 -2
  450. data/third_party/abseil-cpp/absl/container/fixed_array.h +2 -0
  451. data/third_party/abseil-cpp/absl/container/flat_hash_map.h +11 -4
  452. data/third_party/abseil-cpp/absl/container/flat_hash_set.h +15 -9
  453. data/third_party/abseil-cpp/absl/container/inlined_vector.h +20 -9
  454. data/third_party/abseil-cpp/absl/container/internal/common.h +6 -5
  455. data/third_party/abseil-cpp/absl/container/internal/container_memory.h +10 -28
  456. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.cc +68 -20
  457. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.h +29 -11
  458. data/third_party/abseil-cpp/absl/container/internal/inlined_vector.h +59 -38
  459. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.cc +4 -0
  460. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.h +515 -184
  461. data/third_party/abseil-cpp/absl/debugging/internal/address_is_readable.cc +45 -88
  462. data/third_party/abseil-cpp/absl/debugging/internal/elf_mem_image.cc +4 -0
  463. data/third_party/abseil-cpp/absl/debugging/internal/elf_mem_image.h +3 -2
  464. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_aarch64-inl.inc +8 -3
  465. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_arm-inl.inc +8 -3
  466. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_config.h +2 -1
  467. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_powerpc-inl.inc +8 -3
  468. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_riscv-inl.inc +20 -18
  469. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_x86-inl.inc +8 -3
  470. data/third_party/abseil-cpp/absl/debugging/internal/vdso_support.cc +15 -2
  471. data/third_party/abseil-cpp/absl/debugging/symbolize.cc +6 -1
  472. data/third_party/abseil-cpp/absl/debugging/symbolize_elf.inc +46 -7
  473. data/third_party/abseil-cpp/absl/functional/bind_front.h +10 -1
  474. data/third_party/abseil-cpp/absl/functional/function_ref.h +2 -1
  475. data/third_party/abseil-cpp/absl/hash/hash.h +82 -8
  476. data/third_party/abseil-cpp/absl/hash/internal/hash.h +218 -23
  477. data/third_party/abseil-cpp/absl/numeric/bits.h +2 -1
  478. data/third_party/abseil-cpp/absl/numeric/int128.cc +4 -2
  479. data/third_party/abseil-cpp/absl/numeric/int128.h +2 -2
  480. data/third_party/abseil-cpp/absl/profiling/internal/sample_recorder.h +21 -6
  481. data/third_party/abseil-cpp/absl/random/bernoulli_distribution.h +4 -4
  482. data/third_party/abseil-cpp/absl/random/distributions.h +3 -3
  483. data/third_party/abseil-cpp/absl/random/internal/distribution_caller.h +3 -0
  484. data/third_party/abseil-cpp/absl/random/internal/fast_uniform_bits.h +2 -1
  485. data/third_party/abseil-cpp/absl/random/internal/generate_real.h +2 -2
  486. data/third_party/abseil-cpp/absl/random/internal/nonsecure_base.h +59 -48
  487. data/third_party/abseil-cpp/absl/random/internal/pcg_engine.h +1 -1
  488. data/third_party/abseil-cpp/absl/random/internal/randen.h +5 -11
  489. data/third_party/abseil-cpp/absl/random/internal/randen_detect.cc +6 -2
  490. data/third_party/abseil-cpp/absl/random/internal/randen_engine.h +48 -23
  491. data/third_party/abseil-cpp/absl/random/internal/salted_seed_seq.h +24 -26
  492. data/third_party/abseil-cpp/absl/random/internal/traits.h +53 -5
  493. data/third_party/abseil-cpp/absl/random/internal/uniform_helper.h +5 -5
  494. data/third_party/abseil-cpp/absl/random/internal/wide_multiply.h +33 -48
  495. data/third_party/abseil-cpp/absl/random/log_uniform_int_distribution.h +9 -10
  496. data/third_party/abseil-cpp/absl/random/poisson_distribution.h +7 -4
  497. data/third_party/abseil-cpp/absl/random/seed_sequences.h +1 -0
  498. data/third_party/abseil-cpp/absl/random/uniform_int_distribution.h +2 -2
  499. data/third_party/abseil-cpp/absl/random/uniform_real_distribution.h +1 -1
  500. data/third_party/abseil-cpp/absl/random/zipf_distribution.h +4 -3
  501. data/third_party/abseil-cpp/absl/status/internal/status_internal.h +17 -0
  502. data/third_party/abseil-cpp/absl/status/status.cc +174 -2
  503. data/third_party/abseil-cpp/absl/status/status.h +22 -12
  504. data/third_party/abseil-cpp/absl/status/statusor.h +9 -3
  505. data/third_party/abseil-cpp/absl/strings/ascii.h +4 -4
  506. data/third_party/abseil-cpp/absl/strings/cord.cc +194 -913
  507. data/third_party/abseil-cpp/absl/strings/cord.h +202 -81
  508. data/third_party/abseil-cpp/absl/strings/cord_analysis.cc +188 -0
  509. data/third_party/abseil-cpp/absl/strings/cord_analysis.h +44 -0
  510. data/third_party/abseil-cpp/absl/strings/cord_buffer.cc +30 -0
  511. data/third_party/abseil-cpp/absl/strings/cord_buffer.h +572 -0
  512. data/third_party/abseil-cpp/absl/strings/internal/cord_data_edge.h +63 -0
  513. data/third_party/abseil-cpp/absl/strings/internal/cord_internal.cc +20 -32
  514. data/third_party/abseil-cpp/absl/strings/internal/cord_internal.h +123 -88
  515. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree.cc +149 -49
  516. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree.h +44 -59
  517. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_navigator.cc +3 -1
  518. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_navigator.h +4 -2
  519. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_reader.cc +3 -2
  520. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_reader.h +5 -4
  521. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_consume.cc +7 -74
  522. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_crc.cc +54 -0
  523. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_crc.h +102 -0
  524. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_flat.h +58 -17
  525. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring.cc +13 -11
  526. data/third_party/abseil-cpp/absl/strings/internal/cordz_info.cc +11 -38
  527. data/third_party/abseil-cpp/absl/strings/internal/cordz_statistics.h +1 -0
  528. data/third_party/abseil-cpp/absl/strings/internal/cordz_update_tracker.h +4 -2
  529. data/third_party/abseil-cpp/absl/strings/internal/escaping.cc +6 -5
  530. data/third_party/abseil-cpp/absl/strings/internal/ostringstream.cc +1 -1
  531. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.cc +1 -1
  532. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.h +1 -1
  533. data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.h +38 -7
  534. data/third_party/abseil-cpp/absl/strings/internal/str_format/checker.h +7 -2
  535. data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.cc +4 -5
  536. data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.h +5 -2
  537. data/third_party/abseil-cpp/absl/strings/internal/str_format/output.h +2 -1
  538. data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.h +4 -2
  539. data/third_party/abseil-cpp/absl/strings/internal/str_join_internal.h +9 -6
  540. data/third_party/abseil-cpp/absl/strings/internal/string_constant.h +10 -2
  541. data/third_party/abseil-cpp/absl/strings/internal/utf8.cc +9 -9
  542. data/third_party/abseil-cpp/absl/strings/numbers.cc +8 -8
  543. data/third_party/abseil-cpp/absl/strings/numbers.h +26 -23
  544. data/third_party/abseil-cpp/absl/strings/str_cat.h +20 -13
  545. data/third_party/abseil-cpp/absl/strings/str_join.h +9 -15
  546. data/third_party/abseil-cpp/absl/strings/str_split.h +1 -2
  547. data/third_party/abseil-cpp/absl/strings/string_view.cc +2 -13
  548. data/third_party/abseil-cpp/absl/strings/string_view.h +3 -2
  549. data/third_party/abseil-cpp/absl/strings/strip.h +8 -6
  550. data/third_party/abseil-cpp/absl/strings/substitute.h +10 -2
  551. data/third_party/abseil-cpp/absl/synchronization/internal/create_thread_identity.cc +9 -6
  552. data/third_party/abseil-cpp/absl/synchronization/internal/create_thread_identity.h +0 -4
  553. data/third_party/abseil-cpp/absl/synchronization/internal/per_thread_sem.cc +0 -4
  554. data/third_party/abseil-cpp/absl/synchronization/internal/per_thread_sem.h +1 -6
  555. data/third_party/abseil-cpp/absl/synchronization/internal/waiter.cc +0 -25
  556. data/third_party/abseil-cpp/absl/synchronization/internal/waiter.h +10 -4
  557. data/third_party/abseil-cpp/absl/synchronization/mutex.cc +75 -40
  558. data/third_party/abseil-cpp/absl/synchronization/mutex.h +17 -9
  559. data/third_party/abseil-cpp/absl/synchronization/notification.h +3 -2
  560. data/third_party/abseil-cpp/absl/time/duration.cc +5 -4
  561. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/civil_time_detail.h +11 -7
  562. data/third_party/abseil-cpp/absl/time/time.h +16 -12
  563. data/third_party/abseil-cpp/absl/types/internal/optional.h +8 -0
  564. data/third_party/abseil-cpp/absl/types/internal/variant.h +3 -3
  565. data/third_party/abseil-cpp/absl/types/optional.h +17 -14
  566. data/third_party/abseil-cpp/absl/types/span.h +2 -1
  567. metadata +39 -15
  568. data/src/core/lib/slice/slice_split.cc +0 -103
  569. data/src/core/lib/slice/slice_split.h +0 -36
  570. data/src/core/lib/transport/byte_stream.cc +0 -165
  571. data/src/core/lib/transport/byte_stream.h +0 -170
  572. data/third_party/abseil-cpp/absl/cleanup/cleanup.h +0 -140
  573. data/third_party/abseil-cpp/absl/cleanup/internal/cleanup.h +0 -100
  574. data/third_party/abseil-cpp/absl/container/internal/have_sse.h +0 -50
@@ -25,6 +25,7 @@
25
25
  #include "absl/strings/internal/str_format/checker.h"
26
26
  #include "absl/strings/internal/str_format/parser.h"
27
27
  #include "absl/types/span.h"
28
+ #include "absl/utility/utility.h"
28
29
 
29
30
  namespace absl {
30
31
  ABSL_NAMESPACE_BEGIN
@@ -87,6 +88,36 @@ class FormatSpecTemplate
87
88
  : public MakeDependent<UntypedFormatSpec, Args...>::type {
88
89
  using Base = typename MakeDependent<UntypedFormatSpec, Args...>::type;
89
90
 
91
+ template <bool res>
92
+ struct ErrorMaker {
93
+ constexpr bool operator()(int) const { return res; }
94
+ };
95
+
96
+ template <int i, int j>
97
+ static constexpr bool CheckArity(ErrorMaker<true> SpecifierCount = {},
98
+ ErrorMaker<i == j> ParametersPassed = {}) {
99
+ static_assert(SpecifierCount(i) == ParametersPassed(j),
100
+ "Number of arguments passed must match the number of "
101
+ "conversion specifiers.");
102
+ return true;
103
+ }
104
+
105
+ template <FormatConversionCharSet specified, FormatConversionCharSet passed,
106
+ int arg>
107
+ static constexpr bool CheckMatch(
108
+ ErrorMaker<Contains(specified, passed)> MismatchedArgumentNumber = {}) {
109
+ static_assert(MismatchedArgumentNumber(arg),
110
+ "Passed argument must match specified format.");
111
+ return true;
112
+ }
113
+
114
+ template <FormatConversionCharSet... C, size_t... I>
115
+ static bool CheckMatches(absl::index_sequence<I...>) {
116
+ bool res[] = {true, CheckMatch<Args, C, I + 1>()...};
117
+ (void)res;
118
+ return true;
119
+ }
120
+
90
121
  public:
91
122
  #ifdef ABSL_INTERNAL_ENABLE_FORMAT_CHECKER
92
123
 
@@ -112,7 +143,8 @@ class FormatSpecTemplate
112
143
  template <typename T = void>
113
144
  FormatSpecTemplate(string_view s) // NOLINT
114
145
  __attribute__((enable_if(str_format_internal::EnsureConstexpr(s),
115
- "constexpr trap"))) {
146
+ "constexpr trap")))
147
+ : Base("to avoid noise in the compiler error") {
116
148
  static_assert(sizeof(T*) == 0,
117
149
  "Format specified does not match the arguments passed.");
118
150
  }
@@ -133,13 +165,12 @@ class FormatSpecTemplate
133
165
 
134
166
  #endif // ABSL_INTERNAL_ENABLE_FORMAT_CHECKER
135
167
 
136
- template <
137
- FormatConversionCharSet... C,
138
- typename = typename std::enable_if<sizeof...(C) == sizeof...(Args)>::type,
139
- typename = typename std::enable_if<AllOf(Contains(Args,
140
- C)...)>::type>
168
+ template <FormatConversionCharSet... C>
141
169
  FormatSpecTemplate(const ExtendedParsedFormat<C...>& pc) // NOLINT
142
- : Base(&pc) {}
170
+ : Base(&pc) {
171
+ CheckArity<sizeof...(C), sizeof...(Args)>();
172
+ CheckMatches<C...>(absl::make_index_sequence<sizeof...(C)>{});
173
+ }
143
174
  };
144
175
 
145
176
  class Streamable {
@@ -22,9 +22,14 @@
22
22
  // Compile time check support for entry points.
23
23
 
24
24
  #ifndef ABSL_INTERNAL_ENABLE_FORMAT_CHECKER
25
- #if ABSL_HAVE_ATTRIBUTE(enable_if) && !defined(__native_client__)
25
+ // We disable format checker under vscode intellisense compilation.
26
+ // See https://github.com/microsoft/vscode-cpptools/issues/3683 for
27
+ // more details.
28
+ #if ABSL_HAVE_ATTRIBUTE(enable_if) && !defined(__native_client__) && \
29
+ !defined(__INTELLISENSE__)
26
30
  #define ABSL_INTERNAL_ENABLE_FORMAT_CHECKER 1
27
- #endif // ABSL_HAVE_ATTRIBUTE(enable_if) && !defined(__native_client__)
31
+ #endif // ABSL_HAVE_ATTRIBUTE(enable_if) && !defined(__native_client__) &&
32
+ // !defined(__INTELLISENSE__)
28
33
  #endif // ABSL_INTERNAL_ENABLE_FORMAT_CHECKER
29
34
 
30
35
  namespace absl {
@@ -33,6 +33,8 @@ std::string FlagsToString(Flags v) {
33
33
  return s;
34
34
  }
35
35
 
36
+ #ifdef ABSL_INTERNAL_NEED_REDUNDANT_CONSTEXPR_DECL
37
+
36
38
  #define ABSL_INTERNAL_X_VAL(id) \
37
39
  constexpr absl::FormatConversionChar FormatConversionCharInternal::id;
38
40
  ABSL_INTERNAL_CONVERSION_CHARS_EXPAND_(ABSL_INTERNAL_X_VAL, )
@@ -45,17 +47,14 @@ constexpr absl::FormatConversionChar FormatConversionCharInternal::kNone;
45
47
  ABSL_INTERNAL_CONVERSION_CHARS_EXPAND_(ABSL_INTERNAL_CHAR_SET_CASE, )
46
48
  #undef ABSL_INTERNAL_CHAR_SET_CASE
47
49
 
48
- // NOLINTNEXTLINE(readability-redundant-declaration)
49
50
  constexpr FormatConversionCharSet FormatConversionCharSetInternal::kStar;
50
- // NOLINTNEXTLINE(readability-redundant-declaration)
51
51
  constexpr FormatConversionCharSet FormatConversionCharSetInternal::kIntegral;
52
- // NOLINTNEXTLINE(readability-redundant-declaration)
53
52
  constexpr FormatConversionCharSet FormatConversionCharSetInternal::kFloating;
54
- // NOLINTNEXTLINE(readability-redundant-declaration)
55
53
  constexpr FormatConversionCharSet FormatConversionCharSetInternal::kNumeric;
56
- // NOLINTNEXTLINE(readability-redundant-declaration)
57
54
  constexpr FormatConversionCharSet FormatConversionCharSetInternal::kPointer;
58
55
 
56
+ #endif // ABSL_INTERNAL_NEED_REDUNDANT_CONSTEXPR_DECL
57
+
59
58
  bool FormatSinkImpl::PutPaddedString(string_view value, int width,
60
59
  int precision, bool left) {
61
60
  size_t space_remaining = 0;
@@ -19,6 +19,7 @@
19
19
  #include <limits.h>
20
20
 
21
21
  #include <cstddef>
22
+ #include <cstdint>
22
23
  #include <cstring>
23
24
  #include <ostream>
24
25
 
@@ -70,7 +71,7 @@ class FormatSinkImpl {
70
71
  ~FormatSinkImpl() { Flush(); }
71
72
 
72
73
  void Flush() {
73
- raw_.Write(string_view(buf_, pos_ - buf_));
74
+ raw_.Write(string_view(buf_, static_cast<size_t>(pos_ - buf_)));
74
75
  pos_ = buf_;
75
76
  }
76
77
 
@@ -120,7 +121,9 @@ class FormatSinkImpl {
120
121
  }
121
122
 
122
123
  private:
123
- size_t Avail() const { return buf_ + sizeof(buf_) - pos_; }
124
+ size_t Avail() const {
125
+ return static_cast<size_t>(buf_ + sizeof(buf_) - pos_);
126
+ }
124
127
 
125
128
  FormatRawSinkImpl raw_;
126
129
  size_t size_ = 0;
@@ -22,6 +22,7 @@
22
22
  #define ABSL_STRINGS_INTERNAL_STR_FORMAT_OUTPUT_H_
23
23
 
24
24
  #include <cstdio>
25
+ #include <ios>
25
26
  #include <ostream>
26
27
  #include <string>
27
28
 
@@ -71,7 +72,7 @@ inline void AbslFormatFlush(std::string* out, string_view s) {
71
72
  out->append(s.data(), s.size());
72
73
  }
73
74
  inline void AbslFormatFlush(std::ostream* out, string_view s) {
74
- out->write(s.data(), s.size());
75
+ out->write(s.data(), static_cast<std::streamsize>(s.size()));
75
76
  }
76
77
 
77
78
  inline void AbslFormatFlush(FILERawSink* sink, string_view v) {
@@ -151,7 +151,8 @@ bool ParseFormatString(string_view src, Consumer consumer) {
151
151
  const char* p = src.data();
152
152
  const char* const end = p + src.size();
153
153
  while (p != end) {
154
- const char* percent = static_cast<const char*>(memchr(p, '%', end - p));
154
+ const char* percent =
155
+ static_cast<const char*>(memchr(p, '%', static_cast<size_t>(end - p)));
155
156
  if (!percent) {
156
157
  // We found the last substring.
157
158
  return consumer.Append(string_view(p, end - p));
@@ -242,7 +243,8 @@ class ParsedFormatBase {
242
243
  string_view text(base, 0);
243
244
  for (const auto& item : items_) {
244
245
  const char* const end = text.data() + text.size();
245
- text = string_view(end, (base + item.text_end) - end);
246
+ text =
247
+ string_view(end, static_cast<size_t>((base + item.text_end) - end));
246
248
  if (item.is_conversion) {
247
249
  if (!consumer.ConvertOne(item.conv, text)) return false;
248
250
  } else {
@@ -229,10 +229,11 @@ std::string JoinAlgorithm(Iterator start, Iterator end, absl::string_view s,
229
229
  std::string result;
230
230
  if (start != end) {
231
231
  // Sums size
232
- size_t result_size = start->size();
232
+ auto&& start_value = *start;
233
+ size_t result_size = start_value.size();
233
234
  for (Iterator it = start; ++it != end;) {
234
235
  result_size += s.size();
235
- result_size += it->size();
236
+ result_size += (*it).size();
236
237
  }
237
238
 
238
239
  if (result_size > 0) {
@@ -240,13 +241,15 @@ std::string JoinAlgorithm(Iterator start, Iterator end, absl::string_view s,
240
241
 
241
242
  // Joins strings
242
243
  char* result_buf = &*result.begin();
243
- memcpy(result_buf, start->data(), start->size());
244
- result_buf += start->size();
244
+
245
+ memcpy(result_buf, start_value.data(), start_value.size());
246
+ result_buf += start_value.size();
245
247
  for (Iterator it = start; ++it != end;) {
246
248
  memcpy(result_buf, s.data(), s.size());
247
249
  result_buf += s.size();
248
- memcpy(result_buf, it->data(), it->size());
249
- result_buf += it->size();
250
+ auto&& value = *it;
251
+ memcpy(result_buf, value.data(), value.size());
252
+ result_buf += value.size();
250
253
  }
251
254
  }
252
255
  }
@@ -35,17 +35,25 @@ namespace strings_internal {
35
35
  // below.
36
36
  template <typename T>
37
37
  struct StringConstant {
38
+ private:
39
+ static constexpr bool TryConstexprEval(absl::string_view view) {
40
+ return view.empty() || 2 * view[0] != 1;
41
+ }
42
+
43
+ public:
38
44
  static constexpr absl::string_view value = T{}();
39
45
  constexpr absl::string_view operator()() const { return value; }
40
46
 
41
47
  // Check to be sure `view` points to constant data.
42
48
  // Otherwise, it can't be constant evaluated.
43
- static_assert(value.empty() || 2 * value[0] != 1,
49
+ static_assert(TryConstexprEval(value),
44
50
  "The input string_view must point to constant data.");
45
51
  };
46
52
 
53
+ #ifdef ABSL_INTERNAL_NEED_REDUNDANT_CONSTEXPR_DECL
47
54
  template <typename T>
48
- constexpr absl::string_view StringConstant<T>::value; // NOLINT
55
+ constexpr absl::string_view StringConstant<T>::value;
56
+ #endif
49
57
 
50
58
  // Factory function for `StringConstant` instances.
51
59
  // It supports callables that have a constexpr default constructor and a
@@ -25,25 +25,25 @@ size_t EncodeUTF8Char(char *buffer, char32_t utf8_char) {
25
25
  *buffer = static_cast<char>(utf8_char);
26
26
  return 1;
27
27
  } else if (utf8_char <= 0x7FF) {
28
- buffer[1] = 0x80 | (utf8_char & 0x3F);
28
+ buffer[1] = static_cast<char>(0x80 | (utf8_char & 0x3F));
29
29
  utf8_char >>= 6;
30
- buffer[0] = 0xC0 | utf8_char;
30
+ buffer[0] = static_cast<char>(0xC0 | utf8_char);
31
31
  return 2;
32
32
  } else if (utf8_char <= 0xFFFF) {
33
- buffer[2] = 0x80 | (utf8_char & 0x3F);
33
+ buffer[2] = static_cast<char>(0x80 | (utf8_char & 0x3F));
34
34
  utf8_char >>= 6;
35
- buffer[1] = 0x80 | (utf8_char & 0x3F);
35
+ buffer[1] = static_cast<char>(0x80 | (utf8_char & 0x3F));
36
36
  utf8_char >>= 6;
37
- buffer[0] = 0xE0 | utf8_char;
37
+ buffer[0] = static_cast<char>(0xE0 | utf8_char);
38
38
  return 3;
39
39
  } else {
40
- buffer[3] = 0x80 | (utf8_char & 0x3F);
40
+ buffer[3] = static_cast<char>(0x80 | (utf8_char & 0x3F));
41
41
  utf8_char >>= 6;
42
- buffer[2] = 0x80 | (utf8_char & 0x3F);
42
+ buffer[2] = static_cast<char>(0x80 | (utf8_char & 0x3F));
43
43
  utf8_char >>= 6;
44
- buffer[1] = 0x80 | (utf8_char & 0x3F);
44
+ buffer[1] = static_cast<char>(0x80 | (utf8_char & 0x3F));
45
45
  utf8_char >>= 6;
46
- buffer[0] = 0xF0 | utf8_char;
46
+ buffer[0] = static_cast<char>(0xF0 | utf8_char);
47
47
  return 4;
48
48
  }
49
49
  }
@@ -757,8 +757,8 @@ struct LookupTables {
757
757
  //
758
758
  // uint128& operator/=(uint128) is not constexpr, so hardcode the resulting
759
759
  // array to avoid a static initializer.
760
- template<>
761
- const uint128 LookupTables<uint128>::kVmaxOverBase[] = {
760
+ template <>
761
+ ABSL_CONST_INIT const uint128 LookupTables<uint128>::kVmaxOverBase[] = {
762
762
  0,
763
763
  0,
764
764
  MakeUint128(9223372036854775807u, 18446744073709551615u),
@@ -809,8 +809,8 @@ const uint128 LookupTables<uint128>::kVmaxOverBase[] = {
809
809
  //
810
810
  // int128& operator/=(int128) is not constexpr, so hardcode the resulting array
811
811
  // to avoid a static initializer.
812
- template<>
813
- const int128 LookupTables<int128>::kVmaxOverBase[] = {
812
+ template <>
813
+ ABSL_CONST_INIT const int128 LookupTables<int128>::kVmaxOverBase[] = {
814
814
  0,
815
815
  0,
816
816
  MakeInt128(4611686018427387903, 18446744073709551615u),
@@ -862,8 +862,8 @@ const int128 LookupTables<int128>::kVmaxOverBase[] = {
862
862
  //
863
863
  // int128& operator/=(int128) is not constexpr, so hardcode the resulting array
864
864
  // to avoid a static initializer.
865
- template<>
866
- const int128 LookupTables<int128>::kVminOverBase[] = {
865
+ template <>
866
+ ABSL_CONST_INIT const int128 LookupTables<int128>::kVminOverBase[] = {
867
867
  0,
868
868
  0,
869
869
  MakeInt128(-4611686018427387904, 0u),
@@ -904,11 +904,11 @@ const int128 LookupTables<int128>::kVminOverBase[] = {
904
904
  };
905
905
 
906
906
  template <typename IntType>
907
- const IntType LookupTables<IntType>::kVmaxOverBase[] =
907
+ ABSL_CONST_INIT const IntType LookupTables<IntType>::kVmaxOverBase[] =
908
908
  X_OVER_BASE_INITIALIZER(std::numeric_limits<IntType>::max());
909
909
 
910
910
  template <typename IntType>
911
- const IntType LookupTables<IntType>::kVminOverBase[] =
911
+ ABSL_CONST_INIT const IntType LookupTables<IntType>::kVminOverBase[] =
912
912
  X_OVER_BASE_INITIALIZER(std::numeric_limits<IntType>::min());
913
913
 
914
914
  #undef X_OVER_BASE_INITIALIZER
@@ -23,8 +23,12 @@
23
23
  #ifndef ABSL_STRINGS_NUMBERS_H_
24
24
  #define ABSL_STRINGS_NUMBERS_H_
25
25
 
26
- #ifdef __SSE4_2__
27
- #include <x86intrin.h>
26
+ #ifdef __SSSE3__
27
+ #include <tmmintrin.h>
28
+ #endif
29
+
30
+ #ifdef _MSC_VER
31
+ #include <intrin.h>
28
32
  #endif
29
33
 
30
34
  #include <cstddef>
@@ -36,14 +40,7 @@
36
40
  #include <type_traits>
37
41
 
38
42
  #include "absl/base/config.h"
39
- #ifdef __SSE4_2__
40
- // TODO(jorg): Remove this when we figure out the right way
41
- // to swap bytes on SSE 4.2 that works with the compilers
42
- // we claim to support. Also, add tests for the compiler
43
- // that doesn't support the Intel _bswap64 intrinsic but
44
- // does support all the SSE 4.2 intrinsics
45
43
  #include "absl/base/internal/endian.h"
46
- #endif
47
44
  #include "absl/base/macros.h"
48
45
  #include "absl/base/port.h"
49
46
  #include "absl/numeric/bits.h"
@@ -181,16 +178,19 @@ char* FastIntToBuffer(int_type i, char* buffer) {
181
178
  // TODO(jorg): This signed-ness check is used because it works correctly
182
179
  // with enums, and it also serves to check that int_type is not a pointer.
183
180
  // If one day something like std::is_signed<enum E> works, switch to it.
184
- if (static_cast<int_type>(1) - 2 < 0) { // Signed
185
- if (sizeof(i) > 32 / 8) { // 33-bit to 64-bit
181
+ // These conditions are constexpr bools to suppress MSVC warning C4127.
182
+ constexpr bool kIsSigned = static_cast<int_type>(1) - 2 < 0;
183
+ constexpr bool kUse64Bit = sizeof(i) > 32 / 8;
184
+ if (kIsSigned) {
185
+ if (kUse64Bit) {
186
186
  return FastIntToBuffer(static_cast<int64_t>(i), buffer);
187
- } else { // 32-bit or less
187
+ } else {
188
188
  return FastIntToBuffer(static_cast<int32_t>(i), buffer);
189
189
  }
190
- } else { // Unsigned
191
- if (sizeof(i) > 32 / 8) { // 33-bit to 64-bit
190
+ } else {
191
+ if (kUse64Bit) {
192
192
  return FastIntToBuffer(static_cast<uint64_t>(i), buffer);
193
- } else { // 32-bit or less
193
+ } else {
194
194
  return FastIntToBuffer(static_cast<uint32_t>(i), buffer);
195
195
  }
196
196
  }
@@ -209,22 +209,25 @@ ABSL_MUST_USE_RESULT bool safe_strtoi_base(absl::string_view s, int_type* out,
209
209
  // TODO(jorg): This signed-ness check is used because it works correctly
210
210
  // with enums, and it also serves to check that int_type is not a pointer.
211
211
  // If one day something like std::is_signed<enum E> works, switch to it.
212
- if (static_cast<int_type>(1) - 2 < 0) { // Signed
213
- if (sizeof(*out) == 64 / 8) { // 64-bit
212
+ // These conditions are constexpr bools to suppress MSVC warning C4127.
213
+ constexpr bool kIsSigned = static_cast<int_type>(1) - 2 < 0;
214
+ constexpr bool kUse64Bit = sizeof(*out) == 64 / 8;
215
+ if (kIsSigned) {
216
+ if (kUse64Bit) {
214
217
  int64_t val;
215
218
  parsed = numbers_internal::safe_strto64_base(s, &val, base);
216
219
  *out = static_cast<int_type>(val);
217
- } else { // 32-bit
220
+ } else {
218
221
  int32_t val;
219
222
  parsed = numbers_internal::safe_strto32_base(s, &val, base);
220
223
  *out = static_cast<int_type>(val);
221
224
  }
222
- } else { // Unsigned
223
- if (sizeof(*out) == 64 / 8) { // 64-bit
225
+ } else {
226
+ if (kUse64Bit) {
224
227
  uint64_t val;
225
228
  parsed = numbers_internal::safe_strtou64_base(s, &val, base);
226
229
  *out = static_cast<int_type>(val);
227
- } else { // 32-bit
230
+ } else {
228
231
  uint32_t val;
229
232
  parsed = numbers_internal::safe_strtou32_base(s, &val, base);
230
233
  *out = static_cast<int_type>(val);
@@ -240,7 +243,7 @@ ABSL_MUST_USE_RESULT bool safe_strtoi_base(absl::string_view s, int_type* out,
240
243
  // Returns the number of non-pad digits of the output (it can never be zero
241
244
  // since 0 has one digit).
242
245
  inline size_t FastHexToBufferZeroPad16(uint64_t val, char* out) {
243
- #ifdef __SSE4_2__
246
+ #ifdef ABSL_INTERNAL_HAVE_SSSE3
244
247
  uint64_t be = absl::big_endian::FromHost64(val);
245
248
  const auto kNibbleMask = _mm_set1_epi8(0xf);
246
249
  const auto kHexDigits = _mm_setr_epi8('0', '1', '2', '3', '4', '5', '6', '7',
@@ -259,7 +262,7 @@ inline size_t FastHexToBufferZeroPad16(uint64_t val, char* out) {
259
262
  }
260
263
  #endif
261
264
  // | 0x1 so that even 0 has 1 digit.
262
- return 16 - countl_zero(val | 0x1) / 4;
265
+ return 16 - static_cast<size_t>(countl_zero(val | 0x1) / 4);
263
266
  }
264
267
 
265
268
  } // namespace numbers_internal
@@ -214,23 +214,29 @@ class AlphaNum {
214
214
  // A bool ctor would also convert incoming pointers (bletch).
215
215
 
216
216
  AlphaNum(int x) // NOLINT(runtime/explicit)
217
- : piece_(digits_,
218
- numbers_internal::FastIntToBuffer(x, digits_) - &digits_[0]) {}
217
+ : piece_(digits_, static_cast<size_t>(
218
+ numbers_internal::FastIntToBuffer(x, digits_) -
219
+ &digits_[0])) {}
219
220
  AlphaNum(unsigned int x) // NOLINT(runtime/explicit)
220
- : piece_(digits_,
221
- numbers_internal::FastIntToBuffer(x, digits_) - &digits_[0]) {}
221
+ : piece_(digits_, static_cast<size_t>(
222
+ numbers_internal::FastIntToBuffer(x, digits_) -
223
+ &digits_[0])) {}
222
224
  AlphaNum(long x) // NOLINT(*)
223
- : piece_(digits_,
224
- numbers_internal::FastIntToBuffer(x, digits_) - &digits_[0]) {}
225
+ : piece_(digits_, static_cast<size_t>(
226
+ numbers_internal::FastIntToBuffer(x, digits_) -
227
+ &digits_[0])) {}
225
228
  AlphaNum(unsigned long x) // NOLINT(*)
226
- : piece_(digits_,
227
- numbers_internal::FastIntToBuffer(x, digits_) - &digits_[0]) {}
229
+ : piece_(digits_, static_cast<size_t>(
230
+ numbers_internal::FastIntToBuffer(x, digits_) -
231
+ &digits_[0])) {}
228
232
  AlphaNum(long long x) // NOLINT(*)
229
- : piece_(digits_,
230
- numbers_internal::FastIntToBuffer(x, digits_) - &digits_[0]) {}
233
+ : piece_(digits_, static_cast<size_t>(
234
+ numbers_internal::FastIntToBuffer(x, digits_) -
235
+ &digits_[0])) {}
231
236
  AlphaNum(unsigned long long x) // NOLINT(*)
232
- : piece_(digits_,
233
- numbers_internal::FastIntToBuffer(x, digits_) - &digits_[0]) {}
237
+ : piece_(digits_, static_cast<size_t>(
238
+ numbers_internal::FastIntToBuffer(x, digits_) -
239
+ &digits_[0])) {}
234
240
 
235
241
  AlphaNum(float f) // NOLINT(runtime/explicit)
236
242
  : piece_(digits_, numbers_internal::SixDigitsToBuffer(f, digits_)) {}
@@ -245,7 +251,8 @@ class AlphaNum {
245
251
  const strings_internal::AlphaNumBuffer<size>& buf)
246
252
  : piece_(&buf.data[0], buf.size) {}
247
253
 
248
- AlphaNum(const char* c_str) : piece_(c_str) {} // NOLINT(runtime/explicit)
254
+ AlphaNum(const char* c_str) // NOLINT(runtime/explicit)
255
+ : piece_(NullSafeStringView(c_str)) {} // NOLINT(runtime/explicit)
249
256
  AlphaNum(absl::string_view pc) : piece_(pc) {} // NOLINT(runtime/explicit)
250
257
 
251
258
  template <typename Allocator>
@@ -72,21 +72,15 @@ ABSL_NAMESPACE_BEGIN
72
72
  // functions. You may provide your own Formatter to enable `absl::StrJoin()` to
73
73
  // work with arbitrary types.
74
74
  //
75
- // The following is an example of a custom Formatter that simply uses
76
- // `std::to_string()` to format an integer as a std::string.
77
- //
78
- // struct MyFormatter {
79
- // void operator()(std::string* out, int i) const {
80
- // out->append(std::to_string(i));
81
- // }
82
- // };
83
- //
84
- // You would use the above formatter by passing an instance of it as the final
85
- // argument to `absl::StrJoin()`:
86
- //
87
- // std::vector<int> v = {1, 2, 3, 4};
88
- // std::string s = absl::StrJoin(v, "-", MyFormatter());
89
- // EXPECT_EQ("1-2-3-4", s);
75
+ // The following is an example of a custom Formatter that uses
76
+ // `absl::FormatDuration` to join a list of `absl::Duration`s.
77
+ //
78
+ // std::vector<absl::Duration> v = {absl::Seconds(1), absl::Milliseconds(10)};
79
+ // std::string s =
80
+ // absl::StrJoin(v, ", ", [](std::string* out, absl::Duration dur) {
81
+ // absl::StrAppend(out, absl::FormatDuration(dur));
82
+ // });
83
+ // EXPECT_EQ("1s, 10ms", s);
90
84
  //
91
85
  // The following standard formatters are provided within this file:
92
86
  //
@@ -461,8 +461,7 @@ using EnableSplitIfString =
461
461
  // first two split strings become the `std::pair` `.first` and `.second`
462
462
  // members, respectively. The remaining split substrings are discarded. If there
463
463
  // are less than two split substrings, the empty string is used for the
464
- // corresponding
465
- // `std::pair` member.
464
+ // corresponding `std::pair` member.
466
465
  //
467
466
  // Example:
468
467
  //
@@ -207,22 +207,11 @@ string_view::size_type string_view::find_last_not_of(
207
207
  return npos;
208
208
  }
209
209
 
210
- // MSVC has non-standard behavior that implicitly creates definitions for static
211
- // const members. These implicit definitions conflict with explicit out-of-class
212
- // member definitions that are required by the C++ standard, resulting in
213
- // LNK1169 "multiply defined" errors at link time. __declspec(selectany) asks
214
- // MSVC to choose only one definition for the symbol it decorates. See details
215
- // at https://msdn.microsoft.com/en-us/library/34h23df8(v=vs.100).aspx
216
- #ifdef _MSC_VER
217
- #define ABSL_STRING_VIEW_SELECTANY __declspec(selectany)
218
- #else
219
- #define ABSL_STRING_VIEW_SELECTANY
220
- #endif
221
210
 
222
- ABSL_STRING_VIEW_SELECTANY
211
+ #ifdef ABSL_INTERNAL_NEED_REDUNDANT_CONSTEXPR_DECL
223
212
  constexpr string_view::size_type string_view::npos;
224
- ABSL_STRING_VIEW_SELECTANY
225
213
  constexpr string_view::size_type string_view::kMaxSize;
214
+ #endif
226
215
 
227
216
  ABSL_NAMESPACE_END
228
217
  } // namespace absl
@@ -55,8 +55,9 @@ ABSL_NAMESPACE_END
55
55
 
56
56
  #else // ABSL_USES_STD_STRING_VIEW
57
57
 
58
- #if ABSL_HAVE_BUILTIN(__builtin_memcmp) || \
59
- (defined(__GNUC__) && !defined(__clang__))
58
+ #if ABSL_HAVE_BUILTIN(__builtin_memcmp) || \
59
+ (defined(__GNUC__) && !defined(__clang__)) || \
60
+ (defined(_MSC_VER) && _MSC_VER >= 1928)
60
61
  #define ABSL_INTERNAL_STRING_VIEW_MEMCMP __builtin_memcmp
61
62
  #else // ABSL_HAVE_BUILTIN(__builtin_memcmp)
62
63
  #define ABSL_INTERNAL_STRING_VIEW_MEMCMP memcmp
@@ -34,8 +34,9 @@ ABSL_NAMESPACE_BEGIN
34
34
 
35
35
  // ConsumePrefix()
36
36
  //
37
- // Strips the `expected` prefix from the start of the given string, returning
38
- // `true` if the strip operation succeeded or false otherwise.
37
+ // Strips the `expected` prefix, if found, from the start of `str`.
38
+ // If the operation succeeded, `true` is returned. If not, `false`
39
+ // is returned and `str` is not modified.
39
40
  //
40
41
  // Example:
41
42
  //
@@ -49,8 +50,9 @@ inline bool ConsumePrefix(absl::string_view* str, absl::string_view expected) {
49
50
  }
50
51
  // ConsumeSuffix()
51
52
  //
52
- // Strips the `expected` suffix from the end of the given string, returning
53
- // `true` if the strip operation succeeded or false otherwise.
53
+ // Strips the `expected` suffix, if found, from the end of `str`.
54
+ // If the operation succeeded, `true` is returned. If not, `false`
55
+ // is returned and `str` is not modified.
54
56
  //
55
57
  // Example:
56
58
  //
@@ -65,7 +67,7 @@ inline bool ConsumeSuffix(absl::string_view* str, absl::string_view expected) {
65
67
 
66
68
  // StripPrefix()
67
69
  //
68
- // Returns a view into the input string 'str' with the given 'prefix' removed,
70
+ // Returns a view into the input string `str` with the given `prefix` removed,
69
71
  // but leaving the original string intact. If the prefix does not match at the
70
72
  // start of the string, returns the original string instead.
71
73
  ABSL_MUST_USE_RESULT inline absl::string_view StripPrefix(
@@ -76,7 +78,7 @@ ABSL_MUST_USE_RESULT inline absl::string_view StripPrefix(
76
78
 
77
79
  // StripSuffix()
78
80
  //
79
- // Returns a view into the input string 'str' with the given 'suffix' removed,
81
+ // Returns a view into the input string `str` with the given `suffix` removed,
80
82
  // but leaving the original string intact. If the suffix does not match at the
81
83
  // end of the string, returns the original string instead.
82
84
  ABSL_MUST_USE_RESULT inline absl::string_view StripSuffix(
@@ -159,8 +159,8 @@ class Arg {
159
159
  Arg(Hex hex); // NOLINT(runtime/explicit)
160
160
  Arg(Dec dec); // NOLINT(runtime/explicit)
161
161
 
162
- // vector<bool>::reference and const_reference require special help to
163
- // convert to `AlphaNum` because it requires two user defined conversions.
162
+ // vector<bool>::reference and const_reference require special help to convert
163
+ // to `Arg` because it requires two user defined conversions.
164
164
  template <typename T,
165
165
  absl::enable_if_t<
166
166
  std::is_class<T>::value &&
@@ -174,6 +174,14 @@ class Arg {
174
174
  // "0x<hex value>". However, in the case of `nullptr`, "NULL" is printed.
175
175
  Arg(const void* value); // NOLINT(runtime/explicit)
176
176
 
177
+ // Normal enums are already handled by the integer formatters.
178
+ // This overload matches only scoped enums.
179
+ template <typename T,
180
+ typename = typename std::enable_if<
181
+ std::is_enum<T>{} && !std::is_convertible<T, int>{}>::type>
182
+ Arg(T value) // NOLINT(google-explicit-constructor)
183
+ : Arg(static_cast<typename std::underlying_type<T>::type>(value)) {}
184
+
177
185
  Arg(const Arg&) = delete;
178
186
  Arg& operator=(const Arg&) = delete;
179
187