grpc 1.31.1 → 1.32.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 (431) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +595 -15723
  3. data/include/grpc/grpc_security.h +31 -14
  4. data/include/grpc/impl/codegen/README.md +22 -0
  5. data/include/grpc/impl/codegen/port_platform.h +6 -1
  6. data/src/core/ext/filters/client_channel/backup_poller.cc +3 -2
  7. data/src/core/ext/filters/client_channel/client_channel.cc +64 -20
  8. data/src/core/ext/filters/client_channel/client_channel.h +1 -1
  9. data/src/core/ext/filters/client_channel/client_channel_channelz.h +0 -3
  10. data/src/core/ext/filters/client_channel/health/health_check_client.cc +6 -1
  11. data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +2 -3
  12. data/src/core/ext/filters/client_channel/lb_policy.h +2 -0
  13. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +6 -4
  14. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +20 -13
  15. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc +0 -13
  16. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.h +0 -3
  17. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc +1 -37
  18. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +19 -13
  19. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +29 -10
  20. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +5 -4
  21. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +20 -9
  22. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +18 -12
  23. data/src/core/ext/filters/client_channel/lb_policy/xds/eds.cc +22 -14
  24. data/src/core/ext/filters/client_channel/lb_policy/xds/lrs.cc +18 -9
  25. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc +54 -56
  26. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +3 -3
  27. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_libuv.cc +1 -1
  28. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_windows.cc +1 -1
  29. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +1 -1
  30. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +1 -1
  31. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +363 -14
  32. data/src/core/ext/filters/client_channel/resolver_result_parsing.h +0 -1
  33. data/src/core/ext/filters/client_channel/resolving_lb_policy.cc +5 -4
  34. data/src/core/ext/filters/client_channel/server_address.cc +40 -7
  35. data/src/core/ext/filters/client_channel/server_address.h +42 -4
  36. data/src/core/ext/filters/client_channel/subchannel.cc +64 -23
  37. data/src/core/ext/filters/client_channel/subchannel.h +16 -4
  38. data/src/core/ext/filters/max_age/max_age_filter.cc +2 -1
  39. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +87 -31
  40. data/src/core/ext/transport/chttp2/client/chttp2_connector.h +18 -1
  41. data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +10 -35
  42. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +19 -25
  43. data/src/core/ext/transport/chttp2/server/chttp2_server.h +2 -1
  44. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2.cc +2 -2
  45. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.cc +6 -6
  46. data/src/core/ext/transport/chttp2/server/secure/server_secure_chttp2.cc +3 -2
  47. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +239 -277
  48. data/src/core/ext/transport/chttp2/transport/flow_control.cc +1 -1
  49. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +2 -2
  50. data/src/core/ext/transport/chttp2/transport/internal.h +5 -1
  51. data/src/core/ext/transport/chttp2/transport/parsing.cc +1 -28
  52. data/src/core/ext/transport/chttp2/transport/writing.cc +6 -5
  53. data/src/core/ext/transport/inproc/inproc_transport.cc +12 -12
  54. data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.c +224 -0
  55. data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.h +700 -0
  56. data/src/core/ext/upb-generated/envoy/config/cluster/v3/circuit_breaker.upb.c +74 -0
  57. data/src/core/ext/upb-generated/envoy/config/cluster/v3/circuit_breaker.upb.h +226 -0
  58. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.c +380 -0
  59. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.h +1378 -0
  60. data/src/core/ext/upb-generated/envoy/{api/v2/cluster → config/cluster/v3}/filter.upb.c +8 -8
  61. data/src/core/ext/upb-generated/envoy/config/cluster/v3/filter.upb.h +69 -0
  62. data/src/core/ext/upb-generated/envoy/{api/v2/cluster → config/cluster/v3}/outlier_detection.upb.c +8 -8
  63. data/src/core/ext/upb-generated/envoy/config/cluster/v3/outlier_detection.upb.h +323 -0
  64. data/src/core/ext/upb-generated/envoy/config/core/v3/address.upb.c +112 -0
  65. data/src/core/ext/upb-generated/envoy/config/core/v3/address.upb.h +334 -0
  66. data/src/core/ext/upb-generated/envoy/{api/v2/core → config/core/v3}/backoff.upb.c +8 -8
  67. data/src/core/ext/upb-generated/envoy/config/core/v3/backoff.upb.h +79 -0
  68. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.c +309 -0
  69. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.h +869 -0
  70. data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.c +96 -0
  71. data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.h +328 -0
  72. data/src/core/ext/upb-generated/envoy/config/core/v3/event_service_config.upb.c +34 -0
  73. data/src/core/ext/upb-generated/envoy/config/core/v3/event_service_config.upb.h +71 -0
  74. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.c +195 -0
  75. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.h +634 -0
  76. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.c +170 -0
  77. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.h +684 -0
  78. data/src/core/ext/upb-generated/envoy/{api/v2/core → config/core/v3}/http_uri.upb.c +8 -8
  79. data/src/core/ext/upb-generated/envoy/config/core/v3/http_uri.upb.h +80 -0
  80. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.c +152 -0
  81. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.h +536 -0
  82. data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.c +28 -0
  83. data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.h +58 -0
  84. data/src/core/ext/upb-generated/envoy/{api/v2/core → config/core/v3}/socket_option.upb.c +6 -6
  85. data/src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.h +88 -0
  86. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.c +91 -0
  87. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.h +220 -0
  88. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.c +91 -0
  89. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.h +273 -0
  90. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.c +112 -0
  91. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.h +332 -0
  92. data/src/core/ext/upb-generated/envoy/config/listener/{v2 → v3}/api_listener.upb.c +8 -8
  93. data/src/core/ext/upb-generated/envoy/config/listener/v3/api_listener.upb.h +65 -0
  94. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.c +108 -0
  95. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.h +401 -0
  96. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.c +138 -0
  97. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.h +490 -0
  98. data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.c +41 -0
  99. data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.h +94 -0
  100. data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.c +174 -0
  101. data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.h +599 -0
  102. data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.c +63 -0
  103. data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.h +204 -0
  104. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.c +773 -0
  105. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.h +2855 -0
  106. data/src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.c +59 -0
  107. data/src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.h +135 -0
  108. data/src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.c +50 -0
  109. data/src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.h +108 -0
  110. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.c +312 -0
  111. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h +1125 -0
  112. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.c +20 -0
  113. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.h +34 -0
  114. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.c +111 -0
  115. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.h +401 -0
  116. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.c +72 -0
  117. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.h +198 -0
  118. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.c +105 -0
  119. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.h +388 -0
  120. data/src/core/ext/upb-generated/envoy/{api/v2 → service/cluster/v3}/cds.upb.c +5 -6
  121. data/src/core/ext/upb-generated/envoy/service/cluster/v3/cds.upb.h +49 -0
  122. data/src/core/ext/upb-generated/envoy/service/discovery/{v2 → v3}/ads.upb.c +5 -4
  123. data/src/core/ext/upb-generated/envoy/service/discovery/v3/ads.upb.h +49 -0
  124. data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.c +129 -0
  125. data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.h +386 -0
  126. data/src/core/ext/upb-generated/envoy/{api/v2 → service/endpoint/v3}/eds.upb.c +5 -6
  127. data/src/core/ext/upb-generated/envoy/service/endpoint/v3/eds.upb.h +49 -0
  128. data/src/core/ext/upb-generated/envoy/{api/v2 → service/listener/v3}/lds.upb.c +5 -6
  129. data/src/core/ext/upb-generated/envoy/service/listener/v3/lds.upb.h +49 -0
  130. data/src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.c +55 -0
  131. data/src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.h +136 -0
  132. data/src/core/ext/upb-generated/envoy/{api/v2 → service/route/v3}/rds.upb.c +5 -6
  133. data/src/core/ext/upb-generated/envoy/service/route/v3/rds.upb.h +49 -0
  134. data/src/core/ext/upb-generated/envoy/{api/v2 → service/route/v3}/srds.upb.c +5 -6
  135. data/src/core/ext/upb-generated/envoy/service/route/v3/srds.upb.h +49 -0
  136. data/src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.c +47 -0
  137. data/src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.h +114 -0
  138. data/src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.c +35 -0
  139. data/src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.h +77 -0
  140. data/src/core/ext/upb-generated/envoy/type/matcher/v3/path.upb.c +34 -0
  141. data/src/core/ext/upb-generated/envoy/type/matcher/v3/path.upb.h +71 -0
  142. data/src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.c +64 -0
  143. data/src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.h +145 -0
  144. data/src/core/ext/upb-generated/envoy/type/matcher/v3/string.upb.c +53 -0
  145. data/src/core/ext/upb-generated/envoy/type/matcher/v3/string.upb.h +127 -0
  146. data/src/core/ext/upb-generated/envoy/type/matcher/v3/value.upb.c +63 -0
  147. data/src/core/ext/upb-generated/envoy/type/matcher/v3/value.upb.h +188 -0
  148. data/src/core/ext/upb-generated/envoy/type/metadata/v3/metadata.upb.c +88 -0
  149. data/src/core/ext/upb-generated/envoy/type/metadata/v3/metadata.upb.h +258 -0
  150. data/src/core/ext/upb-generated/envoy/type/tracing/v3/custom_tag.upb.c +90 -0
  151. data/src/core/ext/upb-generated/envoy/type/tracing/v3/custom_tag.upb.h +250 -0
  152. data/src/core/ext/upb-generated/envoy/type/{http.upb.c → v3/http.upb.c} +2 -2
  153. data/src/core/ext/upb-generated/envoy/type/{http.upb.h → v3/http.upb.h} +8 -8
  154. data/src/core/ext/upb-generated/envoy/type/{percent.upb.c → v3/percent.upb.c} +9 -8
  155. data/src/core/ext/upb-generated/envoy/type/v3/percent.upb.h +86 -0
  156. data/src/core/ext/upb-generated/envoy/type/{range.upb.c → v3/range.upb.c} +12 -11
  157. data/src/core/ext/upb-generated/envoy/type/v3/range.upb.h +111 -0
  158. data/src/core/ext/upb-generated/envoy/type/{semantic_version.upb.c → v3/semantic_version.upb.c} +6 -5
  159. data/src/core/ext/upb-generated/envoy/type/v3/semantic_version.upb.h +61 -0
  160. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.c +234 -0
  161. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.h +759 -0
  162. data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.c +36 -36
  163. data/src/core/ext/upb-generated/google/protobuf/struct.upb.h +1 -1
  164. data/src/core/ext/upb-generated/udpa/annotations/versioning.upb.c +27 -0
  165. data/src/core/ext/upb-generated/udpa/annotations/versioning.upb.h +53 -0
  166. data/src/core/ext/upb-generated/validate/validate.upb.c +11 -11
  167. data/src/core/ext/upb-generated/validate/validate.upb.h +1 -1
  168. data/src/core/ext/{filters/client_channel/xds → xds}/xds_api.cc +1045 -767
  169. data/src/core/ext/{filters/client_channel/xds → xds}/xds_api.h +114 -99
  170. data/src/core/ext/{filters/client_channel/xds → xds}/xds_bootstrap.cc +44 -2
  171. data/src/core/ext/{filters/client_channel/xds → xds}/xds_bootstrap.h +8 -3
  172. data/src/core/ext/{filters/client_channel/xds → xds}/xds_channel.h +4 -4
  173. data/src/core/ext/{filters/client_channel/xds → xds}/xds_channel_args.h +3 -3
  174. data/src/core/ext/{filters/client_channel/xds → xds}/xds_channel_secure.cc +2 -5
  175. data/src/core/ext/{filters/client_channel/xds → xds}/xds_client.cc +85 -417
  176. data/src/core/ext/{filters/client_channel/xds → xds}/xds_client.h +12 -45
  177. data/src/core/ext/{filters/client_channel/xds → xds}/xds_client_stats.cc +2 -2
  178. data/src/core/ext/{filters/client_channel/xds → xds}/xds_client_stats.h +3 -3
  179. data/src/core/lib/channel/channelz.cc +14 -15
  180. data/src/core/lib/channel/channelz.h +1 -1
  181. data/src/core/lib/channel/channelz_registry.cc +3 -1
  182. data/src/core/lib/gpr/sync_posix.cc +2 -8
  183. data/src/core/lib/iomgr/endpoint.cc +5 -1
  184. data/src/core/lib/iomgr/endpoint.h +7 -3
  185. data/src/core/lib/iomgr/endpoint_cfstream.cc +32 -11
  186. data/src/core/lib/iomgr/ev_posix.cc +0 -2
  187. data/src/core/lib/iomgr/iomgr.cc +0 -10
  188. data/src/core/lib/iomgr/iomgr.h +0 -10
  189. data/src/core/{ext/filters/client_channel → lib/iomgr}/parse_address.cc +1 -1
  190. data/src/core/{ext/filters/client_channel → lib/iomgr}/parse_address.h +3 -3
  191. data/src/core/lib/iomgr/sockaddr_utils.cc +2 -1
  192. data/src/core/lib/iomgr/sockaddr_utils.h +2 -1
  193. data/src/core/lib/iomgr/tcp_custom.cc +32 -16
  194. data/src/core/lib/iomgr/tcp_posix.cc +31 -13
  195. data/src/core/lib/iomgr/tcp_windows.cc +26 -10
  196. data/src/core/lib/security/authorization/authorization_engine.cc +177 -0
  197. data/src/core/lib/security/authorization/authorization_engine.h +84 -0
  198. data/src/core/lib/security/authorization/evaluate_args.cc +153 -0
  199. data/src/core/lib/security/authorization/evaluate_args.h +59 -0
  200. data/src/core/lib/security/authorization/mock_cel/activation.h +57 -0
  201. data/src/core/lib/security/authorization/mock_cel/cel_expr_builder_factory.h +42 -0
  202. data/src/core/lib/security/authorization/mock_cel/cel_expression.h +68 -0
  203. data/src/core/lib/security/authorization/mock_cel/cel_value.h +93 -0
  204. data/src/core/lib/security/authorization/mock_cel/evaluator_core.h +67 -0
  205. data/src/core/lib/security/authorization/mock_cel/flat_expr_builder.h +56 -0
  206. data/src/core/lib/security/authorization/mock_cel/statusor.h +50 -0
  207. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +56 -38
  208. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +1 -2
  209. data/src/core/lib/security/transport/secure_endpoint.cc +7 -1
  210. data/src/core/lib/surface/call.cc +12 -12
  211. data/src/core/lib/surface/call.h +2 -1
  212. data/src/core/lib/surface/channel.cc +28 -20
  213. data/src/core/lib/surface/channel.h +12 -2
  214. data/src/core/lib/surface/completion_queue.cc +10 -272
  215. data/src/core/lib/surface/completion_queue.h +0 -8
  216. data/src/core/lib/surface/init.cc +1 -3
  217. data/src/core/lib/surface/server.cc +1066 -1244
  218. data/src/core/lib/surface/server.h +363 -87
  219. data/src/core/lib/surface/version.cc +2 -2
  220. data/src/core/lib/transport/authority_override.cc +38 -0
  221. data/src/core/lib/transport/authority_override.h +32 -0
  222. data/src/core/lib/transport/connectivity_state.cc +18 -13
  223. data/src/core/lib/transport/connectivity_state.h +18 -6
  224. data/src/core/lib/transport/error_utils.cc +13 -0
  225. data/src/core/lib/transport/error_utils.h +6 -0
  226. data/src/core/lib/transport/static_metadata.cc +295 -276
  227. data/src/core/lib/transport/static_metadata.h +80 -73
  228. data/src/core/lib/transport/transport.h +7 -0
  229. data/src/core/lib/uri/uri_parser.cc +23 -21
  230. data/src/core/lib/uri/uri_parser.h +3 -1
  231. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +22 -0
  232. data/src/core/tsi/ssl_transport_security.cc +3 -9
  233. data/src/ruby/ext/grpc/rb_channel_credentials.c +9 -0
  234. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +2 -2
  235. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +4 -4
  236. data/src/ruby/lib/grpc/version.rb +1 -1
  237. data/src/ruby/spec/channel_credentials_spec.rb +10 -0
  238. data/src/ruby/spec/generic/active_call_spec.rb +19 -8
  239. data/third_party/abseil-cpp/absl/algorithm/container.h +1727 -0
  240. data/third_party/abseil-cpp/absl/base/internal/direct_mmap.h +161 -0
  241. data/third_party/abseil-cpp/absl/base/internal/exponential_biased.cc +93 -0
  242. data/third_party/abseil-cpp/absl/base/internal/exponential_biased.h +130 -0
  243. data/third_party/abseil-cpp/absl/base/internal/low_level_alloc.cc +620 -0
  244. data/third_party/abseil-cpp/absl/base/internal/low_level_alloc.h +126 -0
  245. data/third_party/abseil-cpp/absl/container/fixed_array.h +515 -0
  246. data/third_party/abseil-cpp/absl/container/flat_hash_set.h +503 -0
  247. data/third_party/abseil-cpp/absl/container/internal/common.h +202 -0
  248. data/third_party/abseil-cpp/absl/container/internal/container_memory.h +440 -0
  249. data/third_party/abseil-cpp/absl/container/internal/hash_function_defaults.h +146 -0
  250. data/third_party/abseil-cpp/absl/container/internal/hash_policy_traits.h +191 -0
  251. data/third_party/abseil-cpp/absl/container/internal/hashtable_debug_hooks.h +85 -0
  252. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.cc +269 -0
  253. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.h +297 -0
  254. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler_force_weak_definition.cc +30 -0
  255. data/third_party/abseil-cpp/absl/container/internal/have_sse.h +49 -0
  256. data/third_party/abseil-cpp/absl/container/internal/layout.h +741 -0
  257. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.cc +48 -0
  258. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.h +1882 -0
  259. data/third_party/abseil-cpp/absl/debugging/internal/address_is_readable.cc +138 -0
  260. data/third_party/abseil-cpp/absl/debugging/internal/address_is_readable.h +32 -0
  261. data/third_party/abseil-cpp/absl/debugging/internal/demangle.cc +1895 -0
  262. data/third_party/abseil-cpp/absl/debugging/internal/demangle.h +71 -0
  263. data/third_party/abseil-cpp/absl/debugging/internal/elf_mem_image.cc +382 -0
  264. data/third_party/abseil-cpp/absl/debugging/internal/elf_mem_image.h +134 -0
  265. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_aarch64-inl.inc +192 -0
  266. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_arm-inl.inc +125 -0
  267. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_config.h +70 -0
  268. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_generic-inl.inc +99 -0
  269. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_powerpc-inl.inc +248 -0
  270. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_unimplemented-inl.inc +24 -0
  271. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_win32-inl.inc +85 -0
  272. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_x86-inl.inc +346 -0
  273. data/third_party/abseil-cpp/absl/debugging/internal/symbolize.h +128 -0
  274. data/third_party/abseil-cpp/absl/debugging/internal/vdso_support.cc +194 -0
  275. data/third_party/abseil-cpp/absl/debugging/internal/vdso_support.h +158 -0
  276. data/third_party/abseil-cpp/absl/debugging/stacktrace.cc +140 -0
  277. data/third_party/abseil-cpp/absl/debugging/stacktrace.h +231 -0
  278. data/third_party/abseil-cpp/absl/debugging/symbolize.cc +25 -0
  279. data/third_party/abseil-cpp/absl/debugging/symbolize.h +99 -0
  280. data/third_party/abseil-cpp/absl/debugging/symbolize_elf.inc +1480 -0
  281. data/third_party/abseil-cpp/absl/debugging/symbolize_unimplemented.inc +40 -0
  282. data/third_party/abseil-cpp/absl/debugging/symbolize_win32.inc +81 -0
  283. data/third_party/abseil-cpp/absl/functional/function_ref.h +139 -0
  284. data/third_party/abseil-cpp/absl/functional/internal/function_ref.h +106 -0
  285. data/third_party/abseil-cpp/absl/hash/hash.h +324 -0
  286. data/third_party/abseil-cpp/absl/hash/internal/city.cc +346 -0
  287. data/third_party/abseil-cpp/absl/hash/internal/city.h +96 -0
  288. data/third_party/abseil-cpp/absl/hash/internal/hash.cc +55 -0
  289. data/third_party/abseil-cpp/absl/hash/internal/hash.h +988 -0
  290. data/third_party/abseil-cpp/absl/status/status.cc +447 -0
  291. data/third_party/abseil-cpp/absl/status/status.h +428 -0
  292. data/third_party/abseil-cpp/absl/status/status_payload_printer.cc +43 -0
  293. data/third_party/abseil-cpp/absl/status/status_payload_printer.h +51 -0
  294. data/third_party/abseil-cpp/absl/strings/cord.cc +2019 -0
  295. data/third_party/abseil-cpp/absl/strings/cord.h +1121 -0
  296. data/third_party/abseil-cpp/absl/strings/internal/cord_internal.h +151 -0
  297. data/third_party/abseil-cpp/absl/synchronization/barrier.cc +52 -0
  298. data/third_party/abseil-cpp/absl/synchronization/barrier.h +79 -0
  299. data/third_party/abseil-cpp/absl/synchronization/blocking_counter.cc +57 -0
  300. data/third_party/abseil-cpp/absl/synchronization/blocking_counter.h +99 -0
  301. data/third_party/abseil-cpp/absl/synchronization/internal/create_thread_identity.cc +140 -0
  302. data/third_party/abseil-cpp/absl/synchronization/internal/create_thread_identity.h +60 -0
  303. data/third_party/abseil-cpp/absl/synchronization/internal/graphcycles.cc +697 -0
  304. data/third_party/abseil-cpp/absl/synchronization/internal/graphcycles.h +141 -0
  305. data/third_party/abseil-cpp/absl/synchronization/internal/kernel_timeout.h +155 -0
  306. data/third_party/abseil-cpp/absl/synchronization/internal/mutex_nonprod.inc +261 -0
  307. data/third_party/abseil-cpp/absl/synchronization/internal/per_thread_sem.cc +106 -0
  308. data/third_party/abseil-cpp/absl/synchronization/internal/per_thread_sem.h +115 -0
  309. data/third_party/abseil-cpp/absl/synchronization/internal/waiter.cc +484 -0
  310. data/third_party/abseil-cpp/absl/synchronization/internal/waiter.h +159 -0
  311. data/third_party/abseil-cpp/absl/synchronization/mutex.cc +2728 -0
  312. data/third_party/abseil-cpp/absl/synchronization/mutex.h +1056 -0
  313. data/third_party/abseil-cpp/absl/synchronization/notification.cc +78 -0
  314. data/third_party/abseil-cpp/absl/synchronization/notification.h +123 -0
  315. data/third_party/abseil-cpp/absl/types/bad_variant_access.cc +64 -0
  316. data/third_party/abseil-cpp/absl/types/bad_variant_access.h +82 -0
  317. data/third_party/abseil-cpp/absl/types/internal/variant.h +1646 -0
  318. data/third_party/abseil-cpp/absl/types/variant.h +861 -0
  319. data/third_party/boringssl-with-bazel/err_data.c +263 -257
  320. data/third_party/boringssl-with-bazel/src/crypto/evp/evp_asn1.c +16 -0
  321. data/third_party/boringssl-with-bazel/src/crypto/hpke/hpke.c +456 -0
  322. data/third_party/boringssl-with-bazel/src/crypto/hpke/internal.h +192 -0
  323. data/third_party/boringssl-with-bazel/src/crypto/x509/x_sig.c +20 -0
  324. data/third_party/boringssl-with-bazel/src/include/openssl/arm_arch.h +52 -0
  325. data/third_party/boringssl-with-bazel/src/include/openssl/base.h +1 -1
  326. data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +39 -7
  327. data/third_party/boringssl-with-bazel/src/include/openssl/tls1.h +2 -3
  328. data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +11 -0
  329. data/third_party/boringssl-with-bazel/src/ssl/internal.h +4 -0
  330. data/third_party/boringssl-with-bazel/src/ssl/ssl_cert.cc +3 -6
  331. data/third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc +10 -0
  332. data/third_party/boringssl-with-bazel/src/ssl/t1_lib.cc +34 -9
  333. data/third_party/boringssl-with-bazel/src/ssl/tls13_server.cc +5 -0
  334. data/third_party/boringssl-with-bazel/src/ssl/tls_record.cc +5 -3
  335. data/third_party/upb/upb/decode.c +64 -15
  336. data/third_party/upb/upb/encode.c +2 -2
  337. data/third_party/upb/upb/msg.h +2 -2
  338. data/third_party/upb/upb/port_def.inc +1 -1
  339. data/third_party/upb/upb/table.c +0 -11
  340. data/third_party/upb/upb/table.int.h +0 -9
  341. data/third_party/upb/upb/upb.c +16 -14
  342. data/third_party/upb/upb/upb.h +26 -0
  343. data/third_party/upb/upb/upb.hpp +2 -0
  344. metadata +257 -155
  345. data/src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.c +0 -21
  346. data/src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.h +0 -34
  347. data/src/core/ext/upb-generated/envoy/api/v2/auth/common.upb.c +0 -114
  348. data/src/core/ext/upb-generated/envoy/api/v2/auth/common.upb.h +0 -429
  349. data/src/core/ext/upb-generated/envoy/api/v2/auth/secret.upb.c +0 -72
  350. data/src/core/ext/upb-generated/envoy/api/v2/auth/secret.upb.h +0 -198
  351. data/src/core/ext/upb-generated/envoy/api/v2/auth/tls.upb.c +0 -105
  352. data/src/core/ext/upb-generated/envoy/api/v2/auth/tls.upb.h +0 -388
  353. data/src/core/ext/upb-generated/envoy/api/v2/cds.upb.h +0 -52
  354. data/src/core/ext/upb-generated/envoy/api/v2/cluster.upb.c +0 -403
  355. data/src/core/ext/upb-generated/envoy/api/v2/cluster.upb.h +0 -1453
  356. data/src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.c +0 -74
  357. data/src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.h +0 -226
  358. data/src/core/ext/upb-generated/envoy/api/v2/cluster/filter.upb.h +0 -69
  359. data/src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.h +0 -323
  360. data/src/core/ext/upb-generated/envoy/api/v2/core/address.upb.c +0 -112
  361. data/src/core/ext/upb-generated/envoy/api/v2/core/address.upb.h +0 -334
  362. data/src/core/ext/upb-generated/envoy/api/v2/core/backoff.upb.h +0 -79
  363. data/src/core/ext/upb-generated/envoy/api/v2/core/base.upb.c +0 -313
  364. data/src/core/ext/upb-generated/envoy/api/v2/core/base.upb.h +0 -891
  365. data/src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.c +0 -96
  366. data/src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.h +0 -328
  367. data/src/core/ext/upb-generated/envoy/api/v2/core/event_service_config.upb.c +0 -34
  368. data/src/core/ext/upb-generated/envoy/api/v2/core/event_service_config.upb.h +0 -71
  369. data/src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.c +0 -197
  370. data/src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.h +0 -649
  371. data/src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.c +0 -172
  372. data/src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.h +0 -693
  373. data/src/core/ext/upb-generated/envoy/api/v2/core/http_uri.upb.h +0 -80
  374. data/src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.c +0 -152
  375. data/src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.h +0 -536
  376. data/src/core/ext/upb-generated/envoy/api/v2/core/socket_option.upb.h +0 -88
  377. data/src/core/ext/upb-generated/envoy/api/v2/discovery.upb.c +0 -129
  378. data/src/core/ext/upb-generated/envoy/api/v2/discovery.upb.h +0 -386
  379. data/src/core/ext/upb-generated/envoy/api/v2/eds.upb.h +0 -52
  380. data/src/core/ext/upb-generated/envoy/api/v2/endpoint.upb.c +0 -92
  381. data/src/core/ext/upb-generated/envoy/api/v2/endpoint.upb.h +0 -224
  382. data/src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint.upb.c +0 -18
  383. data/src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint.upb.h +0 -32
  384. data/src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint_components.upb.c +0 -91
  385. data/src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint_components.upb.h +0 -273
  386. data/src/core/ext/upb-generated/envoy/api/v2/endpoint/load_report.upb.c +0 -112
  387. data/src/core/ext/upb-generated/envoy/api/v2/endpoint/load_report.upb.h +0 -332
  388. data/src/core/ext/upb-generated/envoy/api/v2/lds.upb.h +0 -52
  389. data/src/core/ext/upb-generated/envoy/api/v2/listener.upb.c +0 -109
  390. data/src/core/ext/upb-generated/envoy/api/v2/listener.upb.h +0 -415
  391. data/src/core/ext/upb-generated/envoy/api/v2/listener/listener.upb.c +0 -18
  392. data/src/core/ext/upb-generated/envoy/api/v2/listener/listener.upb.h +0 -32
  393. data/src/core/ext/upb-generated/envoy/api/v2/listener/listener_components.upb.c +0 -145
  394. data/src/core/ext/upb-generated/envoy/api/v2/listener/listener_components.upb.h +0 -538
  395. data/src/core/ext/upb-generated/envoy/api/v2/listener/udp_listener_config.upb.c +0 -43
  396. data/src/core/ext/upb-generated/envoy/api/v2/listener/udp_listener_config.upb.h +0 -111
  397. data/src/core/ext/upb-generated/envoy/api/v2/rds.upb.h +0 -52
  398. data/src/core/ext/upb-generated/envoy/api/v2/route.upb.c +0 -63
  399. data/src/core/ext/upb-generated/envoy/api/v2/route.upb.h +0 -204
  400. data/src/core/ext/upb-generated/envoy/api/v2/route/route.upb.c +0 -18
  401. data/src/core/ext/upb-generated/envoy/api/v2/route/route.upb.h +0 -32
  402. data/src/core/ext/upb-generated/envoy/api/v2/route/route_components.upb.c +0 -815
  403. data/src/core/ext/upb-generated/envoy/api/v2/route/route_components.upb.h +0 -2984
  404. data/src/core/ext/upb-generated/envoy/api/v2/scoped_route.upb.c +0 -59
  405. data/src/core/ext/upb-generated/envoy/api/v2/scoped_route.upb.h +0 -135
  406. data/src/core/ext/upb-generated/envoy/api/v2/srds.upb.h +0 -52
  407. data/src/core/ext/upb-generated/envoy/config/filter/accesslog/v2/accesslog.upb.c +0 -228
  408. data/src/core/ext/upb-generated/envoy/config/filter/accesslog/v2/accesslog.upb.h +0 -732
  409. data/src/core/ext/upb-generated/envoy/config/filter/network/http_connection_manager/v2/http_connection_manager.upb.c +0 -316
  410. data/src/core/ext/upb-generated/envoy/config/filter/network/http_connection_manager/v2/http_connection_manager.upb.h +0 -1167
  411. data/src/core/ext/upb-generated/envoy/config/listener/v2/api_listener.upb.h +0 -65
  412. data/src/core/ext/upb-generated/envoy/config/trace/v2/http_tracer.upb.c +0 -51
  413. data/src/core/ext/upb-generated/envoy/config/trace/v2/http_tracer.upb.h +0 -125
  414. data/src/core/ext/upb-generated/envoy/service/discovery/v2/ads.upb.h +0 -49
  415. data/src/core/ext/upb-generated/envoy/service/load_stats/v2/lrs.upb.c +0 -54
  416. data/src/core/ext/upb-generated/envoy/service/load_stats/v2/lrs.upb.h +0 -136
  417. data/src/core/ext/upb-generated/envoy/type/matcher/regex.upb.c +0 -63
  418. data/src/core/ext/upb-generated/envoy/type/matcher/regex.upb.h +0 -145
  419. data/src/core/ext/upb-generated/envoy/type/matcher/string.upb.c +0 -53
  420. data/src/core/ext/upb-generated/envoy/type/matcher/string.upb.h +0 -133
  421. data/src/core/ext/upb-generated/envoy/type/metadata/v2/metadata.upb.c +0 -88
  422. data/src/core/ext/upb-generated/envoy/type/metadata/v2/metadata.upb.h +0 -258
  423. data/src/core/ext/upb-generated/envoy/type/percent.upb.h +0 -86
  424. data/src/core/ext/upb-generated/envoy/type/range.upb.h +0 -111
  425. data/src/core/ext/upb-generated/envoy/type/semantic_version.upb.h +0 -61
  426. data/src/core/ext/upb-generated/envoy/type/tracing/v2/custom_tag.upb.c +0 -89
  427. data/src/core/ext/upb-generated/envoy/type/tracing/v2/custom_tag.upb.h +0 -250
  428. data/src/core/lib/security/transport/target_authority_table.cc +0 -75
  429. data/src/core/lib/security/transport/target_authority_table.h +0 -40
  430. data/src/core/lib/slice/slice_hash_table.h +0 -199
  431. data/src/core/lib/slice/slice_weak_hash_table.h +0 -102
@@ -0,0 +1,988 @@
1
+ // Copyright 2018 The Abseil Authors.
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // https://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+ //
15
+ // -----------------------------------------------------------------------------
16
+ // File: hash.h
17
+ // -----------------------------------------------------------------------------
18
+ //
19
+ #ifndef ABSL_HASH_INTERNAL_HASH_H_
20
+ #define ABSL_HASH_INTERNAL_HASH_H_
21
+
22
+ #include <algorithm>
23
+ #include <array>
24
+ #include <cmath>
25
+ #include <cstring>
26
+ #include <deque>
27
+ #include <forward_list>
28
+ #include <functional>
29
+ #include <iterator>
30
+ #include <limits>
31
+ #include <list>
32
+ #include <map>
33
+ #include <memory>
34
+ #include <set>
35
+ #include <string>
36
+ #include <tuple>
37
+ #include <type_traits>
38
+ #include <utility>
39
+ #include <vector>
40
+
41
+ #include "absl/base/internal/endian.h"
42
+ #include "absl/base/port.h"
43
+ #include "absl/container/fixed_array.h"
44
+ #include "absl/meta/type_traits.h"
45
+ #include "absl/numeric/int128.h"
46
+ #include "absl/strings/string_view.h"
47
+ #include "absl/types/optional.h"
48
+ #include "absl/types/variant.h"
49
+ #include "absl/utility/utility.h"
50
+ #include "absl/hash/internal/city.h"
51
+
52
+ namespace absl {
53
+ ABSL_NAMESPACE_BEGIN
54
+ namespace hash_internal {
55
+
56
+ class PiecewiseCombiner;
57
+
58
+ // Internal detail: Large buffers are hashed in smaller chunks. This function
59
+ // returns the size of these chunks.
60
+ constexpr size_t PiecewiseChunkSize() { return 1024; }
61
+
62
+ // HashStateBase
63
+ //
64
+ // A hash state object represents an intermediate state in the computation
65
+ // of an unspecified hash algorithm. `HashStateBase` provides a CRTP style
66
+ // base class for hash state implementations. Developers adding type support
67
+ // for `absl::Hash` should not rely on any parts of the state object other than
68
+ // the following member functions:
69
+ //
70
+ // * HashStateBase::combine()
71
+ // * HashStateBase::combine_contiguous()
72
+ //
73
+ // A derived hash state class of type `H` must provide a static member function
74
+ // with a signature similar to the following:
75
+ //
76
+ // `static H combine_contiguous(H state, const unsigned char*, size_t)`.
77
+ //
78
+ // `HashStateBase` will provide a complete implementation for a hash state
79
+ // object in terms of this method.
80
+ //
81
+ // Example:
82
+ //
83
+ // // Use CRTP to define your derived class.
84
+ // struct MyHashState : HashStateBase<MyHashState> {
85
+ // static H combine_contiguous(H state, const unsigned char*, size_t);
86
+ // using MyHashState::HashStateBase::combine;
87
+ // using MyHashState::HashStateBase::combine_contiguous;
88
+ // };
89
+ template <typename H>
90
+ class HashStateBase {
91
+ public:
92
+ // HashStateBase::combine()
93
+ //
94
+ // Combines an arbitrary number of values into a hash state, returning the
95
+ // updated state.
96
+ //
97
+ // Each of the value types `T` must be separately hashable by the Abseil
98
+ // hashing framework.
99
+ //
100
+ // NOTE:
101
+ //
102
+ // state = H::combine(std::move(state), value1, value2, value3);
103
+ //
104
+ // is guaranteed to produce the same hash expansion as:
105
+ //
106
+ // state = H::combine(std::move(state), value1);
107
+ // state = H::combine(std::move(state), value2);
108
+ // state = H::combine(std::move(state), value3);
109
+ template <typename T, typename... Ts>
110
+ static H combine(H state, const T& value, const Ts&... values);
111
+ static H combine(H state) { return state; }
112
+
113
+ // HashStateBase::combine_contiguous()
114
+ //
115
+ // Combines a contiguous array of `size` elements into a hash state, returning
116
+ // the updated state.
117
+ //
118
+ // NOTE:
119
+ //
120
+ // state = H::combine_contiguous(std::move(state), data, size);
121
+ //
122
+ // is NOT guaranteed to produce the same hash expansion as a for-loop (it may
123
+ // perform internal optimizations). If you need this guarantee, use the
124
+ // for-loop instead.
125
+ template <typename T>
126
+ static H combine_contiguous(H state, const T* data, size_t size);
127
+
128
+ private:
129
+ friend class PiecewiseCombiner;
130
+ };
131
+
132
+ // is_uniquely_represented
133
+ //
134
+ // `is_uniquely_represented<T>` is a trait class that indicates whether `T`
135
+ // is uniquely represented.
136
+ //
137
+ // A type is "uniquely represented" if two equal values of that type are
138
+ // guaranteed to have the same bytes in their underlying storage. In other
139
+ // words, if `a == b`, then `memcmp(&a, &b, sizeof(T))` is guaranteed to be
140
+ // zero. This property cannot be detected automatically, so this trait is false
141
+ // by default, but can be specialized by types that wish to assert that they are
142
+ // uniquely represented. This makes them eligible for certain optimizations.
143
+ //
144
+ // If you have any doubt whatsoever, do not specialize this template.
145
+ // The default is completely safe, and merely disables some optimizations
146
+ // that will not matter for most types. Specializing this template,
147
+ // on the other hand, can be very hazardous.
148
+ //
149
+ // To be uniquely represented, a type must not have multiple ways of
150
+ // representing the same value; for example, float and double are not
151
+ // uniquely represented, because they have distinct representations for
152
+ // +0 and -0. Furthermore, the type's byte representation must consist
153
+ // solely of user-controlled data, with no padding bits and no compiler-
154
+ // controlled data such as vptrs or sanitizer metadata. This is usually
155
+ // very difficult to guarantee, because in most cases the compiler can
156
+ // insert data and padding bits at its own discretion.
157
+ //
158
+ // If you specialize this template for a type `T`, you must do so in the file
159
+ // that defines that type (or in this file). If you define that specialization
160
+ // anywhere else, `is_uniquely_represented<T>` could have different meanings
161
+ // in different places.
162
+ //
163
+ // The Enable parameter is meaningless; it is provided as a convenience,
164
+ // to support certain SFINAE techniques when defining specializations.
165
+ template <typename T, typename Enable = void>
166
+ struct is_uniquely_represented : std::false_type {};
167
+
168
+ // is_uniquely_represented<unsigned char>
169
+ //
170
+ // unsigned char is a synonym for "byte", so it is guaranteed to be
171
+ // uniquely represented.
172
+ template <>
173
+ struct is_uniquely_represented<unsigned char> : std::true_type {};
174
+
175
+ // is_uniquely_represented for non-standard integral types
176
+ //
177
+ // Integral types other than bool should be uniquely represented on any
178
+ // platform that this will plausibly be ported to.
179
+ template <typename Integral>
180
+ struct is_uniquely_represented<
181
+ Integral, typename std::enable_if<std::is_integral<Integral>::value>::type>
182
+ : std::true_type {};
183
+
184
+ // is_uniquely_represented<bool>
185
+ //
186
+ //
187
+ template <>
188
+ struct is_uniquely_represented<bool> : std::false_type {};
189
+
190
+ // hash_bytes()
191
+ //
192
+ // Convenience function that combines `hash_state` with the byte representation
193
+ // of `value`.
194
+ template <typename H, typename T>
195
+ H hash_bytes(H hash_state, const T& value) {
196
+ const unsigned char* start = reinterpret_cast<const unsigned char*>(&value);
197
+ return H::combine_contiguous(std::move(hash_state), start, sizeof(value));
198
+ }
199
+
200
+ // PiecewiseCombiner
201
+ //
202
+ // PiecewiseCombiner is an internal-only helper class for hashing a piecewise
203
+ // buffer of `char` or `unsigned char` as though it were contiguous. This class
204
+ // provides two methods:
205
+ //
206
+ // H add_buffer(state, data, size)
207
+ // H finalize(state)
208
+ //
209
+ // `add_buffer` can be called zero or more times, followed by a single call to
210
+ // `finalize`. This will produce the same hash expansion as concatenating each
211
+ // buffer piece into a single contiguous buffer, and passing this to
212
+ // `H::combine_contiguous`.
213
+ //
214
+ // Example usage:
215
+ // PiecewiseCombiner combiner;
216
+ // for (const auto& piece : pieces) {
217
+ // state = combiner.add_buffer(std::move(state), piece.data, piece.size);
218
+ // }
219
+ // return combiner.finalize(std::move(state));
220
+ class PiecewiseCombiner {
221
+ public:
222
+ PiecewiseCombiner() : position_(0) {}
223
+ PiecewiseCombiner(const PiecewiseCombiner&) = delete;
224
+ PiecewiseCombiner& operator=(const PiecewiseCombiner&) = delete;
225
+
226
+ // PiecewiseCombiner::add_buffer()
227
+ //
228
+ // Appends the given range of bytes to the sequence to be hashed, which may
229
+ // modify the provided hash state.
230
+ template <typename H>
231
+ H add_buffer(H state, const unsigned char* data, size_t size);
232
+ template <typename H>
233
+ H add_buffer(H state, const char* data, size_t size) {
234
+ return add_buffer(std::move(state),
235
+ reinterpret_cast<const unsigned char*>(data), size);
236
+ }
237
+
238
+ // PiecewiseCombiner::finalize()
239
+ //
240
+ // Finishes combining the hash sequence, which may may modify the provided
241
+ // hash state.
242
+ //
243
+ // Once finalize() is called, add_buffer() may no longer be called. The
244
+ // resulting hash state will be the same as if the pieces passed to
245
+ // add_buffer() were concatenated into a single flat buffer, and then provided
246
+ // to H::combine_contiguous().
247
+ template <typename H>
248
+ H finalize(H state);
249
+
250
+ private:
251
+ unsigned char buf_[PiecewiseChunkSize()];
252
+ size_t position_;
253
+ };
254
+
255
+ // -----------------------------------------------------------------------------
256
+ // AbslHashValue for Basic Types
257
+ // -----------------------------------------------------------------------------
258
+
259
+ // Note: Default `AbslHashValue` implementations live in `hash_internal`. This
260
+ // allows us to block lexical scope lookup when doing an unqualified call to
261
+ // `AbslHashValue` below. User-defined implementations of `AbslHashValue` can
262
+ // only be found via ADL.
263
+
264
+ // AbslHashValue() for hashing bool values
265
+ //
266
+ // We use SFINAE to ensure that this overload only accepts bool, not types that
267
+ // are convertible to bool.
268
+ template <typename H, typename B>
269
+ typename std::enable_if<std::is_same<B, bool>::value, H>::type AbslHashValue(
270
+ H hash_state, B value) {
271
+ return H::combine(std::move(hash_state),
272
+ static_cast<unsigned char>(value ? 1 : 0));
273
+ }
274
+
275
+ // AbslHashValue() for hashing enum values
276
+ template <typename H, typename Enum>
277
+ typename std::enable_if<std::is_enum<Enum>::value, H>::type AbslHashValue(
278
+ H hash_state, Enum e) {
279
+ // In practice, we could almost certainly just invoke hash_bytes directly,
280
+ // but it's possible that a sanitizer might one day want to
281
+ // store data in the unused bits of an enum. To avoid that risk, we
282
+ // convert to the underlying type before hashing. Hopefully this will get
283
+ // optimized away; if not, we can reopen discussion with c-toolchain-team.
284
+ return H::combine(std::move(hash_state),
285
+ static_cast<typename std::underlying_type<Enum>::type>(e));
286
+ }
287
+ // AbslHashValue() for hashing floating-point values
288
+ template <typename H, typename Float>
289
+ typename std::enable_if<std::is_same<Float, float>::value ||
290
+ std::is_same<Float, double>::value,
291
+ H>::type
292
+ AbslHashValue(H hash_state, Float value) {
293
+ return hash_internal::hash_bytes(std::move(hash_state),
294
+ value == 0 ? 0 : value);
295
+ }
296
+
297
+ // Long double has the property that it might have extra unused bytes in it.
298
+ // For example, in x86 sizeof(long double)==16 but it only really uses 80-bits
299
+ // of it. This means we can't use hash_bytes on a long double and have to
300
+ // convert it to something else first.
301
+ template <typename H, typename LongDouble>
302
+ typename std::enable_if<std::is_same<LongDouble, long double>::value, H>::type
303
+ AbslHashValue(H hash_state, LongDouble value) {
304
+ const int category = std::fpclassify(value);
305
+ switch (category) {
306
+ case FP_INFINITE:
307
+ // Add the sign bit to differentiate between +Inf and -Inf
308
+ hash_state = H::combine(std::move(hash_state), std::signbit(value));
309
+ break;
310
+
311
+ case FP_NAN:
312
+ case FP_ZERO:
313
+ default:
314
+ // Category is enough for these.
315
+ break;
316
+
317
+ case FP_NORMAL:
318
+ case FP_SUBNORMAL:
319
+ // We can't convert `value` directly to double because this would have
320
+ // undefined behavior if the value is out of range.
321
+ // std::frexp gives us a value in the range (-1, -.5] or [.5, 1) that is
322
+ // guaranteed to be in range for `double`. The truncation is
323
+ // implementation defined, but that works as long as it is deterministic.
324
+ int exp;
325
+ auto mantissa = static_cast<double>(std::frexp(value, &exp));
326
+ hash_state = H::combine(std::move(hash_state), mantissa, exp);
327
+ }
328
+
329
+ return H::combine(std::move(hash_state), category);
330
+ }
331
+
332
+ // AbslHashValue() for hashing pointers
333
+ template <typename H, typename T>
334
+ H AbslHashValue(H hash_state, T* ptr) {
335
+ auto v = reinterpret_cast<uintptr_t>(ptr);
336
+ // Due to alignment, pointers tend to have low bits as zero, and the next few
337
+ // bits follow a pattern since they are also multiples of some base value.
338
+ // Mixing the pointer twice helps prevent stuck low bits for certain alignment
339
+ // values.
340
+ return H::combine(std::move(hash_state), v, v);
341
+ }
342
+
343
+ // AbslHashValue() for hashing nullptr_t
344
+ template <typename H>
345
+ H AbslHashValue(H hash_state, std::nullptr_t) {
346
+ return H::combine(std::move(hash_state), static_cast<void*>(nullptr));
347
+ }
348
+
349
+ // -----------------------------------------------------------------------------
350
+ // AbslHashValue for Composite Types
351
+ // -----------------------------------------------------------------------------
352
+
353
+ // is_hashable()
354
+ //
355
+ // Trait class which returns true if T is hashable by the absl::Hash framework.
356
+ // Used for the AbslHashValue implementations for composite types below.
357
+ template <typename T>
358
+ struct is_hashable;
359
+
360
+ // AbslHashValue() for hashing pairs
361
+ template <typename H, typename T1, typename T2>
362
+ typename std::enable_if<is_hashable<T1>::value && is_hashable<T2>::value,
363
+ H>::type
364
+ AbslHashValue(H hash_state, const std::pair<T1, T2>& p) {
365
+ return H::combine(std::move(hash_state), p.first, p.second);
366
+ }
367
+
368
+ // hash_tuple()
369
+ //
370
+ // Helper function for hashing a tuple. The third argument should
371
+ // be an index_sequence running from 0 to tuple_size<Tuple> - 1.
372
+ template <typename H, typename Tuple, size_t... Is>
373
+ H hash_tuple(H hash_state, const Tuple& t, absl::index_sequence<Is...>) {
374
+ return H::combine(std::move(hash_state), std::get<Is>(t)...);
375
+ }
376
+
377
+ // AbslHashValue for hashing tuples
378
+ template <typename H, typename... Ts>
379
+ #if defined(_MSC_VER)
380
+ // This SFINAE gets MSVC confused under some conditions. Let's just disable it
381
+ // for now.
382
+ H
383
+ #else // _MSC_VER
384
+ typename std::enable_if<absl::conjunction<is_hashable<Ts>...>::value, H>::type
385
+ #endif // _MSC_VER
386
+ AbslHashValue(H hash_state, const std::tuple<Ts...>& t) {
387
+ return hash_internal::hash_tuple(std::move(hash_state), t,
388
+ absl::make_index_sequence<sizeof...(Ts)>());
389
+ }
390
+
391
+ // -----------------------------------------------------------------------------
392
+ // AbslHashValue for Pointers
393
+ // -----------------------------------------------------------------------------
394
+
395
+ // AbslHashValue for hashing unique_ptr
396
+ template <typename H, typename T, typename D>
397
+ H AbslHashValue(H hash_state, const std::unique_ptr<T, D>& ptr) {
398
+ return H::combine(std::move(hash_state), ptr.get());
399
+ }
400
+
401
+ // AbslHashValue for hashing shared_ptr
402
+ template <typename H, typename T>
403
+ H AbslHashValue(H hash_state, const std::shared_ptr<T>& ptr) {
404
+ return H::combine(std::move(hash_state), ptr.get());
405
+ }
406
+
407
+ // -----------------------------------------------------------------------------
408
+ // AbslHashValue for String-Like Types
409
+ // -----------------------------------------------------------------------------
410
+
411
+ // AbslHashValue for hashing strings
412
+ //
413
+ // All the string-like types supported here provide the same hash expansion for
414
+ // the same character sequence. These types are:
415
+ //
416
+ // - `std::string` (and std::basic_string<char, std::char_traits<char>, A> for
417
+ // any allocator A)
418
+ // - `absl::string_view` and `std::string_view`
419
+ //
420
+ // For simplicity, we currently support only `char` strings. This support may
421
+ // be broadened, if necessary, but with some caution - this overload would
422
+ // misbehave in cases where the traits' `eq()` member isn't equivalent to `==`
423
+ // on the underlying character type.
424
+ template <typename H>
425
+ H AbslHashValue(H hash_state, absl::string_view str) {
426
+ return H::combine(
427
+ H::combine_contiguous(std::move(hash_state), str.data(), str.size()),
428
+ str.size());
429
+ }
430
+
431
+ // Support std::wstring, std::u16string and std::u32string.
432
+ template <typename Char, typename Alloc, typename H,
433
+ typename = absl::enable_if_t<std::is_same<Char, wchar_t>::value ||
434
+ std::is_same<Char, char16_t>::value ||
435
+ std::is_same<Char, char32_t>::value>>
436
+ H AbslHashValue(
437
+ H hash_state,
438
+ const std::basic_string<Char, std::char_traits<Char>, Alloc>& str) {
439
+ return H::combine(
440
+ H::combine_contiguous(std::move(hash_state), str.data(), str.size()),
441
+ str.size());
442
+ }
443
+
444
+ // -----------------------------------------------------------------------------
445
+ // AbslHashValue for Sequence Containers
446
+ // -----------------------------------------------------------------------------
447
+
448
+ // AbslHashValue for hashing std::array
449
+ template <typename H, typename T, size_t N>
450
+ typename std::enable_if<is_hashable<T>::value, H>::type AbslHashValue(
451
+ H hash_state, const std::array<T, N>& array) {
452
+ return H::combine_contiguous(std::move(hash_state), array.data(),
453
+ array.size());
454
+ }
455
+
456
+ // AbslHashValue for hashing std::deque
457
+ template <typename H, typename T, typename Allocator>
458
+ typename std::enable_if<is_hashable<T>::value, H>::type AbslHashValue(
459
+ H hash_state, const std::deque<T, Allocator>& deque) {
460
+ // TODO(gromer): investigate a more efficient implementation taking
461
+ // advantage of the chunk structure.
462
+ for (const auto& t : deque) {
463
+ hash_state = H::combine(std::move(hash_state), t);
464
+ }
465
+ return H::combine(std::move(hash_state), deque.size());
466
+ }
467
+
468
+ // AbslHashValue for hashing std::forward_list
469
+ template <typename H, typename T, typename Allocator>
470
+ typename std::enable_if<is_hashable<T>::value, H>::type AbslHashValue(
471
+ H hash_state, const std::forward_list<T, Allocator>& list) {
472
+ size_t size = 0;
473
+ for (const T& t : list) {
474
+ hash_state = H::combine(std::move(hash_state), t);
475
+ ++size;
476
+ }
477
+ return H::combine(std::move(hash_state), size);
478
+ }
479
+
480
+ // AbslHashValue for hashing std::list
481
+ template <typename H, typename T, typename Allocator>
482
+ typename std::enable_if<is_hashable<T>::value, H>::type AbslHashValue(
483
+ H hash_state, const std::list<T, Allocator>& list) {
484
+ for (const auto& t : list) {
485
+ hash_state = H::combine(std::move(hash_state), t);
486
+ }
487
+ return H::combine(std::move(hash_state), list.size());
488
+ }
489
+
490
+ // AbslHashValue for hashing std::vector
491
+ //
492
+ // Do not use this for vector<bool>. It does not have a .data(), and a fallback
493
+ // for std::hash<> is most likely faster.
494
+ template <typename H, typename T, typename Allocator>
495
+ typename std::enable_if<is_hashable<T>::value && !std::is_same<T, bool>::value,
496
+ H>::type
497
+ AbslHashValue(H hash_state, const std::vector<T, Allocator>& vector) {
498
+ return H::combine(H::combine_contiguous(std::move(hash_state), vector.data(),
499
+ vector.size()),
500
+ vector.size());
501
+ }
502
+
503
+ // -----------------------------------------------------------------------------
504
+ // AbslHashValue for Ordered Associative Containers
505
+ // -----------------------------------------------------------------------------
506
+
507
+ // AbslHashValue for hashing std::map
508
+ template <typename H, typename Key, typename T, typename Compare,
509
+ typename Allocator>
510
+ typename std::enable_if<is_hashable<Key>::value && is_hashable<T>::value,
511
+ H>::type
512
+ AbslHashValue(H hash_state, const std::map<Key, T, Compare, Allocator>& map) {
513
+ for (const auto& t : map) {
514
+ hash_state = H::combine(std::move(hash_state), t);
515
+ }
516
+ return H::combine(std::move(hash_state), map.size());
517
+ }
518
+
519
+ // AbslHashValue for hashing std::multimap
520
+ template <typename H, typename Key, typename T, typename Compare,
521
+ typename Allocator>
522
+ typename std::enable_if<is_hashable<Key>::value && is_hashable<T>::value,
523
+ H>::type
524
+ AbslHashValue(H hash_state,
525
+ const std::multimap<Key, T, Compare, Allocator>& map) {
526
+ for (const auto& t : map) {
527
+ hash_state = H::combine(std::move(hash_state), t);
528
+ }
529
+ return H::combine(std::move(hash_state), map.size());
530
+ }
531
+
532
+ // AbslHashValue for hashing std::set
533
+ template <typename H, typename Key, typename Compare, typename Allocator>
534
+ typename std::enable_if<is_hashable<Key>::value, H>::type AbslHashValue(
535
+ H hash_state, const std::set<Key, Compare, Allocator>& set) {
536
+ for (const auto& t : set) {
537
+ hash_state = H::combine(std::move(hash_state), t);
538
+ }
539
+ return H::combine(std::move(hash_state), set.size());
540
+ }
541
+
542
+ // AbslHashValue for hashing std::multiset
543
+ template <typename H, typename Key, typename Compare, typename Allocator>
544
+ typename std::enable_if<is_hashable<Key>::value, H>::type AbslHashValue(
545
+ H hash_state, const std::multiset<Key, Compare, Allocator>& set) {
546
+ for (const auto& t : set) {
547
+ hash_state = H::combine(std::move(hash_state), t);
548
+ }
549
+ return H::combine(std::move(hash_state), set.size());
550
+ }
551
+
552
+ // -----------------------------------------------------------------------------
553
+ // AbslHashValue for Wrapper Types
554
+ // -----------------------------------------------------------------------------
555
+
556
+ // AbslHashValue for hashing absl::optional
557
+ template <typename H, typename T>
558
+ typename std::enable_if<is_hashable<T>::value, H>::type AbslHashValue(
559
+ H hash_state, const absl::optional<T>& opt) {
560
+ if (opt) hash_state = H::combine(std::move(hash_state), *opt);
561
+ return H::combine(std::move(hash_state), opt.has_value());
562
+ }
563
+
564
+ // VariantVisitor
565
+ template <typename H>
566
+ struct VariantVisitor {
567
+ H&& hash_state;
568
+ template <typename T>
569
+ H operator()(const T& t) const {
570
+ return H::combine(std::move(hash_state), t);
571
+ }
572
+ };
573
+
574
+ // AbslHashValue for hashing absl::variant
575
+ template <typename H, typename... T>
576
+ typename std::enable_if<conjunction<is_hashable<T>...>::value, H>::type
577
+ AbslHashValue(H hash_state, const absl::variant<T...>& v) {
578
+ if (!v.valueless_by_exception()) {
579
+ hash_state = absl::visit(VariantVisitor<H>{std::move(hash_state)}, v);
580
+ }
581
+ return H::combine(std::move(hash_state), v.index());
582
+ }
583
+
584
+ // -----------------------------------------------------------------------------
585
+ // AbslHashValue for Other Types
586
+ // -----------------------------------------------------------------------------
587
+
588
+ // AbslHashValue for hashing std::bitset is not defined, for the same reason as
589
+ // for vector<bool> (see std::vector above): It does not expose the raw bytes,
590
+ // and a fallback to std::hash<> is most likely faster.
591
+
592
+ // -----------------------------------------------------------------------------
593
+
594
+ // hash_range_or_bytes()
595
+ //
596
+ // Mixes all values in the range [data, data+size) into the hash state.
597
+ // This overload accepts only uniquely-represented types, and hashes them by
598
+ // hashing the entire range of bytes.
599
+ template <typename H, typename T>
600
+ typename std::enable_if<is_uniquely_represented<T>::value, H>::type
601
+ hash_range_or_bytes(H hash_state, const T* data, size_t size) {
602
+ const auto* bytes = reinterpret_cast<const unsigned char*>(data);
603
+ return H::combine_contiguous(std::move(hash_state), bytes, sizeof(T) * size);
604
+ }
605
+
606
+ // hash_range_or_bytes()
607
+ template <typename H, typename T>
608
+ typename std::enable_if<!is_uniquely_represented<T>::value, H>::type
609
+ hash_range_or_bytes(H hash_state, const T* data, size_t size) {
610
+ for (const auto end = data + size; data < end; ++data) {
611
+ hash_state = H::combine(std::move(hash_state), *data);
612
+ }
613
+ return hash_state;
614
+ }
615
+
616
+ #if defined(ABSL_INTERNAL_LEGACY_HASH_NAMESPACE) && \
617
+ ABSL_META_INTERNAL_STD_HASH_SFINAE_FRIENDLY_
618
+ #define ABSL_HASH_INTERNAL_SUPPORT_LEGACY_HASH_ 1
619
+ #else
620
+ #define ABSL_HASH_INTERNAL_SUPPORT_LEGACY_HASH_ 0
621
+ #endif
622
+
623
+ // HashSelect
624
+ //
625
+ // Type trait to select the appropriate hash implementation to use.
626
+ // HashSelect::type<T> will give the proper hash implementation, to be invoked
627
+ // as:
628
+ // HashSelect::type<T>::Invoke(state, value)
629
+ // Also, HashSelect::type<T>::value is a boolean equal to `true` if there is a
630
+ // valid `Invoke` function. Types that are not hashable will have a ::value of
631
+ // `false`.
632
+ struct HashSelect {
633
+ private:
634
+ struct State : HashStateBase<State> {
635
+ static State combine_contiguous(State hash_state, const unsigned char*,
636
+ size_t);
637
+ using State::HashStateBase::combine_contiguous;
638
+ };
639
+
640
+ struct UniquelyRepresentedProbe {
641
+ template <typename H, typename T>
642
+ static auto Invoke(H state, const T& value)
643
+ -> absl::enable_if_t<is_uniquely_represented<T>::value, H> {
644
+ return hash_internal::hash_bytes(std::move(state), value);
645
+ }
646
+ };
647
+
648
+ struct HashValueProbe {
649
+ template <typename H, typename T>
650
+ static auto Invoke(H state, const T& value) -> absl::enable_if_t<
651
+ std::is_same<H,
652
+ decltype(AbslHashValue(std::move(state), value))>::value,
653
+ H> {
654
+ return AbslHashValue(std::move(state), value);
655
+ }
656
+ };
657
+
658
+ struct LegacyHashProbe {
659
+ #if ABSL_HASH_INTERNAL_SUPPORT_LEGACY_HASH_
660
+ template <typename H, typename T>
661
+ static auto Invoke(H state, const T& value) -> absl::enable_if_t<
662
+ std::is_convertible<
663
+ decltype(ABSL_INTERNAL_LEGACY_HASH_NAMESPACE::hash<T>()(value)),
664
+ size_t>::value,
665
+ H> {
666
+ return hash_internal::hash_bytes(
667
+ std::move(state),
668
+ ABSL_INTERNAL_LEGACY_HASH_NAMESPACE::hash<T>{}(value));
669
+ }
670
+ #endif // ABSL_HASH_INTERNAL_SUPPORT_LEGACY_HASH_
671
+ };
672
+
673
+ struct StdHashProbe {
674
+ template <typename H, typename T>
675
+ static auto Invoke(H state, const T& value)
676
+ -> absl::enable_if_t<type_traits_internal::IsHashable<T>::value, H> {
677
+ return hash_internal::hash_bytes(std::move(state), std::hash<T>{}(value));
678
+ }
679
+ };
680
+
681
+ template <typename Hash, typename T>
682
+ struct Probe : Hash {
683
+ private:
684
+ template <typename H, typename = decltype(H::Invoke(
685
+ std::declval<State>(), std::declval<const T&>()))>
686
+ static std::true_type Test(int);
687
+ template <typename U>
688
+ static std::false_type Test(char);
689
+
690
+ public:
691
+ static constexpr bool value = decltype(Test<Hash>(0))::value;
692
+ };
693
+
694
+ public:
695
+ // Probe each implementation in order.
696
+ // disjunction provides short circuiting wrt instantiation.
697
+ template <typename T>
698
+ using Apply = absl::disjunction< //
699
+ Probe<UniquelyRepresentedProbe, T>, //
700
+ Probe<HashValueProbe, T>, //
701
+ Probe<LegacyHashProbe, T>, //
702
+ Probe<StdHashProbe, T>, //
703
+ std::false_type>;
704
+ };
705
+
706
+ template <typename T>
707
+ struct is_hashable
708
+ : std::integral_constant<bool, HashSelect::template Apply<T>::value> {};
709
+
710
+ // CityHashState
711
+ class ABSL_DLL CityHashState
712
+ : public HashStateBase<CityHashState> {
713
+ // absl::uint128 is not an alias or a thin wrapper around the intrinsic.
714
+ // We use the intrinsic when available to improve performance.
715
+ #ifdef ABSL_HAVE_INTRINSIC_INT128
716
+ using uint128 = __uint128_t;
717
+ #else // ABSL_HAVE_INTRINSIC_INT128
718
+ using uint128 = absl::uint128;
719
+ #endif // ABSL_HAVE_INTRINSIC_INT128
720
+
721
+ static constexpr uint64_t kMul =
722
+ sizeof(size_t) == 4 ? uint64_t{0xcc9e2d51}
723
+ : uint64_t{0x9ddfea08eb382d69};
724
+
725
+ template <typename T>
726
+ using IntegralFastPath =
727
+ conjunction<std::is_integral<T>, is_uniquely_represented<T>>;
728
+
729
+ public:
730
+ // Move only
731
+ CityHashState(CityHashState&&) = default;
732
+ CityHashState& operator=(CityHashState&&) = default;
733
+
734
+ // CityHashState::combine_contiguous()
735
+ //
736
+ // Fundamental base case for hash recursion: mixes the given range of bytes
737
+ // into the hash state.
738
+ static CityHashState combine_contiguous(CityHashState hash_state,
739
+ const unsigned char* first,
740
+ size_t size) {
741
+ return CityHashState(
742
+ CombineContiguousImpl(hash_state.state_, first, size,
743
+ std::integral_constant<int, sizeof(size_t)>{}));
744
+ }
745
+ using CityHashState::HashStateBase::combine_contiguous;
746
+
747
+ // CityHashState::hash()
748
+ //
749
+ // For performance reasons in non-opt mode, we specialize this for
750
+ // integral types.
751
+ // Otherwise we would be instantiating and calling dozens of functions for
752
+ // something that is just one multiplication and a couple xor's.
753
+ // The result should be the same as running the whole algorithm, but faster.
754
+ template <typename T, absl::enable_if_t<IntegralFastPath<T>::value, int> = 0>
755
+ static size_t hash(T value) {
756
+ return static_cast<size_t>(Mix(Seed(), static_cast<uint64_t>(value)));
757
+ }
758
+
759
+ // Overload of CityHashState::hash()
760
+ template <typename T, absl::enable_if_t<!IntegralFastPath<T>::value, int> = 0>
761
+ static size_t hash(const T& value) {
762
+ return static_cast<size_t>(combine(CityHashState{}, value).state_);
763
+ }
764
+
765
+ private:
766
+ // Invoked only once for a given argument; that plus the fact that this is
767
+ // move-only ensures that there is only one non-moved-from object.
768
+ CityHashState() : state_(Seed()) {}
769
+
770
+ // Workaround for MSVC bug.
771
+ // We make the type copyable to fix the calling convention, even though we
772
+ // never actually copy it. Keep it private to not affect the public API of the
773
+ // type.
774
+ CityHashState(const CityHashState&) = default;
775
+
776
+ explicit CityHashState(uint64_t state) : state_(state) {}
777
+
778
+ // Implementation of the base case for combine_contiguous where we actually
779
+ // mix the bytes into the state.
780
+ // Dispatch to different implementations of the combine_contiguous depending
781
+ // on the value of `sizeof(size_t)`.
782
+ static uint64_t CombineContiguousImpl(uint64_t state,
783
+ const unsigned char* first, size_t len,
784
+ std::integral_constant<int, 4>
785
+ /* sizeof_size_t */);
786
+ static uint64_t CombineContiguousImpl(uint64_t state,
787
+ const unsigned char* first, size_t len,
788
+ std::integral_constant<int, 8>
789
+ /* sizeof_size_t*/);
790
+
791
+ // Slow dispatch path for calls to CombineContiguousImpl with a size argument
792
+ // larger than PiecewiseChunkSize(). Has the same effect as calling
793
+ // CombineContiguousImpl() repeatedly with the chunk stride size.
794
+ static uint64_t CombineLargeContiguousImpl32(uint64_t state,
795
+ const unsigned char* first,
796
+ size_t len);
797
+ static uint64_t CombineLargeContiguousImpl64(uint64_t state,
798
+ const unsigned char* first,
799
+ size_t len);
800
+
801
+ // Reads 9 to 16 bytes from p.
802
+ // The first 8 bytes are in .first, the rest (zero padded) bytes are in
803
+ // .second.
804
+ static std::pair<uint64_t, uint64_t> Read9To16(const unsigned char* p,
805
+ size_t len) {
806
+ uint64_t high = little_endian::Load64(p + len - 8);
807
+ return {little_endian::Load64(p), high >> (128 - len * 8)};
808
+ }
809
+
810
+ // Reads 4 to 8 bytes from p. Zero pads to fill uint64_t.
811
+ static uint64_t Read4To8(const unsigned char* p, size_t len) {
812
+ return (static_cast<uint64_t>(little_endian::Load32(p + len - 4))
813
+ << (len - 4) * 8) |
814
+ little_endian::Load32(p);
815
+ }
816
+
817
+ // Reads 1 to 3 bytes from p. Zero pads to fill uint32_t.
818
+ static uint32_t Read1To3(const unsigned char* p, size_t len) {
819
+ return static_cast<uint32_t>((p[0]) | //
820
+ (p[len / 2] << (len / 2 * 8)) | //
821
+ (p[len - 1] << ((len - 1) * 8)));
822
+ }
823
+
824
+ ABSL_ATTRIBUTE_ALWAYS_INLINE static uint64_t Mix(uint64_t state, uint64_t v) {
825
+ using MultType =
826
+ absl::conditional_t<sizeof(size_t) == 4, uint64_t, uint128>;
827
+ // We do the addition in 64-bit space to make sure the 128-bit
828
+ // multiplication is fast. If we were to do it as MultType the compiler has
829
+ // to assume that the high word is non-zero and needs to perform 2
830
+ // multiplications instead of one.
831
+ MultType m = state + v;
832
+ m *= kMul;
833
+ return static_cast<uint64_t>(m ^ (m >> (sizeof(m) * 8 / 2)));
834
+ }
835
+
836
+ // Seed()
837
+ //
838
+ // A non-deterministic seed.
839
+ //
840
+ // The current purpose of this seed is to generate non-deterministic results
841
+ // and prevent having users depend on the particular hash values.
842
+ // It is not meant as a security feature right now, but it leaves the door
843
+ // open to upgrade it to a true per-process random seed. A true random seed
844
+ // costs more and we don't need to pay for that right now.
845
+ //
846
+ // On platforms with ASLR, we take advantage of it to make a per-process
847
+ // random value.
848
+ // See https://en.wikipedia.org/wiki/Address_space_layout_randomization
849
+ //
850
+ // On other platforms this is still going to be non-deterministic but most
851
+ // probably per-build and not per-process.
852
+ ABSL_ATTRIBUTE_ALWAYS_INLINE static uint64_t Seed() {
853
+ return static_cast<uint64_t>(reinterpret_cast<uintptr_t>(kSeed));
854
+ }
855
+ static const void* const kSeed;
856
+
857
+ uint64_t state_;
858
+ };
859
+
860
+ // CityHashState::CombineContiguousImpl()
861
+ inline uint64_t CityHashState::CombineContiguousImpl(
862
+ uint64_t state, const unsigned char* first, size_t len,
863
+ std::integral_constant<int, 4> /* sizeof_size_t */) {
864
+ // For large values we use CityHash, for small ones we just use a
865
+ // multiplicative hash.
866
+ uint64_t v;
867
+ if (len > 8) {
868
+ if (ABSL_PREDICT_FALSE(len > PiecewiseChunkSize())) {
869
+ return CombineLargeContiguousImpl32(state, first, len);
870
+ }
871
+ v = absl::hash_internal::CityHash32(reinterpret_cast<const char*>(first), len);
872
+ } else if (len >= 4) {
873
+ v = Read4To8(first, len);
874
+ } else if (len > 0) {
875
+ v = Read1To3(first, len);
876
+ } else {
877
+ // Empty ranges have no effect.
878
+ return state;
879
+ }
880
+ return Mix(state, v);
881
+ }
882
+
883
+ // Overload of CityHashState::CombineContiguousImpl()
884
+ inline uint64_t CityHashState::CombineContiguousImpl(
885
+ uint64_t state, const unsigned char* first, size_t len,
886
+ std::integral_constant<int, 8> /* sizeof_size_t */) {
887
+ // For large values we use CityHash, for small ones we just use a
888
+ // multiplicative hash.
889
+ uint64_t v;
890
+ if (len > 16) {
891
+ if (ABSL_PREDICT_FALSE(len > PiecewiseChunkSize())) {
892
+ return CombineLargeContiguousImpl64(state, first, len);
893
+ }
894
+ v = absl::hash_internal::CityHash64(reinterpret_cast<const char*>(first), len);
895
+ } else if (len > 8) {
896
+ auto p = Read9To16(first, len);
897
+ state = Mix(state, p.first);
898
+ v = p.second;
899
+ } else if (len >= 4) {
900
+ v = Read4To8(first, len);
901
+ } else if (len > 0) {
902
+ v = Read1To3(first, len);
903
+ } else {
904
+ // Empty ranges have no effect.
905
+ return state;
906
+ }
907
+ return Mix(state, v);
908
+ }
909
+
910
+ struct AggregateBarrier {};
911
+
912
+ // HashImpl
913
+
914
+ // Add a private base class to make sure this type is not an aggregate.
915
+ // Aggregates can be aggregate initialized even if the default constructor is
916
+ // deleted.
917
+ struct PoisonedHash : private AggregateBarrier {
918
+ PoisonedHash() = delete;
919
+ PoisonedHash(const PoisonedHash&) = delete;
920
+ PoisonedHash& operator=(const PoisonedHash&) = delete;
921
+ };
922
+
923
+ template <typename T>
924
+ struct HashImpl {
925
+ size_t operator()(const T& value) const { return CityHashState::hash(value); }
926
+ };
927
+
928
+ template <typename T>
929
+ struct Hash
930
+ : absl::conditional_t<is_hashable<T>::value, HashImpl<T>, PoisonedHash> {};
931
+
932
+ template <typename H>
933
+ template <typename T, typename... Ts>
934
+ H HashStateBase<H>::combine(H state, const T& value, const Ts&... values) {
935
+ return H::combine(hash_internal::HashSelect::template Apply<T>::Invoke(
936
+ std::move(state), value),
937
+ values...);
938
+ }
939
+
940
+ // HashStateBase::combine_contiguous()
941
+ template <typename H>
942
+ template <typename T>
943
+ H HashStateBase<H>::combine_contiguous(H state, const T* data, size_t size) {
944
+ return hash_internal::hash_range_or_bytes(std::move(state), data, size);
945
+ }
946
+
947
+ // HashStateBase::PiecewiseCombiner::add_buffer()
948
+ template <typename H>
949
+ H PiecewiseCombiner::add_buffer(H state, const unsigned char* data,
950
+ size_t size) {
951
+ if (position_ + size < PiecewiseChunkSize()) {
952
+ // This partial chunk does not fill our existing buffer
953
+ memcpy(buf_ + position_, data, size);
954
+ position_ += size;
955
+ return state;
956
+ }
957
+
958
+ // Complete the buffer and hash it
959
+ const size_t bytes_needed = PiecewiseChunkSize() - position_;
960
+ memcpy(buf_ + position_, data, bytes_needed);
961
+ state = H::combine_contiguous(std::move(state), buf_, PiecewiseChunkSize());
962
+ data += bytes_needed;
963
+ size -= bytes_needed;
964
+
965
+ // Hash whatever chunks we can without copying
966
+ while (size >= PiecewiseChunkSize()) {
967
+ state = H::combine_contiguous(std::move(state), data, PiecewiseChunkSize());
968
+ data += PiecewiseChunkSize();
969
+ size -= PiecewiseChunkSize();
970
+ }
971
+ // Fill the buffer with the remainder
972
+ memcpy(buf_, data, size);
973
+ position_ = size;
974
+ return state;
975
+ }
976
+
977
+ // HashStateBase::PiecewiseCombiner::finalize()
978
+ template <typename H>
979
+ H PiecewiseCombiner::finalize(H state) {
980
+ // Hash the remainder left in the buffer, which may be empty
981
+ return H::combine_contiguous(std::move(state), buf_, position_);
982
+ }
983
+
984
+ } // namespace hash_internal
985
+ ABSL_NAMESPACE_END
986
+ } // namespace absl
987
+
988
+ #endif // ABSL_HASH_INTERNAL_HASH_H_