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,1009 @@
1
+ use automerge as am;
2
+ use automerge::sync::SyncDoc;
3
+ use automerge::transaction::{CommitOptions, Transactable};
4
+ use automerge::ReadDoc;
5
+ use std::ops::{Deref, DerefMut};
6
+
7
+ use crate::actor_id::{to_actor_id, AMactorId};
8
+ use crate::byte_span::{to_str, AMbyteSpan};
9
+ use crate::cursor::{to_cursor, AMcursor};
10
+ use crate::items::AMitems;
11
+ use crate::obj::{to_obj_id, AMobjId, AMobjType};
12
+ use crate::result::{to_result, AMresult};
13
+ use crate::sync::{to_sync_message, AMsyncMessage, AMsyncState};
14
+
15
+ pub mod list;
16
+ pub mod map;
17
+ pub mod mark;
18
+ pub mod utils;
19
+
20
+ use crate::doc::utils::{clamp, to_doc, to_doc_mut, to_items};
21
+
22
+ macro_rules! to_sync_state_mut {
23
+ ($handle:expr) => {{
24
+ let handle = $handle.as_mut();
25
+ match handle {
26
+ Some(b) => b,
27
+ None => return AMresult::error("Invalid `AMsyncState*`").into(),
28
+ }
29
+ }};
30
+ }
31
+
32
+ /// \struct AMdoc
33
+ /// \installed_headerfile
34
+ /// \brief A JSON-like CRDT.
35
+ #[derive(Clone)]
36
+ pub struct AMdoc(am::AutoCommit);
37
+
38
+ impl AMdoc {
39
+ pub fn new(auto_commit: am::AutoCommit) -> Self {
40
+ Self(auto_commit)
41
+ }
42
+
43
+ fn is_equal_to(&mut self, other: &mut Self) -> bool {
44
+ self.document().get_heads() == other.document().get_heads()
45
+ }
46
+ }
47
+
48
+ impl AsRef<am::AutoCommit> for AMdoc {
49
+ fn as_ref(&self) -> &am::AutoCommit {
50
+ &self.0
51
+ }
52
+ }
53
+
54
+ impl Deref for AMdoc {
55
+ type Target = am::AutoCommit;
56
+
57
+ fn deref(&self) -> &Self::Target {
58
+ &self.0
59
+ }
60
+ }
61
+
62
+ impl DerefMut for AMdoc {
63
+ fn deref_mut(&mut self) -> &mut Self::Target {
64
+ &mut self.0
65
+ }
66
+ }
67
+
68
+ /// \memberof AMdoc
69
+ /// \brief Applies a sequence of changes to a document.
70
+ ///
71
+ /// \param[in] doc A pointer to an `AMdoc` struct.
72
+ /// \param[in] items A pointer to an `AMitems` struct with `AM_VAL_TYPE_CHANGE`
73
+ /// items.
74
+ /// \return A pointer to an `AMresult` struct with an `AM_VAL_TYPE_VOID` item.
75
+ /// \pre \p doc `!= NULL`
76
+ /// \pre \p items `!= NULL`
77
+ /// \warning The returned `AMresult` struct pointer must be passed to
78
+ /// `AMresultFree()` in order to avoid a memory leak.
79
+ /// \internal
80
+ ///
81
+ /// # Safety
82
+ /// doc must be a valid pointer to an AMdoc
83
+ /// items must be a valid pointer to an AMitems.
84
+ #[no_mangle]
85
+ pub unsafe extern "C" fn AMapplyChanges(doc: *mut AMdoc, items: *const AMitems) -> *mut AMresult {
86
+ let doc = to_doc_mut!(doc);
87
+ let items = to_items!(items);
88
+ match Vec::<am::Change>::try_from(items) {
89
+ Ok(changes) => to_result(doc.apply_changes(changes)),
90
+ Err(e) => AMresult::error(&e.to_string()).into(),
91
+ }
92
+ }
93
+
94
+ /// \memberof AMdoc
95
+ /// \brief Allocates storage for a document and initializes it by duplicating
96
+ /// the given document.
97
+ ///
98
+ /// \param[in] doc A pointer to an `AMdoc` struct.
99
+ /// \return A pointer to an `AMresult` struct with an `AM_VAL_TYPE_DOC` item.
100
+ /// \pre \p doc `!= NULL`
101
+ /// \warning The returned `AMresult` struct pointer must be passed to
102
+ /// `AMresultFree()` in order to avoid a memory leak.
103
+ /// \internal
104
+ ///
105
+ /// # Safety
106
+ /// doc must be a valid pointer to an AMdoc
107
+ #[no_mangle]
108
+ pub unsafe extern "C" fn AMclone(doc: *const AMdoc) -> *mut AMresult {
109
+ let doc = to_doc!(doc);
110
+ to_result(doc.as_ref().clone())
111
+ }
112
+
113
+ /// \memberof AMdoc
114
+ /// \brief Allocates a new document and initializes it with defaults.
115
+ ///
116
+ /// \param[in] actor_id A pointer to an `AMactorId` struct or `NULL` for a
117
+ /// random one.
118
+ /// \return A pointer to an `AMresult` struct with an `AM_VAL_TYPE_DOC` item.
119
+ /// \warning The returned `AMresult` struct pointer must be passed to
120
+ /// `AMresultFree()` in order to avoid a memory leak.
121
+ /// \internal
122
+ ///
123
+ /// # Safety
124
+ /// actor_id must be a valid pointer to an AMactorId or std::ptr::null()
125
+ #[no_mangle]
126
+ pub unsafe extern "C" fn AMcreate(actor_id: *const AMactorId) -> *mut AMresult {
127
+ to_result(match actor_id.as_ref() {
128
+ Some(actor_id) => am::AutoCommit::new().with_actor(actor_id.as_ref().clone()),
129
+ None => am::AutoCommit::new(),
130
+ })
131
+ }
132
+
133
+ /// \memberof AMdoc
134
+ /// \brief Commits the current operations on a document with an optional
135
+ /// message and/or *nix timestamp (milliseconds).
136
+ ///
137
+ /// \param[in] doc A pointer to an `AMdoc` struct.
138
+ /// \param[in] message A UTF-8 string view as an `AMbyteSpan` struct.
139
+ /// \param[in] timestamp A pointer to a 64-bit integer or `NULL`.
140
+ /// \return A pointer to an `AMresult` struct with one `AM_VAL_TYPE_CHANGE_HASH`
141
+ /// item if there were operations to commit or an `AM_VAL_TYPE_VOID` item
142
+ /// if there were no operations to commit.
143
+ /// \pre \p doc `!= NULL`
144
+ /// \warning The returned `AMresult` struct pointer must be passed to
145
+ /// `AMresultFree()` in order to avoid a memory leak.
146
+ /// \internal
147
+ ///
148
+ /// # Safety
149
+ /// doc must be a valid pointer to an AMdoc
150
+ #[no_mangle]
151
+ pub unsafe extern "C" fn AMcommit(
152
+ doc: *mut AMdoc,
153
+ message: AMbyteSpan,
154
+ timestamp: *const i64,
155
+ ) -> *mut AMresult {
156
+ let doc = to_doc_mut!(doc);
157
+ let mut options = CommitOptions::default();
158
+ if !message.is_null() {
159
+ options.set_message(to_str!(message));
160
+ }
161
+ if let Some(timestamp) = timestamp.as_ref() {
162
+ options.set_time(*timestamp);
163
+ }
164
+ to_result(doc.commit_with(options))
165
+ }
166
+
167
+ /// \memberof AMdoc
168
+ /// \brief Creates an empty change with an optional message and/or *nix
169
+ /// timestamp (milliseconds).
170
+ ///
171
+ /// \details This is useful if you wish to create a "merge commit" which has as
172
+ /// its dependents the current heads of the document but you don't have
173
+ /// any operations to add to the document.
174
+ ///
175
+ /// \note If there are outstanding uncommitted changes to the document
176
+ /// then two changes will be created: one for creating the outstanding
177
+ /// changes and one for the empty change. The empty change will always be
178
+ /// the latest change in the document after this call and the returned
179
+ /// hash will be the hash of that empty change.
180
+ ///
181
+ /// \param[in] doc A pointer to an `AMdoc` struct.
182
+ /// \param[in] message A UTF-8 string view as an `AMbyteSpan` struct.
183
+ /// \param[in] timestamp A pointer to a 64-bit integer or `NULL`.
184
+ /// \return A pointer to an `AMresult` struct with one `AM_VAL_TYPE_CHANGE_HASH`
185
+ /// item.
186
+ /// \pre \p doc `!= NULL`
187
+ /// \warning The returned `AMresult` struct pointer must be passed to
188
+ /// `AMresultFree()` in order to avoid a memory leak.
189
+ /// \internal
190
+ ///
191
+ /// # Safety
192
+ /// doc must be a valid pointer to an AMdoc
193
+ #[no_mangle]
194
+ pub unsafe extern "C" fn AMemptyChange(
195
+ doc: *mut AMdoc,
196
+ message: AMbyteSpan,
197
+ timestamp: *const i64,
198
+ ) -> *mut AMresult {
199
+ let doc = to_doc_mut!(doc);
200
+ let mut options = CommitOptions::default();
201
+ if !message.is_null() {
202
+ options.set_message(to_str!(message));
203
+ }
204
+ if let Some(timestamp) = timestamp.as_ref() {
205
+ options.set_time(*timestamp);
206
+ }
207
+ to_result(doc.empty_change(options))
208
+ }
209
+
210
+ /// \memberof AMdoc
211
+ /// \brief Tests the equality of two documents after closing their respective
212
+ /// transactions.
213
+ ///
214
+ /// \param[in] doc1 A pointer to an `AMdoc` struct.
215
+ /// \param[in] doc2 A pointer to an `AMdoc` struct.
216
+ /// \return `true` if \p doc1 `==` \p doc2 and `false` otherwise.
217
+ /// \pre \p doc1 `!= NULL`
218
+ /// \pre \p doc2 `!= NULL`
219
+ /// \internal
220
+ ///
221
+ /// #Safety
222
+ /// doc1 must be a valid pointer to an AMdoc
223
+ /// doc2 must be a valid pointer to an AMdoc
224
+ #[no_mangle]
225
+ pub unsafe extern "C" fn AMequal(doc1: *mut AMdoc, doc2: *mut AMdoc) -> bool {
226
+ match (doc1.as_mut(), doc2.as_mut()) {
227
+ (Some(doc1), Some(doc2)) => doc1.is_equal_to(doc2),
228
+ (None, None) | (None, Some(_)) | (Some(_), None) => false,
229
+ }
230
+ }
231
+
232
+ /// \memberof AMdoc
233
+ /// \brief Forks this document at its current or a historical point for use by
234
+ /// a different actor.
235
+ /// \param[in] doc A pointer to an `AMdoc` struct.
236
+ /// \param[in] heads A pointer to an `AMitems` struct with `AM_VAL_TYPE_CHANGE_HASH`
237
+ /// items to select a historical point or `NULL` to select its
238
+ /// current point.
239
+ /// \return A pointer to an `AMresult` struct with an `AM_VAL_TYPE_VOID` item.
240
+ /// \pre \p doc `!= NULL`
241
+ /// \warning The returned `AMresult` struct pointer must be passed to
242
+ /// `AMresultFree()` in order to avoid a memory leak.
243
+ /// \internal
244
+ ///
245
+ /// # Safety
246
+ /// doc must be a valid pointer to an AMdoc
247
+ /// heads must be a valid pointer to an AMitems or std::ptr::null()
248
+ #[no_mangle]
249
+ pub unsafe extern "C" fn AMfork(doc: *mut AMdoc, heads: *const AMitems) -> *mut AMresult {
250
+ let doc = to_doc_mut!(doc);
251
+ match heads.as_ref() {
252
+ None => to_result(doc.fork()),
253
+ Some(heads) => match <Vec<am::ChangeHash>>::try_from(heads) {
254
+ Ok(heads) => to_result(doc.fork_at(&heads)),
255
+ Err(e) => AMresult::error(&e.to_string()).into(),
256
+ },
257
+ }
258
+ }
259
+
260
+ /// \memberof AMdoc
261
+ /// \brief Generates a synchronization message for a peer based upon the given
262
+ /// synchronization state.
263
+ ///
264
+ /// \param[in] doc A pointer to an `AMdoc` struct.
265
+ /// \param[in] sync_state A pointer to an `AMsyncState` struct.
266
+ /// \return A pointer to an `AMresult` struct with either an
267
+ /// `AM_VAL_TYPE_SYNC_MESSAGE` or `AM_VAL_TYPE_VOID` item.
268
+ /// \pre \p doc `!= NULL`
269
+ /// \pre \p sync_state `!= NULL`
270
+ /// \warning The returned `AMresult` struct pointer must be passed to
271
+ /// `AMresultFree()` in order to avoid a memory leak.
272
+ /// \internal
273
+ ///
274
+ /// # Safety
275
+ /// doc must be a valid pointer to an AMdoc
276
+ /// sync_state must be a valid pointer to an AMsyncState
277
+ #[no_mangle]
278
+ pub unsafe extern "C" fn AMgenerateSyncMessage(
279
+ doc: *mut AMdoc,
280
+ sync_state: *mut AMsyncState,
281
+ ) -> *mut AMresult {
282
+ let doc = to_doc_mut!(doc);
283
+ let sync_state = to_sync_state_mut!(sync_state);
284
+ to_result(doc.sync().generate_sync_message(sync_state.as_mut()))
285
+ }
286
+
287
+ /// \memberof AMdoc
288
+ /// \brief Gets a document's actor identifier.
289
+ ///
290
+ /// \param[in] doc A pointer to an `AMdoc` struct.
291
+ /// \return A pointer to an `AMresult` struct with an `AM_VAL_TYPE_ACTOR_ID` item.
292
+ /// \pre \p doc `!= NULL`
293
+ /// \warning The returned `AMresult` struct pointer must be passed to
294
+ /// `AMresultFree()` in order to avoid a memory leak.
295
+ /// \internal
296
+ ///
297
+ /// # Safety
298
+ /// doc must be a valid pointer to an AMdoc
299
+ #[no_mangle]
300
+ pub unsafe extern "C" fn AMgetActorId(doc: *const AMdoc) -> *mut AMresult {
301
+ let doc = to_doc!(doc);
302
+ to_result(Ok::<am::ActorId, am::AutomergeError>(
303
+ doc.get_actor().clone(),
304
+ ))
305
+ }
306
+
307
+ /// \memberof AMdoc
308
+ /// \brief Gets the change added to a document by its respective hash.
309
+ ///
310
+ /// \param[in] doc A pointer to an `AMdoc` struct.
311
+ /// \param[in] src A pointer to an array of bytes.
312
+ /// \param[in] count The count of bytes to copy from the array pointed to by
313
+ /// \p src.
314
+ /// \return A pointer to an `AMresult` struct with an `AM_VAL_TYPE_CHANGE` item.
315
+ /// \pre \p doc `!= NULL`
316
+ /// \pre \p src `!= NULL`
317
+ /// \pre `sizeof(`\p src') >= AM_CHANGE_HASH_SIZE`
318
+ /// \pre \p count `<= sizeof(`\p src `)`
319
+ /// \warning The returned `AMresult` struct pointer must be passed to
320
+ /// `AMresultFree()` in order to avoid a memory leak.
321
+ /// \internal
322
+ ///
323
+ /// # Safety
324
+ /// doc must be a valid pointer to an AMdoc
325
+ /// src must be a byte array of length `>= automerge::types::HASH_SIZE`
326
+ #[no_mangle]
327
+ pub unsafe extern "C" fn AMgetChangeByHash(
328
+ doc: *mut AMdoc,
329
+ src: *const u8,
330
+ count: usize,
331
+ ) -> *mut AMresult {
332
+ let doc = to_doc_mut!(doc);
333
+ let slice = std::slice::from_raw_parts(src, count);
334
+ match slice.try_into() {
335
+ Ok(change_hash) => to_result(doc.get_change_by_hash(&change_hash)),
336
+ Err(e) => AMresult::error(&e.to_string()).into(),
337
+ }
338
+ }
339
+
340
+ /// \memberof AMdoc
341
+ /// \brief Gets the changes added to a document by their respective hashes.
342
+ ///
343
+ /// \param[in] doc A pointer to an `AMdoc` struct.
344
+ /// \param[in] have_deps A pointer to an `AMitems` struct with
345
+ /// `AM_VAL_TYPE_CHANGE_HASH` items or `NULL`.
346
+ /// \return A pointer to an `AMresult` struct with `AM_VAL_TYPE_CHANGE` items.
347
+ /// \pre \p doc `!= NULL`
348
+ /// \warning The returned `AMresult` struct pointer must be passed to
349
+ /// `AMresultFree()` in order to avoid a memory leak.
350
+ /// \internal
351
+ ///
352
+ /// # Safety
353
+ /// doc must be a valid pointer to an AMdoc
354
+ #[no_mangle]
355
+ pub unsafe extern "C" fn AMgetChanges(doc: *mut AMdoc, have_deps: *const AMitems) -> *mut AMresult {
356
+ let doc = to_doc_mut!(doc);
357
+ let have_deps = match have_deps.as_ref() {
358
+ Some(have_deps) => match Vec::<am::ChangeHash>::try_from(have_deps) {
359
+ Ok(change_hashes) => change_hashes,
360
+ Err(e) => return AMresult::error(&e.to_string()).into(),
361
+ },
362
+ None => Vec::<am::ChangeHash>::new(),
363
+ };
364
+ to_result(doc.get_changes(&have_deps))
365
+ }
366
+
367
+ /// \memberof AMdoc
368
+ /// \brief Gets the changes added to a second document that weren't added to
369
+ /// a first document.
370
+ ///
371
+ /// \param[in] doc1 A pointer to an `AMdoc` struct.
372
+ /// \param[in] doc2 A pointer to an `AMdoc` struct.
373
+ /// \return A pointer to an `AMresult` struct with `AM_VAL_TYPE_CHANGE` items.
374
+ /// \pre \p doc1 `!= NULL`
375
+ /// \pre \p doc2 `!= NULL`
376
+ /// \warning The returned `AMresult` struct pointer must be passed to
377
+ /// `AMresultFree()` in order to avoid a memory leak.
378
+ /// \internal
379
+ ///
380
+ /// # Safety
381
+ /// doc1 must be a valid pointer to an AMdoc
382
+ /// doc2 must be a valid pointer to an AMdoc
383
+ #[no_mangle]
384
+ pub unsafe extern "C" fn AMgetChangesAdded(doc1: *mut AMdoc, doc2: *mut AMdoc) -> *mut AMresult {
385
+ let doc1 = to_doc_mut!(doc1);
386
+ let doc2 = to_doc_mut!(doc2);
387
+ to_result(doc1.get_changes_added(doc2))
388
+ }
389
+
390
+ /// \memberof AMdoc
391
+ /// \brief Gets an `AMcursor` i.e. a stable address for a position within a list
392
+ /// object or text object.
393
+ ///
394
+ /// \param[in] doc A pointer to an `AMdoc` struct.
395
+ /// \param[in] obj_id A pointer to an `AMobjId` struct or `AM_ROOT`.
396
+ /// \param[in] position The absolute position of the cursor.
397
+ /// \param[in] heads A pointer to an `AMitems` struct with `AM_VAL_TYPE_CHANGE_HASH`
398
+ /// items to select a historical object or `NULL` to select the
399
+ /// current object.
400
+ /// \return A pointer to an `AMresult` struct with an `AM_VAL_TYPE_CURSOR` item.
401
+ /// \pre \p doc `!= NULL`
402
+ /// \pre \p position `< AMobjSize(`\p doc, \p obj_id, \p heads `)`
403
+ /// \warning The returned `AMresult` struct pointer must be passed to
404
+ /// `AMresultFree()` in order to avoid a memory leak.
405
+ /// \internal
406
+ ///
407
+ /// # Safety
408
+ /// doc must be a valid pointer to an AMdoc
409
+ /// obj_id must be a valid pointer to an AMobjId or std::ptr::null()
410
+ /// heads must be a valid pointer to an AMitems or std::ptr::null()
411
+ #[no_mangle]
412
+ pub unsafe extern "C" fn AMgetCursor(
413
+ doc: *const AMdoc,
414
+ obj_id: *const AMobjId,
415
+ position: usize,
416
+ heads: *const AMitems,
417
+ ) -> *mut AMresult {
418
+ let doc = to_doc!(doc);
419
+ let obj_id = to_obj_id!(obj_id);
420
+ match heads.as_ref() {
421
+ None => to_result(doc.get_cursor(obj_id, position, None)),
422
+ Some(heads) => match <Vec<am::ChangeHash>>::try_from(heads) {
423
+ Ok(heads) => to_result(doc.get_cursor(obj_id, position, Some(heads.as_slice()))),
424
+ Err(e) => AMresult::error(&e.to_string()).into(),
425
+ },
426
+ }
427
+ }
428
+
429
+ /// \memberof AMdoc
430
+ /// \brief Gets the absolute position of an `AMcursor` within a list object or
431
+ /// text object.
432
+ ///
433
+ /// \param[in] doc A pointer to an `AMdoc` struct.
434
+ /// \param[in] obj_id A pointer to an `AMobjId` struct or `AM_ROOT`.
435
+ /// \param[in] cursor A pointer to an `AMcursor` struct.
436
+ /// \param[in] heads A pointer to an `AMitems` struct with `AM_VAL_TYPE_CHANGE_HASH`
437
+ /// items to select a historical object or `NULL` to select the
438
+ /// current object.
439
+ /// \return A pointer to an `AMresult` struct with an `AM_VAL_TYPE_UINT` item.
440
+ /// For an `AM_OBJ_TYPE_TEXT` object, if `AUTOMERGE_C_UTF8` is defined
441
+ /// then the item's value is in bytes but if `AUTOMERGE_C_UTF32` is
442
+ /// defined then the item's value is in Unicode code points.
443
+ /// \pre \p doc `!= NULL`
444
+ /// \pre \p cursor `!= NULL`
445
+ /// \warning The returned `AMresult` struct pointer must be passed to
446
+ /// `AMresultFree()` in order to avoid a memory leak.
447
+ /// \internal
448
+ ///
449
+ /// # Safety
450
+ /// doc must be a valid pointer to an AMdoc
451
+ /// obj_id must be a valid pointer to an AMobjId or std::ptr::null()
452
+ /// cursor must be a valid pointer to an AMcursor
453
+ /// heads must be a valid pointer to an AMitems or std::ptr::null()
454
+ #[no_mangle]
455
+ pub unsafe extern "C" fn AMgetCursorPosition(
456
+ doc: *const AMdoc,
457
+ obj_id: *const AMobjId,
458
+ cursor: *const AMcursor,
459
+ heads: *const AMitems,
460
+ ) -> *mut AMresult {
461
+ let doc = to_doc!(doc);
462
+ let obj_id = to_obj_id!(obj_id);
463
+ let cursor = to_cursor!(cursor);
464
+ match heads.as_ref() {
465
+ None => to_result(doc.get_cursor_position(obj_id, cursor.as_ref(), None)),
466
+ Some(heads) => match <Vec<am::ChangeHash>>::try_from(heads) {
467
+ Ok(heads) => {
468
+ to_result(doc.get_cursor_position(obj_id, cursor.as_ref(), Some(heads.as_slice())))
469
+ }
470
+ Err(e) => AMresult::error(&e.to_string()).into(),
471
+ },
472
+ }
473
+ }
474
+
475
+ /// \memberof AMdoc
476
+ /// \brief Gets the current heads of a document.
477
+ ///
478
+ /// \param[in] doc A pointer to an `AMdoc` struct.
479
+ /// \return A pointer to an `AMresult` struct with `AM_VAL_TYPE_CHANGE_HASH` items.
480
+ /// \pre \p doc `!= NULL`
481
+ /// \warning The returned `AMresult` struct pointer must be passed to
482
+ /// `AMresultFree()` in order to avoid a memory leak.
483
+ /// \internal
484
+ ///
485
+ /// # Safety
486
+ /// doc must be a valid pointer to an AMdoc
487
+ #[no_mangle]
488
+ pub unsafe extern "C" fn AMgetHeads(doc: *mut AMdoc) -> *mut AMresult {
489
+ let doc = to_doc_mut!(doc);
490
+ to_result(Ok::<Vec<am::ChangeHash>, am::AutomergeError>(
491
+ doc.get_heads(),
492
+ ))
493
+ }
494
+
495
+ /// \memberof AMdoc
496
+ /// \brief Gets the hashes of the changes in a document that aren't transitive
497
+ /// dependencies of the given hashes of changes.
498
+ ///
499
+ /// \param[in] doc A pointer to an `AMdoc` struct.
500
+ /// \param[in] heads A pointer to an `AMitems` struct with `AM_VAL_TYPE_CHANGE_HASH`
501
+ /// items or `NULL`.
502
+ /// \return A pointer to an `AMresult` struct with `AM_VAL_TYPE_CHANGE_HASH` items.
503
+ /// \pre \p doc `!= NULL`
504
+ /// \warning The returned `AMresult` struct pointer must be passed to
505
+ /// `AMresultFree()` in order to avoid a memory leak.
506
+ /// \internal
507
+ ///
508
+ /// # Safety
509
+ /// doc must be a valid pointer to an AMdoc
510
+ /// heads must be a valid pointer to an AMitems or std::ptr::null()
511
+ #[no_mangle]
512
+ pub unsafe extern "C" fn AMgetMissingDeps(doc: *mut AMdoc, heads: *const AMitems) -> *mut AMresult {
513
+ let doc = to_doc_mut!(doc);
514
+ let heads = match heads.as_ref() {
515
+ None => Vec::<am::ChangeHash>::new(),
516
+ Some(heads) => match <Vec<am::ChangeHash>>::try_from(heads) {
517
+ Ok(heads) => heads,
518
+ Err(e) => {
519
+ return AMresult::error(&e.to_string()).into();
520
+ }
521
+ },
522
+ };
523
+ to_result(doc.get_missing_deps(heads.as_slice()))
524
+ }
525
+
526
+ /// \memberof AMdoc
527
+ /// \brief Gets the last change made to a document.
528
+ ///
529
+ /// \param[in] doc A pointer to an `AMdoc` struct.
530
+ /// \return A pointer to an `AMresult` struct containing either an
531
+ /// `AM_VAL_TYPE_CHANGE` or `AM_VAL_TYPE_VOID` item.
532
+ /// \pre \p doc `!= NULL`
533
+ /// \warning The returned `AMresult` struct pointer must be passed to
534
+ /// `AMresultFree()` in order to avoid a memory leak.
535
+ /// \internal
536
+ ///
537
+ /// # Safety
538
+ /// doc must be a valid pointer to an AMdoc
539
+ #[no_mangle]
540
+ pub unsafe extern "C" fn AMgetLastLocalChange(doc: *mut AMdoc) -> *mut AMresult {
541
+ let doc = to_doc_mut!(doc);
542
+ to_result(doc.get_last_local_change())
543
+ }
544
+
545
+ /// \memberof AMdoc
546
+ /// \brief Gets the current or historical keys of a map object.
547
+ ///
548
+ /// \param[in] doc A pointer to an `AMdoc` struct.
549
+ /// \param[in] obj_id A pointer to an `AMobjId` struct or `AM_ROOT`.
550
+ /// \param[in] heads A pointer to an `AMitems` struct with `AM_VAL_TYPE_CHANGE_HASH`
551
+ /// items to select historical keys or `NULL` to select current
552
+ /// keys.
553
+ /// \return A pointer to an `AMresult` struct with `AM_VAL_TYPE_STR` items.
554
+ /// \pre \p doc `!= NULL`
555
+ /// \warning The returned `AMresult` struct pointer must be passed to
556
+ /// `AMresultFree()` in order to avoid a memory leak.
557
+ /// \internal
558
+ ///
559
+ /// # Safety
560
+ /// doc must be a valid pointer to an AMdoc
561
+ /// obj_id must be a valid pointer to an AMobjId or std::ptr::null()
562
+ /// heads must be a valid pointer to an AMitems or std::ptr::null()
563
+ #[no_mangle]
564
+ pub unsafe extern "C" fn AMkeys(
565
+ doc: *const AMdoc,
566
+ obj_id: *const AMobjId,
567
+ heads: *const AMitems,
568
+ ) -> *mut AMresult {
569
+ let doc = to_doc!(doc);
570
+ let obj_id = to_obj_id!(obj_id);
571
+ match heads.as_ref() {
572
+ None => to_result(doc.keys(obj_id)),
573
+ Some(heads) => match <Vec<am::ChangeHash>>::try_from(heads) {
574
+ Ok(heads) => to_result(doc.keys_at(obj_id, &heads)),
575
+ Err(e) => AMresult::error(&e.to_string()).into(),
576
+ },
577
+ }
578
+ }
579
+
580
+ /// \memberof AMdoc
581
+ /// \brief Allocates storage for a document and initializes it with the compact
582
+ /// form of an incremental save.
583
+ ///
584
+ /// \param[in] src A pointer to an array of bytes.
585
+ /// \param[in] count The count of bytes to load from the array pointed to by
586
+ /// \p src.
587
+ /// \return A pointer to an `AMresult` struct with an `AM_VAL_TYPE_DOC` item.
588
+ /// \pre \p src `!= NULL`
589
+ /// \pre `sizeof(`\p src `) > 0`
590
+ /// \pre \p count `<= sizeof(`\p src `)`
591
+ /// \warning The returned `AMresult` struct pointer must be passed to
592
+ /// `AMresultFree()` in order to avoid a memory leak.
593
+ /// \internal
594
+ ///
595
+ /// # Safety
596
+ /// src must be a byte array of length `>= count`
597
+ #[no_mangle]
598
+ pub unsafe extern "C" fn AMload(src: *const u8, count: usize) -> *mut AMresult {
599
+ let data = std::slice::from_raw_parts(src, count);
600
+ to_result(am::AutoCommit::load(data))
601
+ }
602
+
603
+ /// \memberof AMdoc
604
+ /// \brief Loads the compact form of an incremental save into a document.
605
+ ///
606
+ /// \param[in] doc A pointer to an `AMdoc` struct.
607
+ /// \param[in] src A pointer to an array of bytes.
608
+ /// \param[in] count The count of bytes to load from the array pointed to by
609
+ /// \p src.
610
+ /// \return A pointer to an `AMresult` struct with an `AM_VAL_TYPE_UINT` item.
611
+ /// \pre \p doc `!= NULL`
612
+ /// \pre \p src `!= NULL`
613
+ /// \pre `sizeof(`\p src `) > 0`
614
+ /// \pre \p count `<= sizeof(`\p src `)`
615
+ /// \warning The returned `AMresult` struct pointer must be passed to
616
+ /// `AMresultFree()` in order to avoid a memory leak.
617
+ /// \internal
618
+ ///
619
+ /// # Safety
620
+ /// doc must be a valid pointer to an AMdoc
621
+ /// src must be a byte array of length `>= count`
622
+ #[no_mangle]
623
+ pub unsafe extern "C" fn AMloadIncremental(
624
+ doc: *mut AMdoc,
625
+ src: *const u8,
626
+ count: usize,
627
+ ) -> *mut AMresult {
628
+ let doc = to_doc_mut!(doc);
629
+ let data = std::slice::from_raw_parts(src, count);
630
+ to_result(doc.load_incremental(data))
631
+ }
632
+
633
+ /// \memberof AMdoc
634
+ /// \brief Applies all of the changes in \p src which are not in \p dest to
635
+ /// \p dest.
636
+ ///
637
+ /// \param[in] dest A pointer to an `AMdoc` struct.
638
+ /// \param[in] src A pointer to an `AMdoc` struct.
639
+ /// \return A pointer to an `AMresult` struct with `AM_VAL_TYPE_CHANGE_HASH` items.
640
+ /// \pre \p dest `!= NULL`
641
+ /// \pre \p src `!= NULL`
642
+ /// \warning The returned `AMresult` struct pointer must be passed to
643
+ /// `AMresultFree()` in order to avoid a memory leak.
644
+ /// \internal
645
+ ///
646
+ /// # Safety
647
+ /// dest must be a valid pointer to an AMdoc
648
+ /// src must be a valid pointer to an AMdoc
649
+ #[no_mangle]
650
+ pub unsafe extern "C" fn AMmerge(dest: *mut AMdoc, src: *mut AMdoc) -> *mut AMresult {
651
+ let dest = to_doc_mut!(dest);
652
+ to_result(dest.merge(to_doc_mut!(src)))
653
+ }
654
+
655
+ /// \memberof AMdoc
656
+ /// \brief Gets the current or historical size of an object.
657
+ /// \param[in] doc A pointer to an `AMdoc` struct.
658
+ /// \param[in] obj_id A pointer to an `AMobjId` struct or `AM_ROOT`.
659
+ /// \param[in] heads A pointer to an `AMitems` struct with `AM_VAL_TYPE_CHANGE_HASH`
660
+ /// items to select a historical size or `NULL` to select its
661
+ /// current size.
662
+ /// \return The count of items in the object identified by \p obj_id.
663
+ /// For an `AM_OBJ_TYPE_TEXT` object, if `AUTOMERGE_C_UTF8` is defined
664
+ /// then the items are bytes but if `AUTOMERGE_C_UTF32` is defined then
665
+ /// the items are Unicode code points.
666
+ /// \pre \p doc `!= NULL`
667
+ /// \internal
668
+ ///
669
+ /// # Safety
670
+ /// doc must be a valid pointer to an AMdoc
671
+ /// obj_id must be a valid pointer to an AMobjId or std::ptr::null()
672
+ /// heads must be a valid pointer to an AMitems or std::ptr::null()
673
+ #[no_mangle]
674
+ pub unsafe extern "C" fn AMobjSize(
675
+ doc: *const AMdoc,
676
+ obj_id: *const AMobjId,
677
+ heads: *const AMitems,
678
+ ) -> usize {
679
+ if let Some(doc) = doc.as_ref() {
680
+ let obj_id = to_obj_id!(obj_id);
681
+ match heads.as_ref() {
682
+ None => {
683
+ return doc.length(obj_id);
684
+ }
685
+ Some(heads) => {
686
+ if let Ok(heads) = <Vec<am::ChangeHash>>::try_from(heads) {
687
+ return doc.length_at(obj_id, &heads);
688
+ }
689
+ }
690
+ }
691
+ }
692
+ 0
693
+ }
694
+
695
+ /// \memberof AMdoc
696
+ /// \brief Gets the type of an object.
697
+ ///
698
+ /// \param[in] doc A pointer to an `AMdoc` struct.
699
+ /// \param[in] obj_id A pointer to an `AMobjId` struct or `AM_ROOT`.
700
+ /// \return An `AMobjType` tag or `0`.
701
+ /// \pre \p doc `!= NULL`
702
+ /// \pre \p obj_id `!= NULL`
703
+ /// \internal
704
+ ///
705
+ /// # Safety
706
+ /// doc must be a valid pointer to an AMdoc
707
+ /// obj_id must be a valid pointer to an AMobjId or std::ptr::null()
708
+ #[no_mangle]
709
+ pub unsafe extern "C" fn AMobjObjType(doc: *const AMdoc, obj_id: *const AMobjId) -> AMobjType {
710
+ if let Some(doc) = doc.as_ref() {
711
+ let obj_id = to_obj_id!(obj_id);
712
+ if let Ok(obj_type) = doc.object_type(obj_id) {
713
+ return (&obj_type).into();
714
+ }
715
+ }
716
+ Default::default()
717
+ }
718
+
719
+ /// \memberof AMdoc
720
+ /// \brief Gets the current or historical items of an entire object.
721
+ ///
722
+ /// \param[in] doc A pointer to an `AMdoc` struct.
723
+ /// \param[in] obj_id A pointer to an `AMobjId` struct or `AM_ROOT`.
724
+ /// \param[in] heads A pointer to an `AMitems` struct with `AM_VAL_TYPE_CHANGE_HASH`
725
+ /// items to select its historical items or `NULL` to select
726
+ /// its current items.
727
+ /// \return A pointer to an `AMresult` struct with an `AMitems` struct.
728
+ /// \pre \p doc `!= NULL`
729
+ /// \warning The returned `AMresult` struct pointer must be passed to
730
+ /// `AMresultFree()` in order to avoid a memory leak.
731
+ /// \internal
732
+ ///
733
+ /// # Safety
734
+ /// doc must be a valid pointer to an AMdoc
735
+ /// obj_id must be a valid pointer to an AMobjId or std::ptr::null()
736
+ /// heads must be a valid pointer to an AMitems or std::ptr::null()
737
+ #[no_mangle]
738
+ pub unsafe extern "C" fn AMobjItems(
739
+ doc: *const AMdoc,
740
+ obj_id: *const AMobjId,
741
+ heads: *const AMitems,
742
+ ) -> *mut AMresult {
743
+ let doc = to_doc!(doc);
744
+ let obj_id = to_obj_id!(obj_id);
745
+ match heads.as_ref() {
746
+ None => to_result(doc.values(obj_id)),
747
+ Some(heads) => match <Vec<am::ChangeHash>>::try_from(heads) {
748
+ Ok(heads) => to_result(doc.values_at(obj_id, &heads)),
749
+ Err(e) => AMresult::error(&e.to_string()).into(),
750
+ },
751
+ }
752
+ }
753
+
754
+ /// \memberof AMdoc
755
+ /// \brief Gets the number of pending operations added during a document's
756
+ /// current transaction.
757
+ ///
758
+ /// \param[in] doc A pointer to an `AMdoc` struct.
759
+ /// \return The count of pending operations for \p doc.
760
+ /// \pre \p doc `!= NULL`
761
+ /// \internal
762
+ ///
763
+ /// # Safety
764
+ /// doc must be a valid pointer to an AMdoc
765
+ #[no_mangle]
766
+ pub unsafe extern "C" fn AMpendingOps(doc: *const AMdoc) -> usize {
767
+ if let Some(doc) = doc.as_ref() {
768
+ return doc.pending_ops();
769
+ }
770
+ 0
771
+ }
772
+
773
+ /// \memberof AMdoc
774
+ /// \brief Receives a synchronization message from a peer based upon a given
775
+ /// synchronization state.
776
+ ///
777
+ /// \param[in] doc A pointer to an `AMdoc` struct.
778
+ /// \param[in] sync_state A pointer to an `AMsyncState` struct.
779
+ /// \param[in] sync_message A pointer to an `AMsyncMessage` struct.
780
+ /// \return A pointer to an `AMresult` struct with an `AM_VAL_TYPE_VOID` item.
781
+ /// \pre \p doc `!= NULL`
782
+ /// \pre \p sync_state `!= NULL`
783
+ /// \pre \p sync_message `!= NULL`
784
+ /// \internal
785
+ ///
786
+ /// # Safety
787
+ /// doc must be a valid pointer to an AMdoc
788
+ /// sync_state must be a valid pointer to an AMsyncState
789
+ /// sync_message must be a valid pointer to an AMsyncMessage
790
+ #[no_mangle]
791
+ pub unsafe extern "C" fn AMreceiveSyncMessage(
792
+ doc: *mut AMdoc,
793
+ sync_state: *mut AMsyncState,
794
+ sync_message: *const AMsyncMessage,
795
+ ) -> *mut AMresult {
796
+ let doc = to_doc_mut!(doc);
797
+ let sync_state = to_sync_state_mut!(sync_state);
798
+ let sync_message = to_sync_message!(sync_message);
799
+ to_result(
800
+ doc.sync()
801
+ .receive_sync_message(sync_state.as_mut(), sync_message.as_ref().clone()),
802
+ )
803
+ }
804
+
805
+ /// \memberof AMdoc
806
+ /// \brief Cancels the pending operations added during a document's current
807
+ /// transaction and gets the number of cancellations.
808
+ ///
809
+ /// \param[in] doc A pointer to an `AMdoc` struct.
810
+ /// \return The count of pending operations for \p doc that were cancelled.
811
+ /// \pre \p doc `!= NULL`
812
+ /// \internal
813
+ ///
814
+ /// # Safety
815
+ /// doc must be a valid pointer to an AMdoc
816
+ #[no_mangle]
817
+ pub unsafe extern "C" fn AMrollback(doc: *mut AMdoc) -> usize {
818
+ if let Some(doc) = doc.as_mut() {
819
+ return doc.rollback();
820
+ }
821
+ 0
822
+ }
823
+
824
+ /// \memberof AMdoc
825
+ /// \brief Saves the entirety of a document into a compact form.
826
+ ///
827
+ /// \param[in] doc A pointer to an `AMdoc` struct.
828
+ /// \return A pointer to an `AMresult` struct with an `AM_VAL_TYPE_BYTES` item.
829
+ /// \pre \p doc `!= NULL`
830
+ /// \warning The returned `AMresult` struct pointer must be passed to
831
+ /// `AMresultFree()` in order to avoid a memory leak.
832
+ /// \internal
833
+ ///
834
+ /// # Safety
835
+ /// doc must be a valid pointer to an AMdoc
836
+ #[no_mangle]
837
+ pub unsafe extern "C" fn AMsave(doc: *mut AMdoc) -> *mut AMresult {
838
+ let doc = to_doc_mut!(doc);
839
+ to_result(Ok(doc.save()))
840
+ }
841
+
842
+ /// \memberof AMdoc
843
+ /// \brief Saves the changes to a document since its last save into a compact
844
+ /// form.
845
+ ///
846
+ /// \param[in] doc A pointer to an `AMdoc` struct.
847
+ /// \return A pointer to an `AMresult` struct with an `AM_VAL_TYPE_BYTES` item.
848
+ /// \pre \p doc `!= NULL`
849
+ /// \warning The returned `AMresult` struct pointer must be passed to
850
+ /// `AMresultFree()` in order to avoid a memory leak.
851
+ /// \internal
852
+ ///
853
+ /// # Safety
854
+ /// doc must be a valid pointer to an AMdoc
855
+ #[no_mangle]
856
+ pub unsafe extern "C" fn AMsaveIncremental(doc: *mut AMdoc) -> *mut AMresult {
857
+ let doc = to_doc_mut!(doc);
858
+ to_result(Ok(doc.save_incremental()))
859
+ }
860
+
861
+ /// \memberof AMdoc
862
+ /// \brief Puts the actor identifier of a document.
863
+ ///
864
+ /// \param[in] doc A pointer to an `AMdoc` struct.
865
+ /// \param[in] actor_id A pointer to an `AMactorId` struct.
866
+ /// \return A pointer to an `AMresult` struct with an `AM_VAL_TYPE_VOID` item.
867
+ /// \pre \p doc `!= NULL`
868
+ /// \pre \p actor_id `!= NULL`
869
+ /// \warning The returned `AMresult` struct pointer must be passed to
870
+ /// `AMresultFree()` in order to avoid a memory leak.
871
+ /// \internal
872
+ ///
873
+ /// # Safety
874
+ /// doc must be a valid pointer to an AMdoc
875
+ /// actor_id must be a valid pointer to an AMactorId
876
+ #[no_mangle]
877
+ pub unsafe extern "C" fn AMsetActorId(
878
+ doc: *mut AMdoc,
879
+ actor_id: *const AMactorId,
880
+ ) -> *mut AMresult {
881
+ let doc = to_doc_mut!(doc);
882
+ let actor_id = to_actor_id!(actor_id);
883
+ doc.set_actor(actor_id.as_ref().clone());
884
+ to_result(Ok(()))
885
+ }
886
+
887
+ /// \memberof AMdoc
888
+ /// \brief Splices values into and/or removes values from the identified object
889
+ /// at a given position within it.
890
+ ///
891
+ /// \param[in] doc A pointer to an `AMdoc` struct.
892
+ /// \param[in] obj_id A pointer to an `AMobjId` struct or `AM_ROOT`.
893
+ /// \param[in] pos A position in the object identified by \p obj_id or
894
+ /// `SIZE_MAX` to indicate one past its end.
895
+ /// \param[in] del The number of values to delete. If \p del `> 0` then
896
+ /// deletion begins at \p pos but if \p del `< 0` then deletion
897
+ /// ends at \p pos.
898
+ /// \param[in] values A copy of an `AMitems` struct from which values will be
899
+ /// spliced <b>starting at its current position</b>; call
900
+ /// `AMitemsRewound()` on a used `AMitems` first to ensure
901
+ /// that all of its values are spliced in. Pass `(AMitems){0}`
902
+ /// when zero values should be spliced in.
903
+ /// \return A pointer to an `AMresult` struct with an `AM_VAL_TYPE_VOID` item.
904
+ /// \pre \p doc `!= NULL`
905
+ /// \pre `0 <=` \p pos `<= AMobjSize(`\p obj_id `)` or \p pos `== SIZE_MAX`
906
+ /// \pre `-AMobjSize(`\p obj_id `) <=` \p del `<= AMobjSize(`\p obj_id `)`
907
+ /// \warning The returned `AMresult` struct pointer must be passed to
908
+ /// `AMresultFree()` in order to avoid a memory leak.
909
+ /// \internal
910
+ ///
911
+ /// # Safety
912
+ /// doc must be a valid pointer to an AMdoc
913
+ /// obj_id must be a valid pointer to an AMobjId or std::ptr::null()
914
+ /// values must be a valid pointer to an AMitems or std::ptr::null()
915
+ #[no_mangle]
916
+ pub unsafe extern "C" fn AMsplice(
917
+ doc: *mut AMdoc,
918
+ obj_id: *const AMobjId,
919
+ pos: usize,
920
+ del: isize,
921
+ values: AMitems,
922
+ ) -> *mut AMresult {
923
+ let doc = to_doc_mut!(doc);
924
+ let obj_id = to_obj_id!(obj_id);
925
+ let len = doc.length(obj_id);
926
+ let pos = clamp!(pos, len, "pos");
927
+ match Vec::<am::ScalarValue>::try_from(&values) {
928
+ Ok(vals) => to_result(doc.splice(obj_id, pos, del, vals)),
929
+ Err(e) => AMresult::error(&e.to_string()).into(),
930
+ }
931
+ }
932
+
933
+ /// \memberof AMdoc
934
+ /// \brief Splices characters into and/or removes characters from the
935
+ /// identified object at a given position within it.
936
+ /// \param[in] doc A pointer to an `AMdoc` struct.
937
+ /// \param[in] obj_id A pointer to an `AMobjId` struct or `AM_ROOT`.
938
+ /// \param[in] pos A position in the text object identified by \p obj_id or
939
+ /// `SIZE_MAX` to indicate one past its end.
940
+ /// If `AUTOMERGE_C_UTF8` is defined then \p pos is in units of
941
+ /// bytes but if `AUTOMERGE_C_UTF32` is defined then \p pos is in
942
+ /// units of Unicode code points.
943
+ /// \param[in] del The number of characters to delete. If \p del `> 0` then
944
+ /// deletion begins at \p pos but if \p del `< 0` then deletion
945
+ /// ends at \p pos.
946
+ /// If `AUTOMERGE_C_UTF8` is defined then \p del is in units of
947
+ /// bytes but if `AUTOMERGE_C_UTF32` is defined then \p del is in
948
+ /// units of Unicode code points.
949
+ /// \param[in] text A UTF-8 string view as an `AMbyteSpan` struct.
950
+ /// \return A pointer to an `AMresult` struct with an `AM_VAL_TYPE_VOID` item.
951
+ /// \pre \p doc `!= NULL`
952
+ /// \pre `0 <=` \p pos `<= AMobjSize(`\p obj_id `)` or \p pos `== SIZE_MAX`
953
+ /// \pre `-AMobjSize(`\p obj_id `) <=` \p del `<= AMobjSize(`\p obj_id `)`
954
+ /// \warning The returned `AMresult` struct pointer must be passed to
955
+ /// `AMresultFree()` in order to avoid a memory leak.
956
+ /// \internal
957
+ ///
958
+ /// # Safety
959
+ /// doc must be a valid pointer to an AMdoc
960
+ /// obj_id must be a valid pointer to an AMobjId or std::ptr::null()
961
+ #[no_mangle]
962
+ pub unsafe extern "C" fn AMspliceText(
963
+ doc: *mut AMdoc,
964
+ obj_id: *const AMobjId,
965
+ pos: usize,
966
+ del: isize,
967
+ text: AMbyteSpan,
968
+ ) -> *mut AMresult {
969
+ let doc = to_doc_mut!(doc);
970
+ let obj_id = to_obj_id!(obj_id);
971
+ let len = doc.length(obj_id);
972
+ let pos = clamp!(pos, len, "pos");
973
+ to_result(doc.splice_text(obj_id, pos, del, to_str!(text)))
974
+ }
975
+
976
+ /// \memberof AMdoc
977
+ /// \brief Gets the current or historical string represented by a text object.
978
+ ///
979
+ /// \param[in] doc A pointer to an `AMdoc` struct.
980
+ /// \param[in] obj_id A pointer to an `AMobjId` struct or `AM_ROOT`.
981
+ /// \param[in] heads A pointer to an `AMitems` struct containing
982
+ /// `AM_VAL_TYPE_CHANGE_HASH` items to select a historical string
983
+ /// or `NULL` to select the current string.
984
+ /// \return A pointer to an `AMresult` struct with an `AM_VAL_TYPE_STR` item.
985
+ /// \pre \p doc `!= NULL`
986
+ /// \warning The returned `AMresult` struct pointer must be passed to
987
+ /// `AMresultFree()` in order to avoid a memory leak.
988
+ /// \internal
989
+ ///
990
+ /// # Safety
991
+ /// doc must be a valid pointer to an AMdoc
992
+ /// obj_id must be a valid pointer to an AMobjId or std::ptr::null()
993
+ /// heads must be a valid pointer to an AMitems or std::ptr::null()
994
+ #[no_mangle]
995
+ pub unsafe extern "C" fn AMtext(
996
+ doc: *const AMdoc,
997
+ obj_id: *const AMobjId,
998
+ heads: *const AMitems,
999
+ ) -> *mut AMresult {
1000
+ let doc = to_doc!(doc);
1001
+ let obj_id = to_obj_id!(obj_id);
1002
+ match heads.as_ref() {
1003
+ None => to_result(doc.text(obj_id)),
1004
+ Some(heads) => match <Vec<am::ChangeHash>>::try_from(heads) {
1005
+ Ok(heads) => to_result(doc.text_at(obj_id, &heads)),
1006
+ Err(e) => AMresult::error(&e.to_string()).into(),
1007
+ },
1008
+ }
1009
+ }