automerge-rb 0.1.1

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 (481) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE.txt +22 -0
  3. data/README.md +175 -0
  4. data/ext/automerge_ext/automerge_ext.c +1805 -0
  5. data/ext/automerge_ext/extconf.rb +132 -0
  6. data/lib/automerge/version.rb +6 -0
  7. data/lib/automerge.rb +110 -0
  8. data/rust-toolchain.toml +4 -0
  9. data/vendor/automerge-rust/Cargo.lock +1909 -0
  10. data/vendor/automerge-rust/Cargo.toml +15 -0
  11. data/vendor/automerge-rust/automerge/Cargo.toml +78 -0
  12. data/vendor/automerge-rust/automerge/README.md +5 -0
  13. data/vendor/automerge-rust/automerge/benches/load_save.rs +102 -0
  14. data/vendor/automerge-rust/automerge/benches/map.rs +260 -0
  15. data/vendor/automerge-rust/automerge/benches/range.rs +37 -0
  16. data/vendor/automerge-rust/automerge/benches/sync.rs +95 -0
  17. data/vendor/automerge-rust/automerge/examples/README.md +7 -0
  18. data/vendor/automerge-rust/automerge/examples/quickstart.rs +57 -0
  19. data/vendor/automerge-rust/automerge/examples/watch.rs +94 -0
  20. data/vendor/automerge-rust/automerge/fuzz/Cargo.toml +29 -0
  21. data/vendor/automerge-rust/automerge/fuzz/fuzz_targets/load.rs +37 -0
  22. data/vendor/automerge-rust/automerge/src/autocommit.rs +1286 -0
  23. data/vendor/automerge-rust/automerge/src/automerge/current_state.rs +546 -0
  24. data/vendor/automerge-rust/automerge/src/automerge/tests.rs +2023 -0
  25. data/vendor/automerge-rust/automerge/src/automerge.rs +2071 -0
  26. data/vendor/automerge-rust/automerge/src/autoserde.rs +128 -0
  27. data/vendor/automerge-rust/automerge/src/change.rs +357 -0
  28. data/vendor/automerge-rust/automerge/src/change_graph.rs +1215 -0
  29. data/vendor/automerge-rust/automerge/src/change_queue.rs +46 -0
  30. data/vendor/automerge-rust/automerge/src/clock.rs +206 -0
  31. data/vendor/automerge-rust/automerge/src/columnar/column_range/boolean.rs +83 -0
  32. data/vendor/automerge-rust/automerge/src/columnar/column_range/delta.rs +148 -0
  33. data/vendor/automerge-rust/automerge/src/columnar/column_range/generic/group.rs +138 -0
  34. data/vendor/automerge-rust/automerge/src/columnar/column_range/generic/simple.rs +76 -0
  35. data/vendor/automerge-rust/automerge/src/columnar/column_range/generic.rs +93 -0
  36. data/vendor/automerge-rust/automerge/src/columnar/column_range/key.rs +272 -0
  37. data/vendor/automerge-rust/automerge/src/columnar/column_range/obj_id.rs +202 -0
  38. data/vendor/automerge-rust/automerge/src/columnar/column_range/opid_list.rs +329 -0
  39. data/vendor/automerge-rust/automerge/src/columnar/column_range/raw.rs +38 -0
  40. data/vendor/automerge-rust/automerge/src/columnar/column_range/rle.rs +216 -0
  41. data/vendor/automerge-rust/automerge/src/columnar/column_range/value.rs +547 -0
  42. data/vendor/automerge-rust/automerge/src/columnar/column_range.rs +17 -0
  43. data/vendor/automerge-rust/automerge/src/columnar/encoding/boolean.rs +197 -0
  44. data/vendor/automerge-rust/automerge/src/columnar/encoding/col_error.rs +88 -0
  45. data/vendor/automerge-rust/automerge/src/columnar/encoding/column_decoder.rs +133 -0
  46. data/vendor/automerge-rust/automerge/src/columnar/encoding/decodable_impls.rs +175 -0
  47. data/vendor/automerge-rust/automerge/src/columnar/encoding/delta.rs +96 -0
  48. data/vendor/automerge-rust/automerge/src/columnar/encoding/encodable_impls.rs +200 -0
  49. data/vendor/automerge-rust/automerge/src/columnar/encoding/leb128.rs +82 -0
  50. data/vendor/automerge-rust/automerge/src/columnar/encoding/properties.rs +178 -0
  51. data/vendor/automerge-rust/automerge/src/columnar/encoding/raw.rs +101 -0
  52. data/vendor/automerge-rust/automerge/src/columnar/encoding/rle.rs +239 -0
  53. data/vendor/automerge-rust/automerge/src/columnar/encoding.rs +67 -0
  54. data/vendor/automerge-rust/automerge/src/columnar/splice_error.rs +47 -0
  55. data/vendor/automerge-rust/automerge/src/columnar.rs +14 -0
  56. data/vendor/automerge-rust/automerge/src/convert.rs +112 -0
  57. data/vendor/automerge-rust/automerge/src/cursor.rs +296 -0
  58. data/vendor/automerge-rust/automerge/src/decoding.rs +475 -0
  59. data/vendor/automerge-rust/automerge/src/error.rs +159 -0
  60. data/vendor/automerge-rust/automerge/src/exid.rs +238 -0
  61. data/vendor/automerge-rust/automerge/src/hydrate/list.rs +140 -0
  62. data/vendor/automerge-rust/automerge/src/hydrate/map.rs +132 -0
  63. data/vendor/automerge-rust/automerge/src/hydrate/tests.rs +40 -0
  64. data/vendor/automerge-rust/automerge/src/hydrate/text.rs +89 -0
  65. data/vendor/automerge-rust/automerge/src/hydrate.rs +368 -0
  66. data/vendor/automerge-rust/automerge/src/indexed_cache.rs +113 -0
  67. data/vendor/automerge-rust/automerge/src/iter/doc.rs +603 -0
  68. data/vendor/automerge-rust/automerge/src/iter/keys.rs +93 -0
  69. data/vendor/automerge-rust/automerge/src/iter/list_range.rs +433 -0
  70. data/vendor/automerge-rust/automerge/src/iter/map_range.rs +316 -0
  71. data/vendor/automerge-rust/automerge/src/iter/spans.rs +601 -0
  72. data/vendor/automerge-rust/automerge/src/iter/tools.rs +427 -0
  73. data/vendor/automerge-rust/automerge/src/iter/values.rs +36 -0
  74. data/vendor/automerge-rust/automerge/src/iter.rs +25 -0
  75. data/vendor/automerge-rust/automerge/src/legacy/mod.rs +364 -0
  76. data/vendor/automerge-rust/automerge/src/legacy/serde_impls/actor_id.rs +25 -0
  77. data/vendor/automerge-rust/automerge/src/legacy/serde_impls/change_hash.rs +29 -0
  78. data/vendor/automerge-rust/automerge/src/legacy/serde_impls/element_id.rs +27 -0
  79. data/vendor/automerge-rust/automerge/src/legacy/serde_impls/mod.rs +31 -0
  80. data/vendor/automerge-rust/automerge/src/legacy/serde_impls/object_id.rs +36 -0
  81. data/vendor/automerge-rust/automerge/src/legacy/serde_impls/op.rs +668 -0
  82. data/vendor/automerge-rust/automerge/src/legacy/serde_impls/op_type.rs +26 -0
  83. data/vendor/automerge-rust/automerge/src/legacy/serde_impls/opid.rs +25 -0
  84. data/vendor/automerge-rust/automerge/src/legacy/serde_impls/scalar_value.rs +63 -0
  85. data/vendor/automerge-rust/automerge/src/legacy/utility_impls/element_id.rs +66 -0
  86. data/vendor/automerge-rust/automerge/src/legacy/utility_impls/key.rs +49 -0
  87. data/vendor/automerge-rust/automerge/src/legacy/utility_impls/mod.rs +4 -0
  88. data/vendor/automerge-rust/automerge/src/legacy/utility_impls/object_id.rs +74 -0
  89. data/vendor/automerge-rust/automerge/src/legacy/utility_impls/opid.rs +68 -0
  90. data/vendor/automerge-rust/automerge/src/lib.rs +315 -0
  91. data/vendor/automerge-rust/automerge/src/marks.rs +478 -0
  92. data/vendor/automerge-rust/automerge/src/op_set2/change/batch.rs +2002 -0
  93. data/vendor/automerge-rust/automerge/src/op_set2/change/collector.rs +974 -0
  94. data/vendor/automerge-rust/automerge/src/op_set2/change.rs +332 -0
  95. data/vendor/automerge-rust/automerge/src/op_set2/columns.rs +714 -0
  96. data/vendor/automerge-rust/automerge/src/op_set2/meta.rs +174 -0
  97. data/vendor/automerge-rust/automerge/src/op_set2/op.rs +1363 -0
  98. data/vendor/automerge-rust/automerge/src/op_set2/op_set/elems.rs +43 -0
  99. data/vendor/automerge-rust/automerge/src/op_set2/op_set/found_op.rs +60 -0
  100. data/vendor/automerge-rust/automerge/src/op_set2/op_set/index.rs +197 -0
  101. data/vendor/automerge-rust/automerge/src/op_set2/op_set/insert.rs +179 -0
  102. data/vendor/automerge-rust/automerge/src/op_set2/op_set/mark_index.rs +292 -0
  103. data/vendor/automerge-rust/automerge/src/op_set2/op_set/marks.rs +86 -0
  104. data/vendor/automerge-rust/automerge/src/op_set2/op_set/op_iter.rs +1295 -0
  105. data/vendor/automerge-rust/automerge/src/op_set2/op_set/op_query.rs +82 -0
  106. data/vendor/automerge-rust/automerge/src/op_set2/op_set/top_op.rs +50 -0
  107. data/vendor/automerge-rust/automerge/src/op_set2/op_set/visible.rs +290 -0
  108. data/vendor/automerge-rust/automerge/src/op_set2/op_set.rs +1793 -0
  109. data/vendor/automerge-rust/automerge/src/op_set2/parents.rs +133 -0
  110. data/vendor/automerge-rust/automerge/src/op_set2/skip_list.rs +714 -0
  111. data/vendor/automerge-rust/automerge/src/op_set2/types.rs +769 -0
  112. data/vendor/automerge-rust/automerge/src/op_set2.rs +18 -0
  113. data/vendor/automerge-rust/automerge/src/patches/patch.rs +95 -0
  114. data/vendor/automerge-rust/automerge/src/patches/patch_builder.rs +382 -0
  115. data/vendor/automerge-rust/automerge/src/patches/patch_log.rs +584 -0
  116. data/vendor/automerge-rust/automerge/src/patches.rs +7 -0
  117. data/vendor/automerge-rust/automerge/src/query/list_state.rs +230 -0
  118. data/vendor/automerge-rust/automerge/src/query/seek_mark.rs +142 -0
  119. data/vendor/automerge-rust/automerge/src/read.rs +326 -0
  120. data/vendor/automerge-rust/automerge/src/sequence_tree.rs +662 -0
  121. data/vendor/automerge-rust/automerge/src/storage/bundle/builder.rs +942 -0
  122. data/vendor/automerge-rust/automerge/src/storage/bundle/error.rs +42 -0
  123. data/vendor/automerge-rust/automerge/src/storage/bundle/meta.rs +23 -0
  124. data/vendor/automerge-rust/automerge/src/storage/bundle/storage.rs +146 -0
  125. data/vendor/automerge-rust/automerge/src/storage/bundle.rs +210 -0
  126. data/vendor/automerge-rust/automerge/src/storage/change/change_actors.rs +311 -0
  127. data/vendor/automerge-rust/automerge/src/storage/change/change_op_columns.rs +621 -0
  128. data/vendor/automerge-rust/automerge/src/storage/change/compressed.rs +51 -0
  129. data/vendor/automerge-rust/automerge/src/storage/change/op_with_change_actors.rs +1 -0
  130. data/vendor/automerge-rust/automerge/src/storage/change.rs +523 -0
  131. data/vendor/automerge-rust/automerge/src/storage/chunk.rs +312 -0
  132. data/vendor/automerge-rust/automerge/src/storage/columns/column.rs +42 -0
  133. data/vendor/automerge-rust/automerge/src/storage/columns/column_builder.rs +199 -0
  134. data/vendor/automerge-rust/automerge/src/storage/columns/column_specification.rs +340 -0
  135. data/vendor/automerge-rust/automerge/src/storage/columns/raw_column.rs +286 -0
  136. data/vendor/automerge-rust/automerge/src/storage/columns.rs +355 -0
  137. data/vendor/automerge-rust/automerge/src/storage/document/compression.rs +362 -0
  138. data/vendor/automerge-rust/automerge/src/storage/document.rs +411 -0
  139. data/vendor/automerge-rust/automerge/src/storage/load/change_collector.rs +15 -0
  140. data/vendor/automerge-rust/automerge/src/storage/load.rs +136 -0
  141. data/vendor/automerge-rust/automerge/src/storage/parse/leb128.rs +302 -0
  142. data/vendor/automerge-rust/automerge/src/storage/parse.rs +619 -0
  143. data/vendor/automerge-rust/automerge/src/storage/save/document.rs +27 -0
  144. data/vendor/automerge-rust/automerge/src/storage.rs +26 -0
  145. data/vendor/automerge-rust/automerge/src/sync/bloom.rs +161 -0
  146. data/vendor/automerge-rust/automerge/src/sync/message_builder.rs +118 -0
  147. data/vendor/automerge-rust/automerge/src/sync/state.rs +214 -0
  148. data/vendor/automerge-rust/automerge/src/sync/v1_compat_test/bloom.rs +162 -0
  149. data/vendor/automerge-rust/automerge/src/sync/v1_compat_test/mod.rs +625 -0
  150. data/vendor/automerge-rust/automerge/src/sync/v1_compat_test/state.rs +120 -0
  151. data/vendor/automerge-rust/automerge/src/sync.rs +2482 -0
  152. data/vendor/automerge-rust/automerge/src/text_diff/LICENSE +201 -0
  153. data/vendor/automerge-rust/automerge/src/text_diff/myers.rs +332 -0
  154. data/vendor/automerge-rust/automerge/src/text_diff/replace.rs +139 -0
  155. data/vendor/automerge-rust/automerge/src/text_diff/utils.rs +119 -0
  156. data/vendor/automerge-rust/automerge/src/text_diff.rs +515 -0
  157. data/vendor/automerge-rust/automerge/src/text_value.rs +276 -0
  158. data/vendor/automerge-rust/automerge/src/transaction/commit.rs +34 -0
  159. data/vendor/automerge-rust/automerge/src/transaction/inner.rs +1403 -0
  160. data/vendor/automerge-rust/automerge/src/transaction/manual_transaction.rs +147 -0
  161. data/vendor/automerge-rust/automerge/src/transaction/owned_transaction.rs +266 -0
  162. data/vendor/automerge-rust/automerge/src/transaction/result.rs +21 -0
  163. data/vendor/automerge-rust/automerge/src/transaction/transactable.rs +203 -0
  164. data/vendor/automerge-rust/automerge/src/transaction.rs +513 -0
  165. data/vendor/automerge-rust/automerge/src/types.rs +749 -0
  166. data/vendor/automerge-rust/automerge/src/validation.rs +29 -0
  167. data/vendor/automerge-rust/automerge/src/value.rs +763 -0
  168. data/vendor/automerge-rust/automerge/tests/batch_insert.rs +1034 -0
  169. data/vendor/automerge-rust/automerge/tests/block_tests.rs +887 -0
  170. data/vendor/automerge-rust/automerge/tests/convert_string_to_text.rs +72 -0
  171. data/vendor/automerge-rust/automerge/tests/diff_marks.rs +1508 -0
  172. data/vendor/automerge-rust/automerge/tests/fixtures/64bit_obj_id_change.automerge +0 -0
  173. data/vendor/automerge-rust/automerge/tests/fixtures/64bit_obj_id_doc.automerge +0 -0
  174. data/vendor/automerge-rust/automerge/tests/fixtures/counter_value_has_incorrect_meta.automerge +0 -0
  175. data/vendor/automerge-rust/automerge/tests/fixtures/counter_value_is_ok.automerge +0 -0
  176. data/vendor/automerge-rust/automerge/tests/fixtures/counter_value_is_overlong.automerge +0 -0
  177. data/vendor/automerge-rust/automerge/tests/fixtures/two_change_chunks.automerge +0 -0
  178. data/vendor/automerge-rust/automerge/tests/fixtures/two_change_chunks_compressed.automerge +0 -0
  179. data/vendor/automerge-rust/automerge/tests/fixtures/two_change_chunks_out_of_order.automerge +0 -0
  180. data/vendor/automerge-rust/automerge/tests/fuzz-crashers/action-is-48.automerge +0 -0
  181. data/vendor/automerge-rust/automerge/tests/fuzz-crashers/crash-da39a3ee5e6b4b0d3255bfef95601890afd80709 +0 -0
  182. data/vendor/automerge-rust/automerge/tests/fuzz-crashers/incorrect_max_op.automerge +0 -0
  183. data/vendor/automerge-rust/automerge/tests/fuzz-crashers/invalid_deflate_stream.automerge +0 -0
  184. data/vendor/automerge-rust/automerge/tests/fuzz-crashers/missing_actor.automerge +0 -0
  185. data/vendor/automerge-rust/automerge/tests/fuzz-crashers/overflow_in_length.automerge +0 -0
  186. data/vendor/automerge-rust/automerge/tests/fuzz-crashers/too_many_deps.automerge +0 -0
  187. data/vendor/automerge-rust/automerge/tests/fuzz-crashers/too_many_ops.automerge +0 -0
  188. data/vendor/automerge-rust/automerge/tests/test.rs +2668 -0
  189. data/vendor/automerge-rust/automerge/tests/test_mark_patches.rs +41 -0
  190. data/vendor/automerge-rust/automerge/tests/test_save_load_orphans.rs +84 -0
  191. data/vendor/automerge-rust/automerge/tests/text.rs +1098 -0
  192. data/vendor/automerge-rust/automerge/tests/text_encoding.rs +640 -0
  193. data/vendor/automerge-rust/automerge-c/CMakeLists.txt +439 -0
  194. data/vendor/automerge-rust/automerge-c/Cargo.toml +22 -0
  195. data/vendor/automerge-rust/automerge-c/README.md +233 -0
  196. data/vendor/automerge-rust/automerge-c/build.rs +21 -0
  197. data/vendor/automerge-rust/automerge-c/cbindgen.toml +48 -0
  198. data/vendor/automerge-rust/automerge-c/cmake/Cargo.toml.in +22 -0
  199. data/vendor/automerge-rust/automerge-c/cmake/automerge-c-config.cmake.in +99 -0
  200. data/vendor/automerge-rust/automerge-c/cmake/cbindgen.toml.in +48 -0
  201. data/vendor/automerge-rust/automerge-c/cmake/config.h.in +58 -0
  202. data/vendor/automerge-rust/automerge-c/cmake/enum-string-functions-gen.cmake +183 -0
  203. data/vendor/automerge-rust/automerge-c/cmake/file-regex-replace.cmake +33 -0
  204. data/vendor/automerge-rust/automerge-c/cmake/file-touch.cmake +35 -0
  205. data/vendor/automerge-rust/automerge-c/docs/CMakeLists.txt +39 -0
  206. data/vendor/automerge-rust/automerge-c/docs/img/brandmark.png +0 -0
  207. data/vendor/automerge-rust/automerge-c/examples/CMakeLists.txt +42 -0
  208. data/vendor/automerge-rust/automerge-c/examples/README.md +9 -0
  209. data/vendor/automerge-rust/automerge-c/examples/quickstart.c +131 -0
  210. data/vendor/automerge-rust/automerge-c/include/automerge-c/utils/result.h +30 -0
  211. data/vendor/automerge-rust/automerge-c/include/automerge-c/utils/stack.h +130 -0
  212. data/vendor/automerge-rust/automerge-c/include/automerge-c/utils/stack_callback_data.h +53 -0
  213. data/vendor/automerge-rust/automerge-c/include/automerge-c/utils/string.h +29 -0
  214. data/vendor/automerge-rust/automerge-c/src/actor_id.rs +193 -0
  215. data/vendor/automerge-rust/automerge-c/src/byte_span.rs +227 -0
  216. data/vendor/automerge-rust/automerge-c/src/change.rs +356 -0
  217. data/vendor/automerge-rust/automerge-c/src/cursor.rs +168 -0
  218. data/vendor/automerge-rust/automerge-c/src/doc/list.rs +636 -0
  219. data/vendor/automerge-rust/automerge-c/src/doc/map.rs +556 -0
  220. data/vendor/automerge-rust/automerge-c/src/doc/mark.rs +296 -0
  221. data/vendor/automerge-rust/automerge-c/src/doc/utils.rs +46 -0
  222. data/vendor/automerge-rust/automerge-c/src/doc.rs +1009 -0
  223. data/vendor/automerge-rust/automerge-c/src/index.rs +84 -0
  224. data/vendor/automerge-rust/automerge-c/src/item.rs +2177 -0
  225. data/vendor/automerge-rust/automerge-c/src/items.rs +401 -0
  226. data/vendor/automerge-rust/automerge-c/src/lib.rs +11 -0
  227. data/vendor/automerge-rust/automerge-c/src/obj.rs +216 -0
  228. data/vendor/automerge-rust/automerge-c/src/result.rs +653 -0
  229. data/vendor/automerge-rust/automerge-c/src/sync/have.rs +42 -0
  230. data/vendor/automerge-rust/automerge-c/src/sync/message.rs +146 -0
  231. data/vendor/automerge-rust/automerge-c/src/sync/state.rs +262 -0
  232. data/vendor/automerge-rust/automerge-c/src/sync.rs +7 -0
  233. data/vendor/automerge-rust/automerge-c/src/utils/result.c +33 -0
  234. data/vendor/automerge-rust/automerge-c/src/utils/stack.c +106 -0
  235. data/vendor/automerge-rust/automerge-c/src/utils/stack_callback_data.c +9 -0
  236. data/vendor/automerge-rust/automerge-c/src/utils/string.c +46 -0
  237. data/vendor/automerge-rust/automerge-c/test/CMakeLists.txt +67 -0
  238. data/vendor/automerge-rust/automerge-c/test/actor_id_tests.c +140 -0
  239. data/vendor/automerge-rust/automerge-c/test/base_state.c +17 -0
  240. data/vendor/automerge-rust/automerge-c/test/base_state.h +39 -0
  241. data/vendor/automerge-rust/automerge-c/test/byte_span_tests.c +119 -0
  242. data/vendor/automerge-rust/automerge-c/test/cmocka_utils.c +91 -0
  243. data/vendor/automerge-rust/automerge-c/test/cmocka_utils.h +42 -0
  244. data/vendor/automerge-rust/automerge-c/test/cursor_tests.c +263 -0
  245. data/vendor/automerge-rust/automerge-c/test/doc_state.c +27 -0
  246. data/vendor/automerge-rust/automerge-c/test/doc_state.h +17 -0
  247. data/vendor/automerge-rust/automerge-c/test/doc_tests.c +335 -0
  248. data/vendor/automerge-rust/automerge-c/test/enum_string_tests.c +148 -0
  249. data/vendor/automerge-rust/automerge-c/test/files/brave-ape-49.automerge +0 -0
  250. data/vendor/automerge-rust/automerge-c/test/item_tests.c +313 -0
  251. data/vendor/automerge-rust/automerge-c/test/list_tests.c +544 -0
  252. data/vendor/automerge-rust/automerge-c/test/macro_utils.c +38 -0
  253. data/vendor/automerge-rust/automerge-c/test/macro_utils.h +23 -0
  254. data/vendor/automerge-rust/automerge-c/test/main.c +33 -0
  255. data/vendor/automerge-rust/automerge-c/test/map_tests.c +1610 -0
  256. data/vendor/automerge-rust/automerge-c/test/mark_tests.c +124 -0
  257. data/vendor/automerge-rust/automerge-c/test/ported_wasm/basic_tests.c +1642 -0
  258. data/vendor/automerge-rust/automerge-c/test/ported_wasm/cursor_tests.c +108 -0
  259. data/vendor/automerge-rust/automerge-c/test/ported_wasm/suite.c +17 -0
  260. data/vendor/automerge-rust/automerge-c/test/ported_wasm/sync_tests.c +1280 -0
  261. data/vendor/automerge-rust/automerge-c/test/str_utils.c +15 -0
  262. data/vendor/automerge-rust/automerge-c/test/str_utils.h +17 -0
  263. data/vendor/automerge-rust/automerge-test/Cargo.toml +17 -0
  264. data/vendor/automerge-rust/automerge-test/README.md +3 -0
  265. data/vendor/automerge-rust/automerge-test/src/lib.rs +487 -0
  266. data/vendor/automerge-rust/hexane/CHANGELOG.md +34 -0
  267. data/vendor/automerge-rust/hexane/Cargo.toml +47 -0
  268. data/vendor/automerge-rust/hexane/README.md +292 -0
  269. data/vendor/automerge-rust/hexane/RESULTS.txt +20 -0
  270. data/vendor/automerge-rust/hexane/TODO +18 -0
  271. data/vendor/automerge-rust/hexane/benches/insert.rs +82 -0
  272. data/vendor/automerge-rust/hexane/benches/seek.rs +77 -0
  273. data/vendor/automerge-rust/hexane/benches/splice.rs +82 -0
  274. data/vendor/automerge-rust/hexane/src/aggregate.rs +288 -0
  275. data/vendor/automerge-rust/hexane/src/boolean.rs +478 -0
  276. data/vendor/automerge-rust/hexane/src/columndata.rs +2540 -0
  277. data/vendor/automerge-rust/hexane/src/cursor.rs +756 -0
  278. data/vendor/automerge-rust/hexane/src/delta.rs +793 -0
  279. data/vendor/automerge-rust/hexane/src/encoder.rs +639 -0
  280. data/vendor/automerge-rust/hexane/src/leb128.rs +82 -0
  281. data/vendor/automerge-rust/hexane/src/lib.rs +95 -0
  282. data/vendor/automerge-rust/hexane/src/pack.rs +325 -0
  283. data/vendor/automerge-rust/hexane/src/raw.rs +314 -0
  284. data/vendor/automerge-rust/hexane/src/rle.rs +928 -0
  285. data/vendor/automerge-rust/hexane/src/slab/tree.rs +1373 -0
  286. data/vendor/automerge-rust/hexane/src/slab/writer.rs +535 -0
  287. data/vendor/automerge-rust/hexane/src/slab.rs +224 -0
  288. data/vendor/automerge-rust/hexane/src/test.rs +108 -0
  289. data/vendor/bundle/ruby/3.3.0/bin/rake +29 -0
  290. data/vendor/bundle/ruby/3.3.0/bin/rake-compiler +29 -0
  291. data/vendor/bundle/ruby/3.3.0/bin/rake-compiler-dock +29 -0
  292. data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/History.rdoc +1732 -0
  293. data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/Manifest.txt +32 -0
  294. data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/README.rdoc +845 -0
  295. data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/Rakefile +97 -0
  296. data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/design_rationale.rb +54 -0
  297. data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/lib/hoe/minitest.rb +30 -0
  298. data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/lib/minitest/assertions.rb +850 -0
  299. data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/lib/minitest/autorun.rb +6 -0
  300. data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/lib/minitest/benchmark.rb +452 -0
  301. data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/lib/minitest/compress.rb +94 -0
  302. data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/lib/minitest/error_on_warning.rb +11 -0
  303. data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/lib/minitest/expectations.rb +321 -0
  304. data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/lib/minitest/hell.rb +11 -0
  305. data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/lib/minitest/manual_plugins.rb +16 -0
  306. data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/lib/minitest/mock.rb +327 -0
  307. data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/lib/minitest/parallel.rb +72 -0
  308. data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/lib/minitest/pride.rb +4 -0
  309. data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/lib/minitest/pride_plugin.rb +135 -0
  310. data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/lib/minitest/spec.rb +353 -0
  311. data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/lib/minitest/test.rb +238 -0
  312. data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/lib/minitest/test_task.rb +324 -0
  313. data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/lib/minitest/unit.rb +42 -0
  314. data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/lib/minitest.rb +1250 -0
  315. data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/test/minitest/metametameta.rb +150 -0
  316. data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/test/minitest/test_minitest_assertions.rb +1677 -0
  317. data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/test/minitest/test_minitest_benchmark.rb +137 -0
  318. data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/test/minitest/test_minitest_mock.rb +1213 -0
  319. data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/test/minitest/test_minitest_reporter.rb +437 -0
  320. data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/test/minitest/test_minitest_spec.rb +1159 -0
  321. data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/test/minitest/test_minitest_test.rb +1374 -0
  322. data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/test/minitest/test_minitest_test_task.rb +57 -0
  323. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/History.rdoc +2454 -0
  324. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/MIT-LICENSE +21 -0
  325. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/README.rdoc +155 -0
  326. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/doc/command_line_usage.rdoc +171 -0
  327. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/doc/example/Rakefile1 +38 -0
  328. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/doc/example/Rakefile2 +35 -0
  329. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/doc/example/a.c +6 -0
  330. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/doc/example/b.c +6 -0
  331. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/doc/example/main.c +11 -0
  332. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/doc/glossary.rdoc +42 -0
  333. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/doc/jamis.rb +592 -0
  334. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/doc/proto_rake.rdoc +127 -0
  335. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/doc/rake.1 +156 -0
  336. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/doc/rakefile.rdoc +635 -0
  337. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/doc/rational.rdoc +151 -0
  338. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/exe/rake +27 -0
  339. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/application.rb +847 -0
  340. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/backtrace.rb +25 -0
  341. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/clean.rb +78 -0
  342. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/cloneable.rb +17 -0
  343. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/cpu_counter.rb +122 -0
  344. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/default_loader.rb +15 -0
  345. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/dsl_definition.rb +196 -0
  346. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/early_time.rb +22 -0
  347. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/ext/core.rb +26 -0
  348. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/ext/string.rb +176 -0
  349. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/file_creation_task.rb +25 -0
  350. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/file_list.rb +435 -0
  351. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/file_task.rb +58 -0
  352. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/file_utils.rb +137 -0
  353. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/file_utils_ext.rb +135 -0
  354. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/invocation_chain.rb +57 -0
  355. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/invocation_exception_mixin.rb +17 -0
  356. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/late_time.rb +18 -0
  357. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/linked_list.rb +112 -0
  358. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/loaders/makefile.rb +54 -0
  359. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/multi_task.rb +14 -0
  360. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/name_space.rb +38 -0
  361. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/options.rb +31 -0
  362. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/packagetask.rb +222 -0
  363. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/phony.rb +16 -0
  364. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/private_reader.rb +21 -0
  365. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/promise.rb +100 -0
  366. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/pseudo_status.rb +30 -0
  367. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/rake_module.rb +67 -0
  368. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/rake_test_loader.rb +27 -0
  369. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/rule_recursion_overflow_error.rb +20 -0
  370. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/scope.rb +43 -0
  371. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/task.rb +434 -0
  372. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/task_argument_error.rb +8 -0
  373. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/task_arguments.rb +113 -0
  374. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/task_manager.rb +333 -0
  375. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/tasklib.rb +12 -0
  376. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/testtask.rb +192 -0
  377. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/thread_history_display.rb +49 -0
  378. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/thread_pool.rb +157 -0
  379. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/trace_output.rb +23 -0
  380. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/version.rb +10 -0
  381. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/win32.rb +17 -0
  382. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake.rb +69 -0
  383. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/rake.gemspec +102 -0
  384. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/Gemfile +8 -0
  385. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/History.md +695 -0
  386. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/LICENSE.txt +20 -0
  387. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/README.md +476 -0
  388. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/Rakefile +15 -0
  389. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/appveyor.yml +22 -0
  390. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/bin/rake-compiler +24 -0
  391. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/cucumber.yml +4 -0
  392. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/features/compile.feature +79 -0
  393. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/features/cross-compile.feature +23 -0
  394. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/features/cross-package-multi.feature +15 -0
  395. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/features/cross-package.feature +14 -0
  396. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/features/java-compile.feature +22 -0
  397. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/features/java-no-native-compile.feature +33 -0
  398. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/features/java-package.feature +24 -0
  399. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/features/package.feature +40 -0
  400. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/features/step_definitions/compilation.rb +70 -0
  401. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/features/step_definitions/cross_compilation.rb +27 -0
  402. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/features/step_definitions/execution.rb +52 -0
  403. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/features/step_definitions/folders.rb +32 -0
  404. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/features/step_definitions/gem.rb +46 -0
  405. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/features/step_definitions/java_compilation.rb +7 -0
  406. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/features/support/env.rb +10 -0
  407. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/features/support/file_template_helpers.rb +137 -0
  408. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/features/support/generator_helpers.rb +123 -0
  409. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/features/support/platform_extension_helpers.rb +27 -0
  410. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/lib/rake/baseextensiontask.rb +90 -0
  411. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/lib/rake/compiler_config.rb +38 -0
  412. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/lib/rake/extensioncompiler.rb +51 -0
  413. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/lib/rake/extensiontask.rb +589 -0
  414. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/lib/rake/javaextensiontask.rb +321 -0
  415. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/tasks/bin/cross-ruby.rake +189 -0
  416. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/tasks/bootstrap.rake +11 -0
  417. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/tasks/common.rake +10 -0
  418. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/tasks/cucumber.rake +23 -0
  419. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/tasks/gem.rake +15 -0
  420. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/tasks/rspec.rake +9 -0
  421. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/CHANGELOG.md +446 -0
  422. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/CONTRIBUTING.md +109 -0
  423. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/Dockerfile.jruby +79 -0
  424. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/Dockerfile.mri.erb +282 -0
  425. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/Gemfile +8 -0
  426. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/LICENSE.txt +22 -0
  427. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/README.md +447 -0
  428. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/Rakefile +246 -0
  429. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/bin/rake-compiler-dock +18 -0
  430. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/build/buildkitd.toml +2 -0
  431. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/build/gem_helper.rb +54 -0
  432. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/build/mk_i686.rb +18 -0
  433. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/build/mk_musl_cross.sh +37 -0
  434. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/build/mk_osxcross.sh +45 -0
  435. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/build/mk_pkg_config.sh +24 -0
  436. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/build/parallel_docker_build.rb +169 -0
  437. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/build/patches/rake-compiler-1.3.1/0004-Enable-build-of-static-libruby.patch +38 -0
  438. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/build/patches/rake-compiler-1.3.1/0005-build-miniruby-first.patch +16 -0
  439. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/build/patches/rake-compiler-1.3.1/0006-ruby-4-rubyspec-capiext.patch +16 -0
  440. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/build/rcd-env.sh +6 -0
  441. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/build/runas +7 -0
  442. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/build/sigfw.c +45 -0
  443. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/build/strip_wrapper_codesign +17 -0
  444. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/build/strip_wrapper_vbox +30 -0
  445. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/build/sudoers +1 -0
  446. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/lib/rake_compiler_dock/colors.rb +43 -0
  447. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/lib/rake_compiler_dock/docker_check.rb +356 -0
  448. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/lib/rake_compiler_dock/predefined_user_group.rb +5 -0
  449. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/lib/rake_compiler_dock/starter.rb +206 -0
  450. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/lib/rake_compiler_dock/version.rb +4 -0
  451. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/lib/rake_compiler_dock.rb +151 -0
  452. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/mingw64-ucrt/Dockerfile +66 -0
  453. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/mingw64-ucrt/README.md +14 -0
  454. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/mingw64-ucrt/binutils-mingw-w64-ignore-check-errors.patch +13 -0
  455. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/mingw64-ucrt/gcc-mingw-w64-only-c-c++.patch +13 -0
  456. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/mingw64-ucrt/mingw-w64-enable-ucrt.patch +22 -0
  457. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/rake-compiler-dock.gemspec +34 -0
  458. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/test/env/Dockerfile.alpine +17 -0
  459. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/test/env/Dockerfile.debian +24 -0
  460. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/test/fixtures/mig_test_rpc.defs +8 -0
  461. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/test/rcd_test/Gemfile +11 -0
  462. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/test/rcd_test/Rakefile +97 -0
  463. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/test/rcd_test/ext/java/RcdTestExtService.java +19 -0
  464. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/test/rcd_test/ext/java/RubyRcdTest.java +16 -0
  465. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/test/rcd_test/ext/mri/extconf.rb +111 -0
  466. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/test/rcd_test/ext/mri/rcd_test_ext.c +65 -0
  467. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/test/rcd_test/ext/mri/rcd_test_ext.h +11 -0
  468. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/test/rcd_test/lib/rcd_test.rb +6 -0
  469. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/test/rcd_test/rcd_test.gemspec +28 -0
  470. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/test/rcd_test/test/test_basic.rb +49 -0
  471. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/test/test_environment_variables.rb +108 -0
  472. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/test/test_mig.rb +18 -0
  473. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/test/test_parallel_docker_build.rb +95 -0
  474. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/test/test_rubygems_plugins.rb +12 -0
  475. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/test/test_starter.rb +158 -0
  476. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/test/test_versions.rb +82 -0
  477. data/vendor/bundle/ruby/3.3.0/specifications/minitest-5.27.0.gemspec +32 -0
  478. data/vendor/bundle/ruby/3.3.0/specifications/rake-13.4.2.gemspec +26 -0
  479. data/vendor/bundle/ruby/3.3.0/specifications/rake-compiler-1.3.1.gemspec +33 -0
  480. data/vendor/bundle/ruby/3.3.0/specifications/rake-compiler-dock-1.12.0.gemspec +28 -0
  481. metadata +584 -0
@@ -0,0 +1,161 @@
1
+ use std::borrow::Borrow;
2
+
3
+ use crate::storage::parse;
4
+ use crate::ChangeHash;
5
+
6
+ // These constants correspond to a 1% false positive rate. The values can be changed without
7
+ // breaking compatibility of the network protocol, since the parameters used for a particular
8
+ // Bloom filter are encoded in the wire format.
9
+ const BITS_PER_ENTRY: u32 = 10;
10
+ const NUM_PROBES: u32 = 7;
11
+
12
+ #[derive(Debug, Clone, PartialEq, Eq, Hash, serde::Serialize)]
13
+ pub struct BloomFilter {
14
+ num_entries: u32,
15
+ num_bits_per_entry: u32,
16
+ num_probes: u32,
17
+ bits: Vec<u8>,
18
+ }
19
+
20
+ impl Default for BloomFilter {
21
+ fn default() -> Self {
22
+ BloomFilter {
23
+ num_entries: 0,
24
+ num_bits_per_entry: BITS_PER_ENTRY,
25
+ num_probes: NUM_PROBES,
26
+ bits: Vec::new(),
27
+ }
28
+ }
29
+ }
30
+
31
+ #[derive(Debug, thiserror::Error)]
32
+ pub(crate) enum ParseError {
33
+ #[error(transparent)]
34
+ Leb128(#[from] parse::leb128::Error),
35
+ }
36
+
37
+ impl BloomFilter {
38
+ pub fn to_bytes(&self) -> Vec<u8> {
39
+ let mut buf = Vec::new();
40
+ if self.num_entries != 0 {
41
+ leb128::write::unsigned(&mut buf, self.num_entries as u64).unwrap();
42
+ leb128::write::unsigned(&mut buf, self.num_bits_per_entry as u64).unwrap();
43
+ leb128::write::unsigned(&mut buf, self.num_probes as u64).unwrap();
44
+ buf.extend(&self.bits);
45
+ }
46
+ buf
47
+ }
48
+
49
+ pub(crate) fn parse(input: parse::Input<'_>) -> parse::ParseResult<'_, Self, ParseError> {
50
+ if input.is_empty() {
51
+ Ok((input, Self::default()))
52
+ } else {
53
+ let (i, num_entries) = parse::leb128_u32(input)?;
54
+ let (i, num_bits_per_entry) = parse::leb128_u32(i)?;
55
+ let (i, num_probes) = parse::leb128_u32(i)?;
56
+ let (i, bits) = parse::take_n(bits_capacity(num_entries, num_bits_per_entry), i)?;
57
+ Ok((
58
+ i,
59
+ Self {
60
+ num_entries,
61
+ num_bits_per_entry,
62
+ num_probes,
63
+ bits: bits.to_vec(),
64
+ },
65
+ ))
66
+ }
67
+ }
68
+
69
+ fn get_probes(&self, hash: &ChangeHash) -> Vec<u32> {
70
+ let hash_bytes = hash.0;
71
+ let modulo = 8 * self.bits.len() as u32;
72
+
73
+ let mut x =
74
+ u32::from_le_bytes([hash_bytes[0], hash_bytes[1], hash_bytes[2], hash_bytes[3]])
75
+ % modulo;
76
+ let mut y =
77
+ u32::from_le_bytes([hash_bytes[4], hash_bytes[5], hash_bytes[6], hash_bytes[7]])
78
+ % modulo;
79
+ let z = u32::from_le_bytes([hash_bytes[8], hash_bytes[9], hash_bytes[10], hash_bytes[11]])
80
+ % modulo;
81
+
82
+ let mut probes = Vec::with_capacity(self.num_probes as usize);
83
+ probes.push(x);
84
+ for _ in 1..self.num_probes {
85
+ x = (x + y) % modulo;
86
+ y = (y + z) % modulo;
87
+ probes.push(x);
88
+ }
89
+ probes
90
+ }
91
+
92
+ fn add_hash(&mut self, hash: &ChangeHash) {
93
+ for probe in self.get_probes(hash) {
94
+ self.set_bit(probe as usize);
95
+ }
96
+ }
97
+
98
+ fn set_bit(&mut self, probe: usize) {
99
+ if let Some(byte) = self.bits.get_mut(probe >> 3) {
100
+ *byte |= 1 << (probe & 7);
101
+ }
102
+ }
103
+
104
+ fn get_bit(&self, probe: usize) -> Option<u8> {
105
+ self.bits
106
+ .get(probe >> 3)
107
+ .map(|byte| byte & (1 << (probe & 7)))
108
+ }
109
+
110
+ #[inline(never)]
111
+ pub fn contains_hash(&self, hash: &ChangeHash) -> bool {
112
+ if self.num_entries == 0 {
113
+ false
114
+ } else {
115
+ for probe in self.get_probes(hash) {
116
+ if let Some(bit) = self.get_bit(probe as usize) {
117
+ if bit == 0 {
118
+ return false;
119
+ }
120
+ }
121
+ }
122
+ true
123
+ }
124
+ }
125
+
126
+ pub fn from_hashes<H: Borrow<ChangeHash>>(hashes: impl ExactSizeIterator<Item = H>) -> Self {
127
+ let num_entries = hashes.len() as u32;
128
+ let num_bits_per_entry = BITS_PER_ENTRY;
129
+ let num_probes = NUM_PROBES;
130
+ let bits = vec![0; bits_capacity(num_entries, num_bits_per_entry)];
131
+ let mut filter = Self {
132
+ num_entries,
133
+ num_bits_per_entry,
134
+ num_probes,
135
+ bits,
136
+ };
137
+ for hash in hashes {
138
+ filter.add_hash(hash.borrow());
139
+ }
140
+ filter
141
+ }
142
+ }
143
+
144
+ fn bits_capacity(num_entries: u32, num_bits_per_entry: u32) -> usize {
145
+ let f = ((f64::from(num_entries) * f64::from(num_bits_per_entry)) / 8_f64).ceil();
146
+ f as usize
147
+ }
148
+
149
+ #[derive(thiserror::Error, Debug)]
150
+ #[error("{0}")]
151
+ pub struct DecodeError(String);
152
+
153
+ impl TryFrom<&[u8]> for BloomFilter {
154
+ type Error = DecodeError;
155
+
156
+ fn try_from(bytes: &[u8]) -> Result<Self, Self::Error> {
157
+ Self::parse(parse::Input::new(bytes))
158
+ .map(|(_, b)| b)
159
+ .map_err(|e| DecodeError(e.to_string()))
160
+ }
161
+ }
@@ -0,0 +1,118 @@
1
+ use crate::{Change, ChangeHash};
2
+
3
+ use super::{Have, Message, MessageFlags, MessageVersion, State};
4
+
5
+ use std::borrow::Cow;
6
+
7
+ pub(super) struct MessageBuilder<'a> {
8
+ heads: Vec<ChangeHash>,
9
+ need: Vec<ChangeHash>,
10
+ have: Vec<Have>,
11
+ changes: Vec<Vec<u8>>,
12
+ hashes: Cow<'a, [ChangeHash]>,
13
+ flags: Option<MessageFlags>,
14
+ version: MessageVersion,
15
+ }
16
+
17
+ impl<'a> MessageBuilder<'a> {
18
+ pub(super) fn new(changes: Vec<Change>, sync_state: &State) -> MessageBuilder<'static> {
19
+ if sync_state.supports_v2_messages() {
20
+ MessageBuilder::new_v2_from_changes(changes)
21
+ } else {
22
+ MessageBuilder::new_v1(changes)
23
+ }
24
+ }
25
+
26
+ fn new_v1(changes: Vec<Change>) -> MessageBuilder<'static> {
27
+ let hashes = Cow::Owned(changes.iter().map(|c| c.hash()).collect());
28
+ let changes = changes
29
+ .into_iter()
30
+ .map(|c| c.raw_bytes().to_vec())
31
+ .collect();
32
+ MessageBuilder {
33
+ heads: Vec::new(),
34
+ need: Vec::new(),
35
+ have: Vec::new(),
36
+ changes,
37
+ hashes,
38
+ flags: None,
39
+ version: MessageVersion::V1,
40
+ }
41
+ }
42
+
43
+ fn new_empty_v2() -> MessageBuilder<'static> {
44
+ MessageBuilder {
45
+ heads: Vec::new(),
46
+ need: Vec::new(),
47
+ hashes: Cow::Owned(vec![]),
48
+ changes: Vec::new(),
49
+ have: Vec::new(),
50
+ flags: None,
51
+ version: MessageVersion::V2,
52
+ }
53
+ }
54
+
55
+ fn new_v2_from_changes(changes: Vec<Change>) -> MessageBuilder<'static> {
56
+ let hashes: Cow<'static, _> = Cow::Owned(changes.iter().map(|c| c.hash()).collect());
57
+ let size = changes.iter().map(|c| c.raw_bytes().len()).sum();
58
+ let mut encoded = Vec::with_capacity(size);
59
+ for c in changes {
60
+ encoded.extend_from_slice(c.raw_bytes())
61
+ }
62
+ Self::new_v2(encoded, hashes)
63
+ }
64
+
65
+ pub(super) fn new_v2<'b>(data: Vec<u8>, hashes: Cow<'b, [ChangeHash]>) -> MessageBuilder<'b> {
66
+ if data.is_empty() {
67
+ return Self::new_empty_v2();
68
+ }
69
+ MessageBuilder {
70
+ heads: Vec::new(),
71
+ need: Vec::new(),
72
+ hashes,
73
+ changes: vec![data],
74
+ have: Vec::new(),
75
+ flags: None,
76
+ version: MessageVersion::V2,
77
+ }
78
+ }
79
+
80
+ pub(super) fn is_empty(&self) -> bool {
81
+ self.hashes.is_empty()
82
+ }
83
+
84
+ pub(super) fn hashes(&self) -> impl Iterator<Item = &ChangeHash> {
85
+ self.hashes.iter()
86
+ }
87
+
88
+ pub(super) fn heads(mut self, heads: Vec<ChangeHash>) -> Self {
89
+ self.heads = heads;
90
+ self
91
+ }
92
+
93
+ pub(super) fn need(mut self, need: Vec<ChangeHash>) -> Self {
94
+ self.need = need;
95
+ self
96
+ }
97
+
98
+ pub(super) fn have(mut self, have: Vec<Have>) -> Self {
99
+ self.have = have;
100
+ self
101
+ }
102
+
103
+ pub(super) fn flags(mut self, flags: Option<MessageFlags>) -> Self {
104
+ self.flags = flags;
105
+ self
106
+ }
107
+
108
+ pub(super) fn build(self) -> Message {
109
+ Message {
110
+ heads: self.heads,
111
+ need: self.need,
112
+ have: self.have,
113
+ changes: super::ChunkList::from(self.changes),
114
+ flags: self.flags,
115
+ version: self.version,
116
+ }
117
+ }
118
+ }
@@ -0,0 +1,214 @@
1
+ use std::collections::BTreeSet;
2
+
3
+ #[cfg(doc)]
4
+ use super::SyncDoc;
5
+ use super::{encode_hashes, BloomFilter, Capability};
6
+ use crate::storage::parse;
7
+ use crate::ChangeHash;
8
+
9
+ const SYNC_STATE_TYPE: u8 = 0x43; // first byte of an encoded sync state, for identification
10
+
11
+ #[derive(Debug, thiserror::Error)]
12
+ pub enum DecodeError {
13
+ #[error("{0:?}")]
14
+ Parse(String),
15
+ #[error("wrong type: expected one of {expected_one_of:?} but found {found}")]
16
+ WrongType { expected_one_of: Vec<u8>, found: u8 },
17
+ #[error("not enough input")]
18
+ NotEnoughInput,
19
+ }
20
+
21
+ impl From<parse::leb128::Error> for DecodeError {
22
+ fn from(_: parse::leb128::Error) -> Self {
23
+ Self::Parse("bad leb128 encoding".to_string())
24
+ }
25
+ }
26
+
27
+ /// The state of synchronisation with a peer.
28
+ ///
29
+ /// This should be persisted using [`Self::encode()`] when you know you will be interacting with the
30
+ /// same peer in multiple sessions. [`Self::encode()`] only encodes state which should be reused
31
+ /// across connections.
32
+ #[derive(Debug, Clone, Default, PartialEq, Eq, Hash)]
33
+ pub struct State {
34
+ /// The hashes which we know both peers have
35
+ pub shared_heads: Vec<ChangeHash>,
36
+ /// The heads we last sent
37
+ pub last_sent_heads: Vec<ChangeHash>,
38
+ /// The heads we last received from them
39
+ pub their_heads: Option<Vec<ChangeHash>>,
40
+ /// Any specific changes they last said they needed
41
+ pub their_need: Option<Vec<ChangeHash>>,
42
+ /// The bloom filters summarising what they said they have
43
+ pub their_have: Option<Vec<Have>>,
44
+ /// The hashes we have sent in this session
45
+ pub sent_hashes: BTreeSet<ChangeHash>,
46
+
47
+ /// [`SyncDoc::generate_sync_message()`] should return [`None`] if there are no new changes
48
+ /// to send. In particular, if there are changes in flight which the other end has not yet
49
+ /// acknowledged we do not wish to generate duplicate sync messages. This field tracks whether
50
+ /// the changes we expect to send to the peer based on this sync state have been sent or not. If
51
+ /// [`Self::in_flight`] is [`false`] then [`SyncDoc::generate_sync_message()`] will return a new
52
+ /// message (provided there are in fact changes to send). If it is [`true`] then we don't. This
53
+ /// flag is cleared in [`SyncDoc::receive_sync_message()`].
54
+ pub in_flight: bool,
55
+
56
+ /// Whether we have ever responded to the other end. This is used to ensure that we always send
57
+ /// at least on sync message to the other end, even if we have no changes to send, which is
58
+ /// necessary because we want the other end to know what our heads are.
59
+ pub have_responded: bool,
60
+
61
+ /// The persistent capabilities the other side has advertised (e.g. message
62
+ /// format support). Derived from [`super::MessageFlags`]s on incoming messages.
63
+ pub their_capabilities: Option<Vec<Capability>>,
64
+
65
+ /// If true, incoming changes from the peer will not be applied to the document.
66
+ /// The peer will still receive our changes. This is useful for publish-only peers.
67
+ pub read_only: bool,
68
+
69
+ /// Whether the remote peer is in read-only mode, as advertised by the
70
+ /// [`super::MessageFlags::READ_ONLY`] flag on their most recent message.
71
+ pub peer_read_only: bool,
72
+
73
+ /// If true, the next generated sync message will include a
74
+ /// [`super::MessageFlags::SYNC_RESET`] flag, signaling the remote peer to
75
+ /// clear its `sent_hashes`. Set by [`Self::set_read_only()`] when switching
76
+ /// from read-only to read-write.
77
+ pub needs_reset: bool,
78
+ }
79
+
80
+ /// A summary of the changes that the sender of the message already has.
81
+ /// This is implicitly a request to the recipient to send all changes that the
82
+ /// sender does not already have.
83
+ #[derive(Debug, Clone, Default, PartialEq, Eq, Hash, serde::Serialize)]
84
+ pub struct Have {
85
+ /// The heads at the time of the last successful sync with this recipient.
86
+ pub last_sync: Vec<ChangeHash>,
87
+ /// A bloom filter summarising all of the changes that the sender of the message has added
88
+ /// since the last sync.
89
+ pub bloom: BloomFilter,
90
+ }
91
+
92
+ impl State {
93
+ pub fn new() -> Self {
94
+ Default::default()
95
+ }
96
+
97
+ /// Create a new read-only sync state.
98
+ ///
99
+ /// In read-only mode, incoming changes from the peer are not applied to the
100
+ /// document, but our changes are still sent to the peer.
101
+ pub fn new_read_only() -> Self {
102
+ Self {
103
+ read_only: true,
104
+ ..Default::default()
105
+ }
106
+ }
107
+
108
+ pub fn encode(&self) -> Vec<u8> {
109
+ let mut buf = vec![SYNC_STATE_TYPE];
110
+ encode_hashes(&mut buf, &self.shared_heads);
111
+ buf
112
+ }
113
+
114
+ pub fn decode(input: &[u8]) -> Result<Self, DecodeError> {
115
+ let input = parse::Input::new(input);
116
+ match Self::parse(input) {
117
+ Ok((_, state)) => Ok(state),
118
+ Err(parse::ParseError::Incomplete(_)) => Err(DecodeError::NotEnoughInput),
119
+ Err(parse::ParseError::Error(e)) => Err(e),
120
+ }
121
+ }
122
+
123
+ pub(crate) fn parse(input: parse::Input<'_>) -> parse::ParseResult<'_, Self, DecodeError> {
124
+ let (i, record_type) = parse::take1(input)?;
125
+ if record_type != SYNC_STATE_TYPE {
126
+ return Err(parse::ParseError::Error(DecodeError::WrongType {
127
+ expected_one_of: vec![SYNC_STATE_TYPE],
128
+ found: record_type,
129
+ }));
130
+ }
131
+
132
+ let (i, shared_heads) = parse::length_prefixed(parse::change_hash)(i)?;
133
+ Ok((
134
+ i,
135
+ Self {
136
+ shared_heads,
137
+ last_sent_heads: Vec::new(),
138
+ their_heads: None,
139
+ their_need: None,
140
+ their_have: Some(Vec::new()),
141
+ sent_hashes: BTreeSet::new(),
142
+ in_flight: false,
143
+ have_responded: false,
144
+ their_capabilities: None,
145
+ read_only: false,
146
+ peer_read_only: false,
147
+ needs_reset: false,
148
+ },
149
+ ))
150
+ }
151
+
152
+ /// Set the read-only mode of this sync state.
153
+ ///
154
+ /// When switching from read-only to read-write, the sync state is reset to
155
+ /// trigger a fresh sync exchange with the remote peer. This ensures the
156
+ /// remote peer resends any changes that were previously ignored.
157
+ ///
158
+ /// When switching from read-write to read-only, only the flag is changed.
159
+ pub fn set_read_only(&mut self, read_only: bool) {
160
+ if self.read_only == read_only {
161
+ return;
162
+ }
163
+ if self.read_only && !read_only {
164
+ // Switching to read-write: reset sync state so the next message
165
+ // triggers a fresh exchange. Set needs_reset so the next message
166
+ // includes a SyncReset flag, telling the remote to clear its
167
+ // sent_hashes and resend changes we previously ignored.
168
+ let their_capabilities = self.their_capabilities.take();
169
+ *self = Self {
170
+ their_capabilities,
171
+ read_only: false,
172
+ needs_reset: true,
173
+ ..Default::default()
174
+ };
175
+ } else {
176
+ // Switching to read-only: ensure the next generate_sync_message
177
+ // produces a message so the peer discovers the ReadOnly flag.
178
+ self.read_only = true;
179
+ self.in_flight = false;
180
+ self.have_responded = false;
181
+ }
182
+ }
183
+
184
+ /// Returns true if the remote peer has advertised that it is in read-only
185
+ /// mode. A read-only peer will not apply incoming changes, so there is no
186
+ /// point sending them.
187
+ pub fn is_peer_read_only(&self) -> bool {
188
+ self.peer_read_only
189
+ }
190
+
191
+ pub(crate) fn peer_supports_sync_reset(&self) -> bool {
192
+ self.their_capabilities
193
+ .as_ref()
194
+ .map(|caps| caps.contains(&Capability::SyncReset))
195
+ .unwrap_or(false)
196
+ }
197
+
198
+ pub(crate) fn send_doc(&self) -> bool {
199
+ self.their_heads == Some(vec![]) && self.supports_v2_messages()
200
+ }
201
+
202
+ pub(crate) fn their(&self) -> Option<(&[Have], &[ChangeHash])> {
203
+ let have = self.their_have.as_ref()?;
204
+ let need = self.their_need.as_ref()?;
205
+ Some((have.as_slice(), need.as_slice()))
206
+ }
207
+
208
+ pub(crate) fn supports_v2_messages(&self) -> bool {
209
+ self.their_capabilities
210
+ .as_ref()
211
+ .map(|caps| caps.contains(&Capability::MessageV2))
212
+ .unwrap_or(false)
213
+ }
214
+ }
@@ -0,0 +1,162 @@
1
+ use std::borrow::Borrow;
2
+
3
+ use crate::storage::parse;
4
+ use crate::ChangeHash;
5
+
6
+ // These constants correspond to a 1% false positive rate. The values can be changed without
7
+ // breaking compatibility of the network protocol, since the parameters used for a particular
8
+ // Bloom filter are encoded in the wire format.
9
+ const BITS_PER_ENTRY: u32 = 10;
10
+ const NUM_PROBES: u32 = 7;
11
+
12
+ #[derive(Debug, Clone, PartialEq, Eq, Hash, serde::Serialize)]
13
+ pub(crate) struct BloomFilter {
14
+ pub(crate) num_entries: u32,
15
+ pub(crate) num_bits_per_entry: u32,
16
+ pub(crate) num_probes: u32,
17
+ pub(crate) bits: Vec<u8>,
18
+ }
19
+
20
+ impl Default for BloomFilter {
21
+ fn default() -> Self {
22
+ BloomFilter {
23
+ num_entries: 0,
24
+ num_bits_per_entry: BITS_PER_ENTRY,
25
+ num_probes: NUM_PROBES,
26
+ bits: Vec::new(),
27
+ }
28
+ }
29
+ }
30
+
31
+ #[derive(Debug, thiserror::Error)]
32
+ pub(crate) enum ParseError {
33
+ #[error(transparent)]
34
+ Leb128(#[from] parse::leb128::Error),
35
+ }
36
+
37
+ impl BloomFilter {
38
+ pub(crate) fn to_bytes(&self) -> Vec<u8> {
39
+ let mut buf = Vec::new();
40
+ if self.num_entries != 0 {
41
+ leb128::write::unsigned(&mut buf, self.num_entries as u64).unwrap();
42
+ leb128::write::unsigned(&mut buf, self.num_bits_per_entry as u64).unwrap();
43
+ leb128::write::unsigned(&mut buf, self.num_probes as u64).unwrap();
44
+ buf.extend(&self.bits);
45
+ }
46
+ buf
47
+ }
48
+
49
+ pub(crate) fn parse(input: parse::Input<'_>) -> parse::ParseResult<'_, Self, ParseError> {
50
+ if input.is_empty() {
51
+ Ok((input, Self::default()))
52
+ } else {
53
+ let (i, num_entries) = parse::leb128_u32(input)?;
54
+ let (i, num_bits_per_entry) = parse::leb128_u32(i)?;
55
+ let (i, num_probes) = parse::leb128_u32(i)?;
56
+ let (i, bits) = parse::take_n(bits_capacity(num_entries, num_bits_per_entry), i)?;
57
+ Ok((
58
+ i,
59
+ Self {
60
+ num_entries,
61
+ num_bits_per_entry,
62
+ num_probes,
63
+ bits: bits.to_vec(),
64
+ },
65
+ ))
66
+ }
67
+ }
68
+
69
+ fn get_probes(&self, hash: &ChangeHash) -> Vec<u32> {
70
+ let hash_bytes = hash.0;
71
+ let modulo = 8 * self.bits.len() as u32;
72
+
73
+ let mut x =
74
+ u32::from_le_bytes([hash_bytes[0], hash_bytes[1], hash_bytes[2], hash_bytes[3]])
75
+ % modulo;
76
+ let mut y =
77
+ u32::from_le_bytes([hash_bytes[4], hash_bytes[5], hash_bytes[6], hash_bytes[7]])
78
+ % modulo;
79
+ let z = u32::from_le_bytes([hash_bytes[8], hash_bytes[9], hash_bytes[10], hash_bytes[11]])
80
+ % modulo;
81
+
82
+ let mut probes = Vec::with_capacity(self.num_probes as usize);
83
+ probes.push(x);
84
+ for _ in 1..self.num_probes {
85
+ x = (x + y) % modulo;
86
+ y = (y + z) % modulo;
87
+ probes.push(x);
88
+ }
89
+ probes
90
+ }
91
+
92
+ fn add_hash(&mut self, hash: &ChangeHash) {
93
+ for probe in self.get_probes(hash) {
94
+ self.set_bit(probe as usize);
95
+ }
96
+ }
97
+
98
+ fn set_bit(&mut self, probe: usize) {
99
+ if let Some(byte) = self.bits.get_mut(probe >> 3) {
100
+ *byte |= 1 << (probe & 7);
101
+ }
102
+ }
103
+
104
+ fn get_bit(&self, probe: usize) -> Option<u8> {
105
+ self.bits
106
+ .get(probe >> 3)
107
+ .map(|byte| byte & (1 << (probe & 7)))
108
+ }
109
+
110
+ pub(crate) fn contains_hash(&self, hash: &ChangeHash) -> bool {
111
+ if self.num_entries == 0 {
112
+ false
113
+ } else {
114
+ for probe in self.get_probes(hash) {
115
+ if let Some(bit) = self.get_bit(probe as usize) {
116
+ if bit == 0 {
117
+ return false;
118
+ }
119
+ }
120
+ }
121
+ true
122
+ }
123
+ }
124
+
125
+ pub(crate) fn from_hashes<H: Borrow<ChangeHash>>(
126
+ hashes: impl ExactSizeIterator<Item = H>,
127
+ ) -> Self {
128
+ let num_entries = hashes.len() as u32;
129
+ let num_bits_per_entry = BITS_PER_ENTRY;
130
+ let num_probes = NUM_PROBES;
131
+ let bits = vec![0; bits_capacity(num_entries, num_bits_per_entry)];
132
+ let mut filter = Self {
133
+ num_entries,
134
+ num_bits_per_entry,
135
+ num_probes,
136
+ bits,
137
+ };
138
+ for hash in hashes {
139
+ filter.add_hash(hash.borrow());
140
+ }
141
+ filter
142
+ }
143
+ }
144
+
145
+ fn bits_capacity(num_entries: u32, num_bits_per_entry: u32) -> usize {
146
+ let f = ((f64::from(num_entries) * f64::from(num_bits_per_entry)) / 8_f64).ceil();
147
+ f as usize
148
+ }
149
+
150
+ #[derive(thiserror::Error, Debug)]
151
+ #[error("{0}")]
152
+ pub(crate) struct DecodeError(String);
153
+
154
+ impl TryFrom<&[u8]> for BloomFilter {
155
+ type Error = DecodeError;
156
+
157
+ fn try_from(bytes: &[u8]) -> Result<Self, Self::Error> {
158
+ Self::parse(parse::Input::new(bytes))
159
+ .map(|(_, b)| b)
160
+ .map_err(|e| DecodeError(e.to_string()))
161
+ }
162
+ }