grpc 1.34.0 → 1.35.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 (458) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +808 -2787
  3. data/etc/roots.pem +257 -573
  4. data/include/grpc/compression.h +1 -1
  5. data/include/grpc/grpc.h +14 -0
  6. data/include/grpc/grpc_security.h +61 -3
  7. data/include/grpc/impl/codegen/atm_windows.h +4 -0
  8. data/include/grpc/impl/codegen/byte_buffer.h +1 -1
  9. data/include/grpc/impl/codegen/grpc_types.h +1 -1
  10. data/include/grpc/impl/codegen/log.h +0 -2
  11. data/include/grpc/impl/codegen/sync_windows.h +4 -0
  12. data/include/grpc/slice_buffer.h +3 -3
  13. data/include/grpc/support/sync.h +3 -3
  14. data/include/grpc/support/time.h +7 -7
  15. data/src/core/ext/filters/client_channel/backend_metric.cc +2 -4
  16. data/src/core/ext/filters/client_channel/client_channel.cc +2734 -1498
  17. data/src/core/ext/filters/client_channel/client_channel.h +0 -4
  18. data/src/core/ext/filters/client_channel/client_channel_plugin.cc +1 -1
  19. data/src/core/ext/filters/client_channel/config_selector.h +4 -0
  20. data/src/core/ext/filters/client_channel/dynamic_filters.cc +186 -0
  21. data/src/core/ext/filters/client_channel/dynamic_filters.h +99 -0
  22. data/src/core/ext/filters/client_channel/health/health_check_client.cc +6 -6
  23. data/src/core/ext/filters/client_channel/health/health_check_client.h +2 -2
  24. data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +4 -5
  25. data/src/core/ext/filters/client_channel/http_proxy.cc +21 -20
  26. data/src/core/ext/filters/client_channel/lb_policy.cc +1 -1
  27. data/src/core/ext/filters/client_channel/lb_policy.h +2 -3
  28. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +32 -30
  29. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc +3 -3
  30. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h +1 -1
  31. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +162 -20
  32. data/src/core/ext/filters/client_channel/lb_policy/xds/xds.h +0 -8
  33. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_channel_args.h +24 -0
  34. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +5 -2
  35. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +1 -1
  36. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +1262 -0
  37. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +7 -14
  38. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +1 -32
  39. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +2 -2
  40. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +454 -16
  41. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +5 -0
  42. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +6 -9
  43. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +2 -2
  44. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +18 -31
  45. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +3 -5
  46. data/src/core/ext/filters/client_channel/resolver_factory.h +6 -6
  47. data/src/core/ext/filters/client_channel/resolver_registry.cc +40 -39
  48. data/src/core/ext/filters/client_channel/resolver_registry.h +2 -2
  49. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +11 -13
  50. data/src/core/ext/filters/client_channel/resolver_result_parsing.h +8 -8
  51. data/src/core/ext/filters/client_channel/retry_throttle.cc +5 -3
  52. data/src/core/ext/filters/client_channel/retry_throttle.h +3 -1
  53. data/src/core/ext/filters/client_channel/service_config_call_data.h +19 -1
  54. data/src/core/ext/filters/client_channel/subchannel.cc +34 -50
  55. data/src/core/ext/filters/client_channel/subchannel.h +12 -18
  56. data/src/core/ext/filters/deadline/deadline_filter.cc +4 -2
  57. data/src/core/ext/filters/http/client_authority_filter.cc +6 -6
  58. data/src/core/ext/filters/http/http_filters_plugin.cc +6 -3
  59. data/src/core/ext/filters/message_size/message_size_filter.cc +1 -1
  60. data/src/core/ext/filters/workarounds/workaround_utils.cc +1 -1
  61. data/src/core/ext/transport/chttp2/client/authority.cc +3 -3
  62. data/src/core/ext/transport/chttp2/client/insecure/channel_create.cc +20 -8
  63. data/src/core/ext/transport/chttp2/client/insecure/channel_create_posix.cc +21 -10
  64. data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +26 -14
  65. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +178 -86
  66. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.cc +12 -5
  67. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +7 -8
  68. data/src/core/ext/transport/chttp2/transport/flow_control.h +1 -1
  69. data/src/core/ext/transport/chttp2/transport/frame_settings.h +2 -1
  70. data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +6 -6
  71. data/src/core/ext/transport/chttp2/transport/writing.cc +1 -1
  72. data/src/core/ext/transport/inproc/inproc_transport.cc +42 -8
  73. data/src/core/ext/upb-generated/envoy/annotations/deprecation.upb.h +1 -0
  74. data/src/core/ext/upb-generated/envoy/annotations/resource.upb.c +1 -1
  75. data/src/core/ext/upb-generated/envoy/annotations/resource.upb.h +7 -0
  76. data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.c +27 -27
  77. data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.h +139 -40
  78. data/src/core/ext/upb-generated/envoy/config/cluster/v3/circuit_breaker.upb.c +13 -13
  79. data/src/core/ext/upb-generated/envoy/config/cluster/v3/circuit_breaker.upb.h +44 -17
  80. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.c +111 -111
  81. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.h +424 -241
  82. data/src/core/ext/upb-generated/envoy/config/cluster/v3/filter.upb.c +3 -3
  83. data/src/core/ext/upb-generated/envoy/config/cluster/v3/filter.upb.h +13 -5
  84. data/src/core/ext/upb-generated/envoy/config/cluster/v3/outlier_detection.upb.c +22 -22
  85. data/src/core/ext/upb-generated/envoy/config/cluster/v3/outlier_detection.upb.h +47 -21
  86. data/src/core/ext/upb-generated/envoy/config/core/v3/address.upb.c +21 -21
  87. data/src/core/ext/upb-generated/envoy/config/core/v3/address.upb.h +88 -39
  88. data/src/core/ext/upb-generated/envoy/config/core/v3/backoff.upb.c +4 -4
  89. data/src/core/ext/upb-generated/envoy/config/core/v3/backoff.upb.h +15 -6
  90. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.c +44 -44
  91. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.h +200 -78
  92. data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.c +17 -17
  93. data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.h +72 -35
  94. data/src/core/ext/upb-generated/envoy/config/core/v3/event_service_config.upb.c +1 -1
  95. data/src/core/ext/upb-generated/envoy/config/core/v3/event_service_config.upb.h +7 -0
  96. data/src/core/ext/upb-generated/envoy/config/core/v3/extension.upb.c +7 -7
  97. data/src/core/ext/upb-generated/envoy/config/core/v3/extension.upb.h +27 -11
  98. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.c +30 -30
  99. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.h +136 -49
  100. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.c +39 -39
  101. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.h +157 -89
  102. data/src/core/ext/upb-generated/envoy/config/core/v3/http_uri.upb.c +4 -4
  103. data/src/core/ext/upb-generated/envoy/config/core/v3/http_uri.upb.h +17 -9
  104. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.c +47 -47
  105. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.h +163 -78
  106. data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.c +1 -1
  107. data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.h +7 -0
  108. data/src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.c +2 -2
  109. data/src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.h +9 -2
  110. data/src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.c +1 -1
  111. data/src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.h +7 -0
  112. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.c +13 -13
  113. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.h +59 -36
  114. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.c +16 -16
  115. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.h +61 -29
  116. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.c +26 -26
  117. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.h +101 -66
  118. data/src/core/ext/upb-generated/envoy/config/listener/v3/api_listener.upb.c +2 -2
  119. data/src/core/ext/upb-generated/envoy/config/listener/v3/api_listener.upb.h +11 -3
  120. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.c +28 -28
  121. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.h +122 -77
  122. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.c +23 -23
  123. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.h +106 -54
  124. data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.c +2 -2
  125. data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.h +13 -0
  126. data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.c +16 -16
  127. data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.h +81 -35
  128. data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.c +7 -7
  129. data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.h +38 -22
  130. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.c +203 -203
  131. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.h +845 -495
  132. data/src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.c +5 -5
  133. data/src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.h +26 -6
  134. data/src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.c +3 -3
  135. data/src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.h +17 -3
  136. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.c +87 -87
  137. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h +343 -204
  138. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.h +1 -0
  139. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.c +20 -20
  140. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.h +85 -46
  141. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.c +7 -7
  142. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.h +33 -11
  143. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.c +32 -32
  144. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.h +118 -67
  145. data/src/core/ext/upb-generated/envoy/service/cluster/v3/cds.upb.c +1 -1
  146. data/src/core/ext/upb-generated/envoy/service/cluster/v3/cds.upb.h +7 -0
  147. data/src/core/ext/upb-generated/envoy/service/discovery/v3/ads.upb.c +1 -1
  148. data/src/core/ext/upb-generated/envoy/service/discovery/v3/ads.upb.h +7 -0
  149. data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.c +29 -29
  150. data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.h +120 -82
  151. data/src/core/ext/upb-generated/envoy/service/endpoint/v3/eds.upb.c +1 -1
  152. data/src/core/ext/upb-generated/envoy/service/endpoint/v3/eds.upb.h +7 -0
  153. data/src/core/ext/upb-generated/envoy/service/listener/v3/lds.upb.c +1 -1
  154. data/src/core/ext/upb-generated/envoy/service/listener/v3/lds.upb.h +7 -0
  155. data/src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.c +7 -7
  156. data/src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.h +31 -16
  157. data/src/core/ext/upb-generated/envoy/service/route/v3/rds.upb.c +1 -1
  158. data/src/core/ext/upb-generated/envoy/service/route/v3/rds.upb.h +7 -0
  159. data/src/core/ext/upb-generated/envoy/service/route/v3/srds.upb.c +1 -1
  160. data/src/core/ext/upb-generated/envoy/service/route/v3/srds.upb.h +7 -0
  161. data/src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.c +5 -5
  162. data/src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.h +25 -11
  163. data/src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.c +1 -1
  164. data/src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.h +7 -0
  165. data/src/core/ext/upb-generated/envoy/type/matcher/v3/path.upb.c +1 -1
  166. data/src/core/ext/upb-generated/envoy/type/matcher/v3/path.upb.h +7 -0
  167. data/src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.c +6 -6
  168. data/src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.h +29 -8
  169. data/src/core/ext/upb-generated/envoy/type/matcher/v3/string.upb.c +2 -2
  170. data/src/core/ext/upb-generated/envoy/type/matcher/v3/string.upb.h +16 -3
  171. data/src/core/ext/upb-generated/envoy/type/matcher/v3/value.upb.c +3 -3
  172. data/src/core/ext/upb-generated/envoy/type/matcher/v3/value.upb.h +19 -0
  173. data/src/core/ext/upb-generated/envoy/type/metadata/v3/metadata.upb.c +7 -7
  174. data/src/core/ext/upb-generated/envoy/type/metadata/v3/metadata.upb.h +46 -3
  175. data/src/core/ext/upb-generated/envoy/type/tracing/v3/custom_tag.upb.c +8 -8
  176. data/src/core/ext/upb-generated/envoy/type/tracing/v3/custom_tag.upb.h +41 -8
  177. data/src/core/ext/upb-generated/envoy/type/v3/http.upb.h +1 -0
  178. data/src/core/ext/upb-generated/envoy/type/v3/percent.upb.c +3 -3
  179. data/src/core/ext/upb-generated/envoy/type/v3/percent.upb.h +15 -2
  180. data/src/core/ext/upb-generated/envoy/type/v3/range.upb.c +3 -3
  181. data/src/core/ext/upb-generated/envoy/type/v3/range.upb.h +19 -0
  182. data/src/core/ext/upb-generated/envoy/type/v3/semantic_version.upb.c +1 -1
  183. data/src/core/ext/upb-generated/envoy/type/v3/semantic_version.upb.h +7 -0
  184. data/src/core/ext/upb-generated/google/api/annotations.upb.h +1 -0
  185. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/checked.upb.c +34 -34
  186. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/checked.upb.h +149 -72
  187. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.c +34 -34
  188. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.h +142 -59
  189. data/src/core/ext/upb-generated/google/api/http.upb.c +3 -3
  190. data/src/core/ext/upb-generated/google/api/http.upb.h +25 -6
  191. data/src/core/ext/upb-generated/google/protobuf/any.upb.c +1 -1
  192. data/src/core/ext/upb-generated/google/protobuf/any.upb.h +7 -0
  193. data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.c +90 -90
  194. data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.h +455 -292
  195. data/src/core/ext/upb-generated/google/protobuf/duration.upb.c +1 -1
  196. data/src/core/ext/upb-generated/google/protobuf/duration.upb.h +7 -0
  197. data/src/core/ext/upb-generated/google/protobuf/empty.upb.c +1 -1
  198. data/src/core/ext/upb-generated/google/protobuf/empty.upb.h +7 -0
  199. data/src/core/ext/upb-generated/google/protobuf/struct.upb.c +4 -4
  200. data/src/core/ext/upb-generated/google/protobuf/struct.upb.h +22 -3
  201. data/src/core/ext/upb-generated/google/protobuf/timestamp.upb.c +1 -1
  202. data/src/core/ext/upb-generated/google/protobuf/timestamp.upb.h +7 -0
  203. data/src/core/ext/upb-generated/google/protobuf/wrappers.upb.c +9 -9
  204. data/src/core/ext/upb-generated/google/protobuf/wrappers.upb.h +55 -0
  205. data/src/core/ext/upb-generated/google/rpc/status.upb.c +1 -1
  206. data/src/core/ext/upb-generated/google/rpc/status.upb.h +10 -3
  207. data/src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.c +4 -4
  208. data/src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.h +11 -3
  209. data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.c +41 -41
  210. data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.h +149 -76
  211. data/src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.c +5 -5
  212. data/src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.h +21 -6
  213. data/src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.c +2 -2
  214. data/src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.h +13 -0
  215. data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.c +17 -17
  216. data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.h +82 -25
  217. data/src/core/ext/upb-generated/udpa/annotations/migrate.upb.c +3 -3
  218. data/src/core/ext/upb-generated/udpa/annotations/migrate.upb.h +19 -0
  219. data/src/core/ext/upb-generated/udpa/annotations/security.upb.c +1 -1
  220. data/src/core/ext/upb-generated/udpa/annotations/security.upb.h +7 -0
  221. data/src/core/ext/upb-generated/udpa/annotations/sensitive.upb.h +1 -0
  222. data/src/core/ext/upb-generated/udpa/annotations/status.upb.c +2 -2
  223. data/src/core/ext/upb-generated/udpa/annotations/status.upb.h +9 -2
  224. data/src/core/ext/upb-generated/udpa/annotations/versioning.upb.c +1 -1
  225. data/src/core/ext/upb-generated/udpa/annotations/versioning.upb.h +7 -0
  226. data/src/core/ext/upb-generated/udpa/core/v1/authority.upb.c +1 -1
  227. data/src/core/ext/upb-generated/udpa/core/v1/authority.upb.h +7 -0
  228. data/src/core/ext/upb-generated/udpa/core/v1/collection_entry.upb.c +5 -5
  229. data/src/core/ext/upb-generated/udpa/core/v1/collection_entry.upb.h +21 -7
  230. data/src/core/ext/upb-generated/udpa/core/v1/context_params.upb.c +2 -2
  231. data/src/core/ext/upb-generated/udpa/core/v1/context_params.upb.h +7 -0
  232. data/src/core/ext/upb-generated/udpa/core/v1/resource.upb.c +4 -4
  233. data/src/core/ext/upb-generated/udpa/core/v1/resource.upb.h +17 -8
  234. data/src/core/ext/upb-generated/udpa/core/v1/resource_locator.upb.c +7 -7
  235. data/src/core/ext/upb-generated/udpa/core/v1/resource_locator.upb.h +31 -18
  236. data/src/core/ext/upb-generated/udpa/core/v1/resource_name.upb.c +5 -5
  237. data/src/core/ext/upb-generated/udpa/core/v1/resource_name.upb.h +19 -11
  238. data/src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.c +3 -3
  239. data/src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.h +7 -0
  240. data/src/core/ext/upb-generated/validate/validate.upb.c +64 -64
  241. data/src/core/ext/upb-generated/validate/validate.upb.h +296 -157
  242. data/src/core/ext/xds/certificate_provider_store.cc +10 -7
  243. data/src/core/ext/xds/certificate_provider_store.h +12 -7
  244. data/src/core/ext/xds/file_watcher_certificate_provider_factory.cc +25 -0
  245. data/src/core/ext/xds/file_watcher_certificate_provider_factory.h +1 -4
  246. data/src/core/ext/xds/xds_api.cc +220 -31
  247. data/src/core/ext/xds/xds_api.h +41 -10
  248. data/src/core/ext/xds/xds_bootstrap.h +0 -1
  249. data/src/core/ext/xds/xds_certificate_provider.cc +61 -2
  250. data/src/core/ext/xds/xds_certificate_provider.h +40 -2
  251. data/src/core/ext/xds/xds_client.cc +31 -29
  252. data/src/core/ext/xds/xds_client.h +6 -1
  253. data/src/core/ext/xds/xds_client_stats.cc +2 -2
  254. data/src/core/ext/xds/xds_server_config_fetcher.cc +131 -0
  255. data/src/core/lib/channel/channel_args.cc +8 -8
  256. data/src/core/lib/channel/channel_trace.h +1 -1
  257. data/src/core/lib/channel/channelz.cc +13 -14
  258. data/src/core/lib/channel/channelz.h +0 -1
  259. data/src/core/lib/channel/channelz_registry.h +0 -1
  260. data/src/core/lib/channel/handshaker.cc +2 -2
  261. data/src/core/lib/compression/compression_args.cc +3 -2
  262. data/src/core/lib/debug/stats.h +2 -2
  263. data/src/core/lib/debug/stats_data.h +13 -13
  264. data/src/core/lib/gpr/alloc.cc +3 -2
  265. data/src/core/lib/gpr/log.cc +53 -16
  266. data/src/core/lib/gpr/log_linux.cc +3 -1
  267. data/src/core/lib/gpr/log_posix.cc +3 -1
  268. data/src/core/lib/gpr/log_windows.cc +3 -1
  269. data/src/core/lib/gpr/spinlock.h +10 -2
  270. data/src/core/lib/gpr/string.cc +22 -21
  271. data/src/core/lib/gpr/string.h +5 -6
  272. data/src/core/lib/gpr/sync.cc +4 -4
  273. data/src/core/lib/gpr/time.cc +12 -12
  274. data/src/core/lib/gprpp/arena.h +3 -2
  275. data/src/core/lib/gprpp/ref_counted.h +2 -2
  276. data/src/core/lib/gprpp/ref_counted_ptr.h +9 -1
  277. data/src/core/lib/gprpp/thd_posix.cc +6 -1
  278. data/src/core/lib/gprpp/thd_windows.cc +3 -1
  279. data/src/core/lib/http/httpcli.cc +1 -1
  280. data/src/core/lib/http/httpcli.h +2 -3
  281. data/src/core/lib/http/httpcli_security_connector.cc +1 -1
  282. data/src/core/lib/http/parser.cc +1 -2
  283. data/src/core/lib/iomgr/call_combiner.cc +8 -5
  284. data/src/core/lib/iomgr/combiner.cc +2 -1
  285. data/src/core/lib/iomgr/endpoint.h +1 -1
  286. data/src/core/lib/iomgr/error.cc +15 -11
  287. data/src/core/lib/iomgr/error_internal.h +1 -1
  288. data/src/core/lib/iomgr/ev_epoll1_linux.cc +20 -13
  289. data/src/core/lib/iomgr/ev_epollex_linux.cc +17 -13
  290. data/src/core/lib/iomgr/ev_poll_posix.cc +9 -7
  291. data/src/core/lib/iomgr/exec_ctx.h +6 -4
  292. data/src/core/lib/iomgr/executor.cc +2 -1
  293. data/src/core/lib/iomgr/executor.h +1 -1
  294. data/src/core/lib/iomgr/executor/threadpool.h +1 -1
  295. data/src/core/lib/iomgr/iomgr.cc +1 -1
  296. data/src/core/lib/iomgr/load_file.h +1 -1
  297. data/src/core/lib/iomgr/lockfree_event.cc +19 -14
  298. data/src/core/lib/iomgr/lockfree_event.h +2 -2
  299. data/src/core/lib/iomgr/parse_address.cc +52 -46
  300. data/src/core/lib/iomgr/parse_address.h +13 -9
  301. data/src/core/lib/iomgr/poller/eventmanager_libuv.h +1 -1
  302. data/src/core/lib/iomgr/pollset_set_custom.cc +1 -1
  303. data/src/core/lib/iomgr/python_util.h +1 -1
  304. data/src/core/lib/iomgr/resolve_address.cc +4 -4
  305. data/src/core/lib/iomgr/resource_quota.cc +4 -4
  306. data/src/core/lib/iomgr/sockaddr_utils.cc +10 -10
  307. data/src/core/lib/iomgr/sockaddr_utils.h +1 -1
  308. data/src/core/lib/iomgr/socket_factory_posix.cc +3 -2
  309. data/src/core/lib/iomgr/socket_mutator.cc +3 -2
  310. data/src/core/lib/iomgr/tcp_client.cc +3 -3
  311. data/src/core/lib/iomgr/tcp_client_custom.cc +7 -6
  312. data/src/core/lib/iomgr/tcp_custom.cc +22 -17
  313. data/src/core/lib/iomgr/tcp_posix.cc +9 -6
  314. data/src/core/lib/iomgr/tcp_server_custom.cc +28 -22
  315. data/src/core/lib/iomgr/timer_custom.cc +3 -3
  316. data/src/core/lib/iomgr/timer_generic.cc +3 -3
  317. data/src/core/lib/iomgr/timer_manager.cc +2 -2
  318. data/src/core/lib/iomgr/udp_server.cc +1 -2
  319. data/src/core/lib/iomgr/udp_server.h +1 -2
  320. data/src/core/lib/iomgr/unix_sockets_posix.cc +17 -18
  321. data/src/core/lib/json/json.h +10 -0
  322. data/src/core/lib/security/authorization/evaluate_args.cc +5 -10
  323. data/src/core/lib/security/authorization/evaluate_args.h +1 -1
  324. data/src/core/lib/security/context/security_context.cc +4 -3
  325. data/src/core/lib/security/credentials/alts/check_gcp_environment.cc +1 -1
  326. data/src/core/lib/security/credentials/credentials.cc +6 -6
  327. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +413 -0
  328. data/src/core/lib/security/credentials/external/aws_external_account_credentials.h +80 -0
  329. data/src/core/lib/security/credentials/external/aws_request_signer.cc +15 -10
  330. data/src/core/lib/security/credentials/external/aws_request_signer.h +1 -2
  331. data/src/core/lib/security/credentials/external/external_account_credentials.cc +217 -31
  332. data/src/core/lib/security/credentials/external/external_account_credentials.h +7 -5
  333. data/src/core/lib/security/credentials/external/file_external_account_credentials.cc +5 -6
  334. data/src/core/lib/security/credentials/external/file_external_account_credentials.h +3 -4
  335. data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +20 -18
  336. data/src/core/lib/security/credentials/external/url_external_account_credentials.h +5 -6
  337. data/src/core/lib/security/credentials/fake/fake_credentials.cc +2 -1
  338. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +18 -12
  339. data/src/core/lib/security/credentials/insecure/insecure_credentials.cc +18 -5
  340. data/src/core/lib/security/credentials/jwt/json_token.cc +1 -1
  341. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +3 -3
  342. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +37 -44
  343. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +5 -4
  344. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +1 -1
  345. data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +5 -5
  346. data/src/core/lib/security/credentials/ssl/ssl_credentials.h +1 -1
  347. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.cc +1 -6
  348. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.h +1 -6
  349. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc +326 -5
  350. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h +64 -0
  351. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +1 -1
  352. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h +0 -1
  353. data/src/core/lib/security/credentials/tls/tls_credentials.cc +1 -1
  354. data/src/core/lib/security/credentials/tls/tls_utils.cc +91 -0
  355. data/src/core/lib/security/credentials/tls/tls_utils.h +38 -0
  356. data/src/core/lib/security/credentials/xds/xds_credentials.cc +140 -10
  357. data/src/core/lib/security/credentials/xds/xds_credentials.h +27 -9
  358. data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +1 -1
  359. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +1 -1
  360. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.cc +46 -13
  361. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.h +23 -6
  362. data/src/core/lib/security/security_connector/local/local_security_connector.cc +1 -1
  363. data/src/core/lib/security/security_connector/security_connector.cc +3 -2
  364. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +4 -4
  365. data/src/core/lib/security/security_connector/ssl_utils.cc +2 -2
  366. data/src/core/lib/security/security_connector/ssl_utils.h +12 -19
  367. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +57 -12
  368. data/src/core/lib/security/security_connector/tls/tls_security_connector.h +2 -3
  369. data/src/core/lib/security/transport/secure_endpoint.cc +2 -2
  370. data/src/core/lib/security/transport/security_handshaker.cc +2 -2
  371. data/src/core/lib/slice/slice_intern.cc +4 -5
  372. data/src/core/lib/slice/slice_internal.h +2 -2
  373. data/src/core/lib/surface/call.cc +32 -24
  374. data/src/core/lib/surface/call_details.cc +8 -8
  375. data/src/core/lib/surface/channel.cc +16 -10
  376. data/src/core/lib/surface/channel.h +3 -2
  377. data/src/core/lib/surface/channel_init.cc +1 -1
  378. data/src/core/lib/surface/completion_queue.cc +23 -18
  379. data/src/core/lib/surface/completion_queue.h +16 -16
  380. data/src/core/lib/surface/init.cc +6 -5
  381. data/src/core/lib/surface/lame_client.cc +20 -46
  382. data/src/core/lib/surface/lame_client.h +4 -0
  383. data/src/core/lib/surface/server.cc +59 -15
  384. data/src/core/lib/surface/server.h +37 -5
  385. data/src/core/lib/surface/version.cc +1 -1
  386. data/src/core/lib/transport/authority_override.cc +6 -4
  387. data/src/core/lib/transport/authority_override.h +5 -2
  388. data/src/core/lib/transport/connectivity_state.h +6 -4
  389. data/src/core/lib/transport/error_utils.h +1 -1
  390. data/src/core/lib/transport/metadata_batch.h +4 -4
  391. data/src/core/lib/transport/static_metadata.cc +1 -1
  392. data/src/core/lib/transport/status_metadata.cc +4 -3
  393. data/src/core/lib/transport/transport.h +7 -7
  394. data/src/core/lib/uri/uri_parser.cc +131 -249
  395. data/src/core/lib/uri/uri_parser.h +57 -21
  396. data/src/core/plugin_registry/grpc_plugin_registry.cc +10 -4
  397. data/src/core/tsi/alts/crypt/gsec.cc +5 -4
  398. data/src/core/tsi/alts/frame_protector/frame_handler.cc +8 -6
  399. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +1 -1
  400. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +23 -23
  401. data/src/core/tsi/alts/zero_copy_frame_protector/alts_iovec_record_protocol.cc +8 -6
  402. data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +4 -4
  403. data/src/core/tsi/fake_transport_security.cc +5 -3
  404. data/src/core/tsi/ssl/session_cache/ssl_session_boringssl.cc +1 -1
  405. data/src/core/tsi/ssl_transport_security.cc +62 -49
  406. data/src/core/tsi/ssl_transport_security.h +6 -6
  407. data/src/core/tsi/transport_security.cc +6 -6
  408. data/src/core/tsi/transport_security_interface.h +1 -1
  409. data/src/ruby/ext/grpc/rb_event_thread.c +2 -0
  410. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +12 -0
  411. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +31 -13
  412. data/src/ruby/lib/grpc/version.rb +1 -1
  413. data/src/ruby/pb/src/proto/grpc/testing/messages_pb.rb +28 -0
  414. data/src/ruby/pb/src/proto/grpc/testing/test_services_pb.rb +18 -0
  415. data/src/ruby/spec/pb/codegen/package_option_spec.rb +2 -6
  416. data/third_party/abseil-cpp/absl/container/flat_hash_map.h +606 -0
  417. data/third_party/abseil-cpp/absl/container/internal/raw_hash_map.h +197 -0
  418. data/third_party/abseil-cpp/absl/status/internal/statusor_internal.h +399 -0
  419. data/third_party/abseil-cpp/absl/status/statusor.cc +71 -0
  420. data/third_party/abseil-cpp/absl/status/statusor.h +760 -0
  421. data/third_party/upb/third_party/wyhash/wyhash.h +145 -0
  422. data/third_party/upb/upb/decode.c +248 -167
  423. data/third_party/upb/upb/decode.h +20 -1
  424. data/third_party/upb/upb/decode.int.h +163 -0
  425. data/third_party/upb/upb/decode_fast.c +1040 -0
  426. data/third_party/upb/upb/decode_fast.h +126 -0
  427. data/third_party/upb/upb/def.c +525 -516
  428. data/third_party/upb/upb/def.h +16 -31
  429. data/third_party/upb/upb/def.hpp +37 -123
  430. data/third_party/upb/upb/encode.c +227 -169
  431. data/third_party/upb/upb/encode.h +27 -2
  432. data/third_party/upb/upb/json_decode.c +1443 -0
  433. data/third_party/upb/upb/json_decode.h +23 -0
  434. data/third_party/upb/upb/json_encode.c +713 -0
  435. data/third_party/upb/upb/json_encode.h +36 -0
  436. data/third_party/upb/upb/msg.c +167 -88
  437. data/third_party/upb/upb/msg.h +174 -34
  438. data/third_party/upb/upb/port_def.inc +74 -61
  439. data/third_party/upb/upb/port_undef.inc +3 -7
  440. data/third_party/upb/upb/reflection.c +36 -19
  441. data/third_party/upb/upb/table.c +34 -197
  442. data/third_party/upb/upb/table.int.h +14 -5
  443. data/third_party/upb/upb/text_encode.c +45 -22
  444. data/third_party/upb/upb/text_encode.h +4 -1
  445. data/third_party/upb/upb/upb.c +18 -41
  446. data/third_party/upb/upb/upb.h +36 -7
  447. data/third_party/upb/upb/upb.hpp +4 -4
  448. data/third_party/upb/upb/upb.int.h +29 -0
  449. metadata +60 -46
  450. data/src/core/ext/filters/client_channel/lb_policy/xds/eds.cc +0 -909
  451. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.cc +0 -485
  452. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_fallback.cc +0 -68
  453. data/src/core/ext/filters/client_channel/resolving_lb_policy.cc +0 -355
  454. data/src/core/ext/filters/client_channel/resolving_lb_policy.h +0 -138
  455. data/src/core/ext/xds/google_mesh_ca_certificate_provider_factory.cc +0 -265
  456. data/src/core/ext/xds/google_mesh_ca_certificate_provider_factory.h +0 -104
  457. data/src/core/lib/gprpp/map.h +0 -53
  458. data/third_party/upb/upb/port.c +0 -26
@@ -0,0 +1,71 @@
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
+ #include "absl/status/statusor.h"
15
+
16
+ #include <cstdlib>
17
+ #include <utility>
18
+
19
+ #include "absl/base/internal/raw_logging.h"
20
+ #include "absl/status/status.h"
21
+ #include "absl/strings/str_cat.h"
22
+
23
+ namespace absl {
24
+ ABSL_NAMESPACE_BEGIN
25
+
26
+ BadStatusOrAccess::BadStatusOrAccess(absl::Status status)
27
+ : status_(std::move(status)) {}
28
+
29
+ BadStatusOrAccess::~BadStatusOrAccess() = default;
30
+ const char* BadStatusOrAccess::what() const noexcept {
31
+ return "Bad StatusOr access";
32
+ }
33
+
34
+ const absl::Status& BadStatusOrAccess::status() const { return status_; }
35
+
36
+ namespace internal_statusor {
37
+
38
+ void Helper::HandleInvalidStatusCtorArg(absl::Status* status) {
39
+ const char* kMessage =
40
+ "An OK status is not a valid constructor argument to StatusOr<T>";
41
+ #ifdef NDEBUG
42
+ ABSL_INTERNAL_LOG(ERROR, kMessage);
43
+ #else
44
+ ABSL_INTERNAL_LOG(FATAL, kMessage);
45
+ #endif
46
+ // In optimized builds, we will fall back to InternalError.
47
+ *status = absl::InternalError(kMessage);
48
+ }
49
+
50
+ void Helper::Crash(const absl::Status& status) {
51
+ ABSL_INTERNAL_LOG(
52
+ FATAL,
53
+ absl::StrCat("Attempting to fetch value instead of handling error ",
54
+ status.ToString()));
55
+ }
56
+
57
+ void ThrowBadStatusOrAccess(absl::Status status) {
58
+ #ifdef ABSL_HAVE_EXCEPTIONS
59
+ throw absl::BadStatusOrAccess(std::move(status));
60
+ #else
61
+ ABSL_INTERNAL_LOG(
62
+ FATAL,
63
+ absl::StrCat("Attempting to fetch value instead of handling error ",
64
+ status.ToString()));
65
+ std::abort();
66
+ #endif
67
+ }
68
+
69
+ } // namespace internal_statusor
70
+ ABSL_NAMESPACE_END
71
+ } // namespace absl
@@ -0,0 +1,760 @@
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
+ // -----------------------------------------------------------------------------
16
+ // File: statusor.h
17
+ // -----------------------------------------------------------------------------
18
+ //
19
+ // An `absl::StatusOr<T>` represents a union of an `absl::Status` object
20
+ // and an object of type `T`. The `absl::StatusOr<T>` will either contain an
21
+ // object of type `T` (indicating a successful operation), or an error (of type
22
+ // `absl::Status`) explaining why such a value is not present.
23
+ //
24
+ // In general, check the success of an operation returning an
25
+ // `absl::StatusOr<T>` like you would an `absl::Status` by using the `ok()`
26
+ // member function.
27
+ //
28
+ // Example:
29
+ //
30
+ // StatusOr<Foo> result = Calculation();
31
+ // if (result.ok()) {
32
+ // result->DoSomethingCool();
33
+ // } else {
34
+ // LOG(ERROR) << result.status();
35
+ // }
36
+ #ifndef ABSL_STATUS_STATUSOR_H_
37
+ #define ABSL_STATUS_STATUSOR_H_
38
+
39
+ #include <exception>
40
+ #include <initializer_list>
41
+ #include <new>
42
+ #include <string>
43
+ #include <type_traits>
44
+ #include <utility>
45
+
46
+ #include "absl/base/attributes.h"
47
+ #include "absl/meta/type_traits.h"
48
+ #include "absl/status/internal/statusor_internal.h"
49
+ #include "absl/status/status.h"
50
+ #include "absl/types/variant.h"
51
+ #include "absl/utility/utility.h"
52
+
53
+ namespace absl {
54
+ ABSL_NAMESPACE_BEGIN
55
+
56
+ // BadStatusOrAccess
57
+ //
58
+ // This class defines the type of object to throw (if exceptions are enabled),
59
+ // when accessing the value of an `absl::StatusOr<T>` object that does not
60
+ // contain a value. This behavior is analogous to that of
61
+ // `std::bad_optional_access` in the case of accessing an invalid
62
+ // `std::optional` value.
63
+ //
64
+ // Example:
65
+ //
66
+ // try {
67
+ // absl::StatusOr<int> v = FetchInt();
68
+ // DoWork(v.value()); // Accessing value() when not "OK" may throw
69
+ // } catch (absl::BadStatusOrAccess& ex) {
70
+ // LOG(ERROR) << ex.status();
71
+ // }
72
+ class BadStatusOrAccess : public std::exception {
73
+ public:
74
+ explicit BadStatusOrAccess(absl::Status status);
75
+ ~BadStatusOrAccess() override;
76
+
77
+ // BadStatusOrAccess::what()
78
+ //
79
+ // Returns the associated explanatory string of the `absl::StatusOr<T>`
80
+ // object's error code. This function only returns the string literal "Bad
81
+ // StatusOr Access" for cases when evaluating general exceptions.
82
+ //
83
+ // The pointer of this string is guaranteed to be valid until any non-const
84
+ // function is invoked on the exception object.
85
+ const char* what() const noexcept override;
86
+
87
+ // BadStatusOrAccess::status()
88
+ //
89
+ // Returns the associated `absl::Status` of the `absl::StatusOr<T>` object's
90
+ // error.
91
+ const absl::Status& status() const;
92
+
93
+ private:
94
+ absl::Status status_;
95
+ };
96
+
97
+ // Returned StatusOr objects may not be ignored.
98
+ template <typename T>
99
+ class ABSL_MUST_USE_RESULT StatusOr;
100
+
101
+ // absl::StatusOr<T>
102
+ //
103
+ // The `absl::StatusOr<T>` class template is a union of an `absl::Status` object
104
+ // and an object of type `T`. The `absl::StatusOr<T>` models an object that is
105
+ // either a usable object, or an error (of type `absl::Status`) explaining why
106
+ // such an object is not present. An `absl::StatusOr<T>` is typically the return
107
+ // value of a function which may fail.
108
+ //
109
+ // An `absl::StatusOr<T>` can never hold an "OK" status (an
110
+ // `absl::StatusCode::kOk` value); instead, the presence of an object of type
111
+ // `T` indicates success. Instead of checking for a `kOk` value, use the
112
+ // `absl::StatusOr<T>::ok()` member function. (It is for this reason, and code
113
+ // readability, that using the `ok()` function is preferred for `absl::Status`
114
+ // as well.)
115
+ //
116
+ // Example:
117
+ //
118
+ // StatusOr<Foo> result = DoBigCalculationThatCouldFail();
119
+ // if (result.ok()) {
120
+ // result->DoSomethingCool();
121
+ // } else {
122
+ // LOG(ERROR) << result.status();
123
+ // }
124
+ //
125
+ // Accessing the object held by an `absl::StatusOr<T>` should be performed via
126
+ // `operator*` or `operator->`, after a call to `ok()` confirms that the
127
+ // `absl::StatusOr<T>` holds an object of type `T`:
128
+ //
129
+ // Example:
130
+ //
131
+ // absl::StatusOr<int> i = GetCount();
132
+ // if (foo.ok()) {
133
+ // updated_total += *i
134
+ // }
135
+ //
136
+ // NOTE: using `absl::StatusOr<T>::value()` when no valid value is present will
137
+ // throw an exception if exceptions are enabled or terminate the process when
138
+ // execeptions are not enabled.
139
+ //
140
+ // Example:
141
+ //
142
+ // StatusOr<Foo> result = DoBigCalculationThatCouldFail();
143
+ // const Foo& foo = result.value(); // Crash/exception if no value present
144
+ // foo.DoSomethingCool();
145
+ //
146
+ // A `absl::StatusOr<T*>` can be constructed from a null pointer like any other
147
+ // pointer value, and the result will be that `ok()` returns `true` and
148
+ // `value()` returns `nullptr`. Checking the value of pointer in an
149
+ // `absl::StatusOr<T>` generally requires a bit more care, to ensure both that a
150
+ // value is present and that value is not null:
151
+ //
152
+ // StatusOr<std::unique_ptr<Foo>> result = FooFactory::MakeNewFoo(arg);
153
+ // if (!result.ok()) {
154
+ // LOG(ERROR) << result.status();
155
+ // } else if (*result == nullptr) {
156
+ // LOG(ERROR) << "Unexpected null pointer";
157
+ // } else {
158
+ // (*result)->DoSomethingCool();
159
+ // }
160
+ //
161
+ // Example factory implementation returning StatusOr<T>:
162
+ //
163
+ // StatusOr<Foo> FooFactory::MakeFoo(int arg) {
164
+ // if (arg <= 0) {
165
+ // return absl::Status(absl::StatusCode::kInvalidArgument,
166
+ // "Arg must be positive");
167
+ // }
168
+ // return Foo(arg);
169
+ // }
170
+ template <typename T>
171
+ class StatusOr : private internal_statusor::StatusOrData<T>,
172
+ private internal_statusor::CopyCtorBase<T>,
173
+ private internal_statusor::MoveCtorBase<T>,
174
+ private internal_statusor::CopyAssignBase<T>,
175
+ private internal_statusor::MoveAssignBase<T> {
176
+ template <typename U>
177
+ friend class StatusOr;
178
+
179
+ typedef internal_statusor::StatusOrData<T> Base;
180
+
181
+ public:
182
+ // StatusOr<T>::value_type
183
+ //
184
+ // This instance data provides a generic `value_type` member for use within
185
+ // generic programming. This usage is analogous to that of
186
+ // `optional::value_type` in the case of `std::optional`.
187
+ typedef T value_type;
188
+
189
+ // Constructors
190
+
191
+ // Constructs a new `absl::StatusOr` with an `absl::StatusCode::kUnknown`
192
+ // status. This constructor is marked 'explicit' to prevent usages in return
193
+ // values such as 'return {};', under the misconception that
194
+ // `absl::StatusOr<std::vector<int>>` will be initialized with an empty
195
+ // vector, instead of an `absl::StatusCode::kUnknown` error code.
196
+ explicit StatusOr();
197
+
198
+ // `StatusOr<T>` is copy constructible if `T` is copy constructible.
199
+ StatusOr(const StatusOr&) = default;
200
+ // `StatusOr<T>` is copy assignable if `T` is copy constructible and copy
201
+ // assignable.
202
+ StatusOr& operator=(const StatusOr&) = default;
203
+
204
+ // `StatusOr<T>` is move constructible if `T` is move constructible.
205
+ StatusOr(StatusOr&&) = default;
206
+ // `StatusOr<T>` is moveAssignable if `T` is move constructible and move
207
+ // assignable.
208
+ StatusOr& operator=(StatusOr&&) = default;
209
+
210
+ // Converting Constructors
211
+
212
+ // Constructs a new `absl::StatusOr<T>` from an `absl::StatusOr<U>`, when `T`
213
+ // is constructible from `U`. To avoid ambiguity, these constructors are
214
+ // disabled if `T` is also constructible from `StatusOr<U>.`. This constructor
215
+ // is explicit if and only if the corresponding construction of `T` from `U`
216
+ // is explicit. (This constructor inherits its explicitness from the
217
+ // underlying constructor.)
218
+ template <
219
+ typename U,
220
+ absl::enable_if_t<
221
+ absl::conjunction<
222
+ absl::negation<std::is_same<T, U>>,
223
+ std::is_constructible<T, const U&>,
224
+ std::is_convertible<const U&, T>,
225
+ absl::negation<
226
+ internal_statusor::IsConstructibleOrConvertibleFromStatusOr<
227
+ T, U>>>::value,
228
+ int> = 0>
229
+ StatusOr(const StatusOr<U>& other) // NOLINT
230
+ : Base(static_cast<const typename StatusOr<U>::Base&>(other)) {}
231
+ template <
232
+ typename U,
233
+ absl::enable_if_t<
234
+ absl::conjunction<
235
+ absl::negation<std::is_same<T, U>>,
236
+ std::is_constructible<T, const U&>,
237
+ absl::negation<std::is_convertible<const U&, T>>,
238
+ absl::negation<
239
+ internal_statusor::IsConstructibleOrConvertibleFromStatusOr<
240
+ T, U>>>::value,
241
+ int> = 0>
242
+ explicit StatusOr(const StatusOr<U>& other)
243
+ : Base(static_cast<const typename StatusOr<U>::Base&>(other)) {}
244
+
245
+ template <
246
+ typename U,
247
+ absl::enable_if_t<
248
+ absl::conjunction<
249
+ absl::negation<std::is_same<T, U>>, std::is_constructible<T, U&&>,
250
+ std::is_convertible<U&&, T>,
251
+ absl::negation<
252
+ internal_statusor::IsConstructibleOrConvertibleFromStatusOr<
253
+ T, U>>>::value,
254
+ int> = 0>
255
+ StatusOr(StatusOr<U>&& other) // NOLINT
256
+ : Base(static_cast<typename StatusOr<U>::Base&&>(other)) {}
257
+ template <
258
+ typename U,
259
+ absl::enable_if_t<
260
+ absl::conjunction<
261
+ absl::negation<std::is_same<T, U>>, std::is_constructible<T, U&&>,
262
+ absl::negation<std::is_convertible<U&&, T>>,
263
+ absl::negation<
264
+ internal_statusor::IsConstructibleOrConvertibleFromStatusOr<
265
+ T, U>>>::value,
266
+ int> = 0>
267
+ explicit StatusOr(StatusOr<U>&& other)
268
+ : Base(static_cast<typename StatusOr<U>::Base&&>(other)) {}
269
+
270
+ // Converting Assignment Operators
271
+
272
+ // Creates an `absl::StatusOr<T>` through assignment from an
273
+ // `absl::StatusOr<U>` when:
274
+ //
275
+ // * Both `absl::StatusOr<T>` and `absl::StatusOr<U>` are OK by assigning
276
+ // `U` to `T` directly.
277
+ // * `absl::StatusOr<T>` is OK and `absl::StatusOr<U>` contains an error
278
+ // code by destroying `absl::StatusOr<T>`'s value and assigning from
279
+ // `absl::StatusOr<U>'
280
+ // * `absl::StatusOr<T>` contains an error code and `absl::StatusOr<U>` is
281
+ // OK by directly initializing `T` from `U`.
282
+ // * Both `absl::StatusOr<T>` and `absl::StatusOr<U>` contain an error
283
+ // code by assigning the `Status` in `absl::StatusOr<U>` to
284
+ // `absl::StatusOr<T>`
285
+ //
286
+ // These overloads only apply if `absl::StatusOr<T>` is constructible and
287
+ // assignable from `absl::StatusOr<U>` and `StatusOr<T>` cannot be directly
288
+ // assigned from `StatusOr<U>`.
289
+ template <
290
+ typename U,
291
+ absl::enable_if_t<
292
+ absl::conjunction<
293
+ absl::negation<std::is_same<T, U>>,
294
+ std::is_constructible<T, const U&>,
295
+ std::is_assignable<T, const U&>,
296
+ absl::negation<
297
+ internal_statusor::
298
+ IsConstructibleOrConvertibleOrAssignableFromStatusOr<
299
+ T, U>>>::value,
300
+ int> = 0>
301
+ StatusOr& operator=(const StatusOr<U>& other) {
302
+ this->Assign(other);
303
+ return *this;
304
+ }
305
+ template <
306
+ typename U,
307
+ absl::enable_if_t<
308
+ absl::conjunction<
309
+ absl::negation<std::is_same<T, U>>, std::is_constructible<T, U&&>,
310
+ std::is_assignable<T, U&&>,
311
+ absl::negation<
312
+ internal_statusor::
313
+ IsConstructibleOrConvertibleOrAssignableFromStatusOr<
314
+ T, U>>>::value,
315
+ int> = 0>
316
+ StatusOr& operator=(StatusOr<U>&& other) {
317
+ this->Assign(std::move(other));
318
+ return *this;
319
+ }
320
+
321
+ // Constructs a new `absl::StatusOr<T>` with a non-ok status. After calling
322
+ // this constructor, `this->ok()` will be `false` and calls to `value()` will
323
+ // crash, or produce an exception if exceptions are enabled.
324
+ //
325
+ // The constructor also takes any type `U` that is convertible to
326
+ // `absl::Status`. This constructor is explicit if an only if `U` is not of
327
+ // type `absl::Status` and the conversion from `U` to `Status` is explicit.
328
+ //
329
+ // REQUIRES: !Status(std::forward<U>(v)).ok(). This requirement is DCHECKed.
330
+ // In optimized builds, passing absl::OkStatus() here will have the effect
331
+ // of passing absl::StatusCode::kInternal as a fallback.
332
+ template <
333
+ typename U = absl::Status,
334
+ absl::enable_if_t<
335
+ absl::conjunction<
336
+ std::is_convertible<U&&, absl::Status>,
337
+ std::is_constructible<absl::Status, U&&>,
338
+ absl::negation<std::is_same<absl::decay_t<U>, absl::StatusOr<T>>>,
339
+ absl::negation<std::is_same<absl::decay_t<U>, T>>,
340
+ absl::negation<std::is_same<absl::decay_t<U>, absl::in_place_t>>,
341
+ absl::negation<internal_statusor::HasConversionOperatorToStatusOr<
342
+ T, U&&>>>::value,
343
+ int> = 0>
344
+ StatusOr(U&& v) : Base(std::forward<U>(v)) {}
345
+
346
+ template <
347
+ typename U = absl::Status,
348
+ absl::enable_if_t<
349
+ absl::conjunction<
350
+ absl::negation<std::is_convertible<U&&, absl::Status>>,
351
+ std::is_constructible<absl::Status, U&&>,
352
+ absl::negation<std::is_same<absl::decay_t<U>, absl::StatusOr<T>>>,
353
+ absl::negation<std::is_same<absl::decay_t<U>, T>>,
354
+ absl::negation<std::is_same<absl::decay_t<U>, absl::in_place_t>>,
355
+ absl::negation<internal_statusor::HasConversionOperatorToStatusOr<
356
+ T, U&&>>>::value,
357
+ int> = 0>
358
+ explicit StatusOr(U&& v) : Base(std::forward<U>(v)) {}
359
+
360
+ template <
361
+ typename U = absl::Status,
362
+ absl::enable_if_t<
363
+ absl::conjunction<
364
+ std::is_convertible<U&&, absl::Status>,
365
+ std::is_constructible<absl::Status, U&&>,
366
+ absl::negation<std::is_same<absl::decay_t<U>, absl::StatusOr<T>>>,
367
+ absl::negation<std::is_same<absl::decay_t<U>, T>>,
368
+ absl::negation<std::is_same<absl::decay_t<U>, absl::in_place_t>>,
369
+ absl::negation<internal_statusor::HasConversionOperatorToStatusOr<
370
+ T, U&&>>>::value,
371
+ int> = 0>
372
+ StatusOr& operator=(U&& v) {
373
+ this->AssignStatus(std::forward<U>(v));
374
+ return *this;
375
+ }
376
+
377
+ // Perfect-forwarding value assignment operator.
378
+
379
+ // If `*this` contains a `T` value before the call, the contained value is
380
+ // assigned from `std::forward<U>(v)`; Otherwise, it is directly-initialized
381
+ // from `std::forward<U>(v)`.
382
+ // This function does not participate in overload unless:
383
+ // 1. `std::is_constructible_v<T, U>` is true,
384
+ // 2. `std::is_assignable_v<T&, U>` is true.
385
+ // 3. `std::is_same_v<StatusOr<T>, std::remove_cvref_t<U>>` is false.
386
+ // 4. Assigning `U` to `T` is not ambiguous:
387
+ // If `U` is `StatusOr<V>` and `T` is constructible and assignable from
388
+ // both `StatusOr<V>` and `V`, the assignment is considered bug-prone and
389
+ // ambiguous thus will fail to compile. For example:
390
+ // StatusOr<bool> s1 = true; // s1.ok() && *s1 == true
391
+ // StatusOr<bool> s2 = false; // s2.ok() && *s2 == false
392
+ // s1 = s2; // ambiguous, `s1 = *s2` or `s1 = bool(s2)`?
393
+ template <
394
+ typename U = T,
395
+ typename = typename std::enable_if<absl::conjunction<
396
+ std::is_constructible<T, U&&>, std::is_assignable<T&, U&&>,
397
+ absl::disjunction<
398
+ std::is_same<absl::remove_cv_t<absl::remove_reference_t<U>>, T>,
399
+ absl::conjunction<
400
+ absl::negation<std::is_convertible<U&&, absl::Status>>,
401
+ absl::negation<internal_statusor::
402
+ HasConversionOperatorToStatusOr<T, U&&>>>>,
403
+ internal_statusor::IsForwardingAssignmentValid<T, U&&>>::value>::type>
404
+ StatusOr& operator=(U&& v) {
405
+ this->Assign(std::forward<U>(v));
406
+ return *this;
407
+ }
408
+
409
+ // Constructs the inner value `T` in-place using the provided args, using the
410
+ // `T(args...)` constructor.
411
+ template <typename... Args>
412
+ explicit StatusOr(absl::in_place_t, Args&&... args);
413
+ template <typename U, typename... Args>
414
+ explicit StatusOr(absl::in_place_t, std::initializer_list<U> ilist,
415
+ Args&&... args);
416
+
417
+ // Constructs the inner value `T` in-place using the provided args, using the
418
+ // `T(U)` (direct-initialization) constructor. This constructor is only valid
419
+ // if `T` can be constructed from a `U`. Can accept move or copy constructors.
420
+ //
421
+ // This constructor is explicit if `U` is not convertible to `T`. To avoid
422
+ // ambiguity, this constuctor is disabled if `U` is a `StatusOr<J>`, where `J`
423
+ // is convertible to `T`.
424
+ template <
425
+ typename U = T,
426
+ absl::enable_if_t<
427
+ absl::conjunction<
428
+ internal_statusor::IsDirectInitializationValid<T, U&&>,
429
+ std::is_constructible<T, U&&>, std::is_convertible<U&&, T>,
430
+ absl::disjunction<
431
+ std::is_same<absl::remove_cv_t<absl::remove_reference_t<U>>,
432
+ T>,
433
+ absl::conjunction<
434
+ absl::negation<std::is_convertible<U&&, absl::Status>>,
435
+ absl::negation<
436
+ internal_statusor::HasConversionOperatorToStatusOr<
437
+ T, U&&>>>>>::value,
438
+ int> = 0>
439
+ StatusOr(U&& u) // NOLINT
440
+ : StatusOr(absl::in_place, std::forward<U>(u)) {
441
+ }
442
+
443
+ template <
444
+ typename U = T,
445
+ absl::enable_if_t<
446
+ absl::conjunction<
447
+ internal_statusor::IsDirectInitializationValid<T, U&&>,
448
+ absl::disjunction<
449
+ std::is_same<absl::remove_cv_t<absl::remove_reference_t<U>>,
450
+ T>,
451
+ absl::conjunction<
452
+ absl::negation<std::is_constructible<absl::Status, U&&>>,
453
+ absl::negation<
454
+ internal_statusor::HasConversionOperatorToStatusOr<
455
+ T, U&&>>>>,
456
+ std::is_constructible<T, U&&>,
457
+ absl::negation<std::is_convertible<U&&, T>>>::value,
458
+ int> = 0>
459
+ explicit StatusOr(U&& u) // NOLINT
460
+ : StatusOr(absl::in_place, std::forward<U>(u)) {
461
+ }
462
+
463
+ // StatusOr<T>::ok()
464
+ //
465
+ // Returns whether or not this `absl::StatusOr<T>` holds a `T` value. This
466
+ // member function is analagous to `absl::Status::ok()` and should be used
467
+ // similarly to check the status of return values.
468
+ //
469
+ // Example:
470
+ //
471
+ // StatusOr<Foo> result = DoBigCalculationThatCouldFail();
472
+ // if (result.ok()) {
473
+ // // Handle result
474
+ // else {
475
+ // // Handle error
476
+ // }
477
+ ABSL_MUST_USE_RESULT bool ok() const { return this->status_.ok(); }
478
+
479
+ // StatusOr<T>::status()
480
+ //
481
+ // Returns a reference to the current `absl::Status` contained within the
482
+ // `absl::StatusOr<T>`. If `absl::StatusOr<T>` contains a `T`, then this
483
+ // function returns `absl::OkStatus()`.
484
+ const Status& status() const &;
485
+ Status status() &&;
486
+
487
+ // StatusOr<T>::value()
488
+ //
489
+ // Returns a reference to the held value if `this->ok()`. Otherwise, throws
490
+ // `absl::BadStatusOrAccess` if exceptions are enabled, or is guaranteed to
491
+ // terminate the process if exceptions are disabled.
492
+ //
493
+ // If you have already checked the status using `this->ok()`, you probably
494
+ // want to use `operator*()` or `operator->()` to access the value instead of
495
+ // `value`.
496
+ //
497
+ // Note: for value types that are cheap to copy, prefer simple code:
498
+ //
499
+ // T value = statusor.value();
500
+ //
501
+ // Otherwise, if the value type is expensive to copy, but can be left
502
+ // in the StatusOr, simply assign to a reference:
503
+ //
504
+ // T& value = statusor.value(); // or `const T&`
505
+ //
506
+ // Otherwise, if the value type supports an efficient move, it can be
507
+ // used as follows:
508
+ //
509
+ // T value = std::move(statusor).value();
510
+ //
511
+ // The `std::move` on statusor instead of on the whole expression enables
512
+ // warnings about possible uses of the statusor object after the move.
513
+ const T& value() const&;
514
+ T& value() &;
515
+ const T&& value() const&&;
516
+ T&& value() &&;
517
+
518
+ // StatusOr<T>:: operator*()
519
+ //
520
+ // Returns a reference to the current value.
521
+ //
522
+ // REQUIRES: `this->ok() == true`, otherwise the behavior is undefined.
523
+ //
524
+ // Use `this->ok()` to verify that there is a current value within the
525
+ // `absl::StatusOr<T>`. Alternatively, see the `value()` member function for a
526
+ // similar API that guarantees crashing or throwing an exception if there is
527
+ // no current value.
528
+ const T& operator*() const&;
529
+ T& operator*() &;
530
+ const T&& operator*() const&&;
531
+ T&& operator*() &&;
532
+
533
+ // StatusOr<T>::operator->()
534
+ //
535
+ // Returns a pointer to the current value.
536
+ //
537
+ // REQUIRES: `this->ok() == true`, otherwise the behavior is undefined.
538
+ //
539
+ // Use `this->ok()` to verify that there is a current value.
540
+ const T* operator->() const;
541
+ T* operator->();
542
+
543
+ // StatusOr<T>::value_or()
544
+ //
545
+ // Returns the current value of `this->ok() == true`. Otherwise constructs a
546
+ // value using the provided `default_value`.
547
+ //
548
+ // Unlike `value`, this function returns by value, copying the current value
549
+ // if necessary. If the value type supports an efficient move, it can be used
550
+ // as follows:
551
+ //
552
+ // T value = std::move(statusor).value_or(def);
553
+ //
554
+ // Unlike with `value`, calling `std::move()` on the result of `value_or` will
555
+ // still trigger a copy.
556
+ template <typename U>
557
+ T value_or(U&& default_value) const&;
558
+ template <typename U>
559
+ T value_or(U&& default_value) &&;
560
+
561
+ // StatusOr<T>::IgnoreError()
562
+ //
563
+ // Ignores any errors. This method does nothing except potentially suppress
564
+ // complaints from any tools that are checking that errors are not dropped on
565
+ // the floor.
566
+ void IgnoreError() const;
567
+
568
+ // StatusOr<T>::emplace()
569
+ //
570
+ // Reconstructs the inner value T in-place using the provided args, using the
571
+ // T(args...) constructor. Returns reference to the reconstructed `T`.
572
+ template <typename... Args>
573
+ T& emplace(Args&&... args) {
574
+ if (ok()) {
575
+ this->Clear();
576
+ this->MakeValue(std::forward<Args>(args)...);
577
+ } else {
578
+ this->MakeValue(std::forward<Args>(args)...);
579
+ this->status_ = absl::OkStatus();
580
+ }
581
+ return this->data_;
582
+ }
583
+
584
+ template <
585
+ typename U, typename... Args,
586
+ absl::enable_if_t<
587
+ std::is_constructible<T, std::initializer_list<U>&, Args&&...>::value,
588
+ int> = 0>
589
+ T& emplace(std::initializer_list<U> ilist, Args&&... args) {
590
+ if (ok()) {
591
+ this->Clear();
592
+ this->MakeValue(ilist, std::forward<Args>(args)...);
593
+ } else {
594
+ this->MakeValue(ilist, std::forward<Args>(args)...);
595
+ this->status_ = absl::OkStatus();
596
+ }
597
+ return this->data_;
598
+ }
599
+
600
+ private:
601
+ using internal_statusor::StatusOrData<T>::Assign;
602
+ template <typename U>
603
+ void Assign(const absl::StatusOr<U>& other);
604
+ template <typename U>
605
+ void Assign(absl::StatusOr<U>&& other);
606
+ };
607
+
608
+ // operator==()
609
+ //
610
+ // This operator checks the equality of two `absl::StatusOr<T>` objects.
611
+ template <typename T>
612
+ bool operator==(const StatusOr<T>& lhs, const StatusOr<T>& rhs) {
613
+ if (lhs.ok() && rhs.ok()) return *lhs == *rhs;
614
+ return lhs.status() == rhs.status();
615
+ }
616
+
617
+ // operator!=()
618
+ //
619
+ // This operator checks the inequality of two `absl::StatusOr<T>` objects.
620
+ template <typename T>
621
+ bool operator!=(const StatusOr<T>& lhs, const StatusOr<T>& rhs) {
622
+ return !(lhs == rhs);
623
+ }
624
+
625
+ //------------------------------------------------------------------------------
626
+ // Implementation details for StatusOr<T>
627
+ //------------------------------------------------------------------------------
628
+
629
+ // TODO(sbenza): avoid the string here completely.
630
+ template <typename T>
631
+ StatusOr<T>::StatusOr() : Base(Status(absl::StatusCode::kUnknown, "")) {}
632
+
633
+ template <typename T>
634
+ template <typename U>
635
+ inline void StatusOr<T>::Assign(const StatusOr<U>& other) {
636
+ if (other.ok()) {
637
+ this->Assign(*other);
638
+ } else {
639
+ this->AssignStatus(other.status());
640
+ }
641
+ }
642
+
643
+ template <typename T>
644
+ template <typename U>
645
+ inline void StatusOr<T>::Assign(StatusOr<U>&& other) {
646
+ if (other.ok()) {
647
+ this->Assign(*std::move(other));
648
+ } else {
649
+ this->AssignStatus(std::move(other).status());
650
+ }
651
+ }
652
+ template <typename T>
653
+ template <typename... Args>
654
+ StatusOr<T>::StatusOr(absl::in_place_t, Args&&... args)
655
+ : Base(absl::in_place, std::forward<Args>(args)...) {}
656
+
657
+ template <typename T>
658
+ template <typename U, typename... Args>
659
+ StatusOr<T>::StatusOr(absl::in_place_t, std::initializer_list<U> ilist,
660
+ Args&&... args)
661
+ : Base(absl::in_place, ilist, std::forward<Args>(args)...) {}
662
+
663
+ template <typename T>
664
+ const Status& StatusOr<T>::status() const & { return this->status_; }
665
+ template <typename T>
666
+ Status StatusOr<T>::status() && {
667
+ return ok() ? OkStatus() : std::move(this->status_);
668
+ }
669
+
670
+ template <typename T>
671
+ const T& StatusOr<T>::value() const& {
672
+ if (!this->ok()) internal_statusor::ThrowBadStatusOrAccess(this->status_);
673
+ return this->data_;
674
+ }
675
+
676
+ template <typename T>
677
+ T& StatusOr<T>::value() & {
678
+ if (!this->ok()) internal_statusor::ThrowBadStatusOrAccess(this->status_);
679
+ return this->data_;
680
+ }
681
+
682
+ template <typename T>
683
+ const T&& StatusOr<T>::value() const&& {
684
+ if (!this->ok()) {
685
+ internal_statusor::ThrowBadStatusOrAccess(std::move(this->status_));
686
+ }
687
+ return std::move(this->data_);
688
+ }
689
+
690
+ template <typename T>
691
+ T&& StatusOr<T>::value() && {
692
+ if (!this->ok()) {
693
+ internal_statusor::ThrowBadStatusOrAccess(std::move(this->status_));
694
+ }
695
+ return std::move(this->data_);
696
+ }
697
+
698
+ template <typename T>
699
+ const T& StatusOr<T>::operator*() const& {
700
+ this->EnsureOk();
701
+ return this->data_;
702
+ }
703
+
704
+ template <typename T>
705
+ T& StatusOr<T>::operator*() & {
706
+ this->EnsureOk();
707
+ return this->data_;
708
+ }
709
+
710
+ template <typename T>
711
+ const T&& StatusOr<T>::operator*() const&& {
712
+ this->EnsureOk();
713
+ return std::move(this->data_);
714
+ }
715
+
716
+ template <typename T>
717
+ T&& StatusOr<T>::operator*() && {
718
+ this->EnsureOk();
719
+ return std::move(this->data_);
720
+ }
721
+
722
+ template <typename T>
723
+ const T* StatusOr<T>::operator->() const {
724
+ this->EnsureOk();
725
+ return &this->data_;
726
+ }
727
+
728
+ template <typename T>
729
+ T* StatusOr<T>::operator->() {
730
+ this->EnsureOk();
731
+ return &this->data_;
732
+ }
733
+
734
+ template <typename T>
735
+ template <typename U>
736
+ T StatusOr<T>::value_or(U&& default_value) const& {
737
+ if (ok()) {
738
+ return this->data_;
739
+ }
740
+ return std::forward<U>(default_value);
741
+ }
742
+
743
+ template <typename T>
744
+ template <typename U>
745
+ T StatusOr<T>::value_or(U&& default_value) && {
746
+ if (ok()) {
747
+ return std::move(this->data_);
748
+ }
749
+ return std::forward<U>(default_value);
750
+ }
751
+
752
+ template <typename T>
753
+ void StatusOr<T>::IgnoreError() const {
754
+ // no-op
755
+ }
756
+
757
+ ABSL_NAMESPACE_END
758
+ } // namespace absl
759
+
760
+ #endif // ABSL_STATUS_STATUSOR_H_