grpc 1.37.1 → 1.38.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 (544) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +64 -58
  3. data/include/grpc/event_engine/README.md +38 -0
  4. data/include/grpc/event_engine/channel_args.h +28 -0
  5. data/include/grpc/event_engine/event_engine.h +336 -0
  6. data/include/grpc/event_engine/port.h +39 -0
  7. data/include/grpc/event_engine/slice_allocator.h +81 -0
  8. data/include/grpc/grpc.h +2 -2
  9. data/include/grpc/grpc_security_constants.h +14 -0
  10. data/include/grpc/impl/codegen/grpc_types.h +11 -0
  11. data/include/grpc/impl/codegen/port_platform.h +5 -0
  12. data/include/grpc/module.modulemap +14 -14
  13. data/src/core/ext/filters/client_channel/backup_poller.cc +3 -3
  14. data/src/core/ext/filters/client_channel/channel_connectivity.cc +177 -202
  15. data/src/core/ext/filters/client_channel/client_channel.cc +628 -3101
  16. data/src/core/ext/filters/client_channel/client_channel.h +489 -55
  17. data/src/core/ext/filters/client_channel/client_channel_channelz.h +1 -1
  18. data/src/core/ext/filters/client_channel/client_channel_plugin.cc +4 -1
  19. data/src/core/ext/filters/client_channel/config_selector.h +1 -1
  20. data/src/core/ext/filters/client_channel/connector.h +1 -1
  21. data/src/core/ext/filters/client_channel/dynamic_filters.cc +9 -10
  22. data/src/core/ext/filters/client_channel/dynamic_filters.h +3 -3
  23. data/src/core/ext/filters/client_channel/health/health_check_client.cc +26 -27
  24. data/src/core/ext/filters/client_channel/health/health_check_client.h +27 -26
  25. data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +24 -21
  26. data/src/core/ext/filters/client_channel/lb_policy.cc +1 -1
  27. data/src/core/ext/filters/client_channel/lb_policy.h +4 -4
  28. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +6 -6
  29. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +46 -43
  30. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc +1 -1
  31. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h +2 -1
  32. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +5 -5
  33. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +14 -12
  34. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +4 -4
  35. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +1 -1
  36. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +15 -15
  37. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +36 -30
  38. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +23 -23
  39. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +31 -46
  40. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +84 -61
  41. data/src/core/ext/filters/client_channel/lb_policy_factory.h +1 -1
  42. data/src/core/ext/filters/client_channel/lb_policy_registry.cc +4 -4
  43. data/src/core/ext/filters/client_channel/lb_policy_registry.h +1 -1
  44. data/src/core/ext/filters/client_channel/resolver.h +2 -2
  45. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +23 -15
  46. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +1 -1
  47. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_libuv.cc +3 -3
  48. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +2 -2
  49. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +14 -14
  50. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +33 -24
  51. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +1 -1
  52. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_libuv.cc +1 -1
  53. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_windows.cc +1 -1
  54. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +17 -9
  55. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +20 -28
  56. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h +7 -5
  57. data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +13 -11
  58. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +1 -1
  59. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +43 -28
  60. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +32 -239
  61. data/src/core/ext/filters/client_channel/resolver_result_parsing.h +20 -49
  62. data/src/core/ext/filters/client_channel/retry_filter.cc +2188 -0
  63. data/src/core/ext/filters/client_channel/retry_filter.h +30 -0
  64. data/src/core/ext/filters/client_channel/retry_service_config.cc +287 -0
  65. data/src/core/ext/filters/client_channel/retry_service_config.h +90 -0
  66. data/src/core/ext/filters/client_channel/server_address.cc +1 -1
  67. data/src/core/ext/filters/client_channel/service_config.cc +15 -14
  68. data/src/core/ext/filters/client_channel/service_config.h +7 -6
  69. data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +5 -4
  70. data/src/core/ext/filters/client_channel/service_config_parser.cc +6 -6
  71. data/src/core/ext/filters/client_channel/service_config_parser.h +7 -4
  72. data/src/core/ext/filters/client_channel/subchannel.cc +17 -16
  73. data/src/core/ext/filters/client_channel/subchannel.h +7 -6
  74. data/src/core/ext/filters/client_idle/client_idle_filter.cc +16 -15
  75. data/src/core/ext/filters/deadline/deadline_filter.cc +10 -10
  76. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +19 -18
  77. data/src/core/ext/filters/fault_injection/service_config_parser.cc +5 -5
  78. data/src/core/ext/filters/fault_injection/service_config_parser.h +1 -1
  79. data/src/core/ext/filters/http/client/http_client_filter.cc +28 -21
  80. data/src/core/ext/filters/http/client_authority_filter.cc +3 -3
  81. data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +23 -22
  82. data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +21 -21
  83. data/src/core/ext/filters/http/server/http_server_filter.cc +27 -23
  84. data/src/core/ext/filters/max_age/max_age_filter.cc +12 -10
  85. data/src/core/ext/filters/message_size/message_size_filter.cc +14 -11
  86. data/src/core/ext/filters/message_size/message_size_filter.h +1 -1
  87. data/src/core/ext/filters/workarounds/workaround_cronet_compression_filter.cc +4 -3
  88. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +7 -7
  89. data/src/core/ext/transport/chttp2/client/chttp2_connector.h +7 -7
  90. data/src/core/ext/transport/chttp2/client/insecure/channel_create.cc +2 -2
  91. data/src/core/ext/transport/chttp2/client/insecure/channel_create_posix.cc +1 -1
  92. data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +3 -3
  93. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +44 -45
  94. data/src/core/ext/transport/chttp2/server/chttp2_server.h +2 -2
  95. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2.cc +3 -4
  96. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.cc +2 -2
  97. data/src/core/ext/transport/chttp2/server/secure/server_secure_chttp2.cc +3 -4
  98. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +129 -116
  99. data/src/core/ext/transport/chttp2/transport/context_list.cc +4 -5
  100. data/src/core/ext/transport/chttp2/transport/context_list.h +4 -4
  101. data/src/core/ext/transport/chttp2/transport/flow_control.cc +3 -3
  102. data/src/core/ext/transport/chttp2/transport/flow_control.h +8 -8
  103. data/src/core/ext/transport/chttp2/transport/frame_data.cc +8 -8
  104. data/src/core/ext/transport/chttp2/transport/frame_data.h +10 -10
  105. data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +7 -8
  106. data/src/core/ext/transport/chttp2/transport/frame_goaway.h +6 -6
  107. data/src/core/ext/transport/chttp2/transport/frame_ping.cc +7 -8
  108. data/src/core/ext/transport/chttp2/transport/frame_ping.h +7 -6
  109. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +7 -7
  110. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.h +6 -6
  111. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +6 -5
  112. data/src/core/ext/transport/chttp2/transport/frame_settings.h +6 -6
  113. data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +4 -6
  114. data/src/core/ext/transport/chttp2/transport/frame_window_update.h +4 -6
  115. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +237 -208
  116. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +10 -10
  117. data/src/core/ext/transport/chttp2/transport/hpack_table.cc +4 -3
  118. data/src/core/ext/transport/chttp2/transport/hpack_table.h +4 -4
  119. data/src/core/ext/transport/chttp2/transport/incoming_metadata.cc +2 -2
  120. data/src/core/ext/transport/chttp2/transport/incoming_metadata.h +2 -2
  121. data/src/core/ext/transport/chttp2/transport/internal.h +31 -27
  122. data/src/core/ext/transport/chttp2/transport/parsing.cc +63 -56
  123. data/src/core/ext/transport/chttp2/transport/writing.cc +7 -3
  124. data/src/core/ext/transport/inproc/inproc_transport.cc +30 -29
  125. data/src/core/ext/xds/certificate_provider_factory.h +1 -1
  126. data/src/core/ext/xds/certificate_provider_store.h +3 -3
  127. data/src/core/ext/xds/file_watcher_certificate_provider_factory.cc +3 -3
  128. data/src/core/ext/xds/file_watcher_certificate_provider_factory.h +2 -2
  129. data/src/core/ext/xds/xds_api.cc +101 -93
  130. data/src/core/ext/xds/xds_api.h +6 -6
  131. data/src/core/ext/xds/xds_bootstrap.cc +97 -159
  132. data/src/core/ext/xds/xds_bootstrap.h +19 -24
  133. data/src/core/ext/xds/xds_certificate_provider.cc +4 -4
  134. data/src/core/ext/xds/xds_certificate_provider.h +4 -4
  135. data/src/core/ext/xds/xds_channel_args.h +5 -2
  136. data/src/core/ext/xds/xds_client.cc +310 -178
  137. data/src/core/ext/xds/xds_client.h +41 -27
  138. data/src/core/ext/xds/xds_client_stats.h +3 -2
  139. data/src/core/ext/xds/xds_server_config_fetcher.cc +34 -20
  140. data/src/core/lib/{iomgr → address_utils}/parse_address.cc +17 -17
  141. data/src/core/lib/{iomgr → address_utils}/parse_address.h +7 -7
  142. data/src/core/lib/{iomgr → address_utils}/sockaddr_utils.cc +3 -20
  143. data/src/core/lib/{iomgr → address_utils}/sockaddr_utils.h +6 -11
  144. data/src/core/lib/channel/channel_stack.cc +10 -9
  145. data/src/core/lib/channel/channel_stack.h +10 -9
  146. data/src/core/lib/channel/channel_stack_builder.cc +2 -2
  147. data/src/core/lib/channel/channel_stack_builder.h +1 -1
  148. data/src/core/lib/channel/channelz.cc +21 -13
  149. data/src/core/lib/channel/connected_channel.cc +4 -4
  150. data/src/core/lib/channel/handshaker.cc +7 -6
  151. data/src/core/lib/channel/handshaker.h +5 -5
  152. data/src/core/lib/event_engine/slice_allocator.cc +59 -0
  153. data/src/core/lib/event_engine/sockaddr.cc +38 -0
  154. data/src/core/lib/gprpp/ref_counted.h +28 -14
  155. data/src/core/lib/gprpp/status_helper.cc +407 -0
  156. data/src/core/lib/gprpp/status_helper.h +180 -0
  157. data/src/core/lib/http/httpcli.cc +11 -11
  158. data/src/core/lib/http/httpcli_security_connector.cc +11 -7
  159. data/src/core/lib/http/parser.cc +16 -16
  160. data/src/core/lib/http/parser.h +4 -4
  161. data/src/core/lib/iomgr/buffer_list.cc +7 -9
  162. data/src/core/lib/iomgr/buffer_list.h +4 -5
  163. data/src/core/lib/iomgr/call_combiner.cc +15 -12
  164. data/src/core/lib/iomgr/call_combiner.h +12 -14
  165. data/src/core/lib/iomgr/cfstream_handle.cc +3 -3
  166. data/src/core/lib/iomgr/cfstream_handle.h +1 -1
  167. data/src/core/lib/iomgr/closure.h +7 -6
  168. data/src/core/lib/iomgr/combiner.cc +14 -12
  169. data/src/core/lib/iomgr/combiner.h +2 -2
  170. data/src/core/lib/iomgr/endpoint.cc +1 -1
  171. data/src/core/lib/iomgr/endpoint.h +2 -2
  172. data/src/core/lib/iomgr/endpoint_cfstream.cc +11 -13
  173. data/src/core/lib/iomgr/endpoint_pair_windows.cc +1 -1
  174. data/src/core/lib/iomgr/error.cc +167 -61
  175. data/src/core/lib/iomgr/error.h +217 -106
  176. data/src/core/lib/iomgr/error_cfstream.cc +3 -2
  177. data/src/core/lib/iomgr/error_cfstream.h +2 -2
  178. data/src/core/lib/iomgr/error_internal.h +5 -1
  179. data/src/core/lib/iomgr/ev_apple.cc +5 -5
  180. data/src/core/lib/iomgr/ev_epoll1_linux.cc +19 -19
  181. data/src/core/lib/iomgr/ev_epollex_linux.cc +48 -45
  182. data/src/core/lib/iomgr/ev_poll_posix.cc +26 -23
  183. data/src/core/lib/iomgr/ev_posix.cc +9 -8
  184. data/src/core/lib/iomgr/ev_posix.h +9 -9
  185. data/src/core/lib/iomgr/exec_ctx.cc +4 -4
  186. data/src/core/lib/iomgr/exec_ctx.h +1 -1
  187. data/src/core/lib/iomgr/executor.cc +8 -8
  188. data/src/core/lib/iomgr/executor.h +2 -2
  189. data/src/core/lib/iomgr/iomgr.cc +1 -1
  190. data/src/core/lib/iomgr/iomgr.h +1 -1
  191. data/src/core/lib/iomgr/iomgr_custom.cc +1 -1
  192. data/src/core/lib/iomgr/iomgr_internal.cc +2 -2
  193. data/src/core/lib/iomgr/iomgr_internal.h +3 -3
  194. data/src/core/lib/iomgr/iomgr_posix.cc +1 -1
  195. data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +2 -2
  196. data/src/core/lib/iomgr/iomgr_windows.cc +1 -1
  197. data/src/core/lib/iomgr/load_file.cc +4 -4
  198. data/src/core/lib/iomgr/load_file.h +2 -2
  199. data/src/core/lib/iomgr/lockfree_event.cc +5 -5
  200. data/src/core/lib/iomgr/lockfree_event.h +1 -1
  201. data/src/core/lib/iomgr/pollset.cc +5 -5
  202. data/src/core/lib/iomgr/pollset.h +9 -9
  203. data/src/core/lib/iomgr/pollset_custom.cc +5 -5
  204. data/src/core/lib/iomgr/pollset_windows.cc +5 -5
  205. data/src/core/lib/iomgr/port.h +1 -1
  206. data/src/core/lib/iomgr/python_util.h +1 -1
  207. data/src/core/lib/iomgr/resolve_address.cc +3 -3
  208. data/src/core/lib/iomgr/resolve_address.h +6 -6
  209. data/src/core/lib/iomgr/resolve_address_custom.cc +10 -9
  210. data/src/core/lib/iomgr/resolve_address_custom.h +3 -3
  211. data/src/core/lib/iomgr/resolve_address_posix.cc +3 -3
  212. data/src/core/lib/iomgr/resolve_address_windows.cc +4 -4
  213. data/src/core/lib/iomgr/resource_quota.cc +11 -10
  214. data/src/core/lib/iomgr/socket_utils_common_posix.cc +22 -20
  215. data/src/core/lib/iomgr/socket_utils_posix.h +20 -20
  216. data/src/core/lib/iomgr/tcp_client_cfstream.cc +4 -4
  217. data/src/core/lib/iomgr/tcp_client_custom.cc +5 -6
  218. data/src/core/lib/iomgr/tcp_client_posix.cc +15 -17
  219. data/src/core/lib/iomgr/tcp_client_posix.h +3 -4
  220. data/src/core/lib/iomgr/tcp_client_windows.cc +5 -5
  221. data/src/core/lib/iomgr/tcp_custom.cc +14 -16
  222. data/src/core/lib/iomgr/tcp_custom.h +13 -12
  223. data/src/core/lib/iomgr/tcp_posix.cc +36 -34
  224. data/src/core/lib/iomgr/tcp_server.cc +6 -6
  225. data/src/core/lib/iomgr/tcp_server.h +12 -11
  226. data/src/core/lib/iomgr/tcp_server_custom.cc +23 -21
  227. data/src/core/lib/iomgr/tcp_server_posix.cc +22 -21
  228. data/src/core/lib/iomgr/tcp_server_utils_posix.h +13 -12
  229. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +19 -17
  230. data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +9 -9
  231. data/src/core/lib/iomgr/tcp_server_utils_posix_noifaddrs.cc +4 -4
  232. data/src/core/lib/iomgr/tcp_server_windows.cc +26 -25
  233. data/src/core/lib/iomgr/tcp_uv.cc +25 -23
  234. data/src/core/lib/iomgr/tcp_windows.cc +13 -13
  235. data/src/core/lib/iomgr/tcp_windows.h +2 -2
  236. data/src/core/lib/iomgr/timer_custom.cc +2 -1
  237. data/src/core/lib/iomgr/timer_custom.h +1 -1
  238. data/src/core/lib/iomgr/timer_generic.cc +6 -6
  239. data/src/core/lib/iomgr/udp_server.cc +21 -20
  240. data/src/core/lib/iomgr/unix_sockets_posix.cc +3 -3
  241. data/src/core/lib/iomgr/unix_sockets_posix.h +2 -2
  242. data/src/core/lib/iomgr/unix_sockets_posix_noop.cc +10 -7
  243. data/src/core/lib/iomgr/wakeup_fd_eventfd.cc +3 -3
  244. data/src/core/lib/iomgr/wakeup_fd_pipe.cc +4 -4
  245. data/src/core/lib/iomgr/wakeup_fd_posix.cc +3 -3
  246. data/src/core/lib/iomgr/wakeup_fd_posix.h +8 -6
  247. data/src/core/lib/iomgr/work_serializer.h +17 -1
  248. data/src/core/lib/json/json.h +1 -1
  249. data/src/core/lib/json/json_reader.cc +4 -4
  250. data/src/core/lib/matchers/matchers.cc +39 -39
  251. data/src/core/lib/matchers/matchers.h +28 -28
  252. data/src/core/lib/security/credentials/composite/composite_credentials.cc +4 -4
  253. data/src/core/lib/security/credentials/composite/composite_credentials.h +2 -2
  254. data/src/core/lib/security/credentials/credentials.h +2 -2
  255. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +17 -13
  256. data/src/core/lib/security/credentials/external/aws_external_account_credentials.h +13 -11
  257. data/src/core/lib/security/credentials/external/aws_request_signer.cc +2 -1
  258. data/src/core/lib/security/credentials/external/aws_request_signer.h +1 -1
  259. data/src/core/lib/security/credentials/external/external_account_credentials.cc +15 -12
  260. data/src/core/lib/security/credentials/external/external_account_credentials.h +9 -8
  261. data/src/core/lib/security/credentials/external/file_external_account_credentials.cc +5 -4
  262. data/src/core/lib/security/credentials/external/file_external_account_credentials.h +4 -3
  263. data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +8 -8
  264. data/src/core/lib/security/credentials/external/url_external_account_credentials.h +9 -7
  265. data/src/core/lib/security/credentials/fake/fake_credentials.cc +2 -2
  266. data/src/core/lib/security/credentials/fake/fake_credentials.h +2 -2
  267. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +9 -9
  268. data/src/core/lib/security/credentials/iam/iam_credentials.cc +2 -2
  269. data/src/core/lib/security/credentials/iam/iam_credentials.h +2 -2
  270. data/src/core/lib/security/credentials/jwt/json_token.cc +2 -2
  271. data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +3 -3
  272. data/src/core/lib/security/credentials/jwt/jwt_credentials.h +2 -2
  273. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +7 -5
  274. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +21 -19
  275. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +5 -5
  276. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +5 -5
  277. data/src/core/lib/security/credentials/plugin/plugin_credentials.h +2 -2
  278. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.cc +8 -7
  279. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.h +9 -9
  280. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc +19 -13
  281. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +4 -0
  282. data/src/core/lib/security/credentials/xds/xds_credentials.cc +3 -3
  283. data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +13 -3
  284. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +13 -3
  285. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.cc +2 -2
  286. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.h +12 -2
  287. data/src/core/lib/security/security_connector/load_system_roots_linux.cc +1 -1
  288. data/src/core/lib/security/security_connector/local/local_security_connector.cc +14 -4
  289. data/src/core/lib/security/security_connector/security_connector.h +9 -4
  290. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +16 -6
  291. data/src/core/lib/security/security_connector/ssl_utils.cc +22 -4
  292. data/src/core/lib/security/security_connector/ssl_utils.h +4 -4
  293. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +56 -60
  294. data/src/core/lib/security/security_connector/tls/tls_security_connector.h +66 -48
  295. data/src/core/lib/security/transport/client_auth_filter.cc +18 -10
  296. data/src/core/lib/security/transport/secure_endpoint.cc +4 -4
  297. data/src/core/lib/security/transport/security_handshaker.cc +33 -32
  298. data/src/core/lib/security/transport/server_auth_filter.cc +19 -13
  299. data/src/core/lib/security/transport/tsi_error.cc +2 -1
  300. data/src/core/lib/security/transport/tsi_error.h +2 -1
  301. data/src/core/lib/security/util/json_util.cc +2 -2
  302. data/src/core/lib/security/util/json_util.h +1 -1
  303. data/src/core/lib/surface/call.cc +46 -45
  304. data/src/core/lib/surface/call.h +2 -2
  305. data/src/core/lib/surface/channel.cc +6 -6
  306. data/src/core/lib/surface/channel.h +3 -2
  307. data/src/core/lib/surface/channel_ping.cc +1 -1
  308. data/src/core/lib/surface/completion_queue.cc +46 -47
  309. data/src/core/lib/surface/completion_queue.h +2 -1
  310. data/src/core/lib/surface/lame_client.cc +11 -11
  311. data/src/core/lib/surface/lame_client.h +1 -1
  312. data/src/core/lib/surface/server.cc +28 -22
  313. data/src/core/lib/surface/server.h +16 -15
  314. data/src/core/lib/surface/validate_metadata.cc +7 -7
  315. data/src/core/lib/surface/validate_metadata.h +3 -2
  316. data/src/core/lib/surface/version.cc +4 -2
  317. data/src/core/lib/transport/byte_stream.cc +5 -5
  318. data/src/core/lib/transport/byte_stream.h +8 -8
  319. data/src/core/lib/transport/connectivity_state.cc +1 -1
  320. data/src/core/lib/transport/error_utils.cc +19 -8
  321. data/src/core/lib/transport/error_utils.h +11 -5
  322. data/src/core/lib/transport/metadata_batch.cc +37 -37
  323. data/src/core/lib/transport/metadata_batch.h +19 -18
  324. data/src/core/lib/transport/transport.cc +4 -3
  325. data/src/core/lib/transport/transport.h +4 -4
  326. data/src/core/lib/transport/transport_op_string.cc +5 -5
  327. data/src/core/tsi/alts/crypt/gsec.h +4 -0
  328. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +5 -4
  329. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +7 -6
  330. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker_private.h +2 -1
  331. data/src/core/tsi/ssl_transport_security.cc +32 -14
  332. data/src/core/tsi/ssl_transport_security.h +3 -4
  333. data/src/ruby/bin/math_services_pb.rb +1 -1
  334. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +1 -1
  335. data/src/ruby/lib/grpc/version.rb +1 -1
  336. data/src/ruby/pb/grpc/health/v1/health_services_pb.rb +1 -1
  337. data/src/ruby/pb/src/proto/grpc/testing/test_services_pb.rb +6 -6
  338. data/third_party/abseil-cpp/absl/algorithm/container.h +3 -3
  339. data/third_party/abseil-cpp/absl/base/attributes.h +24 -4
  340. data/third_party/abseil-cpp/absl/base/call_once.h +2 -9
  341. data/third_party/abseil-cpp/absl/base/config.h +37 -9
  342. data/third_party/abseil-cpp/absl/base/dynamic_annotations.h +24 -10
  343. data/third_party/abseil-cpp/absl/base/internal/direct_mmap.h +4 -1
  344. data/third_party/abseil-cpp/absl/base/internal/endian.h +61 -0
  345. data/third_party/abseil-cpp/absl/base/internal/low_level_scheduling.h +2 -3
  346. data/third_party/abseil-cpp/absl/base/internal/raw_logging.cc +34 -32
  347. data/third_party/abseil-cpp/absl/base/internal/raw_logging.h +16 -6
  348. data/third_party/abseil-cpp/absl/base/internal/spinlock.cc +11 -2
  349. data/third_party/abseil-cpp/absl/base/internal/spinlock.h +14 -5
  350. data/third_party/abseil-cpp/absl/base/internal/spinlock_akaros.inc +2 -2
  351. data/third_party/abseil-cpp/absl/base/internal/spinlock_linux.inc +3 -3
  352. data/third_party/abseil-cpp/absl/base/internal/spinlock_posix.inc +2 -2
  353. data/third_party/abseil-cpp/absl/base/internal/spinlock_wait.h +11 -11
  354. data/third_party/abseil-cpp/absl/base/internal/spinlock_win32.inc +5 -5
  355. data/third_party/abseil-cpp/absl/base/internal/sysinfo.cc +1 -1
  356. data/third_party/abseil-cpp/absl/base/internal/thread_identity.cc +5 -2
  357. data/third_party/abseil-cpp/absl/base/internal/thread_identity.h +43 -42
  358. data/third_party/abseil-cpp/absl/base/internal/throw_delegate.cc +111 -7
  359. data/third_party/abseil-cpp/absl/base/internal/unaligned_access.h +0 -76
  360. data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.cc +1 -3
  361. data/third_party/abseil-cpp/absl/base/log_severity.h +4 -4
  362. data/third_party/abseil-cpp/absl/base/macros.h +11 -0
  363. data/third_party/abseil-cpp/absl/base/optimization.h +10 -7
  364. data/third_party/abseil-cpp/absl/base/options.h +1 -1
  365. data/third_party/abseil-cpp/absl/base/port.h +0 -1
  366. data/third_party/abseil-cpp/absl/base/thread_annotations.h +1 -1
  367. data/third_party/abseil-cpp/absl/container/fixed_array.h +2 -2
  368. data/third_party/abseil-cpp/absl/container/inlined_vector.h +5 -3
  369. data/third_party/abseil-cpp/absl/container/internal/compressed_tuple.h +1 -1
  370. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.cc +5 -1
  371. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.h +2 -1
  372. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler_force_weak_definition.cc +2 -1
  373. data/third_party/abseil-cpp/absl/container/internal/inlined_vector.h +141 -66
  374. data/third_party/abseil-cpp/absl/container/internal/layout.h +4 -4
  375. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.cc +14 -1
  376. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.h +136 -136
  377. data/third_party/abseil-cpp/absl/debugging/internal/demangle.cc +16 -12
  378. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_aarch64-inl.inc +5 -2
  379. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_config.h +3 -12
  380. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_powerpc-inl.inc +6 -1
  381. data/third_party/abseil-cpp/absl/debugging/internal/symbolize.h +3 -5
  382. data/third_party/abseil-cpp/absl/debugging/symbolize_darwin.inc +2 -2
  383. data/third_party/abseil-cpp/absl/debugging/symbolize_elf.inc +2 -2
  384. data/third_party/abseil-cpp/absl/hash/internal/city.cc +15 -12
  385. data/third_party/abseil-cpp/absl/hash/internal/city.h +1 -19
  386. data/third_party/abseil-cpp/absl/hash/internal/hash.cc +25 -10
  387. data/third_party/abseil-cpp/absl/hash/internal/hash.h +86 -37
  388. data/third_party/abseil-cpp/absl/hash/internal/wyhash.cc +111 -0
  389. data/third_party/abseil-cpp/absl/hash/internal/wyhash.h +48 -0
  390. data/third_party/abseil-cpp/absl/meta/type_traits.h +16 -2
  391. data/third_party/abseil-cpp/absl/numeric/bits.h +177 -0
  392. data/third_party/abseil-cpp/absl/numeric/int128.cc +3 -3
  393. data/third_party/abseil-cpp/absl/numeric/internal/bits.h +358 -0
  394. data/third_party/abseil-cpp/absl/numeric/internal/representation.h +55 -0
  395. data/third_party/abseil-cpp/absl/status/internal/status_internal.h +18 -0
  396. data/third_party/abseil-cpp/absl/status/internal/statusor_internal.h +4 -7
  397. data/third_party/abseil-cpp/absl/status/status.cc +29 -22
  398. data/third_party/abseil-cpp/absl/status/status.h +81 -20
  399. data/third_party/abseil-cpp/absl/status/statusor.h +3 -3
  400. data/third_party/abseil-cpp/absl/strings/charconv.cc +5 -5
  401. data/third_party/abseil-cpp/absl/strings/cord.cc +326 -371
  402. data/third_party/abseil-cpp/absl/strings/cord.h +182 -64
  403. data/third_party/abseil-cpp/absl/strings/escaping.cc +4 -4
  404. data/third_party/abseil-cpp/absl/strings/internal/charconv_parse.cc +6 -6
  405. data/third_party/abseil-cpp/absl/strings/internal/cord_internal.cc +83 -0
  406. data/third_party/abseil-cpp/absl/strings/internal/cord_internal.h +387 -17
  407. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_flat.h +146 -0
  408. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring.cc +897 -0
  409. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring.h +589 -0
  410. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring_reader.h +114 -0
  411. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.cc +14 -0
  412. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.h +14 -0
  413. data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.cc +15 -1
  414. data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.h +19 -4
  415. data/third_party/abseil-cpp/absl/strings/internal/str_format/checker.h +14 -0
  416. data/third_party/abseil-cpp/absl/strings/internal/str_format/float_conversion.cc +36 -18
  417. data/third_party/abseil-cpp/absl/strings/internal/str_format/float_conversion.h +14 -0
  418. data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.cc +14 -0
  419. data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.h +14 -0
  420. data/third_party/abseil-cpp/absl/strings/internal/str_split_internal.h +15 -40
  421. data/third_party/abseil-cpp/absl/strings/internal/string_constant.h +64 -0
  422. data/third_party/abseil-cpp/absl/strings/match.cc +6 -3
  423. data/third_party/abseil-cpp/absl/strings/match.h +16 -6
  424. data/third_party/abseil-cpp/absl/strings/numbers.cc +132 -4
  425. data/third_party/abseil-cpp/absl/strings/numbers.h +10 -10
  426. data/third_party/abseil-cpp/absl/strings/str_join.h +1 -1
  427. data/third_party/abseil-cpp/absl/strings/str_split.h +38 -4
  428. data/third_party/abseil-cpp/absl/synchronization/internal/futex.h +154 -0
  429. data/third_party/abseil-cpp/absl/synchronization/internal/kernel_timeout.h +2 -1
  430. data/third_party/abseil-cpp/absl/synchronization/internal/per_thread_sem.cc +2 -2
  431. data/third_party/abseil-cpp/absl/synchronization/internal/per_thread_sem.h +4 -4
  432. data/third_party/abseil-cpp/absl/synchronization/internal/waiter.cc +1 -65
  433. data/third_party/abseil-cpp/absl/synchronization/internal/waiter.h +2 -6
  434. data/third_party/abseil-cpp/absl/synchronization/mutex.cc +71 -59
  435. data/third_party/abseil-cpp/absl/synchronization/mutex.h +79 -62
  436. data/third_party/abseil-cpp/absl/time/clock.cc +146 -130
  437. data/third_party/abseil-cpp/absl/time/clock.h +2 -2
  438. data/third_party/abseil-cpp/absl/time/duration.cc +3 -2
  439. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/civil_time_detail.h +7 -11
  440. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_libc.cc +7 -1
  441. data/third_party/abseil-cpp/absl/time/internal/cctz/src/tzfile.h +4 -4
  442. data/third_party/abseil-cpp/absl/time/time.cc +4 -3
  443. data/third_party/abseil-cpp/absl/time/time.h +26 -24
  444. data/third_party/abseil-cpp/absl/types/internal/variant.h +1 -1
  445. data/third_party/abseil-cpp/absl/types/variant.h +9 -4
  446. data/third_party/boringssl-with-bazel/err_data.c +477 -461
  447. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_bool.c +1 -1
  448. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_object.c +1 -1
  449. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_type.c +18 -8
  450. data/third_party/boringssl-with-bazel/src/crypto/asn1/asn1_lib.c +1 -2
  451. data/third_party/boringssl-with-bazel/src/crypto/asn1/asn1_locl.h +5 -0
  452. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_enc.c +1 -1
  453. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_fre.c +1 -1
  454. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_tls.c +1 -88
  455. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/internal.h +14 -3
  456. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/tls_cbc.c +119 -273
  457. data/third_party/boringssl-with-bazel/src/crypto/err/err.c +87 -80
  458. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bcm.c +1 -0
  459. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/internal.h +1 -1
  460. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/cipher.c +11 -3
  461. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/e_aes.c +25 -2
  462. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/digest/digests.c +10 -2
  463. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/digest/md32_common.h +4 -43
  464. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec.c +4 -0
  465. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec_key.c +0 -1
  466. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/internal.h +0 -4
  467. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdsa/ecdsa.c +104 -93
  468. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdsa/internal.h +39 -0
  469. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/md4/md4.c +43 -46
  470. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/md5/md5.c +43 -46
  471. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/cbc.c +33 -22
  472. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/cfb.c +9 -8
  473. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/ctr.c +9 -8
  474. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/gcm.c +17 -13
  475. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/internal.h +1 -22
  476. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/ofb.c +2 -1
  477. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/urandom.c +26 -7
  478. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/self_check/fips.c +79 -0
  479. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/self_check/self_check.c +14 -9
  480. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha1.c +45 -48
  481. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha256.c +38 -43
  482. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha512.c +37 -45
  483. data/third_party/boringssl-with-bazel/src/crypto/hpke/hpke.c +103 -42
  484. data/third_party/boringssl-with-bazel/src/crypto/hpke/internal.h +58 -37
  485. data/third_party/boringssl-with-bazel/src/crypto/internal.h +65 -0
  486. data/third_party/boringssl-with-bazel/src/crypto/mem.c +14 -0
  487. data/third_party/boringssl-with-bazel/src/crypto/obj/obj.c +3 -3
  488. data/third_party/boringssl-with-bazel/src/crypto/pkcs7/pkcs7_x509.c +1 -1
  489. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8_x509.c +95 -48
  490. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/rand_extra.c +1 -1
  491. data/third_party/boringssl-with-bazel/src/crypto/thread_pthread.c +0 -28
  492. data/third_party/boringssl-with-bazel/src/crypto/x509/internal.h +19 -0
  493. data/third_party/boringssl-with-bazel/src/crypto/x509/t_req.c +2 -0
  494. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_att.c +19 -25
  495. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_cmp.c +3 -2
  496. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_req.c +39 -89
  497. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_set.c +9 -16
  498. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_vfy.c +1 -1
  499. data/third_party/boringssl-with-bazel/src/crypto/x509/x_algor.c +21 -17
  500. data/third_party/boringssl-with-bazel/src/crypto/x509/x_attrib.c +7 -25
  501. data/third_party/boringssl-with-bazel/src/crypto/x509/x_crl.c +5 -0
  502. data/third_party/boringssl-with-bazel/src/crypto/x509/x_pubkey.c +25 -22
  503. data/third_party/boringssl-with-bazel/src/crypto/x509/x_val.c +2 -0
  504. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_cpols.c +2 -4
  505. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_purp.c +1 -1
  506. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_skey.c +1 -0
  507. data/third_party/boringssl-with-bazel/src/include/openssl/aead.h +0 -3
  508. data/third_party/boringssl-with-bazel/src/include/openssl/asn1.h +120 -41
  509. data/third_party/boringssl-with-bazel/src/include/openssl/base.h +9 -0
  510. data/third_party/boringssl-with-bazel/src/include/openssl/cipher.h +0 -8
  511. data/third_party/boringssl-with-bazel/src/include/openssl/crypto.h +24 -4
  512. data/third_party/boringssl-with-bazel/src/include/openssl/ec.h +5 -2
  513. data/third_party/boringssl-with-bazel/src/include/openssl/ecdsa.h +19 -0
  514. data/third_party/boringssl-with-bazel/src/include/openssl/err.h +3 -2
  515. data/third_party/boringssl-with-bazel/src/include/openssl/evp.h +1 -38
  516. data/third_party/boringssl-with-bazel/src/{crypto/x509/x509_r2x.c → include/openssl/evp_errors.h} +41 -58
  517. data/third_party/boringssl-with-bazel/src/include/openssl/obj.h +24 -5
  518. data/third_party/boringssl-with-bazel/src/include/openssl/pkcs7.h +2 -0
  519. data/third_party/boringssl-with-bazel/src/include/openssl/pkcs8.h +9 -1
  520. data/third_party/boringssl-with-bazel/src/include/openssl/rand.h +2 -2
  521. data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +185 -17
  522. data/third_party/boringssl-with-bazel/src/include/openssl/tls1.h +1 -0
  523. data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +416 -121
  524. data/third_party/boringssl-with-bazel/src/include/openssl/x509v3.h +2 -0
  525. data/third_party/boringssl-with-bazel/src/ssl/d1_both.cc +5 -0
  526. data/third_party/boringssl-with-bazel/src/ssl/encrypted_client_hello.cc +444 -0
  527. data/third_party/boringssl-with-bazel/src/ssl/handoff.cc +244 -1
  528. data/third_party/boringssl-with-bazel/src/ssl/handshake.cc +43 -12
  529. data/third_party/boringssl-with-bazel/src/ssl/handshake_server.cc +149 -8
  530. data/third_party/boringssl-with-bazel/src/ssl/internal.h +220 -46
  531. data/third_party/boringssl-with-bazel/src/ssl/s3_both.cc +7 -1
  532. data/third_party/boringssl-with-bazel/src/ssl/ssl_cert.cc +4 -6
  533. data/third_party/boringssl-with-bazel/src/ssl/ssl_key_share.cc +23 -26
  534. data/third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc +74 -15
  535. data/third_party/boringssl-with-bazel/src/ssl/t1_lib.cc +98 -64
  536. data/third_party/boringssl-with-bazel/src/ssl/tls13_both.cc +34 -4
  537. data/third_party/boringssl-with-bazel/src/ssl/tls13_server.cc +205 -100
  538. data/third_party/boringssl-with-bazel/src/ssl/tls_method.cc +4 -2
  539. metadata +68 -45
  540. data/src/core/lib/iomgr/poller/eventmanager_libuv.cc +0 -88
  541. data/src/core/lib/iomgr/poller/eventmanager_libuv.h +0 -88
  542. data/third_party/abseil-cpp/absl/base/internal/bits.h +0 -219
  543. data/third_party/abseil-cpp/absl/synchronization/internal/mutex_nonprod.inc +0 -249
  544. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/is_fips.c +0 -29
@@ -0,0 +1,589 @@
1
+ // Copyright 2020 The Abseil Authors
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // https://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+
15
+ #ifndef ABSL_STRINGS_INTERNAL_CORD_REP_RING_H_
16
+ #define ABSL_STRINGS_INTERNAL_CORD_REP_RING_H_
17
+
18
+ #include <cassert>
19
+ #include <cstddef>
20
+ #include <cstdint>
21
+ #include <iosfwd>
22
+ #include <limits>
23
+ #include <memory>
24
+
25
+ #include "absl/container/internal/layout.h"
26
+ #include "absl/strings/internal/cord_internal.h"
27
+ #include "absl/strings/internal/cord_rep_flat.h"
28
+
29
+ namespace absl {
30
+ ABSL_NAMESPACE_BEGIN
31
+ namespace cord_internal {
32
+
33
+ // See https://bugs.llvm.org/show_bug.cgi?id=48477
34
+ #ifdef __clang__
35
+ #pragma clang diagnostic push
36
+ #pragma clang diagnostic ignored "-Wshadow"
37
+ #if __has_warning("-Wshadow-field")
38
+ #pragma clang diagnostic ignored "-Wshadow-field"
39
+ #endif
40
+ #endif
41
+
42
+ // All operations modifying a ring buffer are implemented as static methods
43
+ // requiring a CordRepRing instance with a reference adopted by the method.
44
+ //
45
+ // The methods return the modified ring buffer, which may be equal to the input
46
+ // if the input was not shared, and having large enough capacity to accommodate
47
+ // any newly added node(s). Otherwise, a copy of the input rep with the new
48
+ // node(s) added is returned.
49
+ //
50
+ // Any modification on non shared ring buffers with enough capacity will then
51
+ // require minimum atomic operations. Caller should where possible provide
52
+ // reasonable `extra` hints for both anticipated extra `flat` byte space, as
53
+ // well as anticipated extra nodes required for complex operations.
54
+ //
55
+ // Example of code creating a ring buffer, adding some data to it,
56
+ // and discarding the buffer when done:
57
+ //
58
+ // void FunWithRings() {
59
+ // // Create ring with 3 flats
60
+ // CordRep* flat = CreateFlat("Hello");
61
+ // CordRepRing* ring = CordRepRing::Create(flat, 2);
62
+ // ring = CordRepRing::Append(ring, CreateFlat(" "));
63
+ // ring = CordRepRing::Append(ring, CreateFlat("world"));
64
+ // DoSomethingWithRing(ring);
65
+ // CordRep::Unref(ring);
66
+ // }
67
+ //
68
+ // Example of code Copying an existing ring buffer and modifying it:
69
+ //
70
+ // void MoreFunWithRings(CordRepRing* src) {
71
+ // CordRepRing* ring = CordRep::Ref(src)->ring();
72
+ // ring = CordRepRing::Append(ring, CreateFlat("Hello"));
73
+ // ring = CordRepRing::Append(ring, CreateFlat(" "));
74
+ // ring = CordRepRing::Append(ring, CreateFlat("world"));
75
+ // DoSomethingWithRing(ring);
76
+ // CordRep::Unref(ring);
77
+ // }
78
+ //
79
+ class CordRepRing : public CordRep {
80
+ public:
81
+ // `pos_type` represents a 'logical position'. A CordRepRing instance has a
82
+ // `begin_pos` (default 0), and each node inside the buffer will have an
83
+ // `end_pos` which is the `end_pos` of the previous node (or `begin_pos`) plus
84
+ // this node's length. The purpose is to allow for a binary search on this
85
+ // position, while allowing O(1) prepend and append operations.
86
+ using pos_type = size_t;
87
+
88
+ // `index_type` is the type for the `head`, `tail` and `capacity` indexes.
89
+ // Ring buffers are limited to having no more than four billion entries.
90
+ using index_type = uint32_t;
91
+
92
+ // `offset_type` is the type for the data offset inside a child rep's data.
93
+ using offset_type = uint32_t;
94
+
95
+ // Position holds the node index and relative offset into the node for
96
+ // some physical offset in the contained data as returned by the Find()
97
+ // and FindTail() methods.
98
+ struct Position {
99
+ index_type index;
100
+ size_t offset;
101
+ };
102
+
103
+ // The maximum # of child nodes that can be hosted inside a CordRepRing.
104
+ static constexpr size_t kMaxCapacity = (std::numeric_limits<uint32_t>::max)();
105
+
106
+ // CordRepring can not be default constructed, moved, copied or assigned.
107
+ CordRepRing() = delete;
108
+ CordRepRing(const CordRepRing&) = delete;
109
+ CordRepRing& operator=(const CordRepRing&) = delete;
110
+
111
+ // Returns true if this instance is valid, false if some or all of the
112
+ // invariants are broken. Intended for debug purposes only.
113
+ // `output` receives an explanation of the broken invariants.
114
+ bool IsValid(std::ostream& output) const;
115
+
116
+ // Returns the size in bytes for a CordRepRing with `capacity' entries.
117
+ static constexpr size_t AllocSize(size_t capacity);
118
+
119
+ // Returns the distance in bytes from `pos` to `end_pos`.
120
+ static constexpr size_t Distance(pos_type pos, pos_type end_pos);
121
+
122
+ // Creates a new ring buffer from the provided `rep`. Adopts a reference
123
+ // on `rep`. The returned ring buffer has a capacity of at least `extra + 1`
124
+ static CordRepRing* Create(CordRep* child, size_t extra = 0);
125
+
126
+ // `head`, `tail` and `capacity` indexes defining the ring buffer boundaries.
127
+ index_type head() const { return head_; }
128
+ index_type tail() const { return tail_; }
129
+ index_type capacity() const { return capacity_; }
130
+
131
+ // Returns the number of entries in this instance.
132
+ index_type entries() const { return entries(head_, tail_); }
133
+
134
+ // Returns the logical begin position of this instance.
135
+ pos_type begin_pos() const { return begin_pos_; }
136
+
137
+ // Returns the number of entries for a given head-tail range.
138
+ // Requires `head` and `tail` values to be less than `capacity()`.
139
+ index_type entries(index_type head, index_type tail) const {
140
+ assert(head < capacity_ && tail < capacity_);
141
+ return tail - head + ((tail > head) ? 0 : capacity_);
142
+ }
143
+
144
+ // Returns the logical end position of entry `index`.
145
+ pos_type const& entry_end_pos(index_type index) const {
146
+ assert(IsValidIndex(index));
147
+ return Layout::Partial().Pointer<0>(data_)[index];
148
+ }
149
+
150
+ // Returns the child pointer of entry `index`.
151
+ CordRep* const& entry_child(index_type index) const {
152
+ assert(IsValidIndex(index));
153
+ return Layout::Partial(capacity()).Pointer<1>(data_)[index];
154
+ }
155
+
156
+ // Returns the data offset of entry `index`
157
+ offset_type const& entry_data_offset(index_type index) const {
158
+ assert(IsValidIndex(index));
159
+ return Layout::Partial(capacity(), capacity()).Pointer<2>(data_)[index];
160
+ }
161
+
162
+ // Appends the provided child node to the `rep` instance.
163
+ // Adopts a reference from `rep` and `child` which may not be null.
164
+ // If the provided child is a FLAT or EXTERNAL node, or a SUBSTRING node
165
+ // containing a FLAT or EXTERNAL node, then flat or external the node is added
166
+ // 'as is', with an offset added for the SUBSTRING case.
167
+ // If the provided child is a RING or CONCAT tree, or a SUBSTRING of a RING or
168
+ // CONCAT tree, then all child nodes not excluded by any start offset or
169
+ // length values are added recursively.
170
+ static CordRepRing* Append(CordRepRing* rep, CordRep* child);
171
+
172
+ // Appends the provided string data to the `rep` instance.
173
+ // This function will attempt to utilize any remaining capacity in the last
174
+ // node of the input if that node is not shared (directly or indirectly), and
175
+ // of type FLAT. Remaining data will be added as one or more FLAT nodes.
176
+ // Any last node added to the ring buffer will be allocated with up to
177
+ // `extra` bytes of capacity for (anticipated) subsequent append actions.
178
+ static CordRepRing* Append(CordRepRing* rep, string_view data,
179
+ size_t extra = 0);
180
+
181
+ // Prepends the provided child node to the `rep` instance.
182
+ // Adopts a reference from `rep` and `child` which may not be null.
183
+ // If the provided child is a FLAT or EXTERNAL node, or a SUBSTRING node
184
+ // containing a FLAT or EXTERNAL node, then flat or external the node is
185
+ // prepended 'as is', with an optional offset added for the SUBSTRING case.
186
+ // If the provided child is a RING or CONCAT tree, or a SUBSTRING of a RING
187
+ // or CONCAT tree, then all child nodes not excluded by any start offset or
188
+ // length values are added recursively.
189
+ static CordRepRing* Prepend(CordRepRing* rep, CordRep* child);
190
+
191
+ // Prepends the provided string data to the `rep` instance.
192
+ // This function will attempt to utilize any remaining capacity in the first
193
+ // node of the input if that node is not shared (directly or indirectly), and
194
+ // of type FLAT. Remaining data will be added as one or more FLAT nodes.
195
+ // Any first node prepnded to the ring buffer will be allocated with up to
196
+ // `extra` bytes of capacity for (anticipated) subsequent prepend actions.
197
+ static CordRepRing* Prepend(CordRepRing* rep, string_view data,
198
+ size_t extra = 0);
199
+
200
+ // Returns a span referencing potentially unused capacity in the last node.
201
+ // The returned span may be empty if no such capacity is available, or if the
202
+ // current instance is shared. Else, a span of size `n <= size` is returned.
203
+ // If non empty, the ring buffer is adjusted to the new length, with the newly
204
+ // added capacity left uninitialized. Callers should assign a value to the
205
+ // entire span before any other operations on this instance.
206
+ Span<char> GetAppendBuffer(size_t size);
207
+
208
+ // Returns a span referencing potentially unused capacity in the first node.
209
+ // This function is identical to GetAppendBuffer except that it returns a span
210
+ // referencing up to `size` capacity directly before the existing data.
211
+ Span<char> GetPrependBuffer(size_t size);
212
+
213
+ // Returns a cord ring buffer containing `length` bytes of data starting at
214
+ // `offset`. If the input is not shared, this function will remove all head
215
+ // and tail child nodes outside of the requested range, and adjust the new
216
+ // head and tail nodes as required. If the input is shared, this function
217
+ // returns a new instance sharing some or all of the nodes from the input.
218
+ static CordRepRing* SubRing(CordRepRing* r, size_t offset, size_t length,
219
+ size_t extra = 0);
220
+
221
+ // Returns a cord ring buffer with the first `length` bytes removed.
222
+ // If the input is not shared, this function will remove all head child nodes
223
+ // fully inside the first `length` bytes, and adjust the new head as required.
224
+ // If the input is shared, this function returns a new instance sharing some
225
+ // or all of the nodes from the input.
226
+ static CordRepRing* RemoveSuffix(CordRepRing* r, size_t length,
227
+ size_t extra = 0);
228
+
229
+ // Returns a cord ring buffer with the last `length` bytes removed.
230
+ // If the input is not shared, this function will remove all head child nodes
231
+ // fully inside the first `length` bytes, and adjust the new head as required.
232
+ // If the input is shared, this function returns a new instance sharing some
233
+ // or all of the nodes from the input.
234
+ static CordRepRing* RemovePrefix(CordRepRing* r, size_t len,
235
+ size_t extra = 0);
236
+
237
+ // Returns the character at `offset`. Requires that `offset < length`.
238
+ char GetCharacter(size_t offset) const;
239
+
240
+ // Testing only: set capacity to requested capacity.
241
+ void SetCapacityForTesting(size_t capacity);
242
+
243
+ // Returns the CordRep data pointer for the provided CordRep.
244
+ // Requires that the provided `rep` is either a FLAT or EXTERNAL CordRep.
245
+ static const char* GetLeafData(const CordRep* rep);
246
+
247
+ // Returns the CordRep data pointer for the provided CordRep.
248
+ // Requires that `rep` is either a FLAT, EXTERNAL, or SUBSTRING CordRep.
249
+ static const char* GetRepData(const CordRep* rep);
250
+
251
+ // Advances the provided position, wrapping around capacity as needed.
252
+ // Requires `index` < capacity()
253
+ inline index_type advance(index_type index) const;
254
+
255
+ // Advances the provided position by 'n`, wrapping around capacity as needed.
256
+ // Requires `index` < capacity() and `n` <= capacity.
257
+ inline index_type advance(index_type index, index_type n) const;
258
+
259
+ // Retreats the provided position, wrapping around 0 as needed.
260
+ // Requires `index` < capacity()
261
+ inline index_type retreat(index_type index) const;
262
+
263
+ // Retreats the provided position by 'n', wrapping around 0 as needed.
264
+ // Requires `index` < capacity()
265
+ inline index_type retreat(index_type index, index_type n) const;
266
+
267
+ // Returns the logical begin position of entry `index`
268
+ pos_type const& entry_begin_pos(index_type index) const {
269
+ return (index == head_) ? begin_pos_ : entry_end_pos(retreat(index));
270
+ }
271
+
272
+ // Returns the physical start offset of entry `index`
273
+ size_t entry_start_offset(index_type index) const {
274
+ return Distance(begin_pos_, entry_begin_pos(index));
275
+ }
276
+
277
+ // Returns the physical end offset of entry `index`
278
+ size_t entry_end_offset(index_type index) const {
279
+ return Distance(begin_pos_, entry_end_pos(index));
280
+ }
281
+
282
+ // Returns the data length for entry `index`
283
+ size_t entry_length(index_type index) const {
284
+ return Distance(entry_begin_pos(index), entry_end_pos(index));
285
+ }
286
+
287
+ // Returns the data for entry `index`
288
+ absl::string_view entry_data(index_type index) const;
289
+
290
+ // Returns the position for `offset` as {index, prefix}. `index` holds the
291
+ // index of the entry at the specified offset and `prefix` holds the relative
292
+ // offset inside that entry.
293
+ // Requires `offset` < length.
294
+ //
295
+ // For example we can implement GetCharacter(offset) as:
296
+ // char GetCharacter(size_t offset) {
297
+ // Position pos = this->Find(offset);
298
+ // return this->entry_data(pos.pos)[pos.offset];
299
+ // }
300
+ inline Position Find(size_t offset) const;
301
+
302
+ // Find starting at `head`
303
+ inline Position Find(index_type head, size_t offset) const;
304
+
305
+ // Returns the tail position for `offset` as {tail index, suffix}.
306
+ // `tail index` holds holds the index of the entry holding the offset directly
307
+ // before 'offset` advanced by one. 'suffix` holds the relative offset from
308
+ // that relative offset in the entry to the end of the entry.
309
+ // For example, FindTail(length) will return {tail(), 0}, FindTail(length - 5)
310
+ // will return {retreat(tail), 5)} provided the preceding entry contains at
311
+ // least 5 bytes of data.
312
+ // Requires offset >= 1 && offset <= length.
313
+ //
314
+ // This function is very useful in functions that need to clip the end of some
315
+ // ring buffer such as 'RemovePrefix'.
316
+ // For example, we could implement RemovePrefix for non shared instances as:
317
+ // void RemoveSuffix(size_t n) {
318
+ // Position pos = FindTail(length - n);
319
+ // UnrefEntries(pos.pos, this->tail_);
320
+ // this->tail_ = pos.pos;
321
+ // entry(retreat(pos.pos)).end_pos -= pos.offset;
322
+ // }
323
+ inline Position FindTail(size_t offset) const;
324
+
325
+ // Find tail starting at `head`
326
+ inline Position FindTail(index_type head, size_t offset) const;
327
+
328
+ // Invokes f(index_type index) for each entry inside the range [head, tail>
329
+ template <typename F>
330
+ void ForEach(index_type head, index_type tail, F&& f) const {
331
+ index_type n1 = (tail > head) ? tail : capacity_;
332
+ for (index_type i = head; i < n1; ++i) f(i);
333
+ if (tail <= head) {
334
+ for (index_type i = 0; i < tail; ++i) f(i);
335
+ }
336
+ }
337
+
338
+ // Invokes f(index_type index) for each entry inside this instance.
339
+ template <typename F>
340
+ void ForEach(F&& f) const {
341
+ ForEach(head_, tail_, std::forward<F>(f));
342
+ }
343
+
344
+ // Dump this instance's data tp stream `s` in human readable format, excluding
345
+ // the actual data content itself. Intended for debug purposes only.
346
+ friend std::ostream& operator<<(std::ostream& s, const CordRepRing& rep);
347
+
348
+ private:
349
+ enum class AddMode { kAppend, kPrepend };
350
+
351
+ using Layout = container_internal::Layout<pos_type, CordRep*, offset_type>;
352
+
353
+ class Filler;
354
+ class Transaction;
355
+ class CreateTransaction;
356
+
357
+ static constexpr size_t kLayoutAlignment = Layout::Partial().Alignment();
358
+
359
+ // Creates a new CordRepRing.
360
+ explicit CordRepRing(index_type capacity) : capacity_(capacity) {}
361
+
362
+ // Returns true if `index` is a valid index into this instance.
363
+ bool IsValidIndex(index_type index) const;
364
+
365
+ // Debug use only: validates the provided CordRepRing invariants.
366
+ // Verification of all CordRepRing methods can be enabled by defining
367
+ // EXTRA_CORD_RING_VALIDATION, i.e.: `--copts=-DEXTRA_CORD_RING_VALIDATION`
368
+ // Verification is VERY expensive, so only do it for debugging purposes.
369
+ static CordRepRing* Validate(CordRepRing* rep, const char* file = nullptr,
370
+ int line = 0);
371
+
372
+ // Allocates a CordRepRing large enough to hold `capacity + extra' entries.
373
+ // The returned capacity may be larger if the allocated memory allows for it.
374
+ // The maximum capacity of a CordRepRing is capped at kMaxCapacity.
375
+ // Throws `std::length_error` if `capacity + extra' exceeds kMaxCapacity.
376
+ static CordRepRing* New(size_t capacity, size_t extra);
377
+
378
+ // Deallocates (but does not destroy) the provided ring buffer.
379
+ static void Delete(CordRepRing* rep);
380
+
381
+ // Destroys the provided ring buffer, decrementing the reference count of all
382
+ // contained child CordReps. The provided 1\`rep` should have a ref count of
383
+ // one (pre decrement destroy call observing `refcount.IsOne()`) or zero (post
384
+ // decrement destroy call observing `!refcount.Decrement()`).
385
+ static void Destroy(CordRepRing* rep);
386
+
387
+ // Returns a mutable reference to the logical end position array.
388
+ pos_type* entry_end_pos() {
389
+ return Layout::Partial().Pointer<0>(data_);
390
+ }
391
+
392
+ // Returns a mutable reference to the child pointer array.
393
+ CordRep** entry_child() {
394
+ return Layout::Partial(capacity()).Pointer<1>(data_);
395
+ }
396
+
397
+ // Returns a mutable reference to the data offset array.
398
+ offset_type* entry_data_offset() {
399
+ return Layout::Partial(capacity(), capacity()).Pointer<2>(data_);
400
+ }
401
+
402
+ // Find implementations for the non fast path 0 / length cases.
403
+ Position FindSlow(index_type head, size_t offset) const;
404
+ Position FindTailSlow(index_type head, size_t offset) const;
405
+
406
+ // Finds the index of the first node that is inside a reasonable distance
407
+ // of the node at `offset` from which we can continue with a linear search.
408
+ template <bool wrap>
409
+ index_type FindBinary(index_type head, index_type tail, size_t offset) const;
410
+
411
+ // Fills the current (initialized) instance from the provided source, copying
412
+ // entries [head, tail). Adds a reference to copied entries if `ref` is true.
413
+ template <bool ref>
414
+ void Fill(const CordRepRing* src, index_type head, index_type tail);
415
+
416
+ // Create a copy of 'rep', copying all entries [head, tail), allocating room
417
+ // for `extra` entries. Adds a reference on all copied entries.
418
+ static CordRepRing* Copy(CordRepRing* rep, index_type head, index_type tail,
419
+ size_t extra = 0);
420
+
421
+ // Returns a Mutable CordRepRing reference from `rep` with room for at least
422
+ // `extra` additional nodes. Adopts a reference count from `rep`.
423
+ // This function will return `rep` if, and only if:
424
+ // - rep.entries + extra <= rep.capacity
425
+ // - rep.refcount == 1
426
+ // Otherwise, this function will create a new copy of `rep` with additional
427
+ // capacity to satisfy `extra` extra nodes, and unref the old `rep` instance.
428
+ //
429
+ // If a new CordRepRing can not be allocated, or the new capacity would exceed
430
+ // the maxmimum capacity, then the input is consumed only, and an exception is
431
+ // thrown.
432
+ static CordRepRing* Mutable(CordRepRing* rep, size_t extra);
433
+
434
+ // Slow path for Append(CordRepRing* rep, CordRep* child). This function is
435
+ // exercised if the provided `child` in Append() is not a leaf node, i.e., a
436
+ // ring buffer or old (concat) cord tree.
437
+ static CordRepRing* AppendSlow(CordRepRing* rep, CordRep* child);
438
+
439
+ // Appends the provided leaf node. Requires `child` to be FLAT or EXTERNAL.
440
+ static CordRepRing* AppendLeaf(CordRepRing* rep, CordRep* child,
441
+ size_t offset, size_t length);
442
+
443
+ // Prepends the provided leaf node. Requires `child` to be FLAT or EXTERNAL.
444
+ static CordRepRing* PrependLeaf(CordRepRing* rep, CordRep* child,
445
+ size_t offset, size_t length);
446
+
447
+ // Slow path for Prepend(CordRepRing* rep, CordRep* child). This function is
448
+ // exercised if the provided `child` in Prepend() is not a leaf node, i.e., a
449
+ // ring buffer or old (concat) cord tree.
450
+ static CordRepRing* PrependSlow(CordRepRing* rep, CordRep* child);
451
+
452
+ // Slow path for Create(CordRep* child, size_t extra). This function is
453
+ // exercised if the provided `child` in Prepend() is not a leaf node, i.e., a
454
+ // ring buffer or old (concat) cord tree.
455
+ static CordRepRing* CreateSlow(CordRep* child, size_t extra);
456
+
457
+ // Creates a new ring buffer from the provided `child` leaf node. Requires
458
+ // `child` to be FLAT or EXTERNAL. on `rep`.
459
+ // The returned ring buffer has a capacity of at least `1 + extra`
460
+ static CordRepRing* CreateFromLeaf(CordRep* child, size_t offset,
461
+ size_t length, size_t extra);
462
+
463
+ // Appends or prepends (depending on AddMode) the ring buffer in `ring' to
464
+ // `rep` starting at `offset` with length `length`.
465
+ template <AddMode mode>
466
+ static CordRepRing* AddRing(CordRepRing* rep, CordRepRing* ring,
467
+ size_t offset, size_t length);
468
+
469
+ // Increases the data offset for entry `index` by `n`.
470
+ void AddDataOffset(index_type index, size_t n);
471
+
472
+ // Descreases the length for entry `index` by `n`.
473
+ void SubLength(index_type index, size_t n);
474
+
475
+ index_type head_;
476
+ index_type tail_;
477
+ index_type capacity_;
478
+ pos_type begin_pos_;
479
+
480
+ alignas(kLayoutAlignment) char data_[kLayoutAlignment];
481
+
482
+ friend struct CordRep;
483
+ };
484
+
485
+ constexpr size_t CordRepRing::AllocSize(size_t capacity) {
486
+ return sizeof(CordRepRing) - sizeof(data_) +
487
+ Layout(capacity, capacity, capacity).AllocSize();
488
+ }
489
+
490
+ inline constexpr size_t CordRepRing::Distance(pos_type pos, pos_type end_pos) {
491
+ return (end_pos - pos);
492
+ }
493
+
494
+ inline const char* CordRepRing::GetLeafData(const CordRep* rep) {
495
+ return rep->tag != EXTERNAL ? rep->flat()->Data() : rep->external()->base;
496
+ }
497
+
498
+ inline const char* CordRepRing::GetRepData(const CordRep* rep) {
499
+ if (rep->tag >= FLAT) return rep->flat()->Data();
500
+ if (rep->tag == EXTERNAL) return rep->external()->base;
501
+ return GetLeafData(rep->substring()->child) + rep->substring()->start;
502
+ }
503
+
504
+ inline CordRepRing::index_type CordRepRing::advance(index_type index) const {
505
+ assert(index < capacity_);
506
+ return ++index == capacity_ ? 0 : index;
507
+ }
508
+
509
+ inline CordRepRing::index_type CordRepRing::advance(index_type index,
510
+ index_type n) const {
511
+ assert(index < capacity_ && n <= capacity_);
512
+ return (index += n) >= capacity_ ? index - capacity_ : index;
513
+ }
514
+
515
+ inline CordRepRing::index_type CordRepRing::retreat(index_type index) const {
516
+ assert(index < capacity_);
517
+ return (index > 0 ? index : capacity_) - 1;
518
+ }
519
+
520
+ inline CordRepRing::index_type CordRepRing::retreat(index_type index,
521
+ index_type n) const {
522
+ assert(index < capacity_ && n <= capacity_);
523
+ return index >= n ? index - n : capacity_ - n + index;
524
+ }
525
+
526
+ inline absl::string_view CordRepRing::entry_data(index_type index) const {
527
+ size_t data_offset = entry_data_offset(index);
528
+ return {GetRepData(entry_child(index)) + data_offset, entry_length(index)};
529
+ }
530
+
531
+ inline bool CordRepRing::IsValidIndex(index_type index) const {
532
+ if (index >= capacity_) return false;
533
+ return (tail_ > head_) ? (index >= head_ && index < tail_)
534
+ : (index >= head_ || index < tail_);
535
+ }
536
+
537
+ #ifndef EXTRA_CORD_RING_VALIDATION
538
+ inline CordRepRing* CordRepRing::Validate(CordRepRing* rep,
539
+ const char* /*file*/, int /*line*/) {
540
+ return rep;
541
+ }
542
+ #endif
543
+
544
+ inline CordRepRing::Position CordRepRing::Find(size_t offset) const {
545
+ assert(offset < length);
546
+ return (offset == 0) ? Position{head_, 0} : FindSlow(head_, offset);
547
+ }
548
+
549
+ inline CordRepRing::Position CordRepRing::Find(index_type head,
550
+ size_t offset) const {
551
+ assert(offset < length);
552
+ assert(IsValidIndex(head) && offset >= entry_start_offset(head));
553
+ return (offset == 0) ? Position{head_, 0} : FindSlow(head, offset);
554
+ }
555
+
556
+ inline CordRepRing::Position CordRepRing::FindTail(size_t offset) const {
557
+ assert(offset > 0 && offset <= length);
558
+ return (offset == length) ? Position{tail_, 0} : FindTailSlow(head_, offset);
559
+ }
560
+
561
+ inline CordRepRing::Position CordRepRing::FindTail(index_type head,
562
+ size_t offset) const {
563
+ assert(offset > 0 && offset <= length);
564
+ assert(IsValidIndex(head) && offset >= entry_start_offset(head) + 1);
565
+ return (offset == length) ? Position{tail_, 0} : FindTailSlow(head, offset);
566
+ }
567
+
568
+ // Now that CordRepRing is defined, we can define CordRep's helper casts:
569
+ inline CordRepRing* CordRep::ring() {
570
+ assert(tag == RING);
571
+ return static_cast<CordRepRing*>(this);
572
+ }
573
+
574
+ inline const CordRepRing* CordRep::ring() const {
575
+ assert(tag == RING);
576
+ return static_cast<const CordRepRing*>(this);
577
+ }
578
+
579
+ std::ostream& operator<<(std::ostream& s, const CordRepRing& rep);
580
+
581
+ #ifdef __clang__
582
+ #pragma clang diagnostic pop
583
+ #endif
584
+
585
+ } // namespace cord_internal
586
+ ABSL_NAMESPACE_END
587
+ } // namespace absl
588
+
589
+ #endif // ABSL_STRINGS_INTERNAL_CORD_REP_RING_H_