pigeonhole-db 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1256) hide show
  1. checksums.yaml +7 -0
  2. data/Cargo.lock +899 -0
  3. data/Cargo.toml +45 -0
  4. data/LICENSE +21 -0
  5. data/README.md +22 -0
  6. data/extconf.rb +12 -0
  7. data/lib/pigeonhole/api.rb +615 -0
  8. data/lib/pigeonhole/index.rb +208 -0
  9. data/lib/pigeonhole/memory.rb +507 -0
  10. data/lib/pigeonhole/version.rb +6 -0
  11. data/lib/pigeonhole-db.rb +6 -0
  12. data/lib/pigeonhole.rb +47 -0
  13. data/sig/pigeonhole.rbs +1484 -0
  14. data/src/budget.rs +205 -0
  15. data/src/classes.rs +279 -0
  16. data/src/convert.rs +192 -0
  17. data/src/db.rs +685 -0
  18. data/src/error.rs +151 -0
  19. data/src/feed.rs +316 -0
  20. data/src/fork.rs +64 -0
  21. data/src/gvl.rs +112 -0
  22. data/src/index.rs +1157 -0
  23. data/src/lib.rs +534 -0
  24. data/src/memory.rs +2178 -0
  25. data/src/read.rs +312 -0
  26. data/src/table.rs +1161 -0
  27. data/src/vector.rs +262 -0
  28. data/src/walk.rs +406 -0
  29. data/vendor/bundle/ruby/3.4.0/bin/minitest +29 -0
  30. data/vendor/bundle/ruby/3.4.0/bin/rake +29 -0
  31. data/vendor/bundle/ruby/3.4.0/bin/rake-compiler +29 -0
  32. data/vendor/bundle/ruby/3.4.0/bin/rake-compiler-dock +29 -0
  33. data/vendor/bundle/ruby/3.4.0/bin/rb-sys-dock +29 -0
  34. data/vendor/bundle/ruby/3.4.0/bin/rbs +29 -0
  35. data/vendor/bundle/ruby/3.4.0/cache/drb-2.2.3.gem +0 -0
  36. data/vendor/bundle/ruby/3.4.0/cache/logger-1.7.0.gem +0 -0
  37. data/vendor/bundle/ruby/3.4.0/cache/minitest-6.0.6.gem +0 -0
  38. data/vendor/bundle/ruby/3.4.0/cache/prism-1.9.0.gem +0 -0
  39. data/vendor/bundle/ruby/3.4.0/cache/rake-13.4.2.gem +0 -0
  40. data/vendor/bundle/ruby/3.4.0/cache/rake-compiler-1.3.2.gem +0 -0
  41. data/vendor/bundle/ruby/3.4.0/cache/rake-compiler-dock-1.12.0.gem +0 -0
  42. data/vendor/bundle/ruby/3.4.0/cache/rb_sys-0.9.130.gem +0 -0
  43. data/vendor/bundle/ruby/3.4.0/cache/rbs-4.2.0.gem +0 -0
  44. data/vendor/bundle/ruby/3.4.0/cache/toml-rb-6.0.0.gem +0 -0
  45. data/vendor/bundle/ruby/3.4.0/cache/tsort-0.2.0.gem +0 -0
  46. data/vendor/bundle/ruby/3.4.0/extensions/x86_64-linux/3.4.0/prism-1.9.0/gem.build_complete +0 -0
  47. data/vendor/bundle/ruby/3.4.0/extensions/x86_64-linux/3.4.0/prism-1.9.0/gem_make.out +44 -0
  48. data/vendor/bundle/ruby/3.4.0/extensions/x86_64-linux/3.4.0/prism-1.9.0/mkmf.log +74 -0
  49. data/vendor/bundle/ruby/3.4.0/extensions/x86_64-linux/3.4.0/prism-1.9.0/prism/prism.so +0 -0
  50. data/vendor/bundle/ruby/3.4.0/extensions/x86_64-linux/3.4.0/rbs-4.2.0/gem.build_complete +0 -0
  51. data/vendor/bundle/ruby/3.4.0/extensions/x86_64-linux/3.4.0/rbs-4.2.0/gem_make.out +41 -0
  52. data/vendor/bundle/ruby/3.4.0/extensions/x86_64-linux/3.4.0/rbs-4.2.0/mkmf.log +102 -0
  53. data/vendor/bundle/ruby/3.4.0/extensions/x86_64-linux/3.4.0/rbs-4.2.0/rbs_extension.so +0 -0
  54. data/vendor/bundle/ruby/3.4.0/gems/drb-2.2.3/LICENSE.txt +22 -0
  55. data/vendor/bundle/ruby/3.4.0/gems/drb-2.2.3/drb.gemspec +42 -0
  56. data/vendor/bundle/ruby/3.4.0/gems/drb-2.2.3/lib/drb/acl.rb +239 -0
  57. data/vendor/bundle/ruby/3.4.0/gems/drb-2.2.3/lib/drb/drb.rb +1993 -0
  58. data/vendor/bundle/ruby/3.4.0/gems/drb-2.2.3/lib/drb/eq.rb +15 -0
  59. data/vendor/bundle/ruby/3.4.0/gems/drb-2.2.3/lib/drb/extserv.rb +44 -0
  60. data/vendor/bundle/ruby/3.4.0/gems/drb-2.2.3/lib/drb/extservm.rb +94 -0
  61. data/vendor/bundle/ruby/3.4.0/gems/drb-2.2.3/lib/drb/gw.rb +161 -0
  62. data/vendor/bundle/ruby/3.4.0/gems/drb-2.2.3/lib/drb/observer.rb +26 -0
  63. data/vendor/bundle/ruby/3.4.0/gems/drb-2.2.3/lib/drb/ssl.rb +354 -0
  64. data/vendor/bundle/ruby/3.4.0/gems/drb-2.2.3/lib/drb/timeridconv.rb +97 -0
  65. data/vendor/bundle/ruby/3.4.0/gems/drb-2.2.3/lib/drb/unix.rb +118 -0
  66. data/vendor/bundle/ruby/3.4.0/gems/drb-2.2.3/lib/drb/version.rb +3 -0
  67. data/vendor/bundle/ruby/3.4.0/gems/drb-2.2.3/lib/drb/weakidconv.rb +31 -0
  68. data/vendor/bundle/ruby/3.4.0/gems/drb-2.2.3/lib/drb.rb +3 -0
  69. data/vendor/bundle/ruby/3.4.0/gems/logger-1.7.0/BSDL +22 -0
  70. data/vendor/bundle/ruby/3.4.0/gems/logger-1.7.0/COPYING +56 -0
  71. data/vendor/bundle/ruby/3.4.0/gems/logger-1.7.0/README.md +104 -0
  72. data/vendor/bundle/ruby/3.4.0/gems/logger-1.7.0/lib/logger/errors.rb +9 -0
  73. data/vendor/bundle/ruby/3.4.0/gems/logger-1.7.0/lib/logger/formatter.rb +36 -0
  74. data/vendor/bundle/ruby/3.4.0/gems/logger-1.7.0/lib/logger/log_device.rb +265 -0
  75. data/vendor/bundle/ruby/3.4.0/gems/logger-1.7.0/lib/logger/period.rb +47 -0
  76. data/vendor/bundle/ruby/3.4.0/gems/logger-1.7.0/lib/logger/severity.rb +38 -0
  77. data/vendor/bundle/ruby/3.4.0/gems/logger-1.7.0/lib/logger/version.rb +5 -0
  78. data/vendor/bundle/ruby/3.4.0/gems/logger-1.7.0/lib/logger.rb +789 -0
  79. data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/History.rdoc +1860 -0
  80. data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/Manifest.txt +41 -0
  81. data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/README.rdoc +763 -0
  82. data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/Rakefile +89 -0
  83. data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/bin/minitest +5 -0
  84. data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/design_rationale.rb +54 -0
  85. data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/lib/hoe/minitest.rb +30 -0
  86. data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/lib/minitest/assertions.rb +821 -0
  87. data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/lib/minitest/autorun.rb +5 -0
  88. data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/lib/minitest/benchmark.rb +452 -0
  89. data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/lib/minitest/bisect.rb +304 -0
  90. data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/lib/minitest/complete.rb +56 -0
  91. data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/lib/minitest/compress.rb +94 -0
  92. data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/lib/minitest/error_on_warning.rb +11 -0
  93. data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/lib/minitest/expectations.rb +321 -0
  94. data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/lib/minitest/find_minimal_combination.rb +127 -0
  95. data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/lib/minitest/hell.rb +11 -0
  96. data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/lib/minitest/manual_plugins.rb +4 -0
  97. data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/lib/minitest/parallel.rb +72 -0
  98. data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/lib/minitest/path_expander.rb +432 -0
  99. data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/lib/minitest/pride.rb +4 -0
  100. data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/lib/minitest/pride_plugin.rb +135 -0
  101. data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/lib/minitest/server.rb +49 -0
  102. data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/lib/minitest/server_plugin.rb +88 -0
  103. data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/lib/minitest/spec.rb +324 -0
  104. data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/lib/minitest/sprint.rb +105 -0
  105. data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/lib/minitest/sprint_plugin.rb +39 -0
  106. data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/lib/minitest/test.rb +232 -0
  107. data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/lib/minitest/test_task.rb +331 -0
  108. data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/lib/minitest.rb +1232 -0
  109. data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/test/minitest/metametameta.rb +150 -0
  110. data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/test/minitest/test_bisect.rb +249 -0
  111. data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/test/minitest/test_find_minimal_combination.rb +138 -0
  112. data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/test/minitest/test_minitest_assertions.rb +1729 -0
  113. data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/test/minitest/test_minitest_benchmark.rb +151 -0
  114. data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/test/minitest/test_minitest_reporter.rb +437 -0
  115. data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/test/minitest/test_minitest_spec.rb +1095 -0
  116. data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/test/minitest/test_minitest_test.rb +1295 -0
  117. data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/test/minitest/test_minitest_test_task.rb +57 -0
  118. data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/test/minitest/test_path_expander.rb +229 -0
  119. data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/test/minitest/test_server.rb +146 -0
  120. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/BSDmakefile +58 -0
  121. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/CHANGELOG.md +786 -0
  122. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/CODE_OF_CONDUCT.md +76 -0
  123. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/CONTRIBUTING.md +58 -0
  124. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/LICENSE.md +7 -0
  125. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/Makefile +116 -0
  126. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/README.md +143 -0
  127. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/config.yml +4739 -0
  128. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/docs/build_system.md +119 -0
  129. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/docs/configuration.md +68 -0
  130. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/docs/cruby_compilation.md +27 -0
  131. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/docs/design.md +53 -0
  132. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/docs/encoding.md +121 -0
  133. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/docs/fuzzing.md +88 -0
  134. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/docs/heredocs.md +36 -0
  135. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/docs/javascript.md +118 -0
  136. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/docs/local_variable_depth.md +229 -0
  137. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/docs/mapping.md +117 -0
  138. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/docs/parser_translation.md +24 -0
  139. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/docs/parsing_rules.md +22 -0
  140. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/docs/releasing.md +75 -0
  141. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/docs/relocation.md +34 -0
  142. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/docs/ripper_translation.md +63 -0
  143. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/docs/ruby_api.md +45 -0
  144. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/docs/ruby_parser_translation.md +19 -0
  145. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/docs/serialization.md +233 -0
  146. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/docs/testing.md +55 -0
  147. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/ext/prism/Makefile +273 -0
  148. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/ext/prism/api_node.c +6945 -0
  149. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/ext/prism/api_pack.c +276 -0
  150. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/ext/prism/extconf.rb +127 -0
  151. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/ext/prism/extension.c +1427 -0
  152. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/ext/prism/extension.h +19 -0
  153. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/include/prism/ast.h +8254 -0
  154. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/include/prism/defines.h +260 -0
  155. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/include/prism/diagnostic.h +458 -0
  156. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/include/prism/encoding.h +283 -0
  157. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/include/prism/node.h +129 -0
  158. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/include/prism/options.h +488 -0
  159. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/include/prism/pack.h +163 -0
  160. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/include/prism/parser.h +936 -0
  161. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/include/prism/prettyprint.h +34 -0
  162. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/include/prism/regexp.h +43 -0
  163. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/include/prism/static_literals.h +121 -0
  164. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/include/prism/util/pm_buffer.h +236 -0
  165. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/include/prism/util/pm_char.h +204 -0
  166. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/include/prism/util/pm_constant_pool.h +218 -0
  167. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/include/prism/util/pm_integer.h +130 -0
  168. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/include/prism/util/pm_list.h +103 -0
  169. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/include/prism/util/pm_memchr.h +29 -0
  170. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/include/prism/util/pm_newline_list.h +113 -0
  171. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/include/prism/util/pm_string.h +200 -0
  172. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/include/prism/util/pm_strncasecmp.h +32 -0
  173. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/include/prism/util/pm_strpbrk.h +46 -0
  174. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/include/prism/version.h +29 -0
  175. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/include/prism.h +408 -0
  176. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/compiler.rb +801 -0
  177. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/desugar_compiler.rb +392 -0
  178. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/dispatcher.rb +2210 -0
  179. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/dot_visitor.rb +4767 -0
  180. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/dsl.rb +1003 -0
  181. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/ffi.rb +578 -0
  182. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/inspect_visitor.rb +2393 -0
  183. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/lex_compat.rb +911 -0
  184. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/mutation_compiler.rb +772 -0
  185. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/node.rb +19966 -0
  186. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/node_ext.rb +511 -0
  187. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/pack.rb +230 -0
  188. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/parse_result/comments.rb +188 -0
  189. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/parse_result/errors.rb +66 -0
  190. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/parse_result/newlines.rb +155 -0
  191. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/parse_result.rb +907 -0
  192. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/pattern.rb +269 -0
  193. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/polyfill/append_as_bytes.rb +15 -0
  194. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/polyfill/byteindex.rb +13 -0
  195. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/polyfill/scan_byte.rb +14 -0
  196. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/polyfill/unpack1.rb +14 -0
  197. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/polyfill/warn.rb +36 -0
  198. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/prism.so +0 -0
  199. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/reflection.rb +416 -0
  200. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/relocation.rb +505 -0
  201. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/serialize.rb +2400 -0
  202. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/string_query.rb +31 -0
  203. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/translation/parser/builder.rb +62 -0
  204. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/translation/parser/compiler.rb +2234 -0
  205. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/translation/parser/lexer.rb +820 -0
  206. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/translation/parser.rb +376 -0
  207. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/translation/parser_current.rb +26 -0
  208. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/translation/parser_versions.rb +36 -0
  209. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/translation/ripper/filter.rb +53 -0
  210. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/translation/ripper/lexer.rb +135 -0
  211. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/translation/ripper/sexp.rb +126 -0
  212. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/translation/ripper/shim.rb +5 -0
  213. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/translation/ripper.rb +3520 -0
  214. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/translation/ruby_parser.rb +1964 -0
  215. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/translation.rb +18 -0
  216. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/visitor.rb +813 -0
  217. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism.rb +98 -0
  218. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/prism.gemspec +172 -0
  219. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/rbi/prism/compiler.rbi +12 -0
  220. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/rbi/prism/dsl.rbi +524 -0
  221. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/rbi/prism/inspect_visitor.rbi +12 -0
  222. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/rbi/prism/node.rbi +8750 -0
  223. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/rbi/prism/node_ext.rbi +107 -0
  224. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/rbi/prism/parse_result.rbi +404 -0
  225. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/rbi/prism/reflection.rbi +58 -0
  226. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/rbi/prism/string_query.rbi +12 -0
  227. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/rbi/prism/translation/parser.rbi +11 -0
  228. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/rbi/prism/translation/parser_versions.rbi +23 -0
  229. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/rbi/prism/translation/ripper.rbi +15 -0
  230. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/rbi/prism/visitor.rbi +473 -0
  231. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/rbi/prism.rbi +63 -0
  232. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/sig/prism/compiler.rbs +9 -0
  233. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/sig/prism/dispatcher.rbs +19 -0
  234. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/sig/prism/dot_visitor.rbs +6 -0
  235. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/sig/prism/dsl.rbs +351 -0
  236. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/sig/prism/inspect_visitor.rbs +22 -0
  237. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/sig/prism/lex_compat.rbs +10 -0
  238. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/sig/prism/mutation_compiler.rbs +159 -0
  239. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/sig/prism/node.rbs +4042 -0
  240. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/sig/prism/node_ext.rbs +149 -0
  241. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/sig/prism/pack.rbs +43 -0
  242. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/sig/prism/parse_result/comments.rbs +38 -0
  243. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/sig/prism/parse_result.rbs +197 -0
  244. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/sig/prism/pattern.rbs +13 -0
  245. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/sig/prism/reflection.rbs +50 -0
  246. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/sig/prism/relocation.rbs +185 -0
  247. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/sig/prism/serialize.rbs +8 -0
  248. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/sig/prism/string_query.rbs +11 -0
  249. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/sig/prism/visitor.rbs +169 -0
  250. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/sig/prism.rbs +272 -0
  251. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/src/diagnostic.c +854 -0
  252. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/src/encoding.c +5340 -0
  253. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/src/node.c +8685 -0
  254. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/src/options.c +338 -0
  255. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/src/pack.c +509 -0
  256. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/src/prettyprint.c +8957 -0
  257. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/src/prism.c +22679 -0
  258. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/src/regexp.c +790 -0
  259. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/src/serialize.c +2274 -0
  260. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/src/static_literals.c +617 -0
  261. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/src/token_type.c +703 -0
  262. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/src/util/pm_buffer.c +357 -0
  263. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/src/util/pm_char.c +318 -0
  264. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/src/util/pm_constant_pool.c +342 -0
  265. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/src/util/pm_integer.c +670 -0
  266. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/src/util/pm_list.c +49 -0
  267. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/src/util/pm_memchr.c +35 -0
  268. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/src/util/pm_newline_list.c +125 -0
  269. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/src/util/pm_string.c +381 -0
  270. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/src/util/pm_strncasecmp.c +36 -0
  271. data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/src/util/pm_strpbrk.c +206 -0
  272. data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/History.rdoc +2454 -0
  273. data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/MIT-LICENSE +21 -0
  274. data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/README.rdoc +155 -0
  275. data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/doc/command_line_usage.rdoc +171 -0
  276. data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/doc/example/Rakefile1 +38 -0
  277. data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/doc/example/Rakefile2 +35 -0
  278. data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/doc/example/a.c +6 -0
  279. data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/doc/example/b.c +6 -0
  280. data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/doc/example/main.c +11 -0
  281. data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/doc/glossary.rdoc +42 -0
  282. data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/doc/jamis.rb +592 -0
  283. data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/doc/proto_rake.rdoc +127 -0
  284. data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/doc/rake.1 +156 -0
  285. data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/doc/rakefile.rdoc +635 -0
  286. data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/doc/rational.rdoc +151 -0
  287. data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/exe/rake +27 -0
  288. data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/application.rb +847 -0
  289. data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/backtrace.rb +25 -0
  290. data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/clean.rb +78 -0
  291. data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/cloneable.rb +17 -0
  292. data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/cpu_counter.rb +122 -0
  293. data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/default_loader.rb +15 -0
  294. data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/dsl_definition.rb +196 -0
  295. data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/early_time.rb +22 -0
  296. data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/ext/core.rb +26 -0
  297. data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/ext/string.rb +176 -0
  298. data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/file_creation_task.rb +25 -0
  299. data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/file_list.rb +435 -0
  300. data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/file_task.rb +58 -0
  301. data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/file_utils.rb +137 -0
  302. data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/file_utils_ext.rb +135 -0
  303. data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/invocation_chain.rb +57 -0
  304. data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/invocation_exception_mixin.rb +17 -0
  305. data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/late_time.rb +18 -0
  306. data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/linked_list.rb +112 -0
  307. data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/loaders/makefile.rb +54 -0
  308. data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/multi_task.rb +14 -0
  309. data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/name_space.rb +38 -0
  310. data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/options.rb +31 -0
  311. data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/packagetask.rb +222 -0
  312. data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/phony.rb +16 -0
  313. data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/private_reader.rb +21 -0
  314. data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/promise.rb +100 -0
  315. data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/pseudo_status.rb +30 -0
  316. data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/rake_module.rb +67 -0
  317. data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/rake_test_loader.rb +27 -0
  318. data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/rule_recursion_overflow_error.rb +20 -0
  319. data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/scope.rb +43 -0
  320. data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/task.rb +434 -0
  321. data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/task_argument_error.rb +8 -0
  322. data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/task_arguments.rb +113 -0
  323. data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/task_manager.rb +333 -0
  324. data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/tasklib.rb +12 -0
  325. data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/testtask.rb +192 -0
  326. data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/thread_history_display.rb +49 -0
  327. data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/thread_pool.rb +157 -0
  328. data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/trace_output.rb +23 -0
  329. data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/version.rb +10 -0
  330. data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/win32.rb +17 -0
  331. data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake.rb +69 -0
  332. data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/rake.gemspec +102 -0
  333. data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/Gemfile +8 -0
  334. data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/History.md +708 -0
  335. data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/LICENSE.txt +20 -0
  336. data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/README.md +505 -0
  337. data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/Rakefile +15 -0
  338. data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/appveyor.yml +22 -0
  339. data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/bin/rake-compiler +24 -0
  340. data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/cucumber.yml +4 -0
  341. data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/features/compile.feature +79 -0
  342. data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/features/cross-compile.feature +23 -0
  343. data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/features/cross-package-multi.feature +15 -0
  344. data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/features/cross-package.feature +14 -0
  345. data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/features/java-compile.feature +22 -0
  346. data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/features/java-no-native-compile.feature +33 -0
  347. data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/features/java-package.feature +24 -0
  348. data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/features/package.feature +40 -0
  349. data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/features/step_definitions/compilation.rb +70 -0
  350. data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/features/step_definitions/cross_compilation.rb +27 -0
  351. data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/features/step_definitions/execution.rb +52 -0
  352. data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/features/step_definitions/folders.rb +32 -0
  353. data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/features/step_definitions/gem.rb +46 -0
  354. data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/features/step_definitions/java_compilation.rb +7 -0
  355. data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/features/support/env.rb +10 -0
  356. data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/features/support/file_template_helpers.rb +137 -0
  357. data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/features/support/generator_helpers.rb +123 -0
  358. data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/features/support/platform_extension_helpers.rb +27 -0
  359. data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/lib/rake/baseextensiontask.rb +90 -0
  360. data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/lib/rake/compiler_config.rb +38 -0
  361. data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/lib/rake/extensioncompiler.rb +51 -0
  362. data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/lib/rake/extensiontask.rb +621 -0
  363. data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/lib/rake/javaextensiontask.rb +321 -0
  364. data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/tasks/bin/cross-ruby.rake +189 -0
  365. data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/tasks/bootstrap.rake +11 -0
  366. data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/tasks/common.rake +10 -0
  367. data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/tasks/cucumber.rake +23 -0
  368. data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/tasks/gem.rake +15 -0
  369. data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/tasks/rspec.rake +9 -0
  370. data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/CHANGELOG.md +446 -0
  371. data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/CONTRIBUTING.md +109 -0
  372. data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/Dockerfile.jruby +79 -0
  373. data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/Dockerfile.mri.erb +282 -0
  374. data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/Gemfile +8 -0
  375. data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/LICENSE.txt +22 -0
  376. data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/README.md +447 -0
  377. data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/Rakefile +246 -0
  378. data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/bin/rake-compiler-dock +18 -0
  379. data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/build/buildkitd.toml +2 -0
  380. data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/build/gem_helper.rb +54 -0
  381. data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/build/mk_i686.rb +18 -0
  382. data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/build/mk_musl_cross.sh +37 -0
  383. data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/build/mk_osxcross.sh +45 -0
  384. data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/build/mk_pkg_config.sh +24 -0
  385. data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/build/parallel_docker_build.rb +169 -0
  386. data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/build/patches/rake-compiler-1.3.1/0004-Enable-build-of-static-libruby.patch +38 -0
  387. data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/build/patches/rake-compiler-1.3.1/0005-build-miniruby-first.patch +16 -0
  388. data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/build/patches/rake-compiler-1.3.1/0006-ruby-4-rubyspec-capiext.patch +16 -0
  389. data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/build/rcd-env.sh +6 -0
  390. data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/build/runas +7 -0
  391. data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/build/sigfw.c +45 -0
  392. data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/build/strip_wrapper_codesign +17 -0
  393. data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/build/strip_wrapper_vbox +30 -0
  394. data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/build/sudoers +1 -0
  395. data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/lib/rake_compiler_dock/colors.rb +43 -0
  396. data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/lib/rake_compiler_dock/docker_check.rb +356 -0
  397. data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/lib/rake_compiler_dock/predefined_user_group.rb +5 -0
  398. data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/lib/rake_compiler_dock/starter.rb +206 -0
  399. data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/lib/rake_compiler_dock/version.rb +4 -0
  400. data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/lib/rake_compiler_dock.rb +151 -0
  401. data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/mingw64-ucrt/Dockerfile +66 -0
  402. data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/mingw64-ucrt/README.md +14 -0
  403. data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/mingw64-ucrt/binutils-mingw-w64-ignore-check-errors.patch +13 -0
  404. data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/mingw64-ucrt/gcc-mingw-w64-only-c-c++.patch +13 -0
  405. data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/mingw64-ucrt/mingw-w64-enable-ucrt.patch +22 -0
  406. data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/rake-compiler-dock.gemspec +34 -0
  407. data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/test/env/Dockerfile.alpine +17 -0
  408. data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/test/env/Dockerfile.debian +24 -0
  409. data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/test/fixtures/mig_test_rpc.defs +8 -0
  410. data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/test/rcd_test/Gemfile +11 -0
  411. data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/test/rcd_test/Rakefile +97 -0
  412. data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/test/rcd_test/ext/java/RcdTestExtService.java +19 -0
  413. data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/test/rcd_test/ext/java/RubyRcdTest.java +16 -0
  414. data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/test/rcd_test/ext/mri/extconf.rb +111 -0
  415. data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/test/rcd_test/ext/mri/rcd_test_ext.c +65 -0
  416. data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/test/rcd_test/ext/mri/rcd_test_ext.h +11 -0
  417. data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/test/rcd_test/lib/rcd_test.rb +6 -0
  418. data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/test/rcd_test/rcd_test.gemspec +28 -0
  419. data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/test/rcd_test/test/test_basic.rb +49 -0
  420. data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/test/test_environment_variables.rb +108 -0
  421. data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/test/test_mig.rb +18 -0
  422. data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/test/test_parallel_docker_build.rb +95 -0
  423. data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/test/test_rubygems_plugins.rb +12 -0
  424. data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/test/test_starter.rb +158 -0
  425. data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/test/test_versions.rb +82 -0
  426. data/vendor/bundle/ruby/3.4.0/gems/rb_sys-0.9.130/LICENSE-APACHE +190 -0
  427. data/vendor/bundle/ruby/3.4.0/gems/rb_sys-0.9.130/LICENSE-MIT +21 -0
  428. data/vendor/bundle/ruby/3.4.0/gems/rb_sys-0.9.130/README.md +42 -0
  429. data/vendor/bundle/ruby/3.4.0/gems/rb_sys-0.9.130/certs/ianks.pem +21 -0
  430. data/vendor/bundle/ruby/3.4.0/gems/rb_sys-0.9.130/exe/rb-sys-dock +495 -0
  431. data/vendor/bundle/ruby/3.4.0/gems/rb_sys-0.9.130/lib/rb_sys/cargo/config.rb +72 -0
  432. data/vendor/bundle/ruby/3.4.0/gems/rb_sys-0.9.130/lib/rb_sys/cargo/metadata.rb +158 -0
  433. data/vendor/bundle/ruby/3.4.0/gems/rb_sys-0.9.130/lib/rb_sys/cargo.rb +9 -0
  434. data/vendor/bundle/ruby/3.4.0/gems/rb_sys-0.9.130/lib/rb_sys/cargo_builder/link_flag_converter.rb +37 -0
  435. data/vendor/bundle/ruby/3.4.0/gems/rb_sys-0.9.130/lib/rb_sys/cargo_builder.rb +370 -0
  436. data/vendor/bundle/ruby/3.4.0/gems/rb_sys-0.9.130/lib/rb_sys/error.rb +43 -0
  437. data/vendor/bundle/ruby/3.4.0/gems/rb_sys-0.9.130/lib/rb_sys/extensiontask.rb +188 -0
  438. data/vendor/bundle/ruby/3.4.0/gems/rb_sys-0.9.130/lib/rb_sys/mkmf/config.rb +75 -0
  439. data/vendor/bundle/ruby/3.4.0/gems/rb_sys-0.9.130/lib/rb_sys/mkmf.rb +413 -0
  440. data/vendor/bundle/ruby/3.4.0/gems/rb_sys-0.9.130/lib/rb_sys/toolchain_info/data.rb +10 -0
  441. data/vendor/bundle/ruby/3.4.0/gems/rb_sys-0.9.130/lib/rb_sys/toolchain_info.rb +82 -0
  442. data/vendor/bundle/ruby/3.4.0/gems/rb_sys-0.9.130/lib/rb_sys/util/logger.rb +73 -0
  443. data/vendor/bundle/ruby/3.4.0/gems/rb_sys-0.9.130/lib/rb_sys/version.rb +5 -0
  444. data/vendor/bundle/ruby/3.4.0/gems/rb_sys-0.9.130/lib/rb_sys.rb +8 -0
  445. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/BSDL +22 -0
  446. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/CHANGELOG.md +2463 -0
  447. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/COPYING +56 -0
  448. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/Dockerfile.jruby +53 -0
  449. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/README.md +240 -0
  450. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/Rakefile +1213 -0
  451. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/Steepfile +55 -0
  452. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/config.yml +920 -0
  453. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/array.rbs +4205 -0
  454. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/basic_object.rbs +376 -0
  455. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/binding.rbs +148 -0
  456. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/builtin.rbs +278 -0
  457. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/class.rbs +223 -0
  458. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/comparable.rbs +192 -0
  459. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/complex.rbs +812 -0
  460. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/constants.rbs +96 -0
  461. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/data.rbs +415 -0
  462. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/dir.rbs +993 -0
  463. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/encoding.rbs +1368 -0
  464. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/enumerable.rbs +2506 -0
  465. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/enumerator/arithmetic_sequence.rbs +70 -0
  466. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/enumerator/product.rbs +92 -0
  467. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/enumerator.rbs +705 -0
  468. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/env.rbs +6 -0
  469. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/errno.rbs +682 -0
  470. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/errors.rbs +789 -0
  471. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/exception.rbs +485 -0
  472. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/false_class.rbs +82 -0
  473. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/fiber.rbs +570 -0
  474. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/fiber_error.rbs +11 -0
  475. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/file.rbs +2045 -0
  476. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/file_constants.rbs +463 -0
  477. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/file_stat.rbs +534 -0
  478. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/file_test.rbs +331 -0
  479. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/float.rbs +1292 -0
  480. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/gc.rbs +788 -0
  481. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/global_variables.rbs +184 -0
  482. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/hash.rbs +2183 -0
  483. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/integer.rbs +1374 -0
  484. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/io/buffer.rbs +995 -0
  485. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/io/wait.rbs +48 -0
  486. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/io.rbs +3473 -0
  487. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/kernel.rbs +3172 -0
  488. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/marshal.rbs +207 -0
  489. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/match_data.rbs +637 -0
  490. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/math.rbs +770 -0
  491. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/method.rbs +422 -0
  492. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/module.rbs +1856 -0
  493. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/nil_class.rbs +210 -0
  494. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/numeric.rbs +832 -0
  495. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/object.rbs +108 -0
  496. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/object_space/weak_key_map.rbs +166 -0
  497. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/object_space.rbs +197 -0
  498. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/pathname.rbs +1312 -0
  499. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/proc.rbs +905 -0
  500. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/process.rbs +2316 -0
  501. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/ractor.rbs +914 -0
  502. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/random.rbs +255 -0
  503. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/range.rbs +1209 -0
  504. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/rational.rbs +502 -0
  505. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/rb_config.rbs +88 -0
  506. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/rbs/ops.rbs +154 -0
  507. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/rbs/unnamed/argf.rbs +1236 -0
  508. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/rbs/unnamed/env_class.rbs +1214 -0
  509. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/rbs/unnamed/main_class.rbs +123 -0
  510. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/rbs/unnamed/random.rbs +186 -0
  511. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/refinement.rbs +59 -0
  512. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/regexp.rbs +1974 -0
  513. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/ruby.rbs +53 -0
  514. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/ruby_vm.rbs +809 -0
  515. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/rubygems/basic_specification.rbs +6 -0
  516. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/rubygems/config_file.rbs +38 -0
  517. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/rubygems/dependency_installer.rbs +6 -0
  518. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/rubygems/errors.rbs +112 -0
  519. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/rubygems/installer.rbs +15 -0
  520. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/rubygems/path_support.rbs +6 -0
  521. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/rubygems/platform.rbs +7 -0
  522. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/rubygems/request_set.rbs +49 -0
  523. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/rubygems/requirement.rbs +138 -0
  524. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/rubygems/rubygems.rbs +1108 -0
  525. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/rubygems/source_list.rbs +15 -0
  526. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/rubygems/specification.rbs +31 -0
  527. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/rubygems/stream_ui.rbs +5 -0
  528. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/rubygems/uninstaller.rbs +10 -0
  529. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/rubygems/version.rbs +133 -0
  530. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/set.rbs +751 -0
  531. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/signal.rbs +110 -0
  532. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/string.rbs +5532 -0
  533. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/struct.rbs +668 -0
  534. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/symbol.rbs +482 -0
  535. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/thread.rbs +1821 -0
  536. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/thread_group.rbs +79 -0
  537. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/time.rbs +1793 -0
  538. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/trace_point.rbs +483 -0
  539. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/true_class.rbs +98 -0
  540. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/unbound_method.rbs +337 -0
  541. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/warning.rbs +87 -0
  542. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/docs/CONTRIBUTING.md +107 -0
  543. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/docs/aliases.md +79 -0
  544. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/docs/architecture.md +110 -0
  545. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/docs/collection.md +192 -0
  546. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/docs/config.md +171 -0
  547. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/docs/data_and_struct.md +86 -0
  548. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/docs/encoding.md +56 -0
  549. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/docs/gem.md +56 -0
  550. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/docs/inline.md +634 -0
  551. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/docs/rbs_by_example.md +309 -0
  552. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/docs/release.md +303 -0
  553. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/docs/repo.md +125 -0
  554. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/docs/rust.md +96 -0
  555. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/docs/sigs.md +167 -0
  556. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/docs/stdlib.md +155 -0
  557. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/docs/syntax.md +952 -0
  558. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/docs/tools.md +17 -0
  559. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/docs/type_fingerprint.md +21 -0
  560. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/docs/wasm_serialization.md +80 -0
  561. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/exe/rbs +7 -0
  562. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/ext/rbs_extension/Makefile +273 -0
  563. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/ext/rbs_extension/ast_translation.c +1870 -0
  564. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/ext/rbs_extension/ast_translation.h +41 -0
  565. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/ext/rbs_extension/class_constants.c +189 -0
  566. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/ext/rbs_extension/class_constants.h +105 -0
  567. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/ext/rbs_extension/compat.h +10 -0
  568. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/ext/rbs_extension/extconf.rb +40 -0
  569. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/ext/rbs_extension/legacy_location.c +299 -0
  570. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/ext/rbs_extension/legacy_location.h +82 -0
  571. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/ext/rbs_extension/main.c +649 -0
  572. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/ext/rbs_extension/rbs_extension.h +16 -0
  573. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/ext/rbs_extension/rbs_string_bridging.c +9 -0
  574. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/ext/rbs_extension/rbs_string_bridging.h +24 -0
  575. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/goodcheck.yml +91 -0
  576. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/include/rbs/ast.h +1055 -0
  577. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/include/rbs/defines.h +104 -0
  578. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/include/rbs/lexer.h +208 -0
  579. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/include/rbs/location.h +40 -0
  580. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/include/rbs/parser.h +187 -0
  581. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/include/rbs/serialize.h +39 -0
  582. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/include/rbs/string.h +47 -0
  583. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/include/rbs/util/rbs_allocator.h +59 -0
  584. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/include/rbs/util/rbs_assert.h +20 -0
  585. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/include/rbs/util/rbs_buffer.h +83 -0
  586. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/include/rbs/util/rbs_constant_pool.h +155 -0
  587. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/include/rbs/util/rbs_encoding.h +282 -0
  588. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/include/rbs/util/rbs_unescape.h +24 -0
  589. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/include/rbs.h +14 -0
  590. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/ancestor_graph.rb +92 -0
  591. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/annotate/annotations.rb +199 -0
  592. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/annotate/formatter.rb +82 -0
  593. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/annotate/rdoc_annotator.rb +398 -0
  594. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/annotate/rdoc_source.rb +131 -0
  595. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/annotate.rb +8 -0
  596. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/ast/annotation.rb +29 -0
  597. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/ast/comment.rb +29 -0
  598. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/ast/declarations.rb +472 -0
  599. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/ast/directives.rb +49 -0
  600. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/ast/members.rb +451 -0
  601. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/ast/ruby/annotations.rb +451 -0
  602. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/ast/ruby/comment_block.rb +247 -0
  603. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/ast/ruby/declarations.rb +291 -0
  604. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/ast/ruby/helpers/constant_helper.rb +28 -0
  605. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/ast/ruby/helpers/location_helper.rb +15 -0
  606. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/ast/ruby/members.rb +762 -0
  607. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/ast/type_param.rb +235 -0
  608. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/ast/visitor.rb +137 -0
  609. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/buffer.rb +189 -0
  610. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/builtin_names.rb +58 -0
  611. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/cli/colored_io.rb +48 -0
  612. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/cli/diff.rb +84 -0
  613. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/cli/validate.rb +294 -0
  614. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/cli.rb +1253 -0
  615. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/collection/cleaner.rb +38 -0
  616. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/collection/config/lockfile.rb +92 -0
  617. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/collection/config/lockfile_generator.rb +269 -0
  618. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/collection/config.rb +81 -0
  619. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/collection/installer.rb +32 -0
  620. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/collection/sources/base.rb +14 -0
  621. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/collection/sources/git.rb +265 -0
  622. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/collection/sources/local.rb +81 -0
  623. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/collection/sources/rubygems.rb +48 -0
  624. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/collection/sources/stdlib.rb +50 -0
  625. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/collection/sources.rb +38 -0
  626. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/collection.rb +16 -0
  627. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/constant.rb +28 -0
  628. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/definition.rb +415 -0
  629. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/definition_builder/ancestor_builder.rb +681 -0
  630. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/definition_builder/method_builder.rb +295 -0
  631. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/definition_builder.rb +1057 -0
  632. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/diff.rb +131 -0
  633. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/environment/class_entry.rb +81 -0
  634. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/environment/module_entry.rb +91 -0
  635. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/environment/use_map.rb +77 -0
  636. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/environment.rb +1028 -0
  637. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/environment_loader.rb +167 -0
  638. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/environment_walker.rb +155 -0
  639. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/errors.rb +634 -0
  640. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/factory.rb +18 -0
  641. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/file_finder.rb +28 -0
  642. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/inline_parser/comment_association.rb +117 -0
  643. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/inline_parser.rb +568 -0
  644. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/location_aux.rb +170 -0
  645. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/locator.rb +247 -0
  646. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/method_type.rb +145 -0
  647. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/namespace.rb +154 -0
  648. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/parser/lex_result.rb +15 -0
  649. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/parser/token.rb +23 -0
  650. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/parser_aux.rb +144 -0
  651. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/prototype/helpers.rb +164 -0
  652. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/prototype/node_usage.rb +99 -0
  653. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/prototype/rb.rb +816 -0
  654. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/prototype/rbi.rb +793 -0
  655. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/prototype/runtime/helpers.rb +59 -0
  656. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/prototype/runtime/reflection.rb +19 -0
  657. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/prototype/runtime/value_object_generator.rb +278 -0
  658. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/prototype/runtime.rb +680 -0
  659. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/repository.rb +127 -0
  660. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/resolver/constant_resolver.rb +219 -0
  661. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/resolver/type_name_resolver.rb +167 -0
  662. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/rewriter.rb +70 -0
  663. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/sorter.rb +198 -0
  664. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/source.rb +99 -0
  665. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/substitution.rb +83 -0
  666. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/subtractor.rb +204 -0
  667. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/test/errors.rb +80 -0
  668. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/test/guaranteed.rb +30 -0
  669. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/test/hook.rb +212 -0
  670. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/test/observer.rb +19 -0
  671. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/test/setup.rb +84 -0
  672. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/test/setup_helper.rb +50 -0
  673. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/test/tester.rb +167 -0
  674. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/test/type_check.rb +457 -0
  675. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/test.rb +112 -0
  676. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/type_alias_dependency.rb +100 -0
  677. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/type_alias_regularity.rb +126 -0
  678. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/type_name.rb +122 -0
  679. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/types.rb +1646 -0
  680. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/unit_test/convertibles.rb +177 -0
  681. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/unit_test/spy.rb +138 -0
  682. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/unit_test/type_assertions.rb +383 -0
  683. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/unit_test/with_aliases.rb +145 -0
  684. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/unit_test.rb +6 -0
  685. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/validator.rb +186 -0
  686. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/variance_calculator.rb +189 -0
  687. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/vendorer.rb +71 -0
  688. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/version.rb +5 -0
  689. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/wasm/deserializer.rb +213 -0
  690. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/wasm/location.rb +61 -0
  691. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/wasm/parser.rb +174 -0
  692. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/wasm/runtime.rb +211 -0
  693. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/wasm/serialization_schema.rb +111 -0
  694. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/writer.rb +424 -0
  695. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs.rb +117 -0
  696. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs_extension.so +0 -0
  697. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs_jars.rb +39 -0
  698. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rdoc/discover.rb +20 -0
  699. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rdoc_plugin/parser.rb +168 -0
  700. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/rbs.gemspec +77 -0
  701. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/schema/annotation.json +14 -0
  702. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/schema/comment.json +26 -0
  703. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/schema/decls.json +326 -0
  704. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/schema/function.json +98 -0
  705. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/schema/location.json +56 -0
  706. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/schema/members.json +266 -0
  707. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/schema/methodType.json +50 -0
  708. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/schema/typeParam.json +52 -0
  709. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/schema/types.json +317 -0
  710. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/ancestor_builder.rbs +163 -0
  711. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/ancestor_graph.rbs +60 -0
  712. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/annotate/annotations.rbs +102 -0
  713. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/annotate/formatter.rbs +24 -0
  714. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/annotate/rdoc_annotater.rbs +85 -0
  715. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/annotate/rdoc_source.rbs +32 -0
  716. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/annotation.rbs +27 -0
  717. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/ast/ruby/annotations.rbs +470 -0
  718. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/ast/ruby/comment_block.rbs +127 -0
  719. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/ast/ruby/declarations.rbs +158 -0
  720. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/ast/ruby/helpers/constant_helper.rbs +11 -0
  721. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/ast/ruby/helpers/location_helper.rbs +15 -0
  722. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/ast/ruby/members.rbs +198 -0
  723. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/buffer.rbs +108 -0
  724. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/builtin_names.rbs +44 -0
  725. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/cli/colored_io.rbs +15 -0
  726. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/cli/diff.rbs +15 -0
  727. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/cli/validate.rbs +47 -0
  728. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/cli.rbs +89 -0
  729. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/collection/cleaner.rbs +13 -0
  730. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/collection/config/lockfile.rbs +74 -0
  731. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/collection/config/lockfile_generator.rbs +68 -0
  732. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/collection/config.rbs +46 -0
  733. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/collection/installer.rbs +17 -0
  734. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/collection/sources.rbs +214 -0
  735. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/collection.rbs +4 -0
  736. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/comment.rbs +26 -0
  737. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/constant.rbs +21 -0
  738. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/declarations.rbs +274 -0
  739. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/definition.rbs +232 -0
  740. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/definition_builder.rbs +181 -0
  741. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/diff.rbs +28 -0
  742. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/directives.rbs +77 -0
  743. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/environment/class_entry.rbs +56 -0
  744. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/environment/module_entry.rbs +65 -0
  745. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/environment.rbs +286 -0
  746. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/environment_loader.rbs +111 -0
  747. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/environment_walker.rbs +65 -0
  748. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/errors.rbs +408 -0
  749. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/factory.rbs +5 -0
  750. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/file_finder.rbs +28 -0
  751. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/inline_parser/comment_association.rbs +71 -0
  752. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/inline_parser.rbs +126 -0
  753. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/location.rbs +135 -0
  754. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/locator.rbs +56 -0
  755. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/manifest.yaml +5 -0
  756. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/members.rbs +258 -0
  757. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/method_builder.rbs +89 -0
  758. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/method_types.rbs +58 -0
  759. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/namespace.rbs +161 -0
  760. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/parser.rbs +164 -0
  761. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/prototype/helpers.rbs +29 -0
  762. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/prototype/node_usage.rbs +20 -0
  763. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/prototype/rb.rbs +96 -0
  764. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/prototype/rbi.rbs +104 -0
  765. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/prototype/runtime.rbs +182 -0
  766. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/rbs.rbs +21 -0
  767. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/rdoc/rbs.rbs +67 -0
  768. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/repository.rbs +85 -0
  769. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/resolver/constant_resolver.rbs +92 -0
  770. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/resolver/context.rbs +34 -0
  771. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/resolver/type_name_resolver.rbs +61 -0
  772. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/rewriter.rbs +45 -0
  773. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/shims/bundler.rbs +38 -0
  774. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/shims/enumerable.rbs +5 -0
  775. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/shims/rubygems.rbs +19 -0
  776. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/sorter.rbs +41 -0
  777. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/source.rbs +48 -0
  778. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/substitution.rbs +48 -0
  779. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/subtractor.rbs +37 -0
  780. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/test/errors.rbs +52 -0
  781. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/test/guranteed.rbs +9 -0
  782. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/test/type_check.rbs +19 -0
  783. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/test.rbs +82 -0
  784. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/type_alias_dependency.rbs +53 -0
  785. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/type_alias_regularity.rbs +98 -0
  786. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/type_param.rbs +115 -0
  787. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/typename.rbs +89 -0
  788. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/types.rbs +588 -0
  789. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/unit_test/convertibles.rbs +154 -0
  790. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/unit_test/spy.rbs +22 -0
  791. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/unit_test/type_assertions.rbs +211 -0
  792. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/unit_test/with_aliases.rbs +136 -0
  793. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/use_map.rbs +35 -0
  794. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/util.rbs +9 -0
  795. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/validator.rbs +63 -0
  796. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/variance_calculator.rbs +87 -0
  797. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/vendorer.rbs +51 -0
  798. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/version.rbs +3 -0
  799. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/visitor.rbs +47 -0
  800. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/wasm/deserializer.rbs +66 -0
  801. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/wasm/serialization_schema.rbs +13 -0
  802. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/writer.rbs +127 -0
  803. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/src/ast.c +1644 -0
  804. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/src/lexer.c +3223 -0
  805. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/src/lexer.re +187 -0
  806. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/src/lexstate.c +222 -0
  807. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/src/location.c +31 -0
  808. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/src/parser.c +4318 -0
  809. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/src/serialize.c +965 -0
  810. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/src/string.c +41 -0
  811. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/src/util/rbs_allocator.c +171 -0
  812. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/src/util/rbs_assert.c +19 -0
  813. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/src/util/rbs_buffer.c +54 -0
  814. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/src/util/rbs_constant_pool.c +268 -0
  815. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/src/util/rbs_encoding.c +21454 -0
  816. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/src/util/rbs_unescape.c +167 -0
  817. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/abbrev/0/abbrev.rbs +66 -0
  818. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/abbrev/0/array.rbs +26 -0
  819. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/base64/0/base64.rbs +355 -0
  820. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/benchmark/0/benchmark.rbs +452 -0
  821. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/bigdecimal/0/big_decimal.rbs +1647 -0
  822. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/bigdecimal-math/0/big_math.rbs +280 -0
  823. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/bigdecimal-math/0/manifest.yaml +2 -0
  824. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/cgi/0/core.rbs +911 -0
  825. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/cgi/0/manifest.yaml +4 -0
  826. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/cgi-escape/0/escape.rbs +171 -0
  827. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/coverage/0/coverage.rbs +266 -0
  828. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/csv/0/csv.rbs +3776 -0
  829. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/csv/0/manifest.yaml +3 -0
  830. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/date/0/date.rbs +1598 -0
  831. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/date/0/date_time.rbs +617 -0
  832. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/date/0/time.rbs +26 -0
  833. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/dbm/0/dbm.rbs +421 -0
  834. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/delegate/0/delegator.rbs +188 -0
  835. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/delegate/0/kernel.rbs +47 -0
  836. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/delegate/0/simple_delegator.rbs +96 -0
  837. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/did_you_mean/0/did_you_mean.rbs +344 -0
  838. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/digest/0/digest.rbs +693 -0
  839. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/erb/0/erb.rbs +933 -0
  840. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/etc/0/etc.rbs +884 -0
  841. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/fileutils/0/fileutils.rbs +1753 -0
  842. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/find/0/find.rbs +49 -0
  843. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/forwardable/0/forwardable.rbs +271 -0
  844. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/io-console/0/io-console.rbs +414 -0
  845. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/ipaddr/0/ipaddr.rbs +431 -0
  846. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/json/0/json.rbs +1963 -0
  847. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/kconv/0/kconv.rbs +166 -0
  848. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/logger/0/formatter.rbs +45 -0
  849. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/logger/0/log_device.rbs +100 -0
  850. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/logger/0/logger.rbs +796 -0
  851. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/logger/0/manifest.yaml +2 -0
  852. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/logger/0/period.rbs +17 -0
  853. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/logger/0/severity.rbs +34 -0
  854. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/kernel.rbs +42 -0
  855. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/abstract_reporter.rbs +52 -0
  856. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/assertion.rbs +17 -0
  857. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/assertions.rbs +590 -0
  858. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/backtrace_filter.rbs +23 -0
  859. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/bench_spec.rbs +102 -0
  860. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/benchmark.rbs +259 -0
  861. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/composite_reporter.rbs +25 -0
  862. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/compress.rbs +13 -0
  863. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/error_on_warning.rbs +3 -0
  864. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/expectation.rbs +2 -0
  865. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/expectations.rbs +21 -0
  866. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/guard.rbs +64 -0
  867. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/mock.rbs +64 -0
  868. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/parallel/executor.rbs +46 -0
  869. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/parallel/test/class_methods.rbs +5 -0
  870. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/parallel/test.rbs +3 -0
  871. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/parallel.rbs +2 -0
  872. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/pride_io.rbs +62 -0
  873. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/pride_lol.rbs +19 -0
  874. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/progress_reporter.rbs +11 -0
  875. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/reportable.rbs +53 -0
  876. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/reporter.rbs +5 -0
  877. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/result.rbs +28 -0
  878. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/runnable.rbs +163 -0
  879. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/skip.rbs +6 -0
  880. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/spec/dsl/instance_methods.rbs +48 -0
  881. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/spec/dsl.rbs +129 -0
  882. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/spec.rbs +11 -0
  883. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/statistics_reporter.rbs +81 -0
  884. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/summary_reporter.rbs +18 -0
  885. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/test/lifecycle_hooks.rbs +92 -0
  886. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/test.rbs +69 -0
  887. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/unexpected_error.rbs +12 -0
  888. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/unexpected_warning.rbs +6 -0
  889. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/unit/test_case.rbs +3 -0
  890. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/unit.rbs +4 -0
  891. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest.rbs +115 -0
  892. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/monitor/0/monitor.rbs +363 -0
  893. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/mutex_m/0/mutex_m.rbs +104 -0
  894. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/net-http/0/manifest.yaml +3 -0
  895. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/net-http/0/net-http.rbs +5580 -0
  896. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/net-protocol/0/manifest.yaml +2 -0
  897. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/net-protocol/0/net-protocol.rbs +56 -0
  898. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/net-smtp/0/manifest.yaml +2 -0
  899. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/net-smtp/0/net-smtp.rbs +55 -0
  900. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/nkf/0/nkf.rbs +402 -0
  901. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/objspace/0/objspace.rbs +470 -0
  902. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/observable/0/observable.rbs +217 -0
  903. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/open-uri/0/manifest.yaml +4 -0
  904. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/open-uri/0/open-uri.rbs +433 -0
  905. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/open3/0/open3.rbs +606 -0
  906. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/openssl/0/manifest.yaml +3 -0
  907. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/openssl/0/openssl.rbs +12237 -0
  908. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/optparse/0/optparse.rbs +1734 -0
  909. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/pathname/0/pathname.rbs +36 -0
  910. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/pp/0/manifest.yaml +2 -0
  911. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/pp/0/pp.rbs +301 -0
  912. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/prettyprint/0/prettyprint.rbs +383 -0
  913. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/pstore/0/pstore.rbs +608 -0
  914. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/psych/0/core_ext.rbs +12 -0
  915. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/psych/0/dbm.rbs +237 -0
  916. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/psych/0/manifest.yaml +3 -0
  917. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/psych/0/psych.rbs +455 -0
  918. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/psych/0/store.rbs +57 -0
  919. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/pty/0/pty.rbs +240 -0
  920. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/random-formatter/0/random-formatter.rbs +277 -0
  921. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/rdoc/0/code_object.rbs +52 -0
  922. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/rdoc/0/comment.rbs +61 -0
  923. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/rdoc/0/context.rbs +153 -0
  924. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/rdoc/0/markup.rbs +117 -0
  925. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/rdoc/0/options.rbs +76 -0
  926. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/rdoc/0/parser.rbs +56 -0
  927. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/rdoc/0/rdoc.rbs +393 -0
  928. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/rdoc/0/ri.rbs +17 -0
  929. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/rdoc/0/store.rbs +48 -0
  930. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/rdoc/0/top_level.rbs +97 -0
  931. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/resolv/0/manifest.yaml +3 -0
  932. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/resolv/0/resolv.rbs +1787 -0
  933. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/ripper/0/ripper.rbs +1654 -0
  934. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/securerandom/0/manifest.yaml +2 -0
  935. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/securerandom/0/securerandom.rbs +49 -0
  936. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/shellwords/0/shellwords.rbs +229 -0
  937. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/singleton/0/singleton.rbs +137 -0
  938. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/socket/0/addrinfo.rbs +666 -0
  939. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/socket/0/basic_socket.rbs +590 -0
  940. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/socket/0/constants.rbs +2295 -0
  941. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/socket/0/ip_socket.rbs +94 -0
  942. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/socket/0/socket.rbs +4170 -0
  943. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/socket/0/socket_error.rbs +5 -0
  944. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/socket/0/tcp_server.rbs +192 -0
  945. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/socket/0/tcp_socket.rbs +87 -0
  946. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/socket/0/udp_socket.rbs +133 -0
  947. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/socket/0/unix_server.rbs +169 -0
  948. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/socket/0/unix_socket.rbs +172 -0
  949. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/stringio/0/stringio.rbs +1682 -0
  950. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/strscan/0/string_scanner.rbs +1648 -0
  951. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/tempfile/0/manifest.yaml +3 -0
  952. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/tempfile/0/tempfile.rbs +483 -0
  953. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/time/0/time.rbs +434 -0
  954. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/timeout/0/timeout.rbs +132 -0
  955. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/tmpdir/0/tmpdir.rbs +69 -0
  956. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/tsort/0/cyclic.rbs +8 -0
  957. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/tsort/0/interfaces.rbs +20 -0
  958. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/tsort/0/tsort.rbs +410 -0
  959. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/uri/0/common.rbs +621 -0
  960. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/uri/0/file.rbs +118 -0
  961. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/uri/0/ftp.rbs +13 -0
  962. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/uri/0/generic.rbs +1111 -0
  963. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/uri/0/http.rbs +104 -0
  964. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/uri/0/https.rbs +14 -0
  965. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/uri/0/ldap.rbs +230 -0
  966. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/uri/0/ldaps.rbs +14 -0
  967. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/uri/0/mailto.rbs +92 -0
  968. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/uri/0/rfc2396_parser.rbs +189 -0
  969. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/uri/0/rfc3986_parser.rbs +2 -0
  970. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/uri/0/ws.rbs +13 -0
  971. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/uri/0/wss.rbs +9 -0
  972. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/yaml/0/manifest.yaml +2 -0
  973. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/yaml/0/yaml.rbs +1 -0
  974. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/zlib/0/buf_error.rbs +10 -0
  975. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/zlib/0/data_error.rbs +10 -0
  976. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/zlib/0/deflate.rbs +211 -0
  977. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/zlib/0/error.rbs +20 -0
  978. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/zlib/0/gzip_file/crc_error.rbs +12 -0
  979. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/zlib/0/gzip_file/error.rbs +23 -0
  980. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/zlib/0/gzip_file/length_error.rbs +12 -0
  981. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/zlib/0/gzip_file/no_footer.rbs +11 -0
  982. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/zlib/0/gzip_file.rbs +156 -0
  983. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/zlib/0/gzip_reader.rbs +293 -0
  984. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/zlib/0/gzip_writer.rbs +169 -0
  985. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/zlib/0/inflate.rbs +180 -0
  986. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/zlib/0/mem_error.rbs +10 -0
  987. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/zlib/0/need_dict.rbs +13 -0
  988. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/zlib/0/stream_end.rbs +11 -0
  989. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/zlib/0/stream_error.rbs +11 -0
  990. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/zlib/0/version_error.rbs +11 -0
  991. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/zlib/0/zlib.rbs +449 -0
  992. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/zlib/0/zstream.rbs +200 -0
  993. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/wasm/README.md +109 -0
  994. data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/wasm/rbs_wasm.c +479 -0
  995. data/vendor/bundle/ruby/3.4.0/gems/toml-rb-6.0.0/LICENSE +19 -0
  996. data/vendor/bundle/ruby/3.4.0/gems/toml-rb-6.0.0/README.md +135 -0
  997. data/vendor/bundle/ruby/3.4.0/gems/toml-rb-6.0.0/lib/toml-rb/datetime.rb +54 -0
  998. data/vendor/bundle/ruby/3.4.0/gems/toml-rb-6.0.0/lib/toml-rb/dumper.rb +182 -0
  999. data/vendor/bundle/ruby/3.4.0/gems/toml-rb-6.0.0/lib/toml-rb/errors.rb +17 -0
  1000. data/vendor/bundle/ruby/3.4.0/gems/toml-rb-6.0.0/lib/toml-rb/inline_table.rb +18 -0
  1001. data/vendor/bundle/ruby/3.4.0/gems/toml-rb-6.0.0/lib/toml-rb/keyvalue.rb +45 -0
  1002. data/vendor/bundle/ruby/3.4.0/gems/toml-rb-6.0.0/lib/toml-rb/parser.rb +296 -0
  1003. data/vendor/bundle/ruby/3.4.0/gems/toml-rb-6.0.0/lib/toml-rb/string.rb +41 -0
  1004. data/vendor/bundle/ruby/3.4.0/gems/toml-rb-6.0.0/lib/toml-rb/table.rb +34 -0
  1005. data/vendor/bundle/ruby/3.4.0/gems/toml-rb-6.0.0/lib/toml-rb/table_array.rb +43 -0
  1006. data/vendor/bundle/ruby/3.4.0/gems/toml-rb-6.0.0/lib/toml-rb/version.rb +5 -0
  1007. data/vendor/bundle/ruby/3.4.0/gems/toml-rb-6.0.0/lib/toml-rb.rb +90 -0
  1008. data/vendor/bundle/ruby/3.4.0/gems/tsort-0.2.0/Gemfile +4 -0
  1009. data/vendor/bundle/ruby/3.4.0/gems/tsort-0.2.0/LICENSE.txt +22 -0
  1010. data/vendor/bundle/ruby/3.4.0/gems/tsort-0.2.0/README.md +72 -0
  1011. data/vendor/bundle/ruby/3.4.0/gems/tsort-0.2.0/Rakefile +10 -0
  1012. data/vendor/bundle/ruby/3.4.0/gems/tsort-0.2.0/bin/console +14 -0
  1013. data/vendor/bundle/ruby/3.4.0/gems/tsort-0.2.0/bin/setup +8 -0
  1014. data/vendor/bundle/ruby/3.4.0/gems/tsort-0.2.0/lib/tsort.rb +455 -0
  1015. data/vendor/bundle/ruby/3.4.0/gems/tsort-0.2.0/tsort.gemspec +29 -0
  1016. data/vendor/bundle/ruby/3.4.0/specifications/drb-2.2.3.gemspec +22 -0
  1017. data/vendor/bundle/ruby/3.4.0/specifications/logger-1.7.0.gemspec +22 -0
  1018. data/vendor/bundle/ruby/3.4.0/specifications/minitest-6.0.6.gemspec +35 -0
  1019. data/vendor/bundle/ruby/3.4.0/specifications/prism-1.9.0.gemspec +24 -0
  1020. data/vendor/bundle/ruby/3.4.0/specifications/rake-13.4.2.gemspec +26 -0
  1021. data/vendor/bundle/ruby/3.4.0/specifications/rake-compiler-1.3.2.gemspec +33 -0
  1022. data/vendor/bundle/ruby/3.4.0/specifications/rake-compiler-dock-1.12.0.gemspec +28 -0
  1023. data/vendor/bundle/ruby/3.4.0/specifications/rb_sys-0.9.130.gemspec +29 -0
  1024. data/vendor/bundle/ruby/3.4.0/specifications/rbs-4.2.0.gemspec +33 -0
  1025. data/vendor/bundle/ruby/3.4.0/specifications/toml-rb-6.0.0.gemspec +27 -0
  1026. data/vendor/bundle/ruby/3.4.0/specifications/tsort-0.2.0.gemspec +23 -0
  1027. data/vendor/cache/Cargo.toml +21 -0
  1028. data/vendor/cache/LICENSE +21 -0
  1029. data/vendor/cache/README.md +5 -0
  1030. data/vendor/cache/src/hash.rs +85 -0
  1031. data/vendor/cache/src/lib.rs +751 -0
  1032. data/vendor/cache/src/loom_tests.rs +340 -0
  1033. data/vendor/cache/src/s3fifo.rs +648 -0
  1034. data/vendor/cache/src/sync.rs +25 -0
  1035. data/vendor/cache/src/tests.rs +260 -0
  1036. data/vendor/compaction/Cargo.toml +32 -0
  1037. data/vendor/compaction/LICENSE +21 -0
  1038. data/vendor/compaction/README.md +5 -0
  1039. data/vendor/compaction/src/blob.rs +478 -0
  1040. data/vendor/compaction/src/cursor.rs +700 -0
  1041. data/vendor/compaction/src/gc.rs +802 -0
  1042. data/vendor/compaction/src/job.rs +861 -0
  1043. data/vendor/compaction/src/lib.rs +102 -0
  1044. data/vendor/compaction/src/merge.rs +995 -0
  1045. data/vendor/compaction/src/picker.rs +681 -0
  1046. data/vendor/compaction/src/resolver.rs +1346 -0
  1047. data/vendor/engine/Cargo.toml +56 -0
  1048. data/vendor/engine/LICENSE +21 -0
  1049. data/vendor/engine/README.md +5 -0
  1050. data/vendor/engine/src/admission.rs +421 -0
  1051. data/vendor/engine/src/catalog.rs +1233 -0
  1052. data/vendor/engine/src/check.rs +1386 -0
  1053. data/vendor/engine/src/clock.rs +244 -0
  1054. data/vendor/engine/src/clock_loom.rs +482 -0
  1055. data/vendor/engine/src/close_gate.rs +325 -0
  1056. data/vendor/engine/src/compact.rs +1509 -0
  1057. data/vendor/engine/src/engine/hooks.rs +1654 -0
  1058. data/vendor/engine/src/engine/info.rs +229 -0
  1059. data/vendor/engine/src/engine.rs +6114 -0
  1060. data/vendor/engine/src/error.rs +490 -0
  1061. data/vendor/engine/src/feed.rs +960 -0
  1062. data/vendor/engine/src/feed_reader.rs +1600 -0
  1063. data/vendor/engine/src/flush.rs +839 -0
  1064. data/vendor/engine/src/flushed_roots.rs +158 -0
  1065. data/vendor/engine/src/flushed_through_loom.rs +77 -0
  1066. data/vendor/engine/src/health.rs +201 -0
  1067. data/vendor/engine/src/large.rs +372 -0
  1068. data/vendor/engine/src/large_settle.rs +201 -0
  1069. data/vendor/engine/src/lib.rs +112 -0
  1070. data/vendor/engine/src/load_slot.rs +324 -0
  1071. data/vendor/engine/src/maintenance.rs +935 -0
  1072. data/vendor/engine/src/manifest/flight.rs +563 -0
  1073. data/vendor/engine/src/manifest.rs +1516 -0
  1074. data/vendor/engine/src/nonblocking.rs +603 -0
  1075. data/vendor/engine/src/options.rs +334 -0
  1076. data/vendor/engine/src/position.rs +125 -0
  1077. data/vendor/engine/src/purge_guard.rs +220 -0
  1078. data/vendor/engine/src/read/keys.rs +1049 -0
  1079. data/vendor/engine/src/read/knn.rs +423 -0
  1080. data/vendor/engine/src/read/reduce.rs +2057 -0
  1081. data/vendor/engine/src/read/traverse.rs +1013 -0
  1082. data/vendor/engine/src/read.rs +2429 -0
  1083. data/vendor/engine/src/row_cache.rs +1101 -0
  1084. data/vendor/engine/src/shard/tablets.rs +3582 -0
  1085. data/vendor/engine/src/shard.rs +12215 -0
  1086. data/vendor/engine/src/snapshot.rs +1429 -0
  1087. data/vendor/engine/src/source.rs +1379 -0
  1088. data/vendor/engine/src/timer_state.rs +226 -0
  1089. data/vendor/engine/src/waker.rs +124 -0
  1090. data/vendor/engine/src/watermark_waiters.rs +674 -0
  1091. data/vendor/engine/src/write.rs +1321 -0
  1092. data/vendor/format/Cargo.toml +40 -0
  1093. data/vendor/format/LICENSE +21 -0
  1094. data/vendor/format/README.md +5 -0
  1095. data/vendor/format/src/blob.rs +101 -0
  1096. data/vendor/format/src/block.rs +1120 -0
  1097. data/vendor/format/src/bloom.rs +456 -0
  1098. data/vendor/format/src/buckets.rs +552 -0
  1099. data/vendor/format/src/bytes.rs +101 -0
  1100. data/vendor/format/src/checksum.rs +132 -0
  1101. data/vendor/format/src/compress.rs +196 -0
  1102. data/vendor/format/src/cursor.rs +110 -0
  1103. data/vendor/format/src/distance.rs +598 -0
  1104. data/vendor/format/src/error.rs +93 -0
  1105. data/vendor/format/src/exact.rs +602 -0
  1106. data/vendor/format/src/feed.rs +285 -0
  1107. data/vendor/format/src/filter.rs +157 -0
  1108. data/vendor/format/src/half.rs +182 -0
  1109. data/vendor/format/src/hash.rs +127 -0
  1110. data/vendor/format/src/hll.rs +500 -0
  1111. data/vendor/format/src/ids.rs +95 -0
  1112. data/vendor/format/src/key.rs +620 -0
  1113. data/vendor/format/src/kind_params.rs +101 -0
  1114. data/vendor/format/src/lib.rs +54 -0
  1115. data/vendor/format/src/manifest.rs +1287 -0
  1116. data/vendor/format/src/roaring.rs +865 -0
  1117. data/vendor/format/src/scan.rs +297 -0
  1118. data/vendor/format/src/shm.rs +805 -0
  1119. data/vendor/format/src/sst.rs +233 -0
  1120. data/vendor/format/src/superblock.rs +345 -0
  1121. data/vendor/format/src/value.rs +163 -0
  1122. data/vendor/format/src/varint.rs +87 -0
  1123. data/vendor/format/src/vector.rs +936 -0
  1124. data/vendor/format/src/version.rs +92 -0
  1125. data/vendor/format/src/wal.rs +999 -0
  1126. data/vendor/io/Cargo.toml +29 -0
  1127. data/vendor/io/LICENSE +21 -0
  1128. data/vendor/io/README.md +5 -0
  1129. data/vendor/io/src/async_poll.rs +44 -0
  1130. data/vendor/io/src/buf.rs +694 -0
  1131. data/vendor/io/src/completion.rs +444 -0
  1132. data/vendor/io/src/error.rs +110 -0
  1133. data/vendor/io/src/file.rs +206 -0
  1134. data/vendor/io/src/lib.rs +53 -0
  1135. data/vendor/io/src/nowait.rs +256 -0
  1136. data/vendor/io/src/os/mod.rs +149 -0
  1137. data/vendor/io/src/os/unix.rs +897 -0
  1138. data/vendor/io/src/os/windows.rs +552 -0
  1139. data/vendor/io/src/own.rs +257 -0
  1140. data/vendor/io/src/pread.rs +854 -0
  1141. data/vendor/io/src/ring_wake.rs +113 -0
  1142. data/vendor/io/src/shared.rs +410 -0
  1143. data/vendor/io/src/sim.rs +1545 -0
  1144. data/vendor/io/src/sys.rs +214 -0
  1145. data/vendor/io/src/uring.rs +1839 -0
  1146. data/vendor/io/src/vfs.rs +154 -0
  1147. data/vendor/memory/Cargo.toml +34 -0
  1148. data/vendor/memory/LICENSE +21 -0
  1149. data/vendor/memory/README.md +11 -0
  1150. data/vendor/memory/src/consolidate.rs +640 -0
  1151. data/vendor/memory/src/dedup.rs +231 -0
  1152. data/vendor/memory/src/error.rs +131 -0
  1153. data/vendor/memory/src/feed_loop.rs +572 -0
  1154. data/vendor/memory/src/forget.rs +724 -0
  1155. data/vendor/memory/src/hooks.rs +109 -0
  1156. data/vendor/memory/src/ivf.rs +204 -0
  1157. data/vendor/memory/src/layout.rs +340 -0
  1158. data/vendor/memory/src/lib.rs +61 -0
  1159. data/vendor/memory/src/recall.rs +1182 -0
  1160. data/vendor/memory/src/store.rs +1785 -0
  1161. data/vendor/memory/src/watch.rs +339 -0
  1162. data/vendor/memtable/Cargo.toml +24 -0
  1163. data/vendor/memtable/LICENSE +21 -0
  1164. data/vendor/memtable/README.md +5 -0
  1165. data/vendor/memtable/src/lib.rs +1658 -0
  1166. data/vendor/memtable/src/loom_tests.rs +274 -0
  1167. data/vendor/memtable/src/mem.rs +344 -0
  1168. data/vendor/memtable/src/tests.rs +1061 -0
  1169. data/vendor/pager/Cargo.toml +23 -0
  1170. data/vendor/pager/LICENSE +21 -0
  1171. data/vendor/pager/README.md +5 -0
  1172. data/vendor/pager/src/alloc.rs +1008 -0
  1173. data/vendor/pager/src/lib.rs +1710 -0
  1174. data/vendor/pigeonhole/Cargo.toml +42 -0
  1175. data/vendor/pigeonhole/LICENSE +21 -0
  1176. data/vendor/pigeonhole/README.md +99 -0
  1177. data/vendor/pigeonhole/src/cell.rs +829 -0
  1178. data/vendor/pigeonhole/src/check.rs +368 -0
  1179. data/vendor/pigeonhole/src/db.rs +2324 -0
  1180. data/vendor/pigeonhole/src/doc_support.rs +89 -0
  1181. data/vendor/pigeonhole/src/error.rs +257 -0
  1182. data/vendor/pigeonhole/src/feed.rs +696 -0
  1183. data/vendor/pigeonhole/src/info.rs +425 -0
  1184. data/vendor/pigeonhole/src/lib.rs +202 -0
  1185. data/vendor/pigeonhole/src/merge.rs +135 -0
  1186. data/vendor/pigeonhole/src/metrics.rs +476 -0
  1187. data/vendor/pigeonhole/src/nonblocking.rs +666 -0
  1188. data/vendor/pigeonhole/src/options.rs +2075 -0
  1189. data/vendor/pigeonhole/src/read/budget.rs +584 -0
  1190. data/vendor/pigeonhole/src/read.rs +2463 -0
  1191. data/vendor/pigeonhole/src/recovery.rs +876 -0
  1192. data/vendor/pigeonhole/src/retry.rs +358 -0
  1193. data/vendor/pigeonhole/src/set.rs +103 -0
  1194. data/vendor/pigeonhole/src/table.rs +861 -0
  1195. data/vendor/pigeonhole/src/vector.rs +351 -0
  1196. data/vendor/pigeonhole/src/write.rs +2815 -0
  1197. data/vendor/runtime/Cargo.toml +21 -0
  1198. data/vendor/runtime/LICENSE +21 -0
  1199. data/vendor/runtime/README.md +5 -0
  1200. data/vendor/runtime/src/completion.rs +629 -0
  1201. data/vendor/runtime/src/drivers.rs +1175 -0
  1202. data/vendor/runtime/src/lib.rs +1546 -0
  1203. data/vendor/runtime/src/pool.rs +992 -0
  1204. data/vendor/runtime/src/sched.rs +809 -0
  1205. data/vendor/runtime/src/signal.rs +532 -0
  1206. data/vendor/runtime/src/submit_gate.rs +144 -0
  1207. data/vendor/shm/Cargo.toml +24 -0
  1208. data/vendor/shm/LICENSE +21 -0
  1209. data/vendor/shm/README.md +5 -0
  1210. data/vendor/shm/src/lib.rs +427 -0
  1211. data/vendor/shm/src/lock.rs +153 -0
  1212. data/vendor/shm/src/region.rs +1609 -0
  1213. data/vendor/sst/Cargo.toml +26 -0
  1214. data/vendor/sst/LICENSE +21 -0
  1215. data/vendor/sst/README.md +5 -0
  1216. data/vendor/sst/src/blob.rs +380 -0
  1217. data/vendor/sst/src/iter.rs +803 -0
  1218. data/vendor/sst/src/lib.rs +695 -0
  1219. data/vendor/sst/src/reader.rs +814 -0
  1220. data/vendor/sst/src/writer.rs +596 -0
  1221. data/vendor/text/Cargo.toml +26 -0
  1222. data/vendor/text/LICENSE +21 -0
  1223. data/vendor/text/README.md +9 -0
  1224. data/vendor/text/src/error.rs +108 -0
  1225. data/vendor/text/src/fuzzy.rs +265 -0
  1226. data/vendor/text/src/highlight.rs +236 -0
  1227. data/vendor/text/src/index.rs +1152 -0
  1228. data/vendor/text/src/layout.rs +424 -0
  1229. data/vendor/text/src/lib.rs +75 -0
  1230. data/vendor/text/src/maxscore.rs +658 -0
  1231. data/vendor/text/src/query.rs +450 -0
  1232. data/vendor/text/src/search.rs +569 -0
  1233. data/vendor/text/src/sloppy.rs +460 -0
  1234. data/vendor/text/src/tokenizer.rs +163 -0
  1235. data/vendor/vector/Cargo.toml +28 -0
  1236. data/vendor/vector/LICENSE +21 -0
  1237. data/vendor/vector/README.md +9 -0
  1238. data/vendor/vector/src/error.rs +63 -0
  1239. data/vendor/vector/src/half.rs +167 -0
  1240. data/vendor/vector/src/hooks.rs +135 -0
  1241. data/vendor/vector/src/index.rs +2690 -0
  1242. data/vendor/vector/src/layout.rs +102 -0
  1243. data/vendor/vector/src/lib.rs +52 -0
  1244. data/vendor/vector/src/point.rs +500 -0
  1245. data/vendor/vector/src/rebalancer.rs +200 -0
  1246. data/vendor/vector/src/registry.rs +81 -0
  1247. data/vendor/wal/Cargo.toml +25 -0
  1248. data/vendor/wal/LICENSE +21 -0
  1249. data/vendor/wal/README.md +5 -0
  1250. data/vendor/wal/src/feed.rs +610 -0
  1251. data/vendor/wal/src/foreground.rs +122 -0
  1252. data/vendor/wal/src/lib.rs +458 -0
  1253. data/vendor/wal/src/mem.rs +166 -0
  1254. data/vendor/wal/src/recovery.rs +426 -0
  1255. data/vendor/wal/src/stream.rs +2382 -0
  1256. metadata +1310 -0
@@ -0,0 +1,2429 @@
1
+ //! The read path: point gets, row reads and ordered scans over a snapshot's view, through
2
+ //! `pigeonhole-compaction`'s `CellResolver` (snapshot visibility, deletes, TTL, versions,
3
+ //! filters, merge folding) over a `MergingCursor` of the engine's [`Source`]s.
4
+
5
+ use std::cell::RefCell;
6
+ use std::ops::Bound;
7
+ use std::sync::{Arc, Mutex, PoisonError};
8
+
9
+ use pigeonhole_compaction::{
10
+ BlobFetch, MergingCursor, ResolveOptions, ResolvedCell, ValuePredicate, blob_pointer,
11
+ };
12
+ use pigeonhole_format::key::{
13
+ Escaped, Kind, SUFFIX_LEN, TERMINATOR, decode_key, encode_row_prefix, row_prefix_len,
14
+ };
15
+ use pigeonhole_format::scan::ScanFilter;
16
+ use pigeonhole_format::value::{BlobPointer, ValueRef, decode_value};
17
+ use pigeonhole_format::{Cursor, FamilyId, Seqno, TableId, TabletId, Timestamp};
18
+ use pigeonhole_memtable::ArenaSlice;
19
+ use pigeonhole_sst::QualifierFilter;
20
+
21
+ use crate::catalog::{FamilyMeta, MergeKind};
22
+ use crate::snapshot::{Snapshot, SstSet, TabletEntry, View};
23
+ use crate::source::{ColumnKey, Pinned, Resolver, Source, row_prefix};
24
+ use crate::{Error, Result};
25
+
26
+ pub(crate) mod keys;
27
+ pub(crate) mod knn;
28
+ pub(crate) mod reduce;
29
+ pub(crate) mod traverse;
30
+
31
+ /// How a [`CellData`] keeps its value alive.
32
+ #[derive(Clone)]
33
+ enum CellValue {
34
+ /// A copy (small values, merge results, small separated values).
35
+ Inline {
36
+ len: u8,
37
+ bytes: [u8; CellData::INLINE_MAX],
38
+ },
39
+ /// A pinned memtable range plus the view that keeps the memtable from being reclaimed.
40
+ Arena { slice: ArenaSlice, _view: Arc<View> },
41
+ /// A pinned range of a cached SST block.
42
+ Block(pigeonhole_cache::Cell),
43
+ /// A heap copy larger than the inline limit (merge results, mid-sized values).
44
+ Owned(Vec<u8>),
45
+ }
46
+
47
+ impl std::fmt::Debug for CellValue {
48
+ fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
49
+ match self {
50
+ CellValue::Inline { len, .. } => write!(f, "Inline({len} bytes)"),
51
+ CellValue::Arena { slice, .. } => write!(f, "Arena({} bytes)", slice.len()),
52
+ CellValue::Block(c) => write!(f, "Block({} bytes)", c.len()),
53
+ CellValue::Owned(v) => write!(f, "Owned({} bytes)", v.len()),
54
+ }
55
+ }
56
+ }
57
+
58
+ /// A resolved cell value that pins its storage instead of copying it: a range of a cached
59
+ /// block (`cache::Cell`), or a range of a memtable arena plus the view pin that keeps it alive
60
+ /// (`memtable::ArenaSlice` + `Arc<View>`). Values of at most [`CellData::INLINE_MAX`] bytes,
61
+ /// merge results and values the resolver had to buffer (up to 4 KiB, decision D81) are copied
62
+ /// into the cell instead (decision D29), so a hot small get never takes a view reference.
63
+ /// Holds no lifetime and clones cheaply.
64
+ #[derive(Debug, Clone)]
65
+ pub struct CellData {
66
+ ts: Timestamp,
67
+ value: CellValue,
68
+ }
69
+
70
+ impl CellData {
71
+ /// Values up to this many bytes are copied rather than pinned.
72
+ pub const INLINE_MAX: usize = 128;
73
+
74
+ /// An empty inline value at timestamp 0, to be overwritten in place with
75
+ /// [`CellData::set_inline`].
76
+ pub const EMPTY: CellData = CellData {
77
+ ts: 0,
78
+ value: CellValue::Inline {
79
+ len: 0,
80
+ bytes: [0; Self::INLINE_MAX],
81
+ },
82
+ };
83
+
84
+ /// A cell holding `stored` (a stored value, its tag byte first) at `ts`: inline when it
85
+ /// fits, else the buffer itself. For results built from values a read copied out, such
86
+ /// as a byte-budgeted read's (D308).
87
+ pub fn from_stored(ts: Timestamp, stored: Vec<u8>) -> Self {
88
+ if stored.len() <= Self::INLINE_MAX {
89
+ let mut c = Self::EMPTY;
90
+ c.set_inline(ts, &stored);
91
+ c
92
+ } else {
93
+ CellData {
94
+ ts,
95
+ value: CellValue::Owned(stored),
96
+ }
97
+ }
98
+ }
99
+
100
+ /// Makes this cell a copy of `stored` (a stored value of at most
101
+ /// [`CellData::INLINE_MAX`] bytes) at `ts`, reusing its inline bytes when it has them.
102
+ #[inline]
103
+ pub fn set_inline(&mut self, ts: Timestamp, stored: &[u8]) {
104
+ debug_assert!(stored.len() <= Self::INLINE_MAX);
105
+ self.ts = ts;
106
+ match &mut self.value {
107
+ CellValue::Inline { len, bytes } => {
108
+ bytes[..stored.len()].copy_from_slice(stored);
109
+ *len = stored.len() as u8;
110
+ }
111
+ v => {
112
+ let mut bytes = [0u8; Self::INLINE_MAX];
113
+ bytes[..stored.len()].copy_from_slice(stored);
114
+ *v = CellValue::Inline {
115
+ len: stored.len() as u8,
116
+ bytes,
117
+ };
118
+ }
119
+ }
120
+ }
121
+
122
+ /// Builds a cell from a resolved one. `source` is the source the merged cursor is on
123
+ /// (to pin a large value without copying); `pin` is called only when the value is large
124
+ /// and borrowed from a memtable, so a hot small get never touches a view reference count.
125
+ pub(crate) fn from_cell(
126
+ cell: &ResolvedCell<'_>,
127
+ source: Option<&Source>,
128
+ pin: impl FnOnce() -> Arc<View>,
129
+ ) -> Self {
130
+ let stored = cell.value;
131
+ let value = if stored.len() <= Self::INLINE_MAX {
132
+ let mut bytes = [0u8; Self::INLINE_MAX];
133
+ bytes[..stored.len()].copy_from_slice(stored);
134
+ CellValue::Inline {
135
+ len: stored.len() as u8,
136
+ bytes,
137
+ }
138
+ } else if cell.from_source {
139
+ match source.map(Source::pin_value) {
140
+ Some(Pinned::Arena(slice)) => CellValue::Arena {
141
+ slice,
142
+ _view: pin(),
143
+ },
144
+ Some(Pinned::Block(c)) => CellValue::Block(c),
145
+ None => CellValue::Owned(stored.to_vec()),
146
+ }
147
+ } else {
148
+ CellValue::Owned(stored.to_vec())
149
+ };
150
+ Self { ts: cell.ts, value }
151
+ }
152
+
153
+ /// A separated value read from its blob file: pinned in the block cache, or copied when
154
+ /// small.
155
+ fn from_blob(ts: Timestamp, value: pigeonhole_cache::Cell) -> Self {
156
+ let bytes: &[u8] = &value;
157
+ if bytes.len() <= Self::INLINE_MAX {
158
+ let mut inline = [0u8; Self::INLINE_MAX];
159
+ inline[..bytes.len()].copy_from_slice(bytes);
160
+ return Self {
161
+ ts,
162
+ value: CellValue::Inline {
163
+ len: bytes.len() as u8,
164
+ bytes: inline,
165
+ },
166
+ };
167
+ }
168
+ Self {
169
+ ts,
170
+ value: CellValue::Block(value),
171
+ }
172
+ }
173
+
174
+ /// Builds a cell from a resolved one that the caller would copy (small, or buffered by
175
+ /// the resolver), reading a separated value from its blob file first.
176
+ pub(crate) fn resolved(
177
+ cell: &ResolvedCell<'_>,
178
+ ssts: &SstSet,
179
+ pin: impl FnOnce() -> Arc<View>,
180
+ ) -> Result<Self> {
181
+ Ok(match ssts.read_blob(cell.value)? {
182
+ Some(v) => Self::from_blob(cell.ts, v),
183
+ None => Self::from_cell(cell, None, pin),
184
+ })
185
+ }
186
+
187
+ fn from_pinned(ts: Timestamp, value: &LaneValue, pin: impl FnOnce() -> Arc<View>) -> Self {
188
+ let bytes: &[u8] = value;
189
+ if bytes.len() <= Self::INLINE_MAX {
190
+ let mut inline = [0u8; Self::INLINE_MAX];
191
+ inline[..bytes.len()].copy_from_slice(bytes);
192
+ return Self {
193
+ ts,
194
+ value: CellValue::Inline {
195
+ len: bytes.len() as u8,
196
+ bytes: inline,
197
+ },
198
+ };
199
+ }
200
+ let value = match value {
201
+ LaneValue::Copied(v) => CellValue::Owned(v.clone()),
202
+ LaneValue::Pinned(Pinned::Arena(slice)) => CellValue::Arena {
203
+ slice: slice.clone(),
204
+ _view: pin(),
205
+ },
206
+ LaneValue::Pinned(Pinned::Block(c)) => CellValue::Block(c.clone()),
207
+ };
208
+ Self { ts, value }
209
+ }
210
+
211
+ /// A copy of `stored` at `ts` (the row cache's hits, D201).
212
+ pub(crate) fn copied(ts: Timestamp, stored: &[u8]) -> Self {
213
+ let mut data = Self::EMPTY;
214
+ if stored.len() <= Self::INLINE_MAX {
215
+ data.set_inline(ts, stored);
216
+ } else {
217
+ data.ts = ts;
218
+ data.value = CellValue::Owned(stored.to_vec());
219
+ }
220
+ data
221
+ }
222
+
223
+ /// Timestamp of this version.
224
+ pub fn timestamp(&self) -> Timestamp {
225
+ self.ts
226
+ }
227
+
228
+ /// The stored value (tag byte included).
229
+ pub fn stored(&self) -> &[u8] {
230
+ match &self.value {
231
+ CellValue::Inline { len, bytes } => &bytes[..usize::from(*len)],
232
+ CellValue::Arena { slice, .. } => slice,
233
+ CellValue::Block(c) => c,
234
+ CellValue::Owned(v) => v,
235
+ }
236
+ }
237
+
238
+ /// The decoded value. Never [`ValueRef::Blob`]: separated values are resolved on read.
239
+ pub fn value(&self) -> ValueRef<'_> {
240
+ decode_value(self.stored()).unwrap_or(ValueRef::Bytes(&[]))
241
+ }
242
+ }
243
+
244
+ /// What part of a row (or of each scanned row) to read. Built once per read.
245
+ #[derive(Debug, Clone, Default)]
246
+ #[non_exhaustive]
247
+ pub struct ReadSpec {
248
+ /// Families to read, in this order; empty means every family of the table.
249
+ pub families: Vec<FamilyId>,
250
+ /// Qualifier selection (pushed into the block decoder).
251
+ pub qualifiers: QualifierFilter,
252
+ /// Versions per column (1 = latest; 0 = all retained).
253
+ pub versions: u32,
254
+ /// Keep versions with `min <= ts < max` (pushed into the block decoder, or applied to
255
+ /// resolved versions on a family with a merge operator, decision D82).
256
+ pub time_range: Option<(Timestamp, Timestamp)>,
257
+ /// Columns per row and family (0 = unlimited); the rest of the row is skipped.
258
+ pub columns_per_row: u32,
259
+ /// Keep only cells whose value matches.
260
+ pub value: Option<ValuePredicate>,
261
+ }
262
+
263
+ impl ReadSpec {
264
+ /// The resolver options and entry filter for one family under this spec.
265
+ pub(crate) fn resolve_opts(
266
+ &self,
267
+ meta: &FamilyMeta,
268
+ snapshot: Seqno,
269
+ now: Timestamp,
270
+ ) -> (ResolveOptions, ScanFilter) {
271
+ let mut opts = ResolveOptions::new(snapshot, now);
272
+ opts.ttl_micros = meta.options.ttl_micros;
273
+ // Decision D76: the caller folds the family's max_versions in (0 = unlimited).
274
+ opts.versions = match (meta.options.max_versions, self.versions) {
275
+ (0, v) => v,
276
+ (m, 0) => m,
277
+ (m, v) => m.min(v),
278
+ };
279
+ opts.columns_per_row = self.columns_per_row;
280
+ opts.value = self.value.clone();
281
+ opts.merge = meta.merge_op.clone();
282
+ opts.counter = meta.options.kind.is_aggregate();
283
+ let mut filter = ScanFilter::all();
284
+ filter.qualifiers = self.qualifiers.clone();
285
+ opts.route_time_range(&mut filter, self.time_range);
286
+ (opts, filter)
287
+ }
288
+ }
289
+
290
+ /// Reads separated values for the resolver (`ResolveOptions::blobs`): a value predicate
291
+ /// tests the value, and a merge operator folds onto the value, not its pointer. The resolver
292
+ /// cannot fail through the hook, so the first error is kept here and the read reports it
293
+ /// after each resolver step ([`ResolverBlobs::check`]).
294
+ #[derive(Debug)]
295
+ pub(crate) struct ResolverBlobs {
296
+ ssts: Arc<SstSet>,
297
+ error: Mutex<Option<Error>>,
298
+ }
299
+
300
+ impl ResolverBlobs {
301
+ /// Sets `opts.blobs` when the resolver may need a separated value and `ssts` names blob
302
+ /// files; returns the handle to check after each resolver step. It may need one for a
303
+ /// value predicate, or to fold operands onto a separated base: under an application's
304
+ /// operator, or a built-in one whose kind's values may be separated (a bloom filter,
305
+ /// D298 §4.1; `catalog::folds_separated_bases`). The other built-in operators never see
306
+ /// a separated base: their kinds' values stay inline (`FamilyKind::values_stay_inline`),
307
+ /// and a standard family's `i64` add rejects every base that is not a stored `i64`, which
308
+ /// a separated value never is. Skipping it keeps their reads free of the hook.
309
+ pub(crate) fn attach(opts: &mut ResolveOptions, ssts: &Arc<SstSet>) -> Option<Arc<Self>> {
310
+ let folds = opts.merge.as_ref().is_some_and(|m| {
311
+ crate::catalog::builtin_kind(m.name()).is_none_or(crate::catalog::folds_separated_bases)
312
+ });
313
+ if !(opts.value.is_some() || folds) || !ssts.has_blobs() {
314
+ return None;
315
+ }
316
+ let blobs = Arc::new(Self {
317
+ ssts: Arc::clone(ssts),
318
+ error: Mutex::new(None),
319
+ });
320
+ opts.blobs = Some(Arc::clone(&blobs) as Arc<dyn BlobFetch>);
321
+ Some(blobs)
322
+ }
323
+
324
+ /// Fails with the first error a fetch hit.
325
+ pub(crate) fn check(blobs: Option<&Arc<Self>>) -> Result<()> {
326
+ match blobs.and_then(|b| {
327
+ b.error
328
+ .lock()
329
+ .unwrap_or_else(PoisonError::into_inner)
330
+ .take()
331
+ }) {
332
+ Some(e) => Err(e),
333
+ None => Ok(()),
334
+ }
335
+ }
336
+ }
337
+
338
+ impl BlobFetch for ResolverBlobs {
339
+ fn fetch(&self, ptr: &BlobPointer) -> Option<pigeonhole_cache::Cell> {
340
+ match self.ssts.read_pointer(ptr) {
341
+ Ok(v) => Some(v),
342
+ Err(e) => {
343
+ let mut slot = self.error.lock().unwrap_or_else(PoisonError::into_inner);
344
+ if slot.is_none() {
345
+ *slot = Some(e);
346
+ }
347
+ None
348
+ }
349
+ }
350
+ }
351
+ }
352
+
353
+ /// A row-range scan.
354
+ #[derive(Debug, Clone)]
355
+ #[non_exhaustive]
356
+ pub struct ScanSpec {
357
+ /// Start of the row range.
358
+ pub start: Bound<Vec<u8>>,
359
+ /// End of the row range.
360
+ pub end: Bound<Vec<u8>>,
361
+ /// Per-row selection.
362
+ pub read: ReadSpec,
363
+ /// Stop after this many rows (0 = unlimited).
364
+ pub limit: u64,
365
+ }
366
+
367
+ impl ScanSpec {
368
+ /// Every row in `[start, end)` with the default projection.
369
+ pub fn new(start: Bound<Vec<u8>>, end: Bound<Vec<u8>>) -> Self {
370
+ Self {
371
+ start,
372
+ end,
373
+ read: ReadSpec::default(),
374
+ limit: 0,
375
+ }
376
+ }
377
+ }
378
+
379
+ /// One cell of a row read. Its qualifier is a range of [`RowData::qualifiers`], so a row
380
+ /// read allocates a few buffers, not one per cell.
381
+ #[derive(Debug, Clone)]
382
+ pub struct RowCell {
383
+ /// Family.
384
+ pub family: FamilyId,
385
+ /// Qualifier bytes (unescaped) within [`RowData::qualifiers`].
386
+ pub qualifier: std::ops::Range<u32>,
387
+ /// Version and value.
388
+ pub data: CellData,
389
+ }
390
+
391
+ /// The result of a row read: cells ordered by family (in [`ReadSpec::families`] order), then
392
+ /// qualifier, then newest version first.
393
+ #[derive(Debug, Clone, Default)]
394
+ pub struct RowData {
395
+ /// Row key.
396
+ pub row: Vec<u8>,
397
+ /// Every qualifier of the row, concatenated; cells refer to ranges of it.
398
+ pub qualifiers: Vec<u8>,
399
+ /// Cells.
400
+ pub cells: Vec<RowCell>,
401
+ }
402
+
403
+ impl RowData {
404
+ /// The qualifier of `cell`.
405
+ pub fn qualifier(&self, cell: &RowCell) -> &[u8] {
406
+ &self.qualifiers[cell.qualifier.start as usize..cell.qualifier.end as usize]
407
+ }
408
+ }
409
+
410
+ /// Where a row read puts the cells it resolves ([`Engine::read_row_into_families`](crate::Engine::read_row_into_families)),
411
+ /// in order: by family (in [`ReadSpec::families`] order), then qualifier, newest version
412
+ /// first. A caller's own row buffer can take them directly, without an intermediate
413
+ /// [`RowData`] (#287).
414
+ pub trait RowSink {
415
+ /// The buffer qualifiers are unescaped into, one after another.
416
+ fn qualifiers(&mut self) -> &mut Vec<u8>;
417
+ /// Appends a cell of `family` whose qualifier is `qualifier` within
418
+ /// [`RowSink::qualifiers`].
419
+ fn push(&mut self, family: FamilyId, qualifier: std::ops::Range<usize>, data: CellData);
420
+ /// Appends a cell whose value is a copy of `stored` (at most [`CellData::INLINE_MAX`]
421
+ /// bytes). Sinks that store cells in a vector override this to build the cell in place
422
+ /// rather than move it (#287).
423
+ fn push_inline(
424
+ &mut self,
425
+ family: FamilyId,
426
+ qualifier: std::ops::Range<usize>,
427
+ ts: Timestamp,
428
+ stored: &[u8],
429
+ ) {
430
+ let mut data = CellData::EMPTY;
431
+ data.set_inline(ts, stored);
432
+ self.push(family, qualifier, data);
433
+ }
434
+
435
+ /// Whether the sink takes no more cells: a row read stops before its next cell. The row
436
+ /// cache's fill uses it to stop reading a row once it is past the cache's row cap (an
437
+ /// oversize row is never stored, so reading it whole is waste, #1059). Never, by default.
438
+ #[inline]
439
+ fn full(&self) -> bool {
440
+ false
441
+ }
442
+
443
+ /// How many cells this sink holds, for the row cache to read back what a read pushed
444
+ /// (D201). `None` (the default): the sink cannot report them, and its reads are not
445
+ /// stored in the row cache.
446
+ fn cell_count(&self) -> Option<usize> {
447
+ None
448
+ }
449
+
450
+ /// Cell `i`: its qualifier and data (see [`RowSink::cell_count`]).
451
+ fn cell(&self, i: usize) -> Option<(&[u8], &CellData)> {
452
+ let _ = i;
453
+ None
454
+ }
455
+ }
456
+
457
+ impl RowSink for RowData {
458
+ fn qualifiers(&mut self) -> &mut Vec<u8> {
459
+ &mut self.qualifiers
460
+ }
461
+
462
+ fn push(&mut self, family: FamilyId, qualifier: std::ops::Range<usize>, data: CellData) {
463
+ self.cells.push(RowCell {
464
+ family,
465
+ qualifier: qualifier.start as u32..qualifier.end as u32,
466
+ data,
467
+ });
468
+ }
469
+
470
+ fn push_inline(
471
+ &mut self,
472
+ family: FamilyId,
473
+ qualifier: std::ops::Range<usize>,
474
+ ts: Timestamp,
475
+ stored: &[u8],
476
+ ) {
477
+ self.cells.push(RowCell {
478
+ family,
479
+ qualifier: qualifier.start as u32..qualifier.end as u32,
480
+ data: CellData::EMPTY,
481
+ });
482
+ if let Some(c) = self.cells.last_mut() {
483
+ c.data.set_inline(ts, stored);
484
+ }
485
+ }
486
+
487
+ fn cell_count(&self) -> Option<usize> {
488
+ Some(self.cells.len())
489
+ }
490
+
491
+ fn cell(&self, i: usize) -> Option<(&[u8], &CellData)> {
492
+ let c = self.cells.get(i)?;
493
+ Some((self.qualifier(c), &c.data))
494
+ }
495
+ }
496
+
497
+ /// The column prefix of a resolved cell's key (escaped row, terminator, escaped qualifier,
498
+ /// terminator).
499
+ pub(crate) fn column_of(key: &[u8]) -> &[u8] {
500
+ &key[..key.len().saturating_sub(SUFFIX_LEN)]
501
+ }
502
+
503
+ /// The escaped row inside a column prefix (without its terminator).
504
+ pub(crate) fn row_of(column: &[u8]) -> &[u8] {
505
+ let n = row_prefix_len(column).unwrap_or(column.len());
506
+ &column[..n.saturating_sub(2)]
507
+ }
508
+
509
+ /// The smallest key past every key of the row whose prefix is `prefix` (the terminator's
510
+ /// last byte bumped), appended to `out`.
511
+ pub(crate) fn past_row(prefix: &[u8], out: &mut Vec<u8>) {
512
+ out.extend_from_slice(prefix);
513
+ if let Some(last) = out.last_mut() {
514
+ *last += 1;
515
+ }
516
+ }
517
+
518
+ /// Maps a resolver error for `meta`: the shared resolver reports a missing operator as a
519
+ /// merge error; the engine promises `UnknownMergeOperator` for such reads.
520
+ pub(crate) fn read_error(e: Error, meta: &FamilyMeta) -> Error {
521
+ match (e, meta.merge) {
522
+ (Error::Merge(_), MergeKind::Unknown) => {
523
+ Error::UnknownMergeOperator(meta.options.merge_operator.clone())
524
+ }
525
+ (e, _) => e,
526
+ }
527
+ }
528
+
529
+ /// A cell borrowed from a [`ScanCursor`]; valid until the cursor moves.
530
+ #[derive(Debug, Clone, Copy)]
531
+ pub struct ScanCell<'a> {
532
+ /// Family.
533
+ pub family: FamilyId,
534
+ /// Qualifier (unescaped; may borrow the cursor's scratch buffer).
535
+ pub qualifier: &'a [u8],
536
+ /// Timestamp.
537
+ pub ts: Timestamp,
538
+ /// Stored value (tag byte included).
539
+ pub stored: &'a [u8],
540
+ }
541
+
542
+ /// A scan's `[start, end)` as encoded row prefixes (`None` = unbounded).
543
+ type RowBounds = (Option<Vec<u8>>, Option<Vec<u8>>);
544
+
545
+ /// A lane's held value.
546
+ #[derive(Debug)]
547
+ enum LaneValue {
548
+ Copied(Vec<u8>),
549
+ Pinned(Pinned),
550
+ }
551
+
552
+ impl std::ops::Deref for LaneValue {
553
+ type Target = [u8];
554
+
555
+ fn deref(&self) -> &[u8] {
556
+ match self {
557
+ LaneValue::Copied(v) => v,
558
+ LaneValue::Pinned(p) => p,
559
+ }
560
+ }
561
+ }
562
+
563
+ /// The resolver of one family within one tablet, plus the cell it holds but has not handed
564
+ /// out yet.
565
+ struct Lane {
566
+ family: FamilyId,
567
+ /// The family's merge operator name when the build does not know it (to name it in the
568
+ /// error a merge then fails with), `None` otherwise: no copy of the family's metadata.
569
+ unknown_merge: Option<String>,
570
+ resolver: Resolver,
571
+ /// A value the resolver buffered was too large to keep its buffers for the next scan.
572
+ grew: bool,
573
+ /// The view's SSTs and blob files, to read separated values.
574
+ ssts: Arc<SstSet>,
575
+ /// The resolver's blob reads, if it may need any.
576
+ resolver_blobs: Option<Arc<ResolverBlobs>>,
577
+ /// The held cell is the resolver's current one (`CellResolver::current`, valid while
578
+ /// `pending`), not a copy: its timestamp, and its value pinned when it is separated or a
579
+ /// large value borrowed from a source.
580
+ ts: Timestamp,
581
+ pinned: Option<LaneValue>,
582
+ pending: bool,
583
+ done: bool,
584
+ }
585
+
586
+ impl std::fmt::Debug for Lane {
587
+ fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
588
+ f.debug_struct("Lane")
589
+ .field("family", &self.family)
590
+ .field("pending", &self.pending)
591
+ .finish()
592
+ }
593
+ }
594
+
595
+ impl Lane {
596
+ /// Moves to the next visible cell. The lane holds it where the resolver has it; only a
597
+ /// separated value (read from its blob file) or a large one borrowed from a source is
598
+ /// pinned.
599
+ fn fetch(&mut self) -> Result<()> {
600
+ self.pending = false;
601
+ self.pinned = None;
602
+ if self.done {
603
+ return Ok(());
604
+ }
605
+ let (from_source, len) = {
606
+ let next = self.resolver.next_cell();
607
+ ResolverBlobs::check(self.resolver_blobs.as_ref())?;
608
+ let Some(cell) = next.map_err(|e| match (e, &self.unknown_merge) {
609
+ (Error::Merge(_), Some(name)) => Error::UnknownMergeOperator(name.clone()),
610
+ (e, _) => e,
611
+ })?
612
+ else {
613
+ self.done = true;
614
+ return Ok(());
615
+ };
616
+ self.ts = cell.ts;
617
+ if let Some(v) = self.ssts.read_blob(cell.value)? {
618
+ self.pinned = Some(LaneValue::Pinned(Pinned::Block(v)));
619
+ }
620
+ (cell.from_source, cell.value.len())
621
+ };
622
+ // Large values only (one branch per cell): a source's is pinned where it lies; one
623
+ // the resolver buffered marks its buffers too large to keep for the next scan.
624
+ if len > CellData::INLINE_MAX {
625
+ if !from_source {
626
+ self.grew |= len > KEEP_BUFFERS_BELOW;
627
+ } else if self.pinned.is_none() {
628
+ let src = self
629
+ .resolver
630
+ .cursor()
631
+ .current()
632
+ .expect("the merged cursor is on the returned entry");
633
+ self.pinned = Some(LaneValue::Pinned(src.pin_value()));
634
+ }
635
+ }
636
+ self.pending = true;
637
+ Ok(())
638
+ }
639
+
640
+ /// The held cell's column prefix (only while `pending`).
641
+ fn col(&self) -> &[u8] {
642
+ self.resolver.current().map_or(&[], |c| column_of(c.key))
643
+ }
644
+
645
+ /// The held cell's stored value (only while `pending`).
646
+ fn value(&self) -> &[u8] {
647
+ match &self.pinned {
648
+ Some(v) => v,
649
+ None => self.resolver.current().map_or(&[], |c| c.value),
650
+ }
651
+ }
652
+
653
+ /// The held cell as a [`CellData`]: a large value stays pinned when it is, and is
654
+ /// copied otherwise (a large merge result the resolver buffered).
655
+ fn data(&self, pin: impl FnOnce() -> Arc<View>) -> CellData {
656
+ match &self.pinned {
657
+ Some(v) => CellData::from_pinned(self.ts, v, pin),
658
+ None => CellData::from_pinned(self.ts, &LaneValue::Copied(self.value().to_vec()), pin),
659
+ }
660
+ }
661
+ }
662
+
663
+ /// An ordered scan over a snapshot: walks tablets in key order and, per family, a resolver
664
+ /// over a merge of the owning sources (memtables and SSTs) stored inside the cursor beside
665
+ /// the snapshot that keeps them valid. Rows come out in order; within a row, cells come out
666
+ /// by family, qualifier, newest first.
667
+ #[derive(Debug)]
668
+ pub struct ScanCursor {
669
+ snapshot: Snapshot,
670
+ spec: ScanSpec,
671
+ families: Vec<FamilyId>,
672
+ now: Timestamp,
673
+ table: TableId,
674
+ /// Index of the next tablet to scan among the table's tablets in the snapshot's view.
675
+ next_tablet: usize,
676
+ /// The scan's start and end as row-prefix bounds, encoded on the first tablet.
677
+ bounds: Option<RowBounds>,
678
+ /// The bounds clamped to the current tablet (reused buffers).
679
+ lo: Vec<u8>,
680
+ hi: Vec<u8>,
681
+ lanes: Vec<Lane>,
682
+ /// Escaped and unescaped current row.
683
+ row_esc: Vec<u8>,
684
+ row: Vec<u8>,
685
+ in_row: bool,
686
+ rows_emitted: u64,
687
+ /// Next lane to look at for the current row.
688
+ lane_idx: usize,
689
+ /// The lane whose cell was handed out last (advanced before the next cell).
690
+ last_lane: Option<usize>,
691
+ qual_buf: Vec<u8>,
692
+ done: bool,
693
+ /// An async scan's state (`Engine::scan_async`), `None` for a sync one.
694
+ nb: Option<Box<AsyncScan>>,
695
+ }
696
+
697
+ /// What an async scan keeps between polls (D196, #398).
698
+ struct AsyncScan {
699
+ shared: Arc<crate::shard::Shared>,
700
+ fetch: Option<(pigeonhole_io::Completion, Box<pigeonhole_sst::Fetch>)>,
701
+ /// Blocks it fetched and has not stepped past yet.
702
+ pinned: Vec<pigeonhole_cache::BlockHandle>,
703
+ /// Fetches while positioning the current tablet: past `MAX_POSITION_FETCHES`, or when
704
+ /// the cache keeps nothing, it positions synchronously (counted).
705
+ fetches: u32,
706
+ sync: bool,
707
+ }
708
+
709
+ impl std::fmt::Debug for AsyncScan {
710
+ fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
711
+ f.debug_struct("AsyncScan")
712
+ .field("fetching", &self.fetch.is_some())
713
+ .field("pinned", &self.pinned.len())
714
+ .field("sync", &self.sync)
715
+ .finish()
716
+ }
717
+ }
718
+
719
+ /// Fetches an async scan makes positioning one tablet before it positions synchronously.
720
+ const MAX_POSITION_FETCHES: u32 = 64;
721
+
722
+ impl ScanCursor {
723
+ pub(crate) fn new(
724
+ snapshot: Snapshot,
725
+ table: TableId,
726
+ spec: ScanSpec,
727
+ families: Vec<FamilyId>,
728
+ now: Timestamp,
729
+ ) -> Self {
730
+ Self {
731
+ snapshot,
732
+ spec,
733
+ families,
734
+ now,
735
+ table,
736
+ next_tablet: 0,
737
+ bounds: None,
738
+ lo: Vec::new(),
739
+ hi: Vec::new(),
740
+ lanes: Vec::new(),
741
+ row_esc: Vec::new(),
742
+ row: Vec::new(),
743
+ in_row: false,
744
+ rows_emitted: 0,
745
+ lane_idx: 0,
746
+ last_lane: None,
747
+ qual_buf: Vec::new(),
748
+ done: false,
749
+ nb: None,
750
+ }
751
+ }
752
+
753
+ /// The next row of an async scan ([`Engine::scan_async`](crate::Engine::scan_async)):
754
+ /// `Ready(Ok(true))` when the cursor is on a row (read its cells, inside
755
+ /// [`ScanCursor::counted`]), `Ready(Ok(false))` at the end.
756
+ ///
757
+ /// Each tablet is positioned cache-only: its cursors' seeks and first cells read only
758
+ /// cached blocks, and what they miss is fetched asynchronously before positioning again
759
+ /// (a position can be redone, as a get can). Then each step first fetches the blocks the
760
+ /// SST cursors will read next, if uncached (one ahead per cursor, only as the scan is
761
+ /// polled), and steps synchronously: a block it still misses (not predicted) is read
762
+ /// synchronously and counted in `Metrics::async_sync_reads` (D196, #398). On a sync
763
+ /// cursor this is `next_row`.
764
+ pub fn poll_next_row(
765
+ &mut self,
766
+ cx: &mut std::task::Context<'_>,
767
+ ) -> std::task::Poll<Result<bool>> {
768
+ let _poll = pigeonhole_io::async_poll_scope();
769
+ use std::future::Future;
770
+ use std::sync::atomic::Ordering;
771
+ use std::task::Poll;
772
+ let Some(mut nb) = self.nb.take() else {
773
+ return Poll::Ready(self.next_row());
774
+ };
775
+ let out = loop {
776
+ if let Some((completion, fetch)) = &mut nb.fetch {
777
+ let buf = match std::pin::Pin::new(completion).poll(cx) {
778
+ Poll::Pending => {
779
+ self.nb = Some(nb);
780
+ return Poll::Pending;
781
+ }
782
+ Poll::Ready(r) => r,
783
+ };
784
+ let admitted = buf.map_err(Error::from).and_then(|b| Ok(fetch.admit(b)?));
785
+ let kept = fetch.is_kept();
786
+ nb.fetch = None;
787
+ match admitted {
788
+ Ok(h) => nb.pinned.extend(h),
789
+ Err(e) => break Err(e),
790
+ }
791
+ if !kept {
792
+ // The cache keeps nothing: prefetching or positioning cache-only would
793
+ // fetch the same block again; read synchronously from now on (counted).
794
+ nb.sync = true;
795
+ nb.shared.async_sync_reads.fetch_add(1, Ordering::Relaxed);
796
+ }
797
+ }
798
+ if self.done {
799
+ break Ok(false);
800
+ }
801
+ if self.lanes.is_empty() && !self.in_row && !nb.sync {
802
+ // Position the next tablet cache-only; on a miss, undo and fetch.
803
+ let tablet = self.next_tablet;
804
+ let positioned = self.open_next_tablet::<true>().and_then(|more| {
805
+ if more {
806
+ self.fill_lanes()?;
807
+ }
808
+ Ok(more)
809
+ });
810
+ match positioned {
811
+ Err(Error::WouldBlock(mut fetch)) => {
812
+ self.recycle_lanes();
813
+ self.next_tablet = tablet;
814
+ nb.fetches += 1;
815
+ if nb.fetches > MAX_POSITION_FETCHES {
816
+ nb.sync = true;
817
+ nb.shared.async_sync_reads.fetch_add(1, Ordering::Relaxed);
818
+ } else {
819
+ let completion = fetch.start();
820
+ nb.fetch = Some((completion, fetch));
821
+ }
822
+ continue;
823
+ }
824
+ Err(e) => break Err(e),
825
+ Ok(false) => {
826
+ self.done = true;
827
+ break Ok(false);
828
+ }
829
+ Ok(true) => {
830
+ nb.fetches = 0;
831
+ nb.pinned.clear();
832
+ for lane in &mut self.lanes {
833
+ for source in lane.resolver.cursor_mut().sources_mut() {
834
+ source.set_cache_only(false);
835
+ }
836
+ }
837
+ }
838
+ }
839
+ }
840
+ if !nb.sync {
841
+ // One block ahead per cursor; fetched one at a time.
842
+ let mut upcoming = Vec::new();
843
+ for lane in &self.lanes {
844
+ for source in lane.resolver.cursor().sources() {
845
+ source.upcoming(1, &mut upcoming);
846
+ if !upcoming.is_empty() {
847
+ break;
848
+ }
849
+ }
850
+ if !upcoming.is_empty() {
851
+ break;
852
+ }
853
+ }
854
+ if let Some(fetch) = upcoming.into_iter().next() {
855
+ let completion = fetch.submit();
856
+ nb.fetch = Some((completion, Box::new(fetch)));
857
+ continue;
858
+ }
859
+ }
860
+ let ((stepped, blob_reads), file_reads) = pigeonhole_sst::counting_file_reads(|| {
861
+ as_async_read(false, || {
862
+ if nb.sync {
863
+ self.advance_row_impl::<true>()
864
+ } else {
865
+ self.advance_row_impl::<false>()
866
+ }
867
+ })
868
+ });
869
+ if blob_reads + file_reads > 0 {
870
+ nb.shared
871
+ .async_sync_reads
872
+ .fetch_add(blob_reads + file_reads, Ordering::Relaxed);
873
+ }
874
+ match stepped {
875
+ // The tablet ran out: position the next one.
876
+ Ok(None) => continue,
877
+ Ok(Some(row)) => {
878
+ // Blocks stepped past need not stay pinned.
879
+ nb.pinned.clear();
880
+ break Ok(row);
881
+ }
882
+ Err(e) => break Err(e),
883
+ }
884
+ };
885
+ self.nb = Some(nb);
886
+ Poll::Ready(self.snapshot.checked(out))
887
+ }
888
+
889
+ /// Runs `f` on this cursor counting the file reads it makes synchronously into
890
+ /// `Metrics::async_sync_reads` (an async scan reading a row's cells after
891
+ /// [`ScanCursor::poll_next_row`]); on a sync cursor it just runs `f`.
892
+ pub fn counted<T>(&mut self, f: impl FnOnce(&mut Self) -> T) -> T {
893
+ let Some(shared) = self.nb.as_ref().map(|nb| Arc::clone(&nb.shared)) else {
894
+ return f(self);
895
+ };
896
+ let ((out, blob_reads), file_reads) =
897
+ pigeonhole_sst::counting_file_reads(|| as_async_read(false, || f(self)));
898
+ if blob_reads + file_reads > 0 {
899
+ shared.async_sync_reads.fetch_add(
900
+ blob_reads + file_reads,
901
+ std::sync::atomic::Ordering::Relaxed,
902
+ );
903
+ }
904
+ out
905
+ }
906
+
907
+ /// The cursor of an async scan ([`ScanCursor::poll_next_row`]).
908
+ pub(crate) fn into_async(mut self, shared: Arc<crate::shard::Shared>) -> Self {
909
+ self.nb = Some(Box::new(AsyncScan {
910
+ shared,
911
+ fetch: None,
912
+ pinned: Vec::new(),
913
+ fetches: 0,
914
+ sync: false,
915
+ }));
916
+ self
917
+ }
918
+
919
+ /// The scan's start and end as row-prefix bounds (`None` = unbounded).
920
+ fn bounds(&self) -> Result<RowBounds> {
921
+ let start = match &self.spec.start {
922
+ Bound::Included(s) | Bound::Excluded(s) => {
923
+ let mut k = Vec::new();
924
+ encode_row_prefix(&mut k, s)?;
925
+ Some(k)
926
+ }
927
+ Bound::Unbounded => None,
928
+ };
929
+ let end = match &self.spec.end {
930
+ Bound::Excluded(e) => {
931
+ let mut k = Vec::new();
932
+ encode_row_prefix(&mut k, e)?;
933
+ Some(k)
934
+ }
935
+ Bound::Included(e) => {
936
+ let mut k = Vec::new();
937
+ encode_row_prefix(&mut k, e)?;
938
+ let mut past = Vec::new();
939
+ past_row(&k, &mut past);
940
+ Some(past)
941
+ }
942
+ Bound::Unbounded => None,
943
+ };
944
+ Ok((start, end))
945
+ }
946
+
947
+ /// Builds the lanes for the next tablet, seeking each to the scan start. Returns false
948
+ /// when no tablet is left.
949
+ fn open_next_tablet<const CACHE_ONLY: bool>(&mut self) -> Result<bool> {
950
+ // A cursor taken before a fork stops in the child at its next tablet (#901).
951
+ self.snapshot.check_process()?;
952
+ self.recycle_lanes();
953
+ let view = Arc::clone(&self.snapshot.view);
954
+ let Some(tablet) = view.tablets().tablets_of(self.table).get(self.next_tablet) else {
955
+ return Ok(false);
956
+ };
957
+ self.next_tablet += 1;
958
+ if self.bounds.is_none() {
959
+ self.bounds = Some(self.bounds()?);
960
+ }
961
+ let (start, end) = self.bounds.as_ref().expect("encoded above");
962
+ // Clamp to the tablet: after a split, children share their parent's SSTs (D13), which
963
+ // hold rows of the sibling too.
964
+ let (has_lo, has_hi) = clamp_into(
965
+ tablet,
966
+ start.as_deref(),
967
+ end.as_deref(),
968
+ &mut self.lo,
969
+ &mut self.hi,
970
+ )?;
971
+ let (start, end) = (
972
+ has_lo.then_some(&self.lo[..]),
973
+ has_hi.then_some(&self.hi[..]),
974
+ );
975
+ if matches!((start, end), (Some(s), Some(e)) if s >= e) {
976
+ // No row of the scan is in this tablet: it opens with no lanes.
977
+ return Ok(true);
978
+ }
979
+ // A scan its limit leaves short starts its readahead later (D293). `.max(1)`: a scan
980
+ // that reached its limit opens no tablet (`advance_row_impl` stops first), so a 0
981
+ // here would only mean "no limit".
982
+ let short = crate::source::scan_is_short(if self.spec.limit == 0 {
983
+ 0
984
+ } else {
985
+ self.spec.limit.saturating_sub(self.rows_emitted).max(1)
986
+ });
987
+ for &family in &self.families {
988
+ // Nothing of this family in the tablet: no resolver, options or sources for it (a
989
+ // table's empty families, #406). Located once, for the sources below too.
990
+ let located = view.locate(tablet.shard, tablet.id, family);
991
+ if !located.has_data() {
992
+ continue;
993
+ }
994
+ let Some(meta) = view.catalog.family(family) else {
995
+ continue;
996
+ };
997
+ let (mut opts, filter) =
998
+ self.spec
999
+ .read
1000
+ .resolve_opts(meta, self.snapshot.seqno, self.now);
1001
+ let resolver_blobs = ResolverBlobs::attach(&mut opts, &view.ssts);
1002
+ let mut resolver = take_scan_resolver();
1003
+ let filled = view.scan_sources_located::<CACHE_ONLY>(
1004
+ &located,
1005
+ &filter,
1006
+ start,
1007
+ end,
1008
+ short,
1009
+ resolver.cursor_mut().sources_mut(),
1010
+ );
1011
+ if let Err(e) = filled {
1012
+ // The sources filled so far go now, so the resolver pins nothing.
1013
+ give_back(resolver);
1014
+ return Err(e);
1015
+ }
1016
+ if resolver.cursor_mut().sources().is_empty() {
1017
+ // Nothing of this family in the tablet's range: no lane, so the scan does not
1018
+ // set one up, seek it or poll it per row (a table's empty families, #406).
1019
+ give_back(resolver);
1020
+ continue;
1021
+ }
1022
+ opts.skip_columns = skips_columns(resolver.cursor_mut().sources());
1023
+ resolver.cursor_mut().reset();
1024
+ resolver.reset(opts);
1025
+ resolver.set_upper_bound(end);
1026
+ self.lanes.push(Lane {
1027
+ family,
1028
+ unknown_merge: (meta.merge == MergeKind::Unknown)
1029
+ .then(|| meta.options.merge_operator.clone()),
1030
+ resolver,
1031
+ grew: false,
1032
+ ssts: Arc::clone(&view.ssts),
1033
+ resolver_blobs,
1034
+ ts: 0,
1035
+ pinned: None,
1036
+ pending: false,
1037
+ done: false,
1038
+ });
1039
+ // A failed seek leaves the lane in place; its sources go with the others.
1040
+ let lane = self.lanes.last_mut().expect("pushed above");
1041
+ match start {
1042
+ Some(s) => lane.resolver.seek(s)?,
1043
+ None => lane.resolver.seek(&[])?,
1044
+ }
1045
+ }
1046
+ Ok(true)
1047
+ }
1048
+
1049
+ /// Ends the current lanes: each resolver goes back to the thread's pool for the next
1050
+ /// lanes, unless a large value grew its buffers.
1051
+ fn recycle_lanes(&mut self) {
1052
+ for lane in self.lanes.drain(..) {
1053
+ if !lane.grew {
1054
+ give_back(lane.resolver);
1055
+ }
1056
+ }
1057
+ }
1058
+
1059
+ /// Makes sure every lane either holds a pending cell or is exhausted.
1060
+ fn fill_lanes(&mut self) -> Result<()> {
1061
+ for lane in &mut self.lanes {
1062
+ if !lane.pending && !lane.done {
1063
+ lane.fetch()?;
1064
+ }
1065
+ }
1066
+ Ok(())
1067
+ }
1068
+
1069
+ /// Whether `row` (unescaped) is past the end bound.
1070
+ fn past_end(&self, row: &[u8]) -> bool {
1071
+ match &self.spec.end {
1072
+ Bound::Included(e) => row > e.as_slice(),
1073
+ Bound::Excluded(e) => row >= e.as_slice(),
1074
+ Bound::Unbounded => false,
1075
+ }
1076
+ }
1077
+
1078
+ /// Drops the rest of the current row in every lane.
1079
+ fn skip_current_row(&mut self) -> Result<()> {
1080
+ // A column of the current row starts with its escaped row and the terminator (which
1081
+ // never occurs inside an escaped row): a prefix compare, no walk to find the row.
1082
+ let row_len = self.row_esc.len() + TERMINATOR.len();
1083
+ for lane in &mut self.lanes {
1084
+ let col = if lane.pending { lane.col() } else { &[] };
1085
+ if lane.pending
1086
+ && col.len() >= row_len
1087
+ && col.starts_with(&self.row_esc)
1088
+ && col[self.row_esc.len()..row_len] == TERMINATOR
1089
+ {
1090
+ lane.pending = false;
1091
+ lane.resolver.skip_row()?;
1092
+ }
1093
+ }
1094
+ Ok(())
1095
+ }
1096
+
1097
+ /// Advances to the next row with at least one visible cell. Returns `false` at the end.
1098
+ /// In a reader process, fails with [`Error::SnapshotExpired`] once a writer restarted
1099
+ /// after the snapshot was taken.
1100
+ pub fn next_row(&mut self) -> Result<bool> {
1101
+ let advanced = self.advance_row();
1102
+ self.snapshot.checked(advanced)
1103
+ }
1104
+
1105
+ fn advance_row(&mut self) -> Result<bool> {
1106
+ Ok(self.advance_row_impl::<true>()?.unwrap_or(false))
1107
+ }
1108
+
1109
+ /// Advances to the next row; with `OPEN`, opening the next tablets as it needs them;
1110
+ /// without, `None` where it would open one (an async scan positions it cache-only first).
1111
+ // Inlined: as a separate function a sync scan measured about 3.5 instructions more per
1112
+ // row (#42).
1113
+ #[inline(always)]
1114
+ fn advance_row_impl<const OPEN: bool>(&mut self) -> Result<Option<bool>> {
1115
+ if self.done {
1116
+ return Ok(Some(false));
1117
+ }
1118
+ // A scan at its row limit is done: never read the next row just to stop there.
1119
+ if self.spec.limit != 0 && self.rows_emitted >= self.spec.limit {
1120
+ self.done = true;
1121
+ self.recycle_lanes();
1122
+ return Ok(Some(false));
1123
+ }
1124
+ // Drop whatever is left of the current row.
1125
+ if self.in_row {
1126
+ if let Some(i) = self.last_lane.take() {
1127
+ self.lanes[i].pending = false;
1128
+ }
1129
+ self.skip_current_row()?;
1130
+ self.in_row = false;
1131
+ }
1132
+ loop {
1133
+ if self.lanes.is_empty() {
1134
+ if !OPEN {
1135
+ return Ok(None);
1136
+ }
1137
+ if !self.open_next_tablet::<false>()? {
1138
+ self.done = true;
1139
+ return Ok(Some(false));
1140
+ }
1141
+ }
1142
+ self.fill_lanes()?;
1143
+ // The smallest pending row across lanes.
1144
+ let mut best: Option<&[u8]> = None;
1145
+ for lane in &self.lanes {
1146
+ if !lane.pending {
1147
+ continue;
1148
+ }
1149
+ let row = row_of(lane.col());
1150
+ if best.is_none_or(|b| row < b) {
1151
+ best = Some(row);
1152
+ }
1153
+ }
1154
+ let Some(best) = best else {
1155
+ // This tablet is exhausted.
1156
+ self.recycle_lanes();
1157
+ continue;
1158
+ };
1159
+ self.row_esc.clear();
1160
+ self.row_esc.extend_from_slice(best);
1161
+ self.row.clear();
1162
+ Escaped::new(&self.row_esc).unescape_long_into(&mut self.row);
1163
+ if matches!(&self.spec.start, Bound::Excluded(s) if s.as_slice() == self.row.as_slice())
1164
+ {
1165
+ self.skip_current_row()?;
1166
+ continue;
1167
+ }
1168
+ if self.past_end(&self.row)
1169
+ || (self.spec.limit != 0 && self.rows_emitted >= self.spec.limit)
1170
+ {
1171
+ self.done = true;
1172
+ self.recycle_lanes();
1173
+ return Ok(Some(false));
1174
+ }
1175
+ self.rows_emitted += 1;
1176
+ // Inside a tablet, a cursor created before a fork stops in the child within
1177
+ // `FORK_CHECK_ROWS` rows (#901, perf287's residual): not per row, which cost the
1178
+ // scan shapes 0.5%.
1179
+ if self.rows_emitted & (FORK_CHECK_ROWS - 1) == 0 {
1180
+ self.check_fork()?;
1181
+ }
1182
+ self.in_row = true;
1183
+ self.lane_idx = 0;
1184
+ self.last_lane = None;
1185
+ return Ok(Some(true));
1186
+ }
1187
+ }
1188
+
1189
+ /// The writer-process snapshot's fork check (#901), out of line: it runs once every
1190
+ /// [`FORK_CHECK_ROWS`] rows.
1191
+ #[cold]
1192
+ #[inline(never)]
1193
+ fn check_fork(&self) -> Result<()> {
1194
+ self.snapshot.check_process()
1195
+ }
1196
+
1197
+ /// The current row key.
1198
+ pub fn row(&self) -> &[u8] {
1199
+ &self.row
1200
+ }
1201
+
1202
+ /// The next cell of the current row, or `None` when the row is done.
1203
+ pub fn next_cell(&mut self) -> Result<Option<ScanCell<'_>>> {
1204
+ let mut qual = std::mem::take(&mut self.qual_buf);
1205
+ qual.clear();
1206
+ let next = self.next_cell_into(&mut qual);
1207
+ self.qual_buf = qual;
1208
+ Ok(next?.map(|family| {
1209
+ let lane = &self.lanes[self.last_lane.expect("set by next_cell_into")];
1210
+ ScanCell {
1211
+ family,
1212
+ qualifier: &self.qual_buf,
1213
+ ts: lane.ts,
1214
+ stored: lane.value(),
1215
+ }
1216
+ }))
1217
+ }
1218
+
1219
+ /// Like [`ScanCursor::next_cell`], but appends the cell's unescaped qualifier to
1220
+ /// `qualifiers` (a caller's row buffer, saving a copy) and returns only its family;
1221
+ /// [`ScanCursor::current_data`] has its version and value.
1222
+ pub fn next_cell_into(&mut self, qualifiers: &mut Vec<u8>) -> Result<Option<FamilyId>> {
1223
+ if !self.in_row {
1224
+ return Ok(None);
1225
+ }
1226
+ if let Some(i) = self.last_lane.take() {
1227
+ let fetched = self.lanes[i].fetch();
1228
+ self.snapshot.checked(fetched)?;
1229
+ }
1230
+ // A column of the current row starts with its escaped row and the terminator (which
1231
+ // never occurs inside an escaped row).
1232
+ let row_len = self.row_esc.len() + TERMINATOR.len();
1233
+ while self.lane_idx < self.lanes.len() {
1234
+ let i = self.lane_idx;
1235
+ let lane = &self.lanes[i];
1236
+ let col = if lane.pending { lane.col() } else { &[] };
1237
+ if lane.pending
1238
+ && col.len() >= row_len
1239
+ && col.starts_with(&self.row_esc)
1240
+ && col[self.row_esc.len()..row_len] == TERMINATOR
1241
+ {
1242
+ self.last_lane = Some(i);
1243
+ let end = col.len().saturating_sub(2).max(row_len);
1244
+ Escaped::new(&col[row_len..end]).unescape_into(qualifiers);
1245
+ return Ok(Some(lane.family));
1246
+ }
1247
+ self.lane_idx += 1;
1248
+ }
1249
+ Ok(None)
1250
+ }
1251
+
1252
+ /// Appends the current row's next cell to `sink`, its qualifier unescaped into
1253
+ /// [`RowSink::qualifiers`]: [`ScanCursor::next_cell_into`] and pushing the cell in one
1254
+ /// step, which reads the resolver's cell once rather than once for its column and again
1255
+ /// for its value (#287). Returns `false` when the row
1256
+ /// is done.
1257
+ pub fn push_next_cell(&mut self, sink: &mut impl RowSink) -> Result<bool> {
1258
+ if !self.in_row {
1259
+ return Ok(false);
1260
+ }
1261
+ if let Some(i) = self.last_lane.take() {
1262
+ let fetched = self.lanes[i].fetch();
1263
+ self.snapshot.checked(fetched)?;
1264
+ }
1265
+ // A column of the current row starts with its escaped row and the terminator (which
1266
+ // never occurs inside an escaped row).
1267
+ let row_len = self.row_esc.len() + TERMINATOR.len();
1268
+ while self.lane_idx < self.lanes.len() {
1269
+ let i = self.lane_idx;
1270
+ let lane = &self.lanes[i];
1271
+ let pushed = match lane.resolver.current().filter(|_| lane.pending) {
1272
+ Some(cell) => {
1273
+ let col = column_of(cell.key);
1274
+ let in_row = col.len() >= row_len
1275
+ && col.starts_with(&self.row_esc)
1276
+ && col[self.row_esc.len()..row_len] == TERMINATOR;
1277
+ if in_row {
1278
+ let end = col.len().saturating_sub(2).max(row_len);
1279
+ let qualifiers = sink.qualifiers();
1280
+ let start = qualifiers.len();
1281
+ Escaped::new(&col[row_len..end]).unescape_into(qualifiers);
1282
+ let qualifier = start..qualifiers.len();
1283
+ let bytes = match &lane.pinned {
1284
+ Some(v) => v,
1285
+ None => cell.value,
1286
+ };
1287
+ if bytes.len() <= CellData::INLINE_MAX {
1288
+ sink.push_inline(lane.family, qualifier, lane.ts, bytes);
1289
+ } else {
1290
+ sink.push(
1291
+ lane.family,
1292
+ qualifier,
1293
+ lane.data(|| Arc::clone(&self.snapshot.view)),
1294
+ );
1295
+ }
1296
+ }
1297
+ in_row
1298
+ }
1299
+ None => false,
1300
+ };
1301
+ if pushed {
1302
+ self.last_lane = Some(i);
1303
+ return Ok(true);
1304
+ }
1305
+ self.lane_idx += 1;
1306
+ }
1307
+ Ok(false)
1308
+ }
1309
+
1310
+ /// The cell last returned by [`ScanCursor::next_cell`], as a pinned [`CellData`] (no
1311
+ /// copy of a large value).
1312
+ ///
1313
+ /// # Panics
1314
+ /// If no cell has been returned for the current row.
1315
+ pub fn current_data(&self) -> CellData {
1316
+ let i = self.last_lane.expect("current_data before next_cell");
1317
+ self.lanes[i].data(|| Arc::clone(&self.snapshot.view))
1318
+ }
1319
+ }
1320
+
1321
+ impl Drop for ScanCursor {
1322
+ fn drop(&mut self) {
1323
+ self.recycle_lanes();
1324
+ }
1325
+ }
1326
+
1327
+ /// Rows between a scan cursor's fork checks inside a tablet (#901): a power of two.
1328
+ const FORK_CHECK_ROWS: u64 = 256;
1329
+
1330
+ thread_local! {
1331
+ /// Resolvers scans refill in place, kept by each scanning thread (#287) as row reads and
1332
+ /// point gets keep theirs: a scan takes one per lane and gives it back when the lane ends
1333
+ /// (its tablet or the scan does, or the cursor is dropped). Each comes back with no source
1334
+ /// and default options, so the pool pins no memtable, SST or blob reader.
1335
+ static SCAN_RESOLVERS: RefCell<Vec<Resolver>> = const { RefCell::new(Vec::new()) };
1336
+ }
1337
+
1338
+ /// Resolvers a thread keeps for its scans (one per family a scan reads, for a few families).
1339
+ const SCAN_RESOLVERS_KEPT: usize = 4;
1340
+
1341
+ /// A resolver for a scan lane: one of the thread's, or a new one. The pool is sized here,
1342
+ /// when a scan starts, so giving a resolver back (at its end) never allocates.
1343
+ pub(crate) fn take_scan_resolver() -> Resolver {
1344
+ SCAN_RESOLVERS
1345
+ .try_with(|pool| {
1346
+ let mut pool = pool.borrow_mut();
1347
+ pool.reserve(SCAN_RESOLVERS_KEPT);
1348
+ pool.pop()
1349
+ })
1350
+ .ok()
1351
+ .flatten()
1352
+ .unwrap_or_else(point_resolver)
1353
+ }
1354
+
1355
+ /// Returns a lane's resolver to the thread's pool: its sources (each pins its memtable or
1356
+ /// SST) and options (merge operator, blob reader) go now, its allocations stay. Past
1357
+ /// [`SCAN_RESOLVERS_KEPT`] it is dropped.
1358
+ pub(crate) fn give_back(mut resolver: Resolver) {
1359
+ let cursor = resolver.cursor_mut();
1360
+ cursor.sources_mut().clear();
1361
+ cursor.reset();
1362
+ resolver.reset(ResolveOptions::new(0, 0));
1363
+ let _ = SCAN_RESOLVERS.try_with(|pool| {
1364
+ let mut pool = pool.borrow_mut();
1365
+ if pool.len() < SCAN_RESOLVERS_KEPT {
1366
+ pool.push(resolver);
1367
+ }
1368
+ });
1369
+ }
1370
+
1371
+ /// `clamp_to_tablet` into reused buffers: `lo` and `hi` receive the clamped start and end,
1372
+ /// and the result says which are set (`false` = unbounded).
1373
+ fn clamp_into(
1374
+ tablet: &TabletEntry,
1375
+ start: Option<&[u8]>,
1376
+ end: Option<&[u8]>,
1377
+ lo: &mut Vec<u8>,
1378
+ hi: &mut Vec<u8>,
1379
+ ) -> Result<(bool, bool)> {
1380
+ lo.clear();
1381
+ let has_lo = if tablet.start.is_empty() {
1382
+ if let Some(s) = start {
1383
+ lo.extend_from_slice(s);
1384
+ }
1385
+ start.is_some()
1386
+ } else {
1387
+ encode_row_prefix(lo, &tablet.start)?;
1388
+ if let Some(s) = start
1389
+ && s > lo.as_slice()
1390
+ {
1391
+ lo.clear();
1392
+ lo.extend_from_slice(s);
1393
+ }
1394
+ true
1395
+ };
1396
+ hi.clear();
1397
+ let has_hi = match &tablet.end {
1398
+ None => {
1399
+ if let Some(e) = end {
1400
+ hi.extend_from_slice(e);
1401
+ }
1402
+ end.is_some()
1403
+ }
1404
+ Some(e) => {
1405
+ encode_row_prefix(hi, e)?;
1406
+ if let Some(x) = end
1407
+ && x < hi.as_slice()
1408
+ {
1409
+ hi.clear();
1410
+ hi.extend_from_slice(x);
1411
+ }
1412
+ true
1413
+ }
1414
+ };
1415
+ Ok((has_lo, has_hi))
1416
+ }
1417
+
1418
+ /// Narrows `[start, end)` (row prefixes, `None` = unbounded) to the rows of `tablet` (the
1419
+ /// test hooks' slot scans).
1420
+ #[cfg(feature = "test-hooks")]
1421
+ pub(crate) fn clamp_to_tablet(
1422
+ tablet: &TabletEntry,
1423
+ start: Option<Vec<u8>>,
1424
+ end: Option<Vec<u8>>,
1425
+ ) -> Result<RowBounds> {
1426
+ let start = if tablet.start.is_empty() {
1427
+ start
1428
+ } else {
1429
+ let mut k = Vec::new();
1430
+ encode_row_prefix(&mut k, &tablet.start)?;
1431
+ Some(match start {
1432
+ Some(s) if s > k => s,
1433
+ _ => k,
1434
+ })
1435
+ };
1436
+ let end = match &tablet.end {
1437
+ None => end,
1438
+ Some(e) => {
1439
+ let mut k = Vec::new();
1440
+ encode_row_prefix(&mut k, e)?;
1441
+ Some(match end {
1442
+ Some(x) if x < k => x,
1443
+ _ => k,
1444
+ })
1445
+ }
1446
+ };
1447
+ Ok((start, end))
1448
+ }
1449
+
1450
+ /// Reads one row through `view`: every family in `families` order.
1451
+ pub(crate) fn read_row(
1452
+ snapshot: &Snapshot,
1453
+ table: TableId,
1454
+ row: &[u8],
1455
+ families: &[FamilyId],
1456
+ spec: &ReadSpec,
1457
+ now: Timestamp,
1458
+ ) -> Result<Option<RowData>> {
1459
+ let mut out = RowData {
1460
+ row: row.to_vec(),
1461
+ ..RowData::default()
1462
+ };
1463
+ let any = read_row_into(
1464
+ &snapshot.view,
1465
+ snapshot.seqno,
1466
+ table,
1467
+ row,
1468
+ families,
1469
+ spec,
1470
+ now,
1471
+ false,
1472
+ &mut out,
1473
+ )?;
1474
+ Ok(any.then_some(out))
1475
+ }
1476
+
1477
+ thread_local! {
1478
+ /// The resolver row reads refill in place, one per reading thread (#287), as point gets
1479
+ /// refill theirs: its merging cursor's source list and heap and its scratch are reused.
1480
+ /// Between reads it holds no source and default options, so it pins no memtable, SST or
1481
+ /// blob reader. Taken while in use, so a read nested in another gets a resolver of its
1482
+ /// own.
1483
+ static ROW_RESOLVER: std::cell::Cell<Option<Resolver>> = const { std::cell::Cell::new(None) };
1484
+ }
1485
+
1486
+ /// Reads one row through `view` at `seqno` into `sink`: every family in `families` order.
1487
+ /// Returns whether any cell was found. A value pinned rather than copied pins `view`.
1488
+ #[allow(clippy::too_many_arguments)]
1489
+ ///
1490
+ /// `cache_only` (an async read, ICR 0014) changes only how each family's sources are
1491
+ /// gathered, so it is a runtime flag rather than a second instance: with two instances the
1492
+ /// per-cell loop stopped inlining `CellResolver::next_cell` into the sync one (#430, +2%
1493
+ /// instructions per row).
1494
+ pub(crate) fn read_row_into(
1495
+ view: &Arc<View>,
1496
+ seqno: Seqno,
1497
+ table: TableId,
1498
+ row: &[u8],
1499
+ families: &[FamilyId],
1500
+ spec: &ReadSpec,
1501
+ now: Timestamp,
1502
+ cache_only: bool,
1503
+ sink: &mut impl RowSink,
1504
+ ) -> Result<bool> {
1505
+ let mut resolver = ROW_RESOLVER
1506
+ .try_with(std::cell::Cell::take)
1507
+ .ok()
1508
+ .flatten()
1509
+ .unwrap_or_else(point_resolver);
1510
+ let mut large = false;
1511
+ let read = read_row_with(
1512
+ &mut resolver,
1513
+ view,
1514
+ seqno,
1515
+ table,
1516
+ row,
1517
+ families,
1518
+ spec,
1519
+ now,
1520
+ cache_only,
1521
+ sink,
1522
+ &mut large,
1523
+ );
1524
+ // Whatever happened, the sources (each pins its memtable or SST) and the options (merge
1525
+ // operator, blob reader) go now; only the allocations stay, unless a large value grew
1526
+ // them.
1527
+ let cursor = resolver.cursor_mut();
1528
+ cursor.sources_mut().clear();
1529
+ cursor.reset();
1530
+ resolver.reset(ResolveOptions::new(0, 0));
1531
+ if !large {
1532
+ let _ = ROW_RESOLVER.try_with(|slot| slot.set(Some(resolver)));
1533
+ }
1534
+ read
1535
+ }
1536
+
1537
+ /// [`read_row_into`] with the thread's resolver. Sets `large` when a value the resolver
1538
+ /// buffered was too large to keep its buffers for.
1539
+ #[allow(clippy::too_many_arguments)]
1540
+ // Inlined into `read_row_into`: called through a separate frame, a hot row's per-cell loop
1541
+ // measured about 1.5% more instructions.
1542
+ #[inline(always)]
1543
+ fn read_row_with(
1544
+ resolver: &mut Resolver,
1545
+ view: &Arc<View>,
1546
+ seqno: Seqno,
1547
+ table: TableId,
1548
+ row: &[u8],
1549
+ families: &[FamilyId],
1550
+ spec: &ReadSpec,
1551
+ now: Timestamp,
1552
+ cache_only: bool,
1553
+ sink: &mut impl RowSink,
1554
+ large: &mut bool,
1555
+ ) -> Result<bool> {
1556
+ let Some((tablet, shard)) = view.tablets().route(table, row) else {
1557
+ return Err(Error::TableNotFound(format!("table {}", table.0)));
1558
+ };
1559
+ // Inline for rows of usual length: the setup allocates nothing per read.
1560
+ let prefix = row_prefix(row)?;
1561
+ let mut past = prefix.clone();
1562
+ if let Some(last) = past.last_mut() {
1563
+ *last += 1;
1564
+ }
1565
+ let mut any = false;
1566
+ #[cfg(feature = "test-hooks")]
1567
+ let mut first = true;
1568
+ for &family in families {
1569
+ #[cfg(feature = "test-hooks")]
1570
+ {
1571
+ if !first {
1572
+ run_between_row_families();
1573
+ }
1574
+ first = false;
1575
+ }
1576
+ let Some(meta) = view.catalog.family(family) else {
1577
+ continue;
1578
+ };
1579
+ let (mut opts, filter) = spec.resolve_opts(meta, seqno, now);
1580
+ let resolver_blobs = ResolverBlobs::attach(&mut opts, &view.ssts);
1581
+ let cursor = resolver.cursor_mut();
1582
+ cursor.sources_mut().clear();
1583
+ if cache_only {
1584
+ row_sources_cache_only(
1585
+ view,
1586
+ shard,
1587
+ tablet,
1588
+ family,
1589
+ &filter,
1590
+ &prefix,
1591
+ cursor.sources_mut(),
1592
+ )?;
1593
+ } else {
1594
+ view.row_sources_into::<false>(
1595
+ shard,
1596
+ tablet,
1597
+ family,
1598
+ &filter,
1599
+ &prefix,
1600
+ cursor.sources_mut(),
1601
+ )?;
1602
+ }
1603
+ if cursor.sources().is_empty() {
1604
+ continue;
1605
+ }
1606
+ opts.skip_columns = skips_columns(cursor.sources());
1607
+ cursor.reset();
1608
+ resolver.reset(opts);
1609
+ resolver.set_upper_bound(Some(&past));
1610
+ resolver.seek(&prefix)?;
1611
+ loop {
1612
+ if sink.full() {
1613
+ break;
1614
+ }
1615
+ let (data, qualifier) = {
1616
+ let next = resolver.next_cell();
1617
+ ResolverBlobs::check(resolver_blobs.as_ref())?;
1618
+ let Some(cell) = next.map_err(|e| read_error(e, meta))? else {
1619
+ break;
1620
+ };
1621
+ if !cell.key.starts_with(&prefix) {
1622
+ break;
1623
+ }
1624
+ *large |= !cell.from_source && cell.value.len() > KEEP_BUFFERS_BELOW;
1625
+ // The qualifier goes straight into the sink, unescaped from the key.
1626
+ let column = column_of(cell.key);
1627
+ let end = column.len().saturating_sub(2).max(prefix.len());
1628
+ let qualifiers = sink.qualifiers();
1629
+ let start = qualifiers.len();
1630
+ Escaped::new(&column[prefix.len()..end]).unescape_into(qualifiers);
1631
+ let qualifier = start..qualifiers.len();
1632
+ let data = if cell.from_source && cell.value.len() > CellData::INLINE_MAX {
1633
+ // Pinned below, once the borrow of the resolver ends.
1634
+ None
1635
+ } else if cell.value.len() <= CellData::INLINE_MAX
1636
+ && blob_pointer(cell.value).is_none()
1637
+ {
1638
+ // Small and not separated: copied straight into the sink's cell.
1639
+ sink.push_inline(family, qualifier, cell.ts, cell.value);
1640
+ any = true;
1641
+ continue;
1642
+ } else {
1643
+ Some(CellData::resolved(&cell, &view.ssts, || Arc::clone(view))?)
1644
+ };
1645
+ (data, qualifier)
1646
+ };
1647
+ let data = match data {
1648
+ Some(d) => d,
1649
+ None => {
1650
+ let src = resolver
1651
+ .cursor()
1652
+ .current()
1653
+ .expect("the merged cursor is on the returned entry");
1654
+ let ts = {
1655
+ let (_, ts, _, _) = pigeonhole_format::key::split_suffix(src.key())?;
1656
+ ts
1657
+ };
1658
+ let value = LaneValue::Pinned(src.pin_value());
1659
+ CellData::from_pinned(ts, &value, || Arc::clone(view))
1660
+ }
1661
+ };
1662
+ sink.push(family, qualifier, data);
1663
+ any = true;
1664
+ }
1665
+ }
1666
+ Ok(any)
1667
+ }
1668
+
1669
+ /// A row read's sources for one family, gathered cache-only (an async read): out of the
1670
+ /// sync row read's way.
1671
+ #[cold]
1672
+ #[inline(never)]
1673
+ fn row_sources_cache_only(
1674
+ view: &View,
1675
+ shard: pigeonhole_runtime::ShardId,
1676
+ tablet: pigeonhole_format::TabletId,
1677
+ family: FamilyId,
1678
+ filter: &ScanFilter,
1679
+ prefix: &[u8],
1680
+ out: &mut Vec<Source>,
1681
+ ) -> Result<()> {
1682
+ view.row_sources_into::<true>(shard, tablet, family, filter, prefix, out)
1683
+ }
1684
+
1685
+ #[cfg(feature = "test-hooks")]
1686
+ thread_local! {
1687
+ /// Runs once on this thread, in the next row read, before it reads its second family
1688
+ /// (`Engine::between_row_read_families`; test hook).
1689
+ pub(crate) static BETWEEN_ROW_FAMILIES: std::cell::RefCell<Option<Box<dyn FnOnce()>>> =
1690
+ const { std::cell::RefCell::new(None) };
1691
+ }
1692
+
1693
+ #[cfg(feature = "test-hooks")]
1694
+ fn run_between_row_families() {
1695
+ let f = BETWEEN_ROW_FAMILIES.with(|h| h.borrow_mut().take());
1696
+ if let Some(f) = f {
1697
+ f();
1698
+ }
1699
+ }
1700
+
1701
+ thread_local! {
1702
+ /// The resolver point gets refill in place, one per reading thread (#46): its merging
1703
+ /// cursor's source list and heap and its scratch are reused, and nothing is moved. Between
1704
+ /// gets it holds no source and default options, so it pins no memtable, SST or blob
1705
+ /// reader.
1706
+ static POINT_RESOLVER: RefCell<Option<Resolver>> = const { RefCell::new(None) };
1707
+ }
1708
+
1709
+ /// A point get returning a longer value drops the thread's resolver (and the buffers that
1710
+ /// value may have grown) instead of keeping it for the next get.
1711
+ const KEEP_BUFFERS_BELOW: usize = 64 << 10;
1712
+
1713
+ /// An empty resolver for point gets.
1714
+ fn point_resolver() -> Resolver {
1715
+ Resolver::new(MergingCursor::new(Vec::new()), ResolveOptions::new(0, 0))
1716
+ }
1717
+
1718
+ /// Entries a counter get folds before it leaves its result behind as a checkpoint (D291,
1719
+ /// the default of `EngineOptions::counter_checkpoint_steps`): a hot counter's reads then fold
1720
+ /// about this many entries, and the shard keeps at most one checkpoint per this many
1721
+ /// operands.
1722
+ pub(crate) const CHECKPOINT_STEPS: u64 = 128;
1723
+
1724
+ /// A counter get's result, to be kept as a base (D291): `Put` at `(column, ts, seqno)` of
1725
+ /// `stored`, the column's value at `seqno`, the newest entry the get's fold read. Sent to the
1726
+ /// row's shard, which inserts it only while that entry is in its active memtable.
1727
+ #[derive(Debug)]
1728
+ pub(crate) struct CounterCheckpoint {
1729
+ pub shard: pigeonhole_runtime::ShardId,
1730
+ pub table: TableId,
1731
+ pub tablet: TabletId,
1732
+ pub family: FamilyId,
1733
+ pub row: Vec<u8>,
1734
+ pub qualifier: Vec<u8>,
1735
+ pub ts: Timestamp,
1736
+ pub seqno: Seqno,
1737
+ pub stored: Vec<u8>,
1738
+ }
1739
+
1740
+ /// A point get through `view` at `seqno`.
1741
+ #[allow(clippy::too_many_arguments)]
1742
+ pub(crate) fn get_in<const CACHE_ONLY: bool>(
1743
+ view: &View,
1744
+ seqno: Seqno,
1745
+ now: impl FnOnce() -> Timestamp,
1746
+ table: TableId,
1747
+ family: FamilyId,
1748
+ row: &[u8],
1749
+ qualifier: &[u8],
1750
+ pin: impl FnOnce() -> Arc<View>,
1751
+ ) -> Result<Option<CellData>> {
1752
+ let mut run = Some(|resolver: &mut Resolver| {
1753
+ let got = get_with::<CACHE_ONLY>(
1754
+ resolver, view, seqno, now, table, family, row, qualifier, pin,
1755
+ );
1756
+ // A counter group's fold (D291): only counter families set it, and every get takes
1757
+ // it, so it is always this get's.
1758
+ if let Some(fold) = resolver.take_counter_fold() {
1759
+ let op_bytes = resolver.counter_fold_operand_bytes();
1760
+ note_checkpoint(view, fold, op_bytes, &got, table, family, row, qualifier);
1761
+ }
1762
+ // Whatever happened, the sources (each pins its memtable or SST) and the options
1763
+ // (merge operator, blob reader) go now; only the allocations stay.
1764
+ let cursor = resolver.cursor_mut();
1765
+ cursor.sources_mut().clear();
1766
+ cursor.reset();
1767
+ resolver.reset(ResolveOptions::new(0, 0));
1768
+ got
1769
+ });
1770
+ // A get nested in another on the same thread, or one during thread teardown, uses a
1771
+ // resolver of its own.
1772
+ let in_place = POINT_RESOLVER.try_with(|cell| {
1773
+ let mut slot = cell.try_borrow_mut().ok()?;
1774
+ let run = run.take().expect("not run yet");
1775
+ let got = run(slot.get_or_insert_with(point_resolver));
1776
+ // A large result may have been folded in the resolver's buffers (merge operands are
1777
+ // copied whatever their size): not worth keeping that much per thread.
1778
+ if got.as_ref().is_ok_and(|c| {
1779
+ c.as_ref()
1780
+ .is_some_and(|c| c.stored().len() > KEEP_BUFFERS_BELOW)
1781
+ }) {
1782
+ *slot = None;
1783
+ }
1784
+ Some(got)
1785
+ });
1786
+ match in_place {
1787
+ Ok(Some(got)) => got,
1788
+ _ => (run.take().expect("not run yet"))(&mut point_resolver()),
1789
+ }
1790
+ }
1791
+
1792
+ /// Whether a read over `sources` should pass finished columns with `skip_column`: when an
1793
+ /// SST source can (ICR 0041), or a memtable source with the stale-tail index (D194), so a
1794
+ /// read of index-less memtables alone never pays for a try that cannot succeed.
1795
+ fn skips_columns(sources: &[Source]) -> bool {
1796
+ sources.iter().any(|s| match s {
1797
+ Source::Mem(m) => m.inner().skips_columns(),
1798
+ Source::Sst(_) => true,
1799
+ })
1800
+ }
1801
+
1802
+ /// A point get's resolver options: as `ReadSpec { versions: 1, .. }.resolve_opts`, built
1803
+ /// directly (no spec, filter or time range to make and drop on every get).
1804
+ fn point_opts(meta: &FamilyMeta, seqno: Seqno, now: Timestamp) -> ResolveOptions {
1805
+ let mut opts = ResolveOptions::new(seqno, now);
1806
+ opts.ttl_micros = meta.options.ttl_micros;
1807
+ // `versions: 1` folded with the family's `max_versions` (0 = unlimited): always 1.
1808
+ opts.versions = 1;
1809
+ opts.merge = meta.merge_op.clone();
1810
+ opts.counter = meta.options.kind.is_aggregate();
1811
+ opts
1812
+ }
1813
+
1814
+ /// How a point get's resolution ended.
1815
+ enum Resolved {
1816
+ Done(Option<CellData>),
1817
+ /// A large put the resolver copied: re-found by its key (in the caller's buffers) and
1818
+ /// pinned, at this timestamp.
1819
+ Refind(Timestamp),
1820
+ }
1821
+
1822
+ #[allow(clippy::too_many_arguments)]
1823
+ fn get_with<const CACHE_ONLY: bool>(
1824
+ resolver: &mut Resolver,
1825
+ view: &View,
1826
+ seqno: Seqno,
1827
+ now: impl FnOnce() -> Timestamp,
1828
+ table: TableId,
1829
+ family: FamilyId,
1830
+ row: &[u8],
1831
+ qualifier: &[u8],
1832
+ pin: impl FnOnce() -> Arc<View>,
1833
+ ) -> Result<Option<CellData>> {
1834
+ let Some((tablet, shard)) = view.tablets().route(table, row) else {
1835
+ return Err(Error::TableNotFound(format!("table {}", table.0)));
1836
+ };
1837
+ let Some(meta) = view.catalog.family(family) else {
1838
+ return Err(Error::FamilyNotFound(format!("family {}", family.0)));
1839
+ };
1840
+ if meta.table != table {
1841
+ return Err(Error::FamilyNotFound(format!("family {}", family.0)));
1842
+ }
1843
+ // Encoded once, for the filter probes and the resolver.
1844
+ let mut key = ColumnKey::new(row, qualifier);
1845
+ // The caller clears the sources afterwards, whatever this returns.
1846
+ let sources = resolver.cursor_mut().sources_mut();
1847
+ let markers = match view.point_sources::<CACHE_ONLY>(shard, tablet, family, &mut key, sources) {
1848
+ Ok(_) if sources.is_empty() => return Ok(None),
1849
+ Ok(markers) => markers,
1850
+ Err(e) => return Err(e),
1851
+ };
1852
+ // The clock only for a family with a TTL, the one thing a point get uses it for.
1853
+ let now = if meta.options.ttl_micros == 0 {
1854
+ 0
1855
+ } else {
1856
+ now()
1857
+ };
1858
+ let mut opts = point_opts(meta, seqno, now);
1859
+ let resolver_blobs = ResolverBlobs::attach(&mut opts, &view.ssts);
1860
+ resolver.cursor_mut().reset();
1861
+ resolver.reset(opts);
1862
+ let mut key_buf = [0u8; 512];
1863
+ let mut key_vec: Vec<u8> = Vec::new();
1864
+ let mut key_len = 0;
1865
+ let mut pin = Some(pin);
1866
+ let resolved = resolve_point(
1867
+ resolver,
1868
+ view,
1869
+ meta,
1870
+ resolver_blobs.as_ref(),
1871
+ &key,
1872
+ markers,
1873
+ (&mut key_buf, &mut key_vec, &mut key_len),
1874
+ &mut pin,
1875
+ );
1876
+ let cursor = resolver.cursor_mut();
1877
+ match resolved {
1878
+ Ok(Resolved::Done(cell)) => Ok(cell),
1879
+ Err(e) => Err(e),
1880
+ Ok(Resolved::Refind(ts)) => {
1881
+ let key: &[u8] = if key_vec.is_empty() {
1882
+ &key_buf[..key_len]
1883
+ } else {
1884
+ &key_vec
1885
+ };
1886
+ match cursor.seek(key) {
1887
+ Err(e) => Err(e),
1888
+ Ok(()) if cursor.valid() && cursor.key() == key => match cursor.current() {
1889
+ Some(src) => {
1890
+ let value = LaneValue::Pinned(src.pin_value());
1891
+ let pin = pin.take().expect("not used yet");
1892
+ Ok(Some(CellData::from_pinned(ts, &value, pin)))
1893
+ }
1894
+ None => Err(missing_entry()),
1895
+ },
1896
+ Ok(()) => Err(missing_entry()),
1897
+ }
1898
+ }
1899
+ }
1900
+ }
1901
+
1902
+ /// The checkpoint bound's ratio R (D298 §4.3, amended): a fold is kept as a checkpoint only
1903
+ /// when the operands it read sum to at least `1 / R` of the value it produced. The memtable
1904
+ /// then takes at most R checkpoint bytes per operand byte written, whatever the value's size,
1905
+ /// and a read folds under `S / R` operand bytes onto its checkpoint. The base the fold started
1906
+ /// from is not an operand, or every fold from a large checkpoint would pass and checkpoint
1907
+ /// again.
1908
+ pub(crate) const CHECKPOINT_BYTES_RATIO: u64 = 4;
1909
+
1910
+ /// Hands a counter get's result to its row's shard as a checkpoint (D291), when its fold
1911
+ /// read at least the writer's checkpoint steps. Out of line: a get pays only for taking the
1912
+ /// resolver's fold record, which only a counter group sets.
1913
+ #[cold]
1914
+ #[inline(never)]
1915
+ #[allow(clippy::too_many_arguments)]
1916
+ fn note_checkpoint(
1917
+ view: &View,
1918
+ (steps, top): (u64, Seqno),
1919
+ op_bytes: u64,
1920
+ got: &Result<Option<CellData>>,
1921
+ table: TableId,
1922
+ family: FamilyId,
1923
+ row: &[u8],
1924
+ qualifier: &[u8],
1925
+ ) {
1926
+ let Some(sink) = view.checkpoint_sink() else {
1927
+ return;
1928
+ };
1929
+ let Ok(Some(cell)) = got else {
1930
+ return;
1931
+ };
1932
+ if steps < sink.steps {
1933
+ return;
1934
+ }
1935
+ if op_bytes < cell.stored().len() as u64 / CHECKPOINT_BYTES_RATIO {
1936
+ return;
1937
+ }
1938
+ debug_assert_ne!(
1939
+ cell.stored().first(),
1940
+ Some(&pigeonhole_format::value::TRANSIENT_TAG),
1941
+ "a working accumulator reached a checkpoint"
1942
+ );
1943
+ let Some((tablet, shard)) = view.tablets().route(table, row) else {
1944
+ return;
1945
+ };
1946
+ (sink.send)(CounterCheckpoint {
1947
+ shard,
1948
+ table,
1949
+ tablet,
1950
+ family,
1951
+ row: row.to_vec(),
1952
+ qualifier: qualifier.to_vec(),
1953
+ ts: cell.timestamp(),
1954
+ seqno: top,
1955
+ stored: cell.stored().to_vec(),
1956
+ });
1957
+ }
1958
+
1959
+ fn missing_entry() -> Error {
1960
+ Error::Corruption("point get: a resolved entry is not in its sources".into())
1961
+ }
1962
+
1963
+ /// Resolves a point get's column. A value above the inline threshold is pinned, not copied
1964
+ /// (D29). The resolver copies values up to its own limit while it reads the group; a copy of
1965
+ /// a put (the output key names exactly that entry; a fold's key is an operand's) is re-found
1966
+ /// with one seek and pinned, so the pinned bytes are the version itself: its key goes to
1967
+ /// `key` and the caller seeks.
1968
+ #[allow(clippy::too_many_arguments)]
1969
+ fn resolve_point<P: FnOnce() -> Arc<View>>(
1970
+ resolver: &mut Resolver,
1971
+ view: &View,
1972
+ meta: &FamilyMeta,
1973
+ resolver_blobs: Option<&Arc<ResolverBlobs>>,
1974
+ column: &ColumnKey,
1975
+ markers: bool,
1976
+ key: (&mut [u8; 512], &mut Vec<u8>, &mut usize),
1977
+ pin: &mut Option<P>,
1978
+ ) -> Result<Resolved> {
1979
+ let (key_buf, key_vec, key_len) = key;
1980
+ if markers {
1981
+ resolver.seek_column_encoded(column.prefix(), column.row_len())?;
1982
+ } else {
1983
+ // No source can hold a delete marker: straight to the column (ICR 0020).
1984
+ resolver.seek_column_encoded_unmarked(column.prefix(), column.row_len())?;
1985
+ }
1986
+ let (ts, refind) = {
1987
+ let next = resolver.next_cell();
1988
+ ResolverBlobs::check(resolver_blobs)?;
1989
+ let Some(cell) = next.map_err(|e| read_error(e, meta))? else {
1990
+ return Ok(Resolved::Done(None));
1991
+ };
1992
+ if cell.value.len() <= CellData::INLINE_MAX {
1993
+ let pin = pin.take().expect("not used yet");
1994
+ return Ok(Resolved::Done(Some(CellData::resolved(
1995
+ &cell, &view.ssts, pin,
1996
+ )?)));
1997
+ }
1998
+ if cell.from_source {
1999
+ (cell.ts, false)
2000
+ } else if decode_key(cell.key).is_ok_and(|k| k.kind == Kind::Put) {
2001
+ *key_len = cell.key.len();
2002
+ if *key_len <= key_buf.len() {
2003
+ key_buf[..*key_len].copy_from_slice(cell.key);
2004
+ } else {
2005
+ key_vec.extend_from_slice(cell.key);
2006
+ }
2007
+ (cell.ts, true)
2008
+ } else {
2009
+ let pin = pin.take().expect("not used yet");
2010
+ return Ok(Resolved::Done(Some(CellData::from_cell(&cell, None, pin))));
2011
+ }
2012
+ };
2013
+ if refind {
2014
+ return Ok(Resolved::Refind(ts));
2015
+ }
2016
+ let src = resolver
2017
+ .cursor()
2018
+ .current()
2019
+ .expect("the merged cursor is on the returned entry");
2020
+ let value = LaneValue::Pinned(src.pin_value());
2021
+ let pin = pin.take().expect("not used yet");
2022
+ Ok(Resolved::Done(Some(CellData::from_pinned(ts, &value, pin))))
2023
+ }
2024
+
2025
+ /// Whether a stored value satisfies a predicate (decision D77).
2026
+ pub(crate) fn predicate_matches(p: &ValuePredicate, stored: &[u8]) -> bool {
2027
+ p.matches(stored)
2028
+ }
2029
+
2030
+ #[cfg(test)]
2031
+ mod tests {
2032
+ //! The resolver rules as the engine relies on them (snapshot visibility, the delete rules
2033
+ //! D9/D38, TTL, merge folding D41, limits and filters), run through the engine's
2034
+ //! `Source` enum against `pigeonhole-compaction`'s shared `CellResolver`.
2035
+
2036
+ use std::sync::Arc;
2037
+
2038
+ use pigeonhole_compaction::{I64Add, MergingCursor, ResolveOptions, VecCursor};
2039
+ use pigeonhole_format::key::{Kind, decode_key, encode_key, encode_marker_key};
2040
+ use pigeonhole_format::value::{ValueRef, decode_value, encode_value};
2041
+
2042
+ use pigeonhole_format::scan::ScanFilter;
2043
+ use pigeonhole_memtable::{ArenaRegion, Memtable, ShardArena};
2044
+
2045
+ use crate::source::{Resolver, mem_sources_from};
2046
+ use crate::{Error, ValuePredicate};
2047
+
2048
+ fn put(row: &str, q: &str, ts: u64, seqno: u64, v: &[u8]) -> (Vec<u8>, Vec<u8>) {
2049
+ let mut k = Vec::new();
2050
+ encode_key(&mut k, row.as_bytes(), q.as_bytes(), ts, seqno, Kind::Put).unwrap();
2051
+ let mut val = Vec::new();
2052
+ // Eight raw bytes are written as a tagged `i64` (what `put_i64` does).
2053
+ match <[u8; 8]>::try_from(v) {
2054
+ Ok(b) => encode_value(&mut val, ValueRef::I64(i64::from_le_bytes(b))),
2055
+ Err(_) => encode_value(&mut val, ValueRef::Bytes(v)),
2056
+ }
2057
+ (k, val)
2058
+ }
2059
+
2060
+ fn incr(row: &str, q: &str, ts: u64, seqno: u64, d: i64) -> (Vec<u8>, Vec<u8>) {
2061
+ let mut k = Vec::new();
2062
+ encode_key(&mut k, row.as_bytes(), q.as_bytes(), ts, seqno, Kind::Merge).unwrap();
2063
+ let mut val = Vec::new();
2064
+ encode_value(&mut val, ValueRef::I64(d));
2065
+ (k, val)
2066
+ }
2067
+
2068
+ fn del(row: &str, q: &str, ts: u64, seqno: u64, kind: Kind) -> (Vec<u8>, Vec<u8>) {
2069
+ let mut k = Vec::new();
2070
+ encode_key(&mut k, row.as_bytes(), q.as_bytes(), ts, seqno, kind).unwrap();
2071
+ (k, Vec::new())
2072
+ }
2073
+
2074
+ fn marker(row: &str, ts: u64, seqno: u64) -> (Vec<u8>, Vec<u8>) {
2075
+ let mut k = Vec::new();
2076
+ encode_marker_key(&mut k, row.as_bytes(), ts, seqno).unwrap();
2077
+ (k, Vec::new())
2078
+ }
2079
+
2080
+ type Cell = (String, String, u64, Vec<u8>);
2081
+
2082
+ fn cell(key: &[u8], ts: u64, value: &[u8]) -> Cell {
2083
+ let parts = decode_key(key).unwrap();
2084
+ let (mut r, mut q) = (Vec::new(), Vec::new());
2085
+ parts.row.unescape_into(&mut r);
2086
+ parts.qualifier.unwrap().unescape_into(&mut q);
2087
+ let v = match decode_value(value).unwrap() {
2088
+ ValueRef::Bytes(b) => b.to_vec(),
2089
+ ValueRef::I64(x) => x.to_le_bytes().to_vec(),
2090
+ other => panic!("{other:?}"),
2091
+ };
2092
+ (
2093
+ String::from_utf8(r).unwrap(),
2094
+ String::from_utf8(q).unwrap(),
2095
+ ts,
2096
+ v,
2097
+ )
2098
+ }
2099
+
2100
+ /// A resolver over one memtable per entry list, built as a read builds its memtable
2101
+ /// sources (`mem_sources_from`, unfiltered).
2102
+ fn resolver(sources: Vec<Vec<(Vec<u8>, Vec<u8>)>>, opts: ResolveOptions) -> Resolver {
2103
+ let readers: Vec<_> = sources
2104
+ .into_iter()
2105
+ .map(|entries| {
2106
+ let mut arena = ShardArena::new(ArenaRegion::heap(1 << 20), 64 << 10);
2107
+ let mut mem = Memtable::create(&mut arena).unwrap();
2108
+ for (k, v) in &entries {
2109
+ mem.insert(&mut arena, k, v).unwrap();
2110
+ }
2111
+ mem.reader()
2112
+ })
2113
+ .collect();
2114
+ let mut out = Vec::new();
2115
+ mem_sources_from(&readers, &ScanFilter::all(), &mut out);
2116
+ Resolver::new(MergingCursor::new(out), opts)
2117
+ }
2118
+
2119
+ fn collect(src: Vec<(Vec<u8>, Vec<u8>)>, opts: ResolveOptions) -> Vec<Cell> {
2120
+ let mut r = resolver(vec![src], opts);
2121
+ r.seek(b"").unwrap();
2122
+ let mut out = Vec::new();
2123
+ while let Some(c) = r.next_cell().unwrap() {
2124
+ out.push(cell(c.key, c.ts, c.value));
2125
+ }
2126
+ out
2127
+ }
2128
+
2129
+ fn opts(snapshot: u64) -> ResolveOptions {
2130
+ let mut o = ResolveOptions::new(snapshot, 1_000);
2131
+ o.versions = 0;
2132
+ o.merge = Some(Arc::new(I64Add));
2133
+ o
2134
+ }
2135
+
2136
+ fn c(row: &str, q: &str, ts: u64, v: &[u8]) -> Cell {
2137
+ (row.into(), q.into(), ts, v.to_vec())
2138
+ }
2139
+
2140
+ #[test]
2141
+ fn newest_first_and_snapshot() {
2142
+ let src = vec![
2143
+ put("r", "q", 10, 1, b"a"),
2144
+ put("r", "q", 20, 2, b"b"),
2145
+ put("r", "q", 15, 3, b"c"),
2146
+ ];
2147
+ assert_eq!(
2148
+ collect(src.clone(), opts(3)),
2149
+ vec![
2150
+ c("r", "q", 20, b"b"),
2151
+ c("r", "q", 15, b"c"),
2152
+ c("r", "q", 10, b"a")
2153
+ ]
2154
+ );
2155
+ assert_eq!(collect(src.clone(), opts(1)), vec![c("r", "q", 10, b"a")]);
2156
+ let mut one = opts(3);
2157
+ one.versions = 1;
2158
+ assert_eq!(collect(src, one), vec![c("r", "q", 20, b"b")]);
2159
+ }
2160
+
2161
+ #[test]
2162
+ fn cell_delete_hides_exact_timestamp_whatever_the_seqno() {
2163
+ let src = vec![
2164
+ put("r", "q", 10, 1, b"a"),
2165
+ del("r", "q", 10, 2, Kind::CellDelete),
2166
+ put("r", "q", 10, 3, b"later"),
2167
+ put("r", "q", 9, 4, b"old"),
2168
+ ];
2169
+ assert_eq!(collect(src.clone(), opts(4)), vec![c("r", "q", 9, b"old")]);
2170
+ assert_eq!(collect(src, opts(1)), vec![c("r", "q", 10, b"a")]);
2171
+ }
2172
+
2173
+ #[test]
2174
+ fn column_delete_hides_by_timestamp_not_seqno() {
2175
+ let src = vec![
2176
+ put("r", "q", 10, 1, b"a"),
2177
+ put("r", "q", 30, 2, b"c"),
2178
+ del("r", "q", 20, 3, Kind::ColumnDelete),
2179
+ put("r", "q", 15, 4, b"late-old"),
2180
+ put("r", "q", 20, 5, b"at-delete"),
2181
+ put("r", "z", 1, 6, b"next-column"),
2182
+ ];
2183
+ assert_eq!(
2184
+ collect(src, opts(6)),
2185
+ vec![c("r", "q", 30, b"c"), c("r", "z", 1, b"next-column")]
2186
+ );
2187
+ }
2188
+
2189
+ #[test]
2190
+ fn family_marker_hides_row_cells_at_or_below_it() {
2191
+ let src = vec![
2192
+ put("r", "a", 10, 1, b"a"),
2193
+ put("r", "b", 30, 1, b"b"),
2194
+ marker("r", 20, 2),
2195
+ put("r", "a", 20, 3, b"a2"),
2196
+ put("s", "a", 5, 1, b"other-row"),
2197
+ ];
2198
+ assert_eq!(
2199
+ collect(src.clone(), opts(3)),
2200
+ vec![c("r", "b", 30, b"b"), c("s", "a", 5, b"other-row")]
2201
+ );
2202
+ assert_eq!(
2203
+ collect(src, opts(1)),
2204
+ vec![
2205
+ c("r", "a", 10, b"a"),
2206
+ c("r", "b", 30, b"b"),
2207
+ c("s", "a", 5, b"other-row")
2208
+ ]
2209
+ );
2210
+ }
2211
+
2212
+ #[test]
2213
+ fn ttl_expires_at_the_boundary() {
2214
+ let src = vec![put("r", "q", 900, 1, b"old"), put("r", "q", 950, 2, b"new")];
2215
+ let mut o = opts(2);
2216
+ o.ttl_micros = 100; // now = 1000: 900 + 100 <= 1000 expired, 950 lives
2217
+ assert_eq!(collect(src, o), vec![c("r", "q", 950, b"new")]);
2218
+ }
2219
+
2220
+ #[test]
2221
+ fn merge_folds_onto_base_and_runs() {
2222
+ let base = 5i64.to_le_bytes();
2223
+ let src = vec![
2224
+ put("r", "c", 10, 1, &base),
2225
+ incr("r", "c", 20, 2, 3),
2226
+ incr("r", "c", 30, 3, 4),
2227
+ put("r", "d", 10, 1, &base),
2228
+ incr("r", "d", 10, 2, 1),
2229
+ incr("r", "e", 7, 1, 2),
2230
+ ];
2231
+ assert_eq!(
2232
+ collect(src.clone(), opts(3)),
2233
+ vec![
2234
+ c("r", "c", 30, &12i64.to_le_bytes()),
2235
+ c("r", "d", 10, &6i64.to_le_bytes()),
2236
+ c("r", "e", 7, &2i64.to_le_bytes()),
2237
+ ]
2238
+ );
2239
+ // A snapshot before the operands returns the base as written.
2240
+ assert_eq!(collect(src, opts(1))[0], c("r", "c", 10, &base));
2241
+ }
2242
+
2243
+ #[test]
2244
+ fn merge_onto_non_i64_base_fails_only_when_returned() {
2245
+ let src = vec![
2246
+ put("r", "c", 10, 1, b"bad"),
2247
+ incr("r", "c", 20, 2, 3),
2248
+ put("r", "c", 30, 3, b"newest"),
2249
+ ];
2250
+ let mut o = opts(3);
2251
+ o.versions = 1;
2252
+ assert_eq!(collect(src.clone(), o), vec![c("r", "c", 30, b"newest")]);
2253
+ let mut r = resolver(vec![src], opts(3));
2254
+ r.seek(b"").unwrap();
2255
+ assert!(r.next_cell().unwrap().is_some());
2256
+ assert!(matches!(r.next_cell(), Err(Error::Merge(_))));
2257
+ }
2258
+
2259
+ #[test]
2260
+ fn point_get_sees_markers_before_the_column() {
2261
+ let src = vec![
2262
+ put("r", "q", 10, 1, b"a"),
2263
+ marker("r", 10, 2),
2264
+ put("r", "q", 11, 3, b"b"),
2265
+ put("r", "q", 9, 4, b"hidden"),
2266
+ put("r", "r", 50, 5, b"other-column"),
2267
+ ];
2268
+ let mut r = resolver(vec![src], opts(5));
2269
+ r.seek_column(b"r", b"q").unwrap();
2270
+ let ts = r.next_cell().unwrap().unwrap().ts;
2271
+ assert_eq!(ts, 11);
2272
+ assert!(r.next_cell().unwrap().is_none());
2273
+ assert!(r.next_cell().unwrap().is_none());
2274
+ r.seek_column(b"r", b"zz").unwrap();
2275
+ assert!(r.next_cell().unwrap().is_none());
2276
+ r.seek_column(b"r", b"r").unwrap();
2277
+ assert_eq!(r.next_cell().unwrap().unwrap().ts, 50);
2278
+ }
2279
+
2280
+ #[test]
2281
+ fn columns_per_row_and_max_versions() {
2282
+ let src = vec![
2283
+ put("r", "a", 1, 1, b"1"),
2284
+ put("r", "a", 2, 2, b"2"),
2285
+ put("r", "b", 1, 1, b"x"),
2286
+ put("r", "c", 1, 1, b"y"),
2287
+ put("s", "a", 1, 1, b"s"),
2288
+ ];
2289
+ let mut o = opts(2);
2290
+ o.versions = 1; // the family's max_versions folded in (D76)
2291
+ o.columns_per_row = 2;
2292
+ assert_eq!(
2293
+ collect(src, o),
2294
+ vec![
2295
+ c("r", "a", 2, b"2"),
2296
+ c("r", "b", 1, b"x"),
2297
+ c("s", "a", 1, b"s")
2298
+ ]
2299
+ );
2300
+ }
2301
+
2302
+ #[test]
2303
+ fn value_predicate_tests_the_newest_version() {
2304
+ let src = vec![
2305
+ put("r", "a", 1, 1, b"yes"),
2306
+ put("r", "a", 2, 2, b"no"),
2307
+ put("r", "b", 1, 1, b"yes"),
2308
+ ];
2309
+ let mut o = opts(2);
2310
+ o.value = Some(ValuePredicate::Equals(b"yes".to_vec()));
2311
+ assert_eq!(collect(src, o), vec![c("r", "b", 1, b"yes")]);
2312
+ }
2313
+
2314
+ #[test]
2315
+ fn qualifier_filter_skips_columns() {
2316
+ let src = vec![
2317
+ put("r", "a", 1, 1, b"1"),
2318
+ put("r", "meta:x", 1, 1, b"2"),
2319
+ put("r", "meta:y", 1, 1, b"3"),
2320
+ put("r", "z", 1, 1, b"4"),
2321
+ put("s", "meta:z", 1, 1, b"5"),
2322
+ ];
2323
+ // The filter is applied by the sources (FilteredCursor / SstIter), not the resolver:
2324
+ // wrap the in-memory source the way memtables are wrapped.
2325
+ let mut filter = pigeonhole_format::scan::ScanFilter::all();
2326
+ filter.qualifiers = pigeonhole_format::scan::QualifierFilter::Prefix(b"meta:".to_vec());
2327
+ let filtered = pigeonhole_compaction::FilteredCursor::new(VecCursor::new(src), filter);
2328
+ let mut out = Vec::new();
2329
+ let mut r = pigeonhole_compaction::CellResolver::new(filtered, opts(2));
2330
+ r.seek(b"").unwrap();
2331
+ while let Some(cell_) = r.next_cell().unwrap() {
2332
+ out.push(cell(cell_.key, cell_.ts, cell_.value));
2333
+ }
2334
+ assert_eq!(
2335
+ out,
2336
+ vec![
2337
+ c("r", "meta:x", 1, b"2"),
2338
+ c("r", "meta:y", 1, b"3"),
2339
+ c("s", "meta:z", 1, b"5")
2340
+ ]
2341
+ );
2342
+ }
2343
+
2344
+ #[test]
2345
+ fn merged_sources_interleave_in_key_order() {
2346
+ let a = vec![put("r", "q", 20, 2, b"new"), put("s", "q", 1, 4, b"s")];
2347
+ let b = vec![put("r", "q", 10, 1, b"old"), put("r", "z", 5, 3, b"z")];
2348
+ let mut r = resolver(vec![a, b], opts(4));
2349
+ r.seek(b"").unwrap();
2350
+ let mut out = Vec::new();
2351
+ while let Some(c) = r.next_cell().unwrap() {
2352
+ out.push(cell(c.key, c.ts, c.value));
2353
+ }
2354
+ assert_eq!(
2355
+ out,
2356
+ vec![
2357
+ c("r", "q", 20, b"new"),
2358
+ c("r", "q", 10, b"old"),
2359
+ c("r", "z", 5, b"z"),
2360
+ c("s", "q", 1, b"s")
2361
+ ]
2362
+ );
2363
+ }
2364
+
2365
+ #[test]
2366
+ fn set_inline_overwrites_any_cell_in_place() {
2367
+ use super::{CellData, CellValue};
2368
+ let stored = |v: &[u8]| {
2369
+ let mut out = Vec::new();
2370
+ encode_value(&mut out, ValueRef::Bytes(v));
2371
+ out
2372
+ };
2373
+ // From the empty cell, as `RowSink::push_inline` builds it.
2374
+ let mut d = CellData::EMPTY;
2375
+ d.set_inline(7, &stored(b"abc"));
2376
+ assert_eq!((d.timestamp(), d.value()), (7, ValueRef::Bytes(b"abc")));
2377
+ // A shorter value over a longer one keeps only its own bytes.
2378
+ d.set_inline(8, &stored(b"x"));
2379
+ assert_eq!((d.timestamp(), d.value()), (8, ValueRef::Bytes(b"x")));
2380
+ // Over a cell that held a heap value.
2381
+ let mut d = CellData {
2382
+ ts: 1,
2383
+ value: CellValue::Owned(stored(&[9; 300])),
2384
+ };
2385
+ let full = vec![5; CellData::INLINE_MAX - 1];
2386
+ d.set_inline(2, &stored(&full));
2387
+ assert!(matches!(d.value, CellValue::Inline { .. }));
2388
+ assert_eq!((d.timestamp(), d.value()), (2, ValueRef::Bytes(&full[..])));
2389
+ }
2390
+ }
2391
+
2392
+ thread_local! {
2393
+ /// While an async read's attempt runs on this thread: whether it is cache-only, and the
2394
+ /// file reads it made synchronously so far (D196), counted into
2395
+ /// `Metrics::async_sync_reads`.
2396
+ static ASYNC_READ: std::cell::Cell<Option<(bool, u64)>> =
2397
+ const { std::cell::Cell::new(None) };
2398
+ }
2399
+
2400
+ /// The running async read's mode on this thread: `Some(cache_only)`, or `None` outside one.
2401
+ pub(crate) fn async_read_mode() -> Option<bool> {
2402
+ ASYNC_READ.with(|c| c.get().map(|(cache_only, _)| cache_only))
2403
+ }
2404
+
2405
+ /// Counts a file read the running async read makes synchronously.
2406
+ pub(crate) fn note_sync_read() {
2407
+ ASYNC_READ.with(|c| {
2408
+ if let Some((cache_only, n)) = c.get() {
2409
+ c.set(Some((cache_only, n + 1)));
2410
+ }
2411
+ });
2412
+ }
2413
+
2414
+ /// Runs `f` as an async read's attempt (`cache_only`, or a synchronous fallback); returns
2415
+ /// its result and the file reads it made synchronously. The flag is restored even if `f`
2416
+ /// panics.
2417
+ pub(crate) fn as_async_read<T>(cache_only: bool, f: impl FnOnce() -> T) -> (T, u64) {
2418
+ struct Restore(Option<(bool, u64)>);
2419
+ impl Drop for Restore {
2420
+ fn drop(&mut self) {
2421
+ ASYNC_READ.with(|c| c.set(self.0));
2422
+ }
2423
+ }
2424
+ let restore = Restore(ASYNC_READ.with(|c| c.replace(Some((cache_only, 0)))));
2425
+ let out = f();
2426
+ let n = ASYNC_READ.with(|c| c.get()).map_or(0, |(_, n)| n);
2427
+ drop(restore);
2428
+ (out, n)
2429
+ }