@salang/sa 0.1.3 → 0.1.4

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 (282) hide show
  1. package/bin/sa.js +13 -1
  2. package/package.json +8 -7
  3. package/sa_std/alloc/layout.sal +12 -0
  4. package/sa_std/alloc/prelude.sa +1 -0
  5. package/sa_std/alloc/prelude.sal +1 -0
  6. package/sa_std/alloc/string.sa +3 -0
  7. package/sa_std/alloc/vec.sa +684 -0
  8. package/sa_std/alloc/vec.sal +4 -0
  9. package/sa_std/any.sa +130 -0
  10. package/sa_std/any.sal +23 -0
  11. package/sa_std/array.sa +1876 -0
  12. package/sa_std/ascii.sa +2 -0
  13. package/sa_std/ascii.sal +1 -0
  14. package/sa_std/async.sla +116 -0
  15. package/sa_std/binary_heap.sa +3003 -0
  16. package/sa_std/binary_heap.sal +7 -0
  17. package/sa_std/borrow.sa +171 -0
  18. package/sa_std/borrow.sal +13 -0
  19. package/sa_std/btree_map.sa +2210 -0
  20. package/sa_std/btree_map.sal +11 -0
  21. package/sa_std/btree_set.sa +1072 -0
  22. package/sa_std/btree_set.sal +6 -0
  23. package/sa_std/char.sa +1309 -0
  24. package/sa_std/char.sal +50 -0
  25. package/sa_std/cmp.sa +554 -0
  26. package/sa_std/cmp.sal +14 -0
  27. package/sa_std/collections/binary_heap.sa +1 -0
  28. package/sa_std/collections/btree_map.sa +1 -0
  29. package/sa_std/collections/btree_set.sa +1 -0
  30. package/sa_std/collections/hashmap.sa +1 -0
  31. package/sa_std/collections/hashset.sa +1 -0
  32. package/sa_std/collections/linked_list.sa +1120 -0
  33. package/sa_std/collections/linked_list.sal +10 -0
  34. package/sa_std/collections/prelude.sa +7 -0
  35. package/sa_std/collections/prelude.sal +1 -0
  36. package/sa_std/collections/vec_deque.sa +1 -0
  37. package/sa_std/collections.sal +13 -0
  38. package/sa_std/convert.sa +1115 -0
  39. package/sa_std/convert.sal +24 -0
  40. package/sa_std/core/arc.sa +233 -0
  41. package/sa_std/core/arc.sal +4 -0
  42. package/sa_std/core/ascii.sa +784 -0
  43. package/sa_std/core/ascii.sal +34 -0
  44. package/sa_std/core/bit.sa +41 -0
  45. package/sa_std/core/box.sa +1 -0
  46. package/sa_std/core/box.sal +2 -0
  47. package/sa_std/core/cell.sa +108 -0
  48. package/sa_std/core/cell.sal +5 -0
  49. package/sa_std/core/cleanup.sa +26 -0
  50. package/sa_std/core/control.sa +20 -0
  51. package/sa_std/core/derive.sa +60 -0
  52. package/sa_std/core/derive.sal +1 -0
  53. package/sa_std/core/dispatch.sa +7 -0
  54. package/sa_std/core/dispatch.sal +5 -0
  55. package/sa_std/core/future.sa +777 -0
  56. package/sa_std/core/future.sal +73 -0
  57. package/sa_std/core/hash.sa +48 -0
  58. package/sa_std/core/iter.sa +2805 -0
  59. package/sa_std/core/iter.sal +4 -0
  60. package/sa_std/core/loop.sa +60 -0
  61. package/sa_std/core/mem.sa +220 -0
  62. package/sa_std/core/option.sa +825 -0
  63. package/sa_std/core/option.sal +11 -0
  64. package/sa_std/core/panic.sa +23 -0
  65. package/sa_std/core/panic.sal +12 -0
  66. package/sa_std/core/prelude.sa +18 -0
  67. package/sa_std/core/prelude.sal +18 -0
  68. package/sa_std/core/rc.sa +225 -0
  69. package/sa_std/core/rc.sal +4 -0
  70. package/sa_std/core/refcell.sa +283 -0
  71. package/sa_std/core/refcell.sal +13 -0
  72. package/sa_std/core/result.sa +708 -0
  73. package/sa_std/core/result.sal +6 -0
  74. package/sa_std/core/rust_patterns.sal +295 -0
  75. package/sa_std/core/sa_core.sa +84 -0
  76. package/sa_std/core/slice.sa +4021 -0
  77. package/sa_std/core/slice.sal +7 -0
  78. package/sa_std/core/task.sa +112 -0
  79. package/sa_std/core/task.sal +15 -0
  80. package/sa_std/core/trait_object.sa +26 -0
  81. package/sa_std/core/trait_object.sal +4 -0
  82. package/sa_std/core/waker.sa +289 -0
  83. package/sa_std/core/waker.sal +31 -0
  84. package/sa_std/core/weak.sa +2 -0
  85. package/sa_std/core/weak.sal +4 -0
  86. package/sa_std/cow.sa +3 -0
  87. package/sa_std/cow.sal +2 -0
  88. package/sa_std/cstring.sa +3 -0
  89. package/sa_std/cstring.sal +2 -0
  90. package/sa_std/default.sa +99 -0
  91. package/sa_std/duration.sa +3 -0
  92. package/sa_std/duration.sal +2 -0
  93. package/sa_std/encoding/json.sa +259 -0
  94. package/sa_std/encoding/json.sai +54 -0
  95. package/sa_std/encoding/json.sal +35 -0
  96. package/sa_std/encoding/prelude.sa +1 -0
  97. package/sa_std/encoding/prelude.sal +0 -0
  98. package/sa_std/env.sa +390 -0
  99. package/sa_std/env.sai +25 -0
  100. package/sa_std/error.sa +253 -0
  101. package/sa_std/error.sal +44 -0
  102. package/sa_std/ffi/cstring.sa +3 -0
  103. package/sa_std/ffi/cstring.sal +1 -0
  104. package/sa_std/ffi/prelude.sa +2 -0
  105. package/sa_std/ffi/prelude.sal +2 -0
  106. package/sa_std/ffi.sa +635 -0
  107. package/sa_std/ffi.sal +51 -0
  108. package/sa_std/fmt.sa +2 -0
  109. package/sa_std/fmt.sai +18 -0
  110. package/sa_std/fmt.sal +35 -0
  111. package/sa_std/fs.sa +1023 -0
  112. package/sa_std/fs.sai +127 -0
  113. package/sa_std/fs.sal +51 -0
  114. package/sa_std/future.sa +2 -0
  115. package/sa_std/future.sal +1 -0
  116. package/sa_std/hash.sa +1486 -0
  117. package/sa_std/hash.sal +13 -0
  118. package/sa_std/hashmap.sa +1962 -0
  119. package/sa_std/hashmap.sal +20 -0
  120. package/sa_std/hashset.sa +1004 -0
  121. package/sa_std/hashset.sal +18 -0
  122. package/sa_std/http2.sa +78 -0
  123. package/sa_std/http2.sai +26 -0
  124. package/sa_std/http2.sal +36 -0
  125. package/sa_std/instant.sa +3 -0
  126. package/sa_std/instant.sal +2 -0
  127. package/sa_std/io/buf_reader.sa +43 -0
  128. package/sa_std/io/buf_writer.sa +35 -0
  129. package/sa_std/io/bufio.sa +4 -0
  130. package/sa_std/io/bufio.sal +4 -0
  131. package/sa_std/io/prelude.sa +1 -0
  132. package/sa_std/io/prelude.sal +1 -0
  133. package/sa_std/io/print.sa +2 -0
  134. package/sa_std/io/print.sai +3 -0
  135. package/sa_std/io.sa +925 -0
  136. package/sa_std/io.sai +25 -0
  137. package/sa_std/io.sal +84 -0
  138. package/sa_std/iter.sa +2 -0
  139. package/sa_std/iter.sal +1 -0
  140. package/sa_std/join_handle.sa +3 -0
  141. package/sa_std/join_handle.sal +2 -0
  142. package/sa_std/libsa_async.sa +80 -0
  143. package/sa_std/m_async.sa +137 -0
  144. package/sa_std/m_async.sal +30 -0
  145. package/sa_std/m_async.sla +2 -0
  146. package/sa_std/manually_drop.sa +3 -0
  147. package/sa_std/manually_drop.sal +2 -0
  148. package/sa_std/marker/phantom_data.sa +3 -0
  149. package/sa_std/marker/phantom_data.sal +1 -0
  150. package/sa_std/marker/prelude.sa +4 -0
  151. package/sa_std/marker/prelude.sal +4 -0
  152. package/sa_std/marker.sa +220 -0
  153. package/sa_std/marker.sal +15 -0
  154. package/sa_std/math.sa +84 -0
  155. package/sa_std/math.sai +10 -0
  156. package/sa_std/mem/manually_drop.sa +3 -0
  157. package/sa_std/mem/manually_drop.sal +1 -0
  158. package/sa_std/mem/prelude.sa +2 -0
  159. package/sa_std/mem/prelude.sal +2 -0
  160. package/sa_std/mem.sa +564 -0
  161. package/sa_std/mem.sal +40 -0
  162. package/sa_std/modstate.sai +19 -0
  163. package/sa_std/net.sa +4227 -0
  164. package/sa_std/net.sai +239 -0
  165. package/sa_std/net.sal +159 -0
  166. package/sa_std/netx.sa +85 -0
  167. package/sa_std/netx.sai +11 -0
  168. package/sa_std/netx.sal +39 -0
  169. package/sa_std/nonzero.sa +3 -0
  170. package/sa_std/nonzero.sal +2 -0
  171. package/sa_std/num/nonzero.sa +3 -0
  172. package/sa_std/num/nonzero.sal +1 -0
  173. package/sa_std/num/prelude.sa +3 -0
  174. package/sa_std/num/prelude.sal +3 -0
  175. package/sa_std/num.sa +17302 -0
  176. package/sa_std/num.sai +11 -0
  177. package/sa_std/num.sal +341 -0
  178. package/sa_std/ops.sa +1884 -0
  179. package/sa_std/ops.sal +68 -0
  180. package/sa_std/option.sa +2 -0
  181. package/sa_std/option.sal +1 -0
  182. package/sa_std/os/fd.sa +96 -0
  183. package/sa_std/os/fd.sai +7 -0
  184. package/sa_std/os/fd.sal +11 -0
  185. package/sa_std/os/prelude.sa +2 -0
  186. package/sa_std/os/prelude.sal +1 -0
  187. package/sa_std/os/unix_ffi.sa +271 -0
  188. package/sa_std/panic.sa +1 -0
  189. package/sa_std/panic.sal +1 -0
  190. package/sa_std/path.sa +3170 -0
  191. package/sa_std/path.sal +12 -0
  192. package/sa_std/phantom_data.sa +3 -0
  193. package/sa_std/phantom_data.sal +2 -0
  194. package/sa_std/pin.sa +79 -0
  195. package/sa_std/pin.sal +5 -0
  196. package/sa_std/plugin_async.sa +90 -0
  197. package/sa_std/plugin_async.sal +29 -0
  198. package/sa_std/plugin_async.sla +4 -0
  199. package/sa_std/plugin_http_async.sa +46 -0
  200. package/sa_std/plugin_http_server.sa +61 -0
  201. package/sa_std/plugin_http_server.sla +2 -0
  202. package/sa_std/plugin_sqlite.sa +106 -0
  203. package/sa_std/plugin_sqlite.sla +2 -0
  204. package/sa_std/prelude.sa +60 -0
  205. package/sa_std/prelude.sal +55 -0
  206. package/sa_std/process.sa +916 -0
  207. package/sa_std/process.sai +57 -0
  208. package/sa_std/process.sal +27 -0
  209. package/sa_std/ptr.sa +503 -0
  210. package/sa_std/ptr.sal +2 -0
  211. package/sa_std/result.sa +2 -0
  212. package/sa_std/result.sal +1 -0
  213. package/sa_std/rust_core.sa +51 -0
  214. package/sa_std/rust_core.sal +26 -0
  215. package/sa_std/sa.mod +7 -0
  216. package/sa_std/sort.sa +156 -0
  217. package/sa_std/str.sla +13 -0
  218. package/sa_std/string.sa +12240 -0
  219. package/sa_std/string.sai +25 -0
  220. package/sa_std/string.sal +17 -0
  221. package/sa_std/string_format.sa +269 -0
  222. package/sa_std/sync/atomic.sa +1500 -0
  223. package/sa_std/sync/atomic.sal +45 -0
  224. package/sa_std/sync/barrier.sa +105 -0
  225. package/sa_std/sync/barrier.sal +7 -0
  226. package/sa_std/sync/condvar.sa +240 -0
  227. package/sa_std/sync/condvar.sal +4 -0
  228. package/sa_std/sync/mpsc.sa +758 -0
  229. package/sa_std/sync/mpsc.sal +42 -0
  230. package/sa_std/sync/mpsc_list.sa +255 -0
  231. package/sa_std/sync/mpsc_list.sal +3 -0
  232. package/sa_std/sync/mutex.sa +182 -0
  233. package/sa_std/sync/mutex.sal +7 -0
  234. package/sa_std/sync/once.sa +371 -0
  235. package/sa_std/sync/once.sal +31 -0
  236. package/sa_std/sync/poison.sa +36 -0
  237. package/sa_std/sync/poison.sal +11 -0
  238. package/sa_std/sync/prelude.sa +8 -0
  239. package/sa_std/sync/prelude.sal +7 -0
  240. package/sa_std/sync/rwlock.sa +369 -0
  241. package/sa_std/sync/rwlock.sal +13 -0
  242. package/sa_std/task.sa +2 -0
  243. package/sa_std/task.sal +1 -0
  244. package/sa_std/term.sa +2 -0
  245. package/sa_std/term.sai +10 -0
  246. package/sa_std/term.sal +33 -0
  247. package/sa_std/testing/assert.sai +4 -0
  248. package/sa_std/testing/mock_io.sa +174 -0
  249. package/sa_std/testing/mock_io.sal +5 -0
  250. package/sa_std/testing/prelude.sa +2 -0
  251. package/sa_std/testing/prelude.sal +1 -0
  252. package/sa_std/text/prelude.sa +1 -0
  253. package/sa_std/text/prelude.sal +1 -0
  254. package/sa_std/text/regex.sa +2 -0
  255. package/sa_std/text/regex.sai +9 -0
  256. package/sa_std/text/regex.sal +33 -0
  257. package/sa_std/thread/join_handle.sa +3 -0
  258. package/sa_std/thread/join_handle.sal +1 -0
  259. package/sa_std/thread/prelude.sa +4 -0
  260. package/sa_std/thread/prelude.sal +3 -0
  261. package/sa_std/thread.sa +160 -0
  262. package/sa_std/thread.sai +11 -0
  263. package/sa_std/thread.sal +4 -0
  264. package/sa_std/thread_local.sa +45 -0
  265. package/sa_std/thread_local.sai +9 -0
  266. package/sa_std/time/duration.sa +3 -0
  267. package/sa_std/time/duration.sal +1 -0
  268. package/sa_std/time/instant.sa +3 -0
  269. package/sa_std/time/instant.sal +1 -0
  270. package/sa_std/time/prelude.sa +4 -0
  271. package/sa_std/time/prelude.sal +4 -0
  272. package/sa_std/time.sa +850 -0
  273. package/sa_std/time.sai +37 -0
  274. package/sa_std/time.sal +35 -0
  275. package/sa_std/time.sla +67 -0
  276. package/sa_std/tls_client.sai +39 -0
  277. package/sa_std/vec.sa +5754 -0
  278. package/sa_std/vec.sal +1 -0
  279. package/sa_std/vec_deque.sa +4925 -0
  280. package/sa_std/vec_deque.sal +8 -0
  281. package/sa_std/vec_runtime_macros.sa +11 -0
  282. package/sa_std/ws_client.sai +57 -0
@@ -0,0 +1,2210 @@
1
+ // Concrete ordered map backed by a sorted entry array.
2
+ @import "core/mem.sa"
3
+ @import "core/slice.sal"
4
+ @import "alloc/vec.sa"
5
+ @import "num.sa"
6
+ @import "btree_map.sal"
7
+ @import "hash.sa"
8
+
9
+ @btree_map_entry_cmp(&lhs: ptr, &rhs: ptr) -> i32:
10
+ L_ENTRY:
11
+ cmp = call @btree_map_entry_cmp_at(&lhs, &rhs, 0)
12
+ return cmp
13
+
14
+ @btree_map_entry_cmp_at(&lhs: ptr, &rhs: ptr, idx: u64) -> i32:
15
+ L_ENTRY:
16
+ lhs_len = load lhs+Slice_len as u64
17
+ rhs_len = load rhs+Slice_len as u64
18
+ lhs_done = eq idx, lhs_len
19
+ br lhs_done -> L_LHS_DONE, L_BODY
20
+
21
+ L_BODY:
22
+ rhs_done = eq idx, rhs_len
23
+ br rhs_done -> L_RHS_DONE, L_COMPARE
24
+
25
+ L_COMPARE:
26
+ lhs_ptr = load lhs+Slice_ptr as ptr
27
+ rhs_ptr = load rhs+Slice_ptr as ptr
28
+ lhs_ip = ptr_add lhs_ptr, idx
29
+ rhs_ip = ptr_add rhs_ptr, idx
30
+ lhs_byte = load lhs_ip+0 as u8
31
+ rhs_byte = load rhs_ip+0 as u8
32
+ lhs_lt = ult lhs_byte, rhs_byte
33
+ br lhs_lt -> L_LESS, L_GT_CHECK
34
+
35
+ L_GT_CHECK:
36
+ lhs_gt = ugt lhs_byte, rhs_byte
37
+ br lhs_gt -> L_GREATER, L_RECURSE
38
+
39
+ L_RECURSE:
40
+ next_idx = add idx, 1
41
+ cmp = call @btree_map_entry_cmp_at(&lhs, &rhs, next_idx)
42
+ !next_idx
43
+ !lhs_lt
44
+ !rhs_byte
45
+ !lhs_byte
46
+ !rhs_ip
47
+ !lhs_ip
48
+ !rhs_done
49
+ !lhs_done
50
+ !idx
51
+ !rhs_len
52
+ !lhs_len
53
+ !rhs
54
+ !lhs
55
+ return cmp
56
+
57
+ L_LESS:
58
+ cmp_result = sub 0, 1
59
+ !lhs_lt
60
+ !rhs_byte
61
+ !lhs_byte
62
+ !rhs_ip
63
+ !lhs_ip
64
+ !rhs_done
65
+ !lhs_done
66
+ !idx
67
+ !rhs_len
68
+ !lhs_len
69
+ !rhs
70
+ !lhs
71
+ return cmp_result
72
+
73
+ L_GREATER:
74
+ cmp_result = add 0, 1
75
+ !lhs_lt
76
+ !rhs_byte
77
+ !lhs_byte
78
+ !rhs_ip
79
+ !lhs_ip
80
+ !rhs_done
81
+ !lhs_done
82
+ !idx
83
+ !rhs_len
84
+ !lhs_len
85
+ !rhs
86
+ !lhs
87
+ return cmp_result
88
+
89
+ L_LHS_DONE:
90
+ rhs_done2 = eq idx, rhs_len
91
+ br rhs_done2 -> L_EQUAL, L_LHS_SHORTER
92
+
93
+ L_RHS_DONE:
94
+ cmp_result = add 0, 1
95
+ !rhs_done
96
+ !lhs_done
97
+ !idx
98
+ !rhs_len
99
+ !lhs_len
100
+ !rhs
101
+ !lhs
102
+ return cmp_result
103
+
104
+ L_LHS_SHORTER:
105
+ cmp_result = sub 0, 1
106
+ !rhs_done2
107
+ !lhs_done
108
+ !idx
109
+ !rhs_len
110
+ !lhs_len
111
+ !rhs
112
+ !lhs
113
+ return cmp_result
114
+
115
+ L_EQUAL:
116
+ !rhs_done2
117
+ !lhs_done
118
+ !idx
119
+ !rhs_len
120
+ !lhs_len
121
+ !rhs
122
+ !lhs
123
+ return 0
124
+
125
+ @btree_map_find(&entries: ptr, len: u64, &key: ptr, &out_index: ptr, &out_found: ptr) -> void:
126
+ L_ENTRY:
127
+ store out_index+0, 0 as u64
128
+ store out_found+0, 0 as u64
129
+ call @btree_map_find_at(&entries, len, &key, 0, &out_index, &out_found)
130
+ !out_found
131
+ !out_index
132
+ !key
133
+ !len
134
+ !entries
135
+ return
136
+
137
+ @btree_map_find_at(&entries: ptr, len: u64, &key: ptr, idx: u64, &out_index: ptr, &out_found: ptr) -> void:
138
+ L_ENTRY:
139
+ done = eq idx, len
140
+ br done -> L_FIND_DONE, L_FIND_BODY
141
+
142
+ L_FIND_BODY:
143
+ entry_off = mul idx, BTreeMapEntry_SIZE
144
+ entry = ptr_add entries, entry_off
145
+ cmp = call @btree_map_entry_cmp(&entry, &key)
146
+ is_equal = eq cmp, 0
147
+ br is_equal -> L_FIND_FOUND, L_FIND_GT_CHECK
148
+
149
+ L_FIND_GT_CHECK:
150
+ is_greater = sgt cmp, 0
151
+ br is_greater -> L_FIND_INSERT_POS, L_FIND_RECURSE
152
+
153
+ L_FIND_RECURSE:
154
+ next_idx = add idx, 1
155
+ call @btree_map_find_at(&entries, len, &key, next_idx, &out_index, &out_found)
156
+ !next_idx
157
+ !is_equal
158
+ !cmp
159
+ !entry
160
+ !entry_off
161
+ !idx
162
+ !done
163
+ !len
164
+ !key
165
+ !out_index
166
+ !out_found
167
+ !entries
168
+ return
169
+
170
+ L_FIND_FOUND:
171
+ store out_index+0, idx as u64
172
+ store out_found+0, 1 as u64
173
+ !is_equal
174
+ !cmp
175
+ !entry
176
+ !entry_off
177
+ !idx
178
+ !done
179
+ !len
180
+ !key
181
+ !out_index
182
+ !out_found
183
+ !entries
184
+ return
185
+
186
+ L_FIND_INSERT_POS:
187
+ store out_index+0, idx as u64
188
+ !is_equal
189
+ !cmp
190
+ !entry
191
+ !entry_off
192
+ !idx
193
+ !done
194
+ !len
195
+ !key
196
+ !out_index
197
+ !out_found
198
+ !entries
199
+ return
200
+
201
+ L_FIND_DONE:
202
+ store out_index+0, len as u64
203
+ !done
204
+ !len
205
+ !key
206
+ !out_index
207
+ !out_found
208
+ !entries
209
+ return
210
+
211
+ @btree_map_hash_entries_str_u64(&hasher: ptr, entries: ptr, len: u64, idx: u64) -> void:
212
+ L_ENTRY:
213
+ done = eq idx, len
214
+ br done -> L_BTREE_MAP_HASH_DONE, L_BTREE_MAP_HASH_BODY
215
+
216
+ L_BTREE_MAP_HASH_BODY:
217
+ entry_off = mul idx, BTreeMapEntry_SIZE
218
+ entry = ptr_add entries, entry_off
219
+ value = load entry+BTreeMapEntry_value as u64
220
+ EXPAND DEFAULT_HASHER_WRITE_STR hasher, entry
221
+ EXPAND DEFAULT_HASHER_WRITE_U64 hasher, value
222
+ next_idx = add idx, 1
223
+ call @btree_map_hash_entries_str_u64(&hasher, entries, len, next_idx)
224
+ !next_idx
225
+ !value
226
+ !entry
227
+ !entry_off
228
+ !done
229
+ !idx
230
+ !len
231
+ !entries
232
+ !hasher
233
+ return
234
+
235
+ L_BTREE_MAP_HASH_DONE:
236
+ !done
237
+ !idx
238
+ !len
239
+ !entries
240
+ !hasher
241
+ return
242
+
243
+ @btree_map_write_hash_str_u64(&hasher: ptr, &map: ptr) -> void:
244
+ L_ENTRY:
245
+ len = load map+BTreeMap_len as u64
246
+ entries = load map+BTreeMap_entries as ptr
247
+ EXPAND DEFAULT_HASHER_WRITE_LENGTH_PREFIX hasher, len
248
+ call @btree_map_hash_entries_str_u64(&hasher, entries, len, 0)
249
+ !entries
250
+ !len
251
+ !map
252
+ !hasher
253
+ return
254
+
255
+ @btree_map_grow(&map: ptr) -> void:
256
+ L_ENTRY:
257
+ old_entries = take map+BTreeMap_entries
258
+ old_cap = load map+BTreeMap_cap as u64
259
+ old_len = load map+BTreeMap_len as u64
260
+ EXPAND NUM_U64_CHECKED_ADD next_cap_ok, next_cap, old_cap, old_cap
261
+ br next_cap_ok -> L_GROW_CAP_OK, L_GROW_CAP_OVERFLOW
262
+
263
+ L_GROW_CAP_OVERFLOW:
264
+ panic(2001)
265
+
266
+ L_GROW_CAP_OK:
267
+ EXPAND NUM_U64_CHECKED_MUL copy_bytes_ok, copy_bytes, old_len, BTreeMapEntry_SIZE
268
+ br copy_bytes_ok -> L_GROW_COPY_BYTES_OK, L_GROW_COPY_BYTES_OVERFLOW
269
+
270
+ L_GROW_COPY_BYTES_OVERFLOW:
271
+ panic(2002)
272
+
273
+ L_GROW_COPY_BYTES_OK:
274
+ EXPAND NUM_U64_CHECKED_MUL new_bytes_ok, new_bytes, next_cap, BTreeMapEntry_SIZE
275
+ br new_bytes_ok -> L_GROW_ALLOC_BYTES_OK, L_GROW_ALLOC_BYTES_OVERFLOW
276
+
277
+ L_GROW_ALLOC_BYTES_OVERFLOW:
278
+ panic(2003)
279
+
280
+ L_GROW_ALLOC_BYTES_OK:
281
+ new_entries = alloc new_bytes
282
+ call @sa_mem_copy(&new_entries, &old_entries, copy_bytes)
283
+ store map+BTreeMap_entries, new_entries as ptr
284
+ store map+BTreeMap_cap, next_cap as u64
285
+ !new_bytes_ok
286
+ !copy_bytes_ok
287
+ !next_cap_ok
288
+ !copy_bytes
289
+ !new_bytes
290
+ !old_len
291
+ !old_cap
292
+ !old_entries
293
+ ^new_entries
294
+ !next_cap
295
+ !map
296
+ return
297
+
298
+ @export sa_btree_map_new() -> ^ptr:
299
+ L_ENTRY:
300
+ map = alloc BTreeMap_SIZE
301
+ initial_bytes = mul BTreeMap_INITIAL_CAP, BTreeMapEntry_SIZE
302
+ entries = alloc initial_bytes
303
+ call @sa_mem_set(&entries, 0, initial_bytes)
304
+ store map+BTreeMap_entries, entries as ptr
305
+ store map+BTreeMap_cap, BTreeMap_INITIAL_CAP as u64
306
+ store map+BTreeMap_len, 0 as u64
307
+ !initial_bytes
308
+ ^entries
309
+ return map
310
+
311
+ @export sa_btree_map_free(^map: ptr) -> void:
312
+ L_ENTRY:
313
+ entries = take map+BTreeMap_entries
314
+ !entries
315
+ !map
316
+ return
317
+
318
+ @export sa_btree_map_len(&map: ptr) -> u64:
319
+ L_ENTRY:
320
+ len = load map+BTreeMap_len as u64
321
+ !map
322
+ return len
323
+
324
+ @export sa_btree_map_is_empty(&map: ptr) -> i32:
325
+ L_ENTRY:
326
+ len = load map+BTreeMap_len as u64
327
+ empty = eq len, 0
328
+ result = empty as i32
329
+ !len
330
+ !map
331
+ return result
332
+
333
+ @export sa_btree_map_contains_key(&map: ptr, &key: ptr) -> i32:
334
+ L_ENTRY:
335
+ find_index_slot = stack_alloc 8
336
+ find_found_slot = stack_alloc 8
337
+ entries = load map+BTreeMap_entries as ptr
338
+ len = load map+BTreeMap_len as u64
339
+ call @btree_map_find(&entries, len, &key, &find_index_slot, &find_found_slot)
340
+ found = load find_found_slot+0 as u64
341
+ present = ne found, 0
342
+ result = present as i32
343
+ !found
344
+ !len
345
+ !key
346
+ !entries
347
+ !map
348
+ return result
349
+
350
+ @export sa_btree_map_clear(&map: ptr) -> void:
351
+ L_ENTRY:
352
+ entries = load map+BTreeMap_entries as ptr
353
+ cap = load map+BTreeMap_cap as u64
354
+ EXPAND NUM_U64_CHECKED_MUL clear_bytes_ok, bytes, cap, BTreeMapEntry_SIZE
355
+ br clear_bytes_ok -> L_CLEAR_BYTES_OK, L_CLEAR_BYTES_OVERFLOW
356
+
357
+ L_CLEAR_BYTES_OVERFLOW:
358
+ panic(2004)
359
+
360
+ L_CLEAR_BYTES_OK:
361
+ has_entries = ne entries, 0
362
+ br has_entries -> L_CLEAR_ENTRIES, L_CLEAR_DONE
363
+
364
+ L_CLEAR_ENTRIES:
365
+ call @sa_mem_set(&entries, 0, bytes)
366
+ jmp L_CLEAR_DONE
367
+
368
+ L_CLEAR_DONE:
369
+ store map+BTreeMap_len, 0 as u64
370
+ !clear_bytes_ok
371
+ !bytes
372
+ !has_entries
373
+ !cap
374
+ !entries
375
+ !map
376
+ return
377
+
378
+ @export sa_btree_map_remove(&map: ptr, &key: ptr) -> u64:
379
+ L_ENTRY:
380
+ find_index_slot = stack_alloc 8
381
+ find_found_slot = stack_alloc 8
382
+ entries = load map+BTreeMap_entries as ptr
383
+ len = load map+BTreeMap_len as u64
384
+ call @btree_map_find(&entries, len, &key, &find_index_slot, &find_found_slot)
385
+ find_index = load find_index_slot+0 as u64
386
+ found = load find_found_slot+0 as u64
387
+ is_found = ne found, 0
388
+ br is_found -> L_REMOVE_HIT, L_REMOVE_MISS
389
+
390
+ L_REMOVE_HIT:
391
+ remove_off = mul find_index, BTreeMapEntry_SIZE
392
+ remove_entry = ptr_add entries, remove_off
393
+ removed_value = load remove_entry+BTreeMapEntry_value as u64
394
+ removed_value_slot = stack_alloc 8
395
+ store removed_value_slot+0, removed_value as u64
396
+ last_index = sub len, 1
397
+ shift_slot = stack_alloc 8
398
+ store shift_slot+0, find_index as u64
399
+ jmp L_REMOVE_SHIFT_LOOP
400
+
401
+ L_REMOVE_SHIFT_LOOP:
402
+ shift_idx = load shift_slot+0 as u64
403
+ needs_shift = ult shift_idx, last_index
404
+ br needs_shift -> L_REMOVE_SHIFT_BODY, L_REMOVE_DONE
405
+
406
+ L_REMOVE_SHIFT_BODY:
407
+ next_idx = add shift_idx, 1
408
+ src_off = mul next_idx, BTreeMapEntry_SIZE
409
+ dst_off = mul shift_idx, BTreeMapEntry_SIZE
410
+ src_entry = ptr_add entries, src_off
411
+ dst_entry = ptr_add entries, dst_off
412
+ src_key_ptr = load src_entry+BTreeMapEntry_key_ptr as ptr
413
+ src_key_len = load src_entry+BTreeMapEntry_key_len as u64
414
+ src_value = load src_entry+BTreeMapEntry_value as u64
415
+ store dst_entry+BTreeMapEntry_key_ptr, src_key_ptr as ptr
416
+ store dst_entry+BTreeMapEntry_key_len, src_key_len as u64
417
+ store dst_entry+BTreeMapEntry_value, src_value as u64
418
+ next_shift = add shift_idx, 1
419
+ store shift_slot+0, next_shift as u64
420
+ !src_value
421
+ !src_key_len
422
+ !src_key_ptr
423
+ !dst_entry
424
+ !src_entry
425
+ !dst_off
426
+ !src_off
427
+ !next_idx
428
+ !next_shift
429
+ !shift_idx
430
+ !needs_shift
431
+ jmp L_REMOVE_SHIFT_LOOP
432
+
433
+ L_REMOVE_DONE:
434
+ last_off = mul last_index, BTreeMapEntry_SIZE
435
+ last_entry = ptr_add entries, last_off
436
+ store last_entry+BTreeMapEntry_key_ptr, 0 as ptr
437
+ store last_entry+BTreeMapEntry_key_len, 0 as u64
438
+ store last_entry+BTreeMapEntry_value, 0 as u64
439
+ next_len = sub len, 1
440
+ store map+BTreeMap_len, next_len as u64
441
+ !last_entry
442
+ !last_off
443
+ !next_len
444
+ !last_index
445
+ !remove_entry
446
+ !remove_off
447
+ !is_found
448
+ !found
449
+ !find_index
450
+ !len
451
+ !entries
452
+ !key
453
+ !map
454
+ removed_value2 = load removed_value_slot+0 as u64
455
+ return removed_value2
456
+
457
+ L_REMOVE_MISS:
458
+ !is_found
459
+ !found
460
+ !find_index
461
+ !len
462
+ !entries
463
+ !key
464
+ !map
465
+ return 0
466
+
467
+ @export sa_btree_map_get(&map: ptr, &key: ptr) -> u64:
468
+ L_ENTRY:
469
+ find_index_slot = stack_alloc 8
470
+ find_found_slot = stack_alloc 8
471
+ value_off = add 0, 0
472
+ value_entry = 0 as ptr
473
+ entries = load map+BTreeMap_entries as ptr
474
+ len = load map+BTreeMap_len as u64
475
+ call @btree_map_find(&entries, len, &key, &find_index_slot, &find_found_slot)
476
+ find_index = load find_index_slot+0 as u64
477
+ found = load find_found_slot+0 as u64
478
+ is_found = ne found, 0
479
+ br is_found -> L_GET_HIT, L_GET_MISS
480
+
481
+ L_GET_HIT:
482
+ value_off = mul find_index, BTreeMapEntry_SIZE
483
+ value_entry = ptr_add entries, value_off
484
+ value = load value_entry+BTreeMapEntry_value as u64
485
+ !value_entry
486
+ !value_off
487
+ !is_found
488
+ !found
489
+ !find_index
490
+ !len
491
+ !key
492
+ !entries
493
+ !map
494
+ return value
495
+
496
+ L_GET_MISS:
497
+ !value_entry
498
+ !value_off
499
+ !is_found
500
+ !found
501
+ !find_index
502
+ !len
503
+ !key
504
+ !entries
505
+ !map
506
+ return 0
507
+
508
+ @export sa_btree_map_try_get(&map: ptr, &key: ptr, &out_value_slot: ptr) -> i32:
509
+ L_ENTRY:
510
+ find_index_slot = stack_alloc 8
511
+ find_found_slot = stack_alloc 8
512
+ entries = load map+BTreeMap_entries as ptr
513
+ len = load map+BTreeMap_len as u64
514
+ call @btree_map_find(&entries, len, &key, &find_index_slot, &find_found_slot)
515
+ find_index = load find_index_slot+0 as u64
516
+ found = load find_found_slot+0 as u64
517
+ is_found = ne found, 0
518
+ br is_found -> L_TRY_GET_HIT, L_TRY_GET_MISS
519
+
520
+ L_TRY_GET_HIT:
521
+ value_off = mul find_index, BTreeMapEntry_SIZE
522
+ value_entry = ptr_add entries, value_off
523
+ value = load value_entry+BTreeMapEntry_value as u64
524
+ store out_value_slot+0, value as u64
525
+ !value
526
+ !value_entry
527
+ !value_off
528
+ !is_found
529
+ !found
530
+ !find_index
531
+ !len
532
+ !entries
533
+ !out_value_slot
534
+ !key
535
+ !map
536
+ return 1
537
+
538
+ L_TRY_GET_MISS:
539
+ store out_value_slot+0, 0 as u64
540
+ !is_found
541
+ !found
542
+ !find_index
543
+ !len
544
+ !entries
545
+ !out_value_slot
546
+ !key
547
+ !map
548
+ return 0
549
+
550
+ @export sa_btree_map_try_get_key_value(&map: ptr, &key: ptr, &out_key: ptr, &out_value_slot: ptr) -> i32:
551
+ L_ENTRY:
552
+ find_index_slot = stack_alloc 8
553
+ find_found_slot = stack_alloc 8
554
+ entries = load map+BTreeMap_entries as ptr
555
+ len = load map+BTreeMap_len as u64
556
+ call @btree_map_find(&entries, len, &key, &find_index_slot, &find_found_slot)
557
+ find_index = load find_index_slot+0 as u64
558
+ found = load find_found_slot+0 as u64
559
+ is_found = ne found, 0
560
+ br is_found -> L_GET_KEY_VALUE_HIT, L_GET_KEY_VALUE_MISS
561
+
562
+ L_GET_KEY_VALUE_HIT:
563
+ entry_off = mul find_index, BTreeMapEntry_SIZE
564
+ entry = ptr_add entries, entry_off
565
+ key_ptr = load entry+BTreeMapEntry_key_ptr as ptr
566
+ key_len = load entry+BTreeMapEntry_key_len as u64
567
+ value = load entry+BTreeMapEntry_value as u64
568
+ store out_key+Slice_ptr, key_ptr as ptr
569
+ store out_key+Slice_len, key_len as u64
570
+ store out_value_slot+0, value as u64
571
+ !value
572
+ !key_len
573
+ !key_ptr
574
+ !entry
575
+ !entry_off
576
+ !is_found
577
+ !found
578
+ !find_index
579
+ !len
580
+ !entries
581
+ !out_value_slot
582
+ !out_key
583
+ !key
584
+ !map
585
+ return 1
586
+
587
+ L_GET_KEY_VALUE_MISS:
588
+ store out_key+Slice_ptr, 0 as ptr
589
+ store out_key+Slice_len, 0 as u64
590
+ store out_value_slot+0, 0 as u64
591
+ !is_found
592
+ !found
593
+ !find_index
594
+ !len
595
+ !entries
596
+ !out_value_slot
597
+ !out_key
598
+ !key
599
+ !map
600
+ return 0
601
+
602
+ @export sa_btree_map_get_mut_ptr(&map: ptr, &key: ptr, &out_ptr_slot: ptr) -> i32:
603
+ L_ENTRY:
604
+ find_index_slot = stack_alloc 8
605
+ find_found_slot = stack_alloc 8
606
+ entries = load map+BTreeMap_entries as ptr
607
+ len = load map+BTreeMap_len as u64
608
+ call @btree_map_find(&entries, len, &key, &find_index_slot, &find_found_slot)
609
+ find_index = load find_index_slot+0 as u64
610
+ found = load find_found_slot+0 as u64
611
+ is_found = ne found, 0
612
+ br is_found -> L_GET_MUT_HIT, L_GET_MUT_MISS
613
+
614
+ L_GET_MUT_HIT:
615
+ value_off = mul find_index, BTreeMapEntry_SIZE
616
+ value_entry = ptr_add entries, value_off
617
+ value_ptr = ptr_add value_entry, BTreeMapEntry_value
618
+ store out_ptr_slot+0, value_ptr as ptr
619
+ !value_ptr
620
+ !value_entry
621
+ !value_off
622
+ !is_found
623
+ !found
624
+ !find_index
625
+ !len
626
+ !entries
627
+ !out_ptr_slot
628
+ !key
629
+ !map
630
+ return 1
631
+
632
+ L_GET_MUT_MISS:
633
+ store out_ptr_slot+0, 0 as ptr
634
+ !is_found
635
+ !found
636
+ !find_index
637
+ !len
638
+ !entries
639
+ !out_ptr_slot
640
+ !key
641
+ !map
642
+ return 0
643
+
644
+ @export sa_btree_map_first_entry_mut_ptr(&map: ptr, &out_key: ptr, &out_ptr_slot: ptr) -> i32:
645
+ L_ENTRY:
646
+ len = load map+BTreeMap_len as u64
647
+ empty = eq len, 0
648
+ br empty -> L_FIRST_ENTRY_MUT_MISS, L_FIRST_ENTRY_MUT_HIT
649
+
650
+ L_FIRST_ENTRY_MUT_HIT:
651
+ entries = load map+BTreeMap_entries as ptr
652
+ entry = ptr_add entries, 0
653
+ key_ptr = load entry+BTreeMapEntry_key_ptr as ptr
654
+ key_len = load entry+BTreeMapEntry_key_len as u64
655
+ value_ptr = ptr_add entry, BTreeMapEntry_value
656
+ store out_key+Slice_ptr, key_ptr as ptr
657
+ store out_key+Slice_len, key_len as u64
658
+ store out_ptr_slot+0, value_ptr as ptr
659
+ !value_ptr
660
+ !key_len
661
+ !key_ptr
662
+ !entry
663
+ !entries
664
+ !empty
665
+ !len
666
+ !out_ptr_slot
667
+ !out_key
668
+ !map
669
+ return 1
670
+
671
+ L_FIRST_ENTRY_MUT_MISS:
672
+ store out_key+Slice_ptr, 0 as ptr
673
+ store out_key+Slice_len, 0 as u64
674
+ store out_ptr_slot+0, 0 as ptr
675
+ !empty
676
+ !len
677
+ !out_ptr_slot
678
+ !out_key
679
+ !map
680
+ return 0
681
+
682
+ @export sa_btree_map_last_entry_mut_ptr(&map: ptr, &out_key: ptr, &out_ptr_slot: ptr) -> i32:
683
+ L_ENTRY:
684
+ len = load map+BTreeMap_len as u64
685
+ empty = eq len, 0
686
+ br empty -> L_LAST_ENTRY_MUT_MISS, L_LAST_ENTRY_MUT_HIT
687
+
688
+ L_LAST_ENTRY_MUT_HIT:
689
+ entries = load map+BTreeMap_entries as ptr
690
+ last_index = sub len, 1
691
+ entry_off = mul last_index, BTreeMapEntry_SIZE
692
+ entry = ptr_add entries, entry_off
693
+ key_ptr = load entry+BTreeMapEntry_key_ptr as ptr
694
+ key_len = load entry+BTreeMapEntry_key_len as u64
695
+ value_ptr = ptr_add entry, BTreeMapEntry_value
696
+ store out_key+Slice_ptr, key_ptr as ptr
697
+ store out_key+Slice_len, key_len as u64
698
+ store out_ptr_slot+0, value_ptr as ptr
699
+ !value_ptr
700
+ !key_len
701
+ !key_ptr
702
+ !entry
703
+ !entry_off
704
+ !last_index
705
+ !entries
706
+ !empty
707
+ !len
708
+ !out_ptr_slot
709
+ !out_key
710
+ !map
711
+ return 1
712
+
713
+ L_LAST_ENTRY_MUT_MISS:
714
+ store out_key+Slice_ptr, 0 as ptr
715
+ store out_key+Slice_len, 0 as u64
716
+ store out_ptr_slot+0, 0 as ptr
717
+ !empty
718
+ !len
719
+ !out_ptr_slot
720
+ !out_key
721
+ !map
722
+ return 0
723
+
724
+ @export sa_btree_map_try_get_disjoint_mut_ptrs(&map: ptr, &key_a: ptr, &key_b: ptr, &out_ptr_a_slot: ptr, &out_ptr_b_slot: ptr) -> i32:
725
+ L_ENTRY:
726
+ key_cmp = call @btree_map_entry_cmp(&key_a, &key_b)
727
+ same_key = eq key_cmp, 0
728
+ br same_key -> L_BTREE_DISJOINT_MUT_SAME, L_BTREE_DISJOINT_MUT_LOOKUP_A
729
+
730
+ L_BTREE_DISJOINT_MUT_LOOKUP_A:
731
+ found_a = call @sa_btree_map_get_mut_ptr(&map, &key_a, &out_ptr_a_slot)
732
+ has_a = ne found_a, 0
733
+ br has_a -> L_BTREE_DISJOINT_MUT_LOOKUP_B, L_BTREE_DISJOINT_MUT_MISS_A
734
+
735
+ L_BTREE_DISJOINT_MUT_LOOKUP_B:
736
+ found_b = call @sa_btree_map_get_mut_ptr(&map, &key_b, &out_ptr_b_slot)
737
+ has_b = ne found_b, 0
738
+ br has_b -> L_BTREE_DISJOINT_MUT_HIT, L_BTREE_DISJOINT_MUT_MISS_B
739
+
740
+ L_BTREE_DISJOINT_MUT_HIT:
741
+ !has_b
742
+ !found_b
743
+ !has_a
744
+ !found_a
745
+ !same_key
746
+ !key_cmp
747
+ !out_ptr_b_slot
748
+ !out_ptr_a_slot
749
+ !key_b
750
+ !key_a
751
+ !map
752
+ return 1
753
+
754
+ L_BTREE_DISJOINT_MUT_MISS_B:
755
+ store out_ptr_a_slot+0, 0 as ptr
756
+ store out_ptr_b_slot+0, 0 as ptr
757
+ !has_b
758
+ !found_b
759
+ !has_a
760
+ !found_a
761
+ !same_key
762
+ !key_cmp
763
+ !out_ptr_b_slot
764
+ !out_ptr_a_slot
765
+ !key_b
766
+ !key_a
767
+ !map
768
+ return 0
769
+
770
+ L_BTREE_DISJOINT_MUT_MISS_A:
771
+ store out_ptr_a_slot+0, 0 as ptr
772
+ store out_ptr_b_slot+0, 0 as ptr
773
+ !has_a
774
+ !found_a
775
+ !same_key
776
+ !key_cmp
777
+ !out_ptr_b_slot
778
+ !out_ptr_a_slot
779
+ !key_b
780
+ !key_a
781
+ !map
782
+ return 0
783
+
784
+ L_BTREE_DISJOINT_MUT_SAME:
785
+ store out_ptr_a_slot+0, 0 as ptr
786
+ store out_ptr_b_slot+0, 0 as ptr
787
+ !same_key
788
+ !key_cmp
789
+ !out_ptr_b_slot
790
+ !out_ptr_a_slot
791
+ !key_b
792
+ !key_a
793
+ !map
794
+ return 0
795
+
796
+ @export sa_btree_map_first_key_value(&map: ptr, &out_key: ptr, &out_value_slot: ptr) -> i32:
797
+ L_ENTRY:
798
+ len = load map+BTreeMap_len as u64
799
+ empty = eq len, 0
800
+ br empty -> L_FIRST_MISS, L_FIRST_HIT
801
+
802
+ L_FIRST_HIT:
803
+ entries = load map+BTreeMap_entries as ptr
804
+ entry_off = add 0, 0
805
+ entry = ptr_add entries, entry_off
806
+ key_ptr = load entry+BTreeMapEntry_key_ptr as ptr
807
+ key_len = load entry+BTreeMapEntry_key_len as u64
808
+ value = load entry+BTreeMapEntry_value as u64
809
+ store out_key+Slice_ptr, key_ptr as ptr
810
+ store out_key+Slice_len, key_len as u64
811
+ store out_value_slot+0, value as u64
812
+ !value
813
+ !key_len
814
+ !key_ptr
815
+ !entry
816
+ !entry_off
817
+ !entries
818
+ !empty
819
+ !len
820
+ !out_value_slot
821
+ !out_key
822
+ !map
823
+ return 1
824
+
825
+ L_FIRST_MISS:
826
+ store out_key+Slice_ptr, 0 as ptr
827
+ store out_key+Slice_len, 0 as u64
828
+ store out_value_slot+0, 0 as u64
829
+ !empty
830
+ !len
831
+ !out_value_slot
832
+ !out_key
833
+ !map
834
+ return 0
835
+
836
+ @export sa_btree_map_last_key_value(&map: ptr, &out_key: ptr, &out_value_slot: ptr) -> i32:
837
+ L_ENTRY:
838
+ len = load map+BTreeMap_len as u64
839
+ empty = eq len, 0
840
+ br empty -> L_LAST_MISS, L_LAST_HIT
841
+
842
+ L_LAST_HIT:
843
+ entries = load map+BTreeMap_entries as ptr
844
+ last_index = sub len, 1
845
+ entry_off = mul last_index, BTreeMapEntry_SIZE
846
+ entry = ptr_add entries, entry_off
847
+ key_ptr = load entry+BTreeMapEntry_key_ptr as ptr
848
+ key_len = load entry+BTreeMapEntry_key_len as u64
849
+ value = load entry+BTreeMapEntry_value as u64
850
+ store out_key+Slice_ptr, key_ptr as ptr
851
+ store out_key+Slice_len, key_len as u64
852
+ store out_value_slot+0, value as u64
853
+ !value
854
+ !key_len
855
+ !key_ptr
856
+ !entry
857
+ !entry_off
858
+ !last_index
859
+ !entries
860
+ !empty
861
+ !len
862
+ !out_value_slot
863
+ !out_key
864
+ !map
865
+ return 1
866
+
867
+ L_LAST_MISS:
868
+ store out_key+Slice_ptr, 0 as ptr
869
+ store out_key+Slice_len, 0 as u64
870
+ store out_value_slot+0, 0 as u64
871
+ !empty
872
+ !len
873
+ !out_value_slot
874
+ !out_key
875
+ !map
876
+ return 0
877
+
878
+ @export sa_btree_map_insert(&map: ptr, &key: ptr, value: u64) -> void:
879
+ L_ENTRY:
880
+ find_index_slot = stack_alloc 8
881
+ find_found_slot = stack_alloc 8
882
+ entries = load map+BTreeMap_entries as ptr
883
+ cap = load map+BTreeMap_cap as u64
884
+ len = load map+BTreeMap_len as u64
885
+ call @btree_map_find(&entries, len, &key, &find_index_slot, &find_found_slot)
886
+ find_index = load find_index_slot+0 as u64
887
+ found = load find_found_slot+0 as u64
888
+ br found -> L_INSERT_UPDATE, L_INSERT_NEED_GROW
889
+
890
+ L_INSERT_UPDATE:
891
+ update_off = mul find_index, BTreeMapEntry_SIZE
892
+ update_entry = ptr_add entries, update_off
893
+ store update_entry+BTreeMapEntry_value, value as u64
894
+ !update_entry
895
+ !update_off
896
+ !find_index
897
+ !len
898
+ !cap
899
+ !value
900
+ !key
901
+ !entries
902
+ !map
903
+ return
904
+
905
+ L_INSERT_NEED_GROW:
906
+ len_is_cap = eq len, cap
907
+ br len_is_cap -> L_INSERT_GROW, L_INSERT_RELEASE
908
+
909
+ L_INSERT_GROW:
910
+ !entries
911
+ !len
912
+ !cap
913
+ call @btree_map_grow(&map)
914
+ jmp L_INSERT_READY
915
+
916
+ L_INSERT_RELEASE:
917
+ !entries
918
+ !len
919
+ !cap
920
+ jmp L_INSERT_READY
921
+
922
+ L_INSERT_READY:
923
+ entries2 = load map+BTreeMap_entries as ptr
924
+ len2 = load map+BTreeMap_len as u64
925
+ shift_slot = stack_alloc 8
926
+ store shift_slot+0, len2 as u64
927
+ jmp L_INSERT_SHIFT_LOOP
928
+
929
+ L_INSERT_SHIFT_LOOP:
930
+ shift_idx = load shift_slot+0 as u64
931
+ done = eq shift_idx, find_index
932
+ br done -> L_INSERT_WRITE, L_INSERT_SHIFT_BODY
933
+
934
+ L_INSERT_SHIFT_BODY:
935
+ prev_idx = sub shift_idx, 1
936
+ prev_off = mul prev_idx, BTreeMapEntry_SIZE
937
+ dst_off = mul shift_idx, BTreeMapEntry_SIZE
938
+ prev_entry = ptr_add entries2, prev_off
939
+ dst_entry = ptr_add entries2, dst_off
940
+ prev_key_ptr = load prev_entry+BTreeMapEntry_key_ptr as ptr
941
+ prev_key_len = load prev_entry+BTreeMapEntry_key_len as u64
942
+ prev_value = load prev_entry+BTreeMapEntry_value as u64
943
+ store dst_entry+BTreeMapEntry_key_ptr, prev_key_ptr as ptr
944
+ store dst_entry+BTreeMapEntry_key_len, prev_key_len as u64
945
+ store dst_entry+BTreeMapEntry_value, prev_value as u64
946
+ next_shift = sub shift_idx, 1
947
+ store shift_slot+0, next_shift as u64
948
+ !prev_idx
949
+ !next_shift
950
+ !prev_value
951
+ !prev_key_len
952
+ !prev_key_ptr
953
+ !dst_entry
954
+ !prev_entry
955
+ !dst_off
956
+ !prev_off
957
+ !shift_idx
958
+ !done
959
+ jmp L_INSERT_SHIFT_LOOP
960
+
961
+ L_INSERT_WRITE:
962
+ insert_off = mul find_index, BTreeMapEntry_SIZE
963
+ insert_entry = ptr_add entries2, insert_off
964
+ key_ptr = load key+Slice_ptr as ptr
965
+ key_len = load key+Slice_len as u64
966
+ store insert_entry+BTreeMapEntry_key_ptr, key_ptr as ptr
967
+ store insert_entry+BTreeMapEntry_key_len, key_len as u64
968
+ store insert_entry+BTreeMapEntry_value, value as u64
969
+ next_len = add len2, 1
970
+ store map+BTreeMap_len, next_len as u64
971
+ !key_len
972
+ !key_ptr
973
+ !insert_entry
974
+ !insert_off
975
+ !entries2
976
+ !len2
977
+ !value
978
+ !key
979
+ !find_index
980
+ !map
981
+ return
982
+
983
+ @export sa_btree_map_insert_old(&map: ptr, &key: ptr, value: u64, &out_old_value_slot: ptr) -> i32:
984
+ L_ENTRY:
985
+ replaced = call @sa_btree_map_try_get(&map, &key, &out_old_value_slot)
986
+ call @sa_btree_map_insert(&map, &key, value)
987
+ !out_old_value_slot
988
+ !value
989
+ !key
990
+ !map
991
+ return replaced
992
+
993
+ @export sa_btree_map_try_insert(&map: ptr, &key: ptr, value: u64, &out_value_ptr_slot: ptr) -> i32:
994
+ L_ENTRY:
995
+ existing_ptr_slot = stack_alloc 8
996
+ found = call @sa_btree_map_get_mut_ptr(&map, &key, &existing_ptr_slot)
997
+ exists = ne found, 0
998
+ br exists -> L_BTREE_TRY_INSERT_EXISTS, L_BTREE_TRY_INSERT_NEW
999
+
1000
+ L_BTREE_TRY_INSERT_EXISTS:
1001
+ existing_ptr = load existing_ptr_slot+0 as ptr
1002
+ store out_value_ptr_slot+0, existing_ptr as ptr
1003
+ !existing_ptr
1004
+ !exists
1005
+ !found
1006
+ !out_value_ptr_slot
1007
+ !value
1008
+ !key
1009
+ !map
1010
+ return 0
1011
+
1012
+ L_BTREE_TRY_INSERT_NEW:
1013
+ call @sa_btree_map_insert(&map, &key, value)
1014
+ inserted_found = call @sa_btree_map_get_mut_ptr(&map, &key, &existing_ptr_slot)
1015
+ inserted_ptr = load existing_ptr_slot+0 as ptr
1016
+ store out_value_ptr_slot+0, inserted_ptr as ptr
1017
+ !inserted_ptr
1018
+ !inserted_found
1019
+ !exists
1020
+ !found
1021
+ !out_value_ptr_slot
1022
+ !value
1023
+ !key
1024
+ !map
1025
+ return 1
1026
+
1027
+ @export sa_btree_map_keys_set(&map: ptr) -> ^ptr:
1028
+ L_ENTRY:
1029
+ out_set = call @sa_btree_map_new()
1030
+ entries = load map+BTreeMap_entries as ptr
1031
+ len = load map+BTreeMap_len as u64
1032
+ idx_slot = stack_alloc 8
1033
+ store idx_slot+0, 0 as u64
1034
+ jmp L_BTREE_KEYS_HEAD
1035
+
1036
+ L_BTREE_KEYS_HEAD:
1037
+ idx = load idx_slot+0 as u64
1038
+ done = eq idx, len
1039
+ br done -> L_BTREE_KEYS_DONE, L_BTREE_KEYS_BODY
1040
+
1041
+ L_BTREE_KEYS_BODY:
1042
+ entry_off = mul idx, BTreeMapEntry_SIZE
1043
+ entry = ptr_add entries, entry_off
1044
+ call @sa_btree_map_insert(&out_set, &entry, 1)
1045
+ next_idx = add idx, 1
1046
+ store idx_slot+0, next_idx as u64
1047
+ !next_idx
1048
+ !entry
1049
+ !entry_off
1050
+ !done
1051
+ !idx
1052
+ jmp L_BTREE_KEYS_HEAD
1053
+
1054
+ L_BTREE_KEYS_DONE:
1055
+ !done
1056
+ !idx
1057
+ !len
1058
+ !entries
1059
+ !map
1060
+ return out_set
1061
+
1062
+ @export sa_btree_map_values_vec(&map: ptr) -> ^ptr:
1063
+ L_ENTRY:
1064
+ len = load map+BTreeMap_len as u64
1065
+ out_vec = call @sa_vec_with_capacity(len, 8)
1066
+ entries = load map+BTreeMap_entries as ptr
1067
+ idx_slot = stack_alloc 8
1068
+ store idx_slot+0, 0 as u64
1069
+ jmp L_BTREE_VALUES_HEAD
1070
+
1071
+ L_BTREE_VALUES_HEAD:
1072
+ idx = load idx_slot+0 as u64
1073
+ done = eq idx, len
1074
+ br done -> L_BTREE_VALUES_DONE, L_BTREE_VALUES_BODY
1075
+
1076
+ L_BTREE_VALUES_BODY:
1077
+ entry_off = mul idx, BTreeMapEntry_SIZE
1078
+ entry = ptr_add entries, entry_off
1079
+ value = load entry+BTreeMapEntry_value as u64
1080
+ out_vec = call @sa_vec_push(^out_vec, value, 8)
1081
+ next_idx = add idx, 1
1082
+ store idx_slot+0, next_idx as u64
1083
+ !next_idx
1084
+ !value
1085
+ !entry
1086
+ !entry_off
1087
+ !done
1088
+ !idx
1089
+ jmp L_BTREE_VALUES_HEAD
1090
+
1091
+ L_BTREE_VALUES_DONE:
1092
+ !done
1093
+ !idx
1094
+ !entries
1095
+ !len
1096
+ !map
1097
+ return out_vec
1098
+
1099
+ @export sa_btree_map_value_mut_ptrs_vec(&map: ptr) -> ^ptr:
1100
+ L_ENTRY:
1101
+ len = load map+BTreeMap_len as u64
1102
+ out_vec = call @sa_vec_with_capacity(len, 8)
1103
+ entries = load map+BTreeMap_entries as ptr
1104
+ idx_slot = stack_alloc 8
1105
+ store idx_slot+0, 0 as u64
1106
+ jmp L_BTREE_VALUE_PTRS_HEAD
1107
+
1108
+ L_BTREE_VALUE_PTRS_HEAD:
1109
+ idx = load idx_slot+0 as u64
1110
+ done = eq idx, len
1111
+ br done -> L_BTREE_VALUE_PTRS_DONE, L_BTREE_VALUE_PTRS_BODY
1112
+
1113
+ L_BTREE_VALUE_PTRS_BODY:
1114
+ entry_off = mul idx, BTreeMapEntry_SIZE
1115
+ entry = ptr_add entries, entry_off
1116
+ value_ptr = ptr_add entry, BTreeMapEntry_value
1117
+ value_ptr_bits = bitcast value_ptr as u64
1118
+ out_vec = call @sa_vec_push(^out_vec, value_ptr_bits, 8)
1119
+ next_idx = add idx, 1
1120
+ store idx_slot+0, next_idx as u64
1121
+ !next_idx
1122
+ !value_ptr_bits
1123
+ !value_ptr
1124
+ !entry
1125
+ !entry_off
1126
+ !done
1127
+ !idx
1128
+ jmp L_BTREE_VALUE_PTRS_HEAD
1129
+
1130
+ L_BTREE_VALUE_PTRS_DONE:
1131
+ !done
1132
+ !idx
1133
+ !entries
1134
+ !len
1135
+ !map
1136
+ return out_vec
1137
+
1138
+ @export sa_btree_map_iter_vec(&map: ptr) -> ^ptr:
1139
+ L_ENTRY:
1140
+ len = load map+BTreeMap_len as u64
1141
+ EXPAND NUM_U64_CHECKED_MUL btree_iter_cap_ok, btree_iter_cap, len, 3
1142
+ br btree_iter_cap_ok -> L_BTREE_ITER_CAP_OK, L_BTREE_ITER_CAP_OVERFLOW
1143
+
1144
+ L_BTREE_ITER_CAP_OVERFLOW:
1145
+ panic(2204)
1146
+
1147
+ L_BTREE_ITER_CAP_OK:
1148
+ out_vec = call @sa_vec_with_capacity(btree_iter_cap, 8)
1149
+ entries = load map+BTreeMap_entries as ptr
1150
+ idx_slot = stack_alloc 8
1151
+ store idx_slot+0, 0 as u64
1152
+ jmp L_BTREE_ITER_HEAD
1153
+
1154
+ L_BTREE_ITER_HEAD:
1155
+ idx = load idx_slot+0 as u64
1156
+ done = eq idx, len
1157
+ br done -> L_BTREE_ITER_DONE, L_BTREE_ITER_BODY
1158
+
1159
+ L_BTREE_ITER_BODY:
1160
+ entry_off = mul idx, BTreeMapEntry_SIZE
1161
+ entry = ptr_add entries, entry_off
1162
+ key_ptr = load entry+BTreeMapEntry_key_ptr as ptr
1163
+ key_len = load entry+BTreeMapEntry_key_len as u64
1164
+ value = load entry+BTreeMapEntry_value as u64
1165
+ key_ptr_bits = bitcast key_ptr as u64
1166
+ out_vec = call @sa_vec_push(^out_vec, key_ptr_bits, 8)
1167
+ out_vec = call @sa_vec_push(^out_vec, key_len, 8)
1168
+ out_vec = call @sa_vec_push(^out_vec, value, 8)
1169
+ next_idx = add idx, 1
1170
+ store idx_slot+0, next_idx as u64
1171
+ !next_idx
1172
+ !key_ptr_bits
1173
+ !value
1174
+ !key_len
1175
+ !key_ptr
1176
+ !entry
1177
+ !entry_off
1178
+ !done
1179
+ !idx
1180
+ jmp L_BTREE_ITER_HEAD
1181
+
1182
+ L_BTREE_ITER_DONE:
1183
+ !done
1184
+ !idx
1185
+ !entries
1186
+ !btree_iter_cap_ok
1187
+ !btree_iter_cap
1188
+ !len
1189
+ !map
1190
+ return out_vec
1191
+
1192
+ @export sa_btree_map_iter_mut_ptrs_vec(&map: ptr) -> ^ptr:
1193
+ L_ENTRY:
1194
+ len = load map+BTreeMap_len as u64
1195
+ EXPAND NUM_U64_CHECKED_MUL btree_iter_mut_cap_ok, btree_iter_mut_cap, len, 3
1196
+ br btree_iter_mut_cap_ok -> L_BTREE_ITER_MUT_CAP_OK, L_BTREE_ITER_MUT_CAP_OVERFLOW
1197
+
1198
+ L_BTREE_ITER_MUT_CAP_OVERFLOW:
1199
+ panic(2205)
1200
+
1201
+ L_BTREE_ITER_MUT_CAP_OK:
1202
+ out_vec = call @sa_vec_with_capacity(btree_iter_mut_cap, 8)
1203
+ entries = load map+BTreeMap_entries as ptr
1204
+ idx_slot = stack_alloc 8
1205
+ store idx_slot+0, 0 as u64
1206
+ jmp L_BTREE_ITER_MUT_HEAD
1207
+
1208
+ L_BTREE_ITER_MUT_HEAD:
1209
+ idx = load idx_slot+0 as u64
1210
+ done = eq idx, len
1211
+ br done -> L_BTREE_ITER_MUT_DONE, L_BTREE_ITER_MUT_BODY
1212
+
1213
+ L_BTREE_ITER_MUT_BODY:
1214
+ entry_off = mul idx, BTreeMapEntry_SIZE
1215
+ entry = ptr_add entries, entry_off
1216
+ key_ptr = load entry+BTreeMapEntry_key_ptr as ptr
1217
+ key_len = load entry+BTreeMapEntry_key_len as u64
1218
+ value_ptr = ptr_add entry, BTreeMapEntry_value
1219
+ key_ptr_bits = bitcast key_ptr as u64
1220
+ value_ptr_bits = bitcast value_ptr as u64
1221
+ out_vec = call @sa_vec_push(^out_vec, key_ptr_bits, 8)
1222
+ out_vec = call @sa_vec_push(^out_vec, key_len, 8)
1223
+ out_vec = call @sa_vec_push(^out_vec, value_ptr_bits, 8)
1224
+ next_idx = add idx, 1
1225
+ store idx_slot+0, next_idx as u64
1226
+ !next_idx
1227
+ !value_ptr_bits
1228
+ !key_ptr_bits
1229
+ !value_ptr
1230
+ !key_len
1231
+ !key_ptr
1232
+ !entry
1233
+ !entry_off
1234
+ !done
1235
+ !idx
1236
+ jmp L_BTREE_ITER_MUT_HEAD
1237
+
1238
+ L_BTREE_ITER_MUT_DONE:
1239
+ !done
1240
+ !idx
1241
+ !entries
1242
+ !btree_iter_mut_cap_ok
1243
+ !btree_iter_mut_cap
1244
+ !len
1245
+ !map
1246
+ return out_vec
1247
+
1248
+ @export sa_btree_map_range_mut_ptrs_vec(&map: ptr, &start_key: ptr, &end_key: ptr) -> ^ptr:
1249
+ L_ENTRY:
1250
+ len = load map+BTreeMap_len as u64
1251
+ EXPAND NUM_U64_CHECKED_MUL btree_range_mut_cap_ok, btree_range_mut_cap, len, 3
1252
+ br btree_range_mut_cap_ok -> L_BTREE_RANGE_MUT_CAP_OK, L_BTREE_RANGE_MUT_CAP_OVERFLOW
1253
+
1254
+ L_BTREE_RANGE_MUT_CAP_OVERFLOW:
1255
+ panic(2205)
1256
+
1257
+ L_BTREE_RANGE_MUT_CAP_OK:
1258
+ out_vec = call @sa_vec_with_capacity(btree_range_mut_cap, 8)
1259
+ entries = load map+BTreeMap_entries as ptr
1260
+ idx_slot = stack_alloc 8
1261
+ store idx_slot+0, 0 as u64
1262
+ jmp L_BTREE_RANGE_MUT_HEAD
1263
+
1264
+ L_BTREE_RANGE_MUT_HEAD:
1265
+ idx = load idx_slot+0 as u64
1266
+ done = eq idx, len
1267
+ br done -> L_BTREE_RANGE_MUT_DONE, L_BTREE_RANGE_MUT_BODY
1268
+
1269
+ L_BTREE_RANGE_MUT_BODY:
1270
+ entry_off = mul idx, BTreeMapEntry_SIZE
1271
+ entry = ptr_add entries, entry_off
1272
+ cmp_start = call @btree_map_entry_cmp(&entry, &start_key)
1273
+ in_lower = sge cmp_start, 0
1274
+ br in_lower -> L_BTREE_RANGE_MUT_CHECK_END, L_BTREE_RANGE_MUT_NEXT_SKIP
1275
+
1276
+ L_BTREE_RANGE_MUT_CHECK_END:
1277
+ cmp_end = call @btree_map_entry_cmp(&entry, &end_key)
1278
+ before_end = slt cmp_end, 0
1279
+ br before_end -> L_BTREE_RANGE_MUT_KEEP, L_BTREE_RANGE_MUT_SKIP_END
1280
+
1281
+ L_BTREE_RANGE_MUT_KEEP:
1282
+ key_ptr = load entry+BTreeMapEntry_key_ptr as ptr
1283
+ key_len = load entry+BTreeMapEntry_key_len as u64
1284
+ value_ptr = ptr_add entry, BTreeMapEntry_value
1285
+ key_ptr_bits = bitcast key_ptr as u64
1286
+ value_ptr_bits = bitcast value_ptr as u64
1287
+ out_vec = call @sa_vec_push(^out_vec, key_ptr_bits, 8)
1288
+ out_vec = call @sa_vec_push(^out_vec, key_len, 8)
1289
+ out_vec = call @sa_vec_push(^out_vec, value_ptr_bits, 8)
1290
+ !value_ptr_bits
1291
+ !key_ptr_bits
1292
+ !value_ptr
1293
+ !key_len
1294
+ !key_ptr
1295
+ !before_end
1296
+ !cmp_end
1297
+ !in_lower
1298
+ !cmp_start
1299
+ jmp L_BTREE_RANGE_MUT_NEXT
1300
+
1301
+ L_BTREE_RANGE_MUT_SKIP_END:
1302
+ !before_end
1303
+ !cmp_end
1304
+ !in_lower
1305
+ !cmp_start
1306
+ jmp L_BTREE_RANGE_MUT_NEXT
1307
+
1308
+ L_BTREE_RANGE_MUT_NEXT_SKIP:
1309
+ !in_lower
1310
+ !cmp_start
1311
+ jmp L_BTREE_RANGE_MUT_NEXT
1312
+
1313
+ L_BTREE_RANGE_MUT_NEXT:
1314
+ next_idx = add idx, 1
1315
+ store idx_slot+0, next_idx as u64
1316
+ !next_idx
1317
+ !entry
1318
+ !entry_off
1319
+ !done
1320
+ !idx
1321
+ jmp L_BTREE_RANGE_MUT_HEAD
1322
+
1323
+ L_BTREE_RANGE_MUT_DONE:
1324
+ !done
1325
+ !idx
1326
+ !entries
1327
+ !btree_range_mut_cap_ok
1328
+ !btree_range_mut_cap
1329
+ !len
1330
+ !end_key
1331
+ !start_key
1332
+ !map
1333
+ return out_vec
1334
+
1335
+ @export sa_btree_map_remove_entry(&map: ptr, &key: ptr, &out_key: ptr, &out_value_slot: ptr) -> i32:
1336
+ L_ENTRY:
1337
+ found = call @sa_btree_map_try_get_key_value(&map, &key, &out_key, &out_value_slot)
1338
+ found_nonzero = ne found, 0
1339
+ br found_nonzero -> L_REMOVE_ENTRY_HIT, L_REMOVE_ENTRY_MISS
1340
+
1341
+ L_REMOVE_ENTRY_HIT:
1342
+ removed = call @sa_btree_map_remove(&map, &key)
1343
+ !removed
1344
+ !found_nonzero
1345
+ !found
1346
+ !out_value_slot
1347
+ !out_key
1348
+ !key
1349
+ !map
1350
+ return 1
1351
+
1352
+ L_REMOVE_ENTRY_MISS:
1353
+ !found_nonzero
1354
+ !found
1355
+ !out_value_slot
1356
+ !out_key
1357
+ !key
1358
+ !map
1359
+ return 0
1360
+
1361
+ @export sa_btree_map_pop_first(&map: ptr, &out_key: ptr, &out_value_slot: ptr) -> i32:
1362
+ L_ENTRY:
1363
+ found = call @sa_btree_map_first_key_value(&map, &out_key, &out_value_slot)
1364
+ found_nonzero = ne found, 0
1365
+ br found_nonzero -> L_POP_FIRST_HIT, L_POP_FIRST_MISS
1366
+
1367
+ L_POP_FIRST_HIT:
1368
+ removed = call @sa_btree_map_remove(&map, &out_key)
1369
+ !removed
1370
+ !found_nonzero
1371
+ !found
1372
+ !out_value_slot
1373
+ !out_key
1374
+ !map
1375
+ return 1
1376
+
1377
+ L_POP_FIRST_MISS:
1378
+ !found_nonzero
1379
+ !found
1380
+ !out_value_slot
1381
+ !out_key
1382
+ !map
1383
+ return 0
1384
+
1385
+ @export sa_btree_map_pop_last(&map: ptr, &out_key: ptr, &out_value_slot: ptr) -> i32:
1386
+ L_ENTRY:
1387
+ found = call @sa_btree_map_last_key_value(&map, &out_key, &out_value_slot)
1388
+ found_nonzero = ne found, 0
1389
+ br found_nonzero -> L_POP_LAST_HIT, L_POP_LAST_MISS
1390
+
1391
+ L_POP_LAST_HIT:
1392
+ removed = call @sa_btree_map_remove(&map, &out_key)
1393
+ !removed
1394
+ !found_nonzero
1395
+ !found
1396
+ !out_value_slot
1397
+ !out_key
1398
+ !map
1399
+ return 1
1400
+
1401
+ L_POP_LAST_MISS:
1402
+ !found_nonzero
1403
+ !found
1404
+ !out_value_slot
1405
+ !out_key
1406
+ !map
1407
+ return 0
1408
+
1409
+ @export sa_btree_map_append(&map: ptr, &other: ptr) -> void:
1410
+ L_ENTRY:
1411
+ entries = load other+BTreeMap_entries as ptr
1412
+ len = load other+BTreeMap_len as u64
1413
+ idx_slot = stack_alloc 8
1414
+ store idx_slot+0, 0 as u64
1415
+ jmp L_APPEND_HEAD
1416
+
1417
+ L_APPEND_HEAD:
1418
+ idx = load idx_slot+0 as u64
1419
+ done = eq idx, len
1420
+ br done -> L_APPEND_DONE, L_APPEND_BODY
1421
+
1422
+ L_APPEND_BODY:
1423
+ entry_off = mul idx, BTreeMapEntry_SIZE
1424
+ entry = ptr_add entries, entry_off
1425
+ value = load entry+BTreeMapEntry_value as u64
1426
+ call @sa_btree_map_insert(&map, &entry, value)
1427
+ next_idx = add idx, 1
1428
+ store idx_slot+0, next_idx as u64
1429
+ !next_idx
1430
+ !value
1431
+ !entry
1432
+ !entry_off
1433
+ !done
1434
+ !idx
1435
+ jmp L_APPEND_HEAD
1436
+
1437
+ L_APPEND_DONE:
1438
+ call @sa_btree_map_clear(&other)
1439
+ !done
1440
+ !idx
1441
+ !len
1442
+ !entries
1443
+ !other
1444
+ !map
1445
+ return
1446
+
1447
+ @export sa_btree_map_split_off(&map: ptr, &key: ptr) -> ^ptr:
1448
+ L_ENTRY:
1449
+ out_map = call @sa_btree_map_new()
1450
+ find_index_slot = stack_alloc 8
1451
+ find_found_slot = stack_alloc 8
1452
+ entries = load map+BTreeMap_entries as ptr
1453
+ len = load map+BTreeMap_len as u64
1454
+ call @btree_map_find(&entries, len, &key, &find_index_slot, &find_found_slot)
1455
+ split_index = load find_index_slot+0 as u64
1456
+ idx_slot = stack_alloc 8
1457
+ store idx_slot+0, split_index as u64
1458
+ jmp L_SPLIT_HEAD
1459
+
1460
+ L_SPLIT_HEAD:
1461
+ idx = load idx_slot+0 as u64
1462
+ done = eq idx, len
1463
+ br done -> L_SPLIT_DONE, L_SPLIT_BODY
1464
+
1465
+ L_SPLIT_BODY:
1466
+ entry_off = mul idx, BTreeMapEntry_SIZE
1467
+ entry = ptr_add entries, entry_off
1468
+ value = load entry+BTreeMapEntry_value as u64
1469
+ call @sa_btree_map_insert(&out_map, &entry, value)
1470
+ store entry+BTreeMapEntry_key_ptr, 0 as ptr
1471
+ store entry+BTreeMapEntry_key_len, 0 as u64
1472
+ store entry+BTreeMapEntry_value, 0 as u64
1473
+ next_idx = add idx, 1
1474
+ store idx_slot+0, next_idx as u64
1475
+ !next_idx
1476
+ !value
1477
+ !entry
1478
+ !entry_off
1479
+ !done
1480
+ !idx
1481
+ jmp L_SPLIT_HEAD
1482
+
1483
+ L_SPLIT_DONE:
1484
+ store map+BTreeMap_len, split_index as u64
1485
+ !done
1486
+ !idx
1487
+ !split_index
1488
+ !len
1489
+ !entries
1490
+ !key
1491
+ !map
1492
+ return out_map
1493
+
1494
+ @export sa_btree_map_range(&map: ptr, &start_key: ptr, &end_key: ptr) -> ^ptr:
1495
+ L_ENTRY:
1496
+ out_map = call @sa_btree_map_new()
1497
+ entries = load map+BTreeMap_entries as ptr
1498
+ len = load map+BTreeMap_len as u64
1499
+ idx_slot = stack_alloc 8
1500
+ store idx_slot+0, 0 as u64
1501
+ jmp L_BTREE_RANGE_HEAD
1502
+
1503
+ L_BTREE_RANGE_HEAD:
1504
+ idx = load idx_slot+0 as u64
1505
+ done = eq idx, len
1506
+ br done -> L_BTREE_RANGE_DONE, L_BTREE_RANGE_BODY
1507
+
1508
+ L_BTREE_RANGE_BODY:
1509
+ entry_off = mul idx, BTreeMapEntry_SIZE
1510
+ entry = ptr_add entries, entry_off
1511
+ cmp_start = call @btree_map_entry_cmp(&entry, &start_key)
1512
+ in_lower = sge cmp_start, 0
1513
+ br in_lower -> L_BTREE_RANGE_CHECK_END, L_BTREE_RANGE_NEXT_SKIP
1514
+
1515
+ L_BTREE_RANGE_CHECK_END:
1516
+ cmp_end = call @btree_map_entry_cmp(&entry, &end_key)
1517
+ before_end = slt cmp_end, 0
1518
+ br before_end -> L_BTREE_RANGE_KEEP, L_BTREE_RANGE_SKIP_END
1519
+
1520
+ L_BTREE_RANGE_KEEP:
1521
+ value = load entry+BTreeMapEntry_value as u64
1522
+ call @sa_btree_map_insert(&out_map, &entry, value)
1523
+ !value
1524
+ !before_end
1525
+ !cmp_end
1526
+ !in_lower
1527
+ !cmp_start
1528
+ jmp L_BTREE_RANGE_NEXT
1529
+
1530
+ L_BTREE_RANGE_SKIP_END:
1531
+ !before_end
1532
+ !cmp_end
1533
+ !in_lower
1534
+ !cmp_start
1535
+ jmp L_BTREE_RANGE_NEXT
1536
+
1537
+ L_BTREE_RANGE_NEXT_SKIP:
1538
+ !in_lower
1539
+ !cmp_start
1540
+ jmp L_BTREE_RANGE_NEXT
1541
+
1542
+ L_BTREE_RANGE_NEXT:
1543
+ next_idx = add idx, 1
1544
+ store idx_slot+0, next_idx as u64
1545
+ !next_idx
1546
+ !entry
1547
+ !entry_off
1548
+ !done
1549
+ !idx
1550
+ jmp L_BTREE_RANGE_HEAD
1551
+
1552
+ L_BTREE_RANGE_DONE:
1553
+ !done
1554
+ !idx
1555
+ !len
1556
+ !entries
1557
+ !end_key
1558
+ !start_key
1559
+ !map
1560
+ return out_map
1561
+
1562
+ [MACRO] BTREE_MAP_NEW %out_map
1563
+ %out_map = call @sa_btree_map_new()
1564
+ [END_MACRO]
1565
+
1566
+ [MACRO] BTREE_MAP_FREE %map_reg
1567
+ call @sa_btree_map_free(^%map_reg)
1568
+ [END_MACRO]
1569
+
1570
+ [MACRO] BTREE_MAP_LEN %out_len, %map_reg
1571
+ %out_len = call @sa_btree_map_len(&%map_reg)
1572
+ [END_MACRO]
1573
+
1574
+ [MACRO] BTREE_MAP_IS_EMPTY %out_flag, %map_reg
1575
+ %out_flag = call @sa_btree_map_is_empty(&%map_reg)
1576
+ [END_MACRO]
1577
+
1578
+ [MACRO] BTREE_MAP_GET %out_value, %map_reg, %key_reg
1579
+ %out_value = call @sa_btree_map_get(&%map_reg, &%key_reg)
1580
+ [END_MACRO]
1581
+
1582
+ [MACRO] BTREE_MAP_TRY_GET %out_ok, %out_value, %map_reg, %key_reg
1583
+ __btree_map_try_get_slot_%out_ok = stack_alloc 8
1584
+ %out_ok = call @sa_btree_map_try_get(&%map_reg, &%key_reg, &__btree_map_try_get_slot_%out_ok)
1585
+ %out_value = load __btree_map_try_get_slot_%out_ok+0 as u64
1586
+ [END_MACRO]
1587
+
1588
+ [MACRO] BTREE_MAP_GET_KEY_VALUE %out_ok, %out_key, %out_value, %map_reg, %key_reg
1589
+ %out_key = alloc Slice_SIZE
1590
+ __btree_map_kv_value_slot_%out_ok = stack_alloc 8
1591
+ %out_ok = call @sa_btree_map_try_get_key_value(&%map_reg, &%key_reg, &%out_key, &__btree_map_kv_value_slot_%out_ok)
1592
+ %out_value = load __btree_map_kv_value_slot_%out_ok+0 as u64
1593
+ [END_MACRO]
1594
+
1595
+ [MACRO] BTREE_MAP_GET_MUT_PTR %out_ok, %out_ptr, %map_reg, %key_reg
1596
+ __btree_map_mut_slot_%out_ok = stack_alloc 8
1597
+ %out_ok = call @sa_btree_map_get_mut_ptr(&%map_reg, &%key_reg, &__btree_map_mut_slot_%out_ok)
1598
+ %out_ptr = load __btree_map_mut_slot_%out_ok+0 as ptr
1599
+ [END_MACRO]
1600
+
1601
+ [MACRO] BTREE_MAP_FIRST_ENTRY_MUT_PTR %out_ok, %out_key, %out_ptr, %map_reg
1602
+ %out_key = alloc Slice_SIZE
1603
+ __btree_map_first_entry_mut_slot_%out_ok = stack_alloc 8
1604
+ %out_ok = call @sa_btree_map_first_entry_mut_ptr(&%map_reg, &%out_key, &__btree_map_first_entry_mut_slot_%out_ok)
1605
+ %out_ptr = load __btree_map_first_entry_mut_slot_%out_ok+0 as ptr
1606
+ [END_MACRO]
1607
+
1608
+ // Rust method-name alias: BTreeMap::first_entry -> mutable value slot + key slice.
1609
+ [MACRO] BTREE_MAP_FIRST_ENTRY_MUT %out_ok, %out_key, %out_ptr, %map_reg
1610
+ EXPAND BTREE_MAP_FIRST_ENTRY_MUT_PTR %out_ok, %out_key, %out_ptr, %map_reg
1611
+ [END_MACRO]
1612
+
1613
+ [MACRO] BTREE_MAP_FIRST_ENTRY %out_ok, %out_key, %out_ptr, %map_reg
1614
+ EXPAND BTREE_MAP_FIRST_ENTRY_MUT_PTR %out_ok, %out_key, %out_ptr, %map_reg
1615
+ [END_MACRO]
1616
+
1617
+ [MACRO] BTREE_MAP_LAST_ENTRY_MUT_PTR %out_ok, %out_key, %out_ptr, %map_reg
1618
+ %out_key = alloc Slice_SIZE
1619
+ __btree_map_last_entry_mut_slot_%out_ok = stack_alloc 8
1620
+ %out_ok = call @sa_btree_map_last_entry_mut_ptr(&%map_reg, &%out_key, &__btree_map_last_entry_mut_slot_%out_ok)
1621
+ %out_ptr = load __btree_map_last_entry_mut_slot_%out_ok+0 as ptr
1622
+ [END_MACRO]
1623
+
1624
+ // Rust method-name alias: BTreeMap::last_entry -> mutable value slot + key slice.
1625
+ [MACRO] BTREE_MAP_LAST_ENTRY_MUT %out_ok, %out_key, %out_ptr, %map_reg
1626
+ EXPAND BTREE_MAP_LAST_ENTRY_MUT_PTR %out_ok, %out_key, %out_ptr, %map_reg
1627
+ [END_MACRO]
1628
+
1629
+ [MACRO] BTREE_MAP_LAST_ENTRY %out_ok, %out_key, %out_ptr, %map_reg
1630
+ EXPAND BTREE_MAP_LAST_ENTRY_MUT_PTR %out_ok, %out_key, %out_ptr, %map_reg
1631
+ [END_MACRO]
1632
+
1633
+ [MACRO] BTREE_MAP_TRY_GET_DISJOINT_MUT_PTRS %out_ok, %out_ptr_a, %out_ptr_b, %map_reg, %key_a, %key_b
1634
+ __btree_map_disjoint_a_slot_%out_ok = stack_alloc 8
1635
+ __btree_map_disjoint_b_slot_%out_ok = stack_alloc 8
1636
+ %out_ok = call @sa_btree_map_try_get_disjoint_mut_ptrs(&%map_reg, &%key_a, &%key_b, &__btree_map_disjoint_a_slot_%out_ok, &__btree_map_disjoint_b_slot_%out_ok)
1637
+ %out_ptr_a = load __btree_map_disjoint_a_slot_%out_ok+0 as ptr
1638
+ %out_ptr_b = load __btree_map_disjoint_b_slot_%out_ok+0 as ptr
1639
+ [END_MACRO]
1640
+
1641
+ // Rust method-name alias: BTreeMap::get_disjoint_mut (pair form).
1642
+ [MACRO] BTREE_MAP_GET_DISJOINT_MUT_PTRS %out_ok, %out_ptr_a, %out_ptr_b, %map_reg, %key_a, %key_b
1643
+ EXPAND BTREE_MAP_TRY_GET_DISJOINT_MUT_PTRS %out_ok, %out_ptr_a, %out_ptr_b, %map_reg, %key_a, %key_b
1644
+ [END_MACRO]
1645
+
1646
+ [MACRO] BTREE_MAP_GET_DISJOINT_MUT %out_ok, %out_ptr_a, %out_ptr_b, %map_reg, %key_a, %key_b
1647
+ EXPAND BTREE_MAP_TRY_GET_DISJOINT_MUT_PTRS %out_ok, %out_ptr_a, %out_ptr_b, %map_reg, %key_a, %key_b
1648
+ [END_MACRO]
1649
+
1650
+ [MACRO] BTREE_MAP_FIRST_KEY_VALUE %out_ok, %out_key, %out_value, %map_reg
1651
+ %out_key = alloc Slice_SIZE
1652
+ __btree_map_first_value_slot_%out_ok = stack_alloc 8
1653
+ %out_ok = call @sa_btree_map_first_key_value(&%map_reg, &%out_key, &__btree_map_first_value_slot_%out_ok)
1654
+ %out_value = load __btree_map_first_value_slot_%out_ok+0 as u64
1655
+ [END_MACRO]
1656
+
1657
+ [MACRO] BTREE_MAP_LAST_KEY_VALUE %out_ok, %out_key, %out_value, %map_reg
1658
+ %out_key = alloc Slice_SIZE
1659
+ __btree_map_last_value_slot_%out_ok = stack_alloc 8
1660
+ %out_ok = call @sa_btree_map_last_key_value(&%map_reg, &%out_key, &__btree_map_last_value_slot_%out_ok)
1661
+ %out_value = load __btree_map_last_value_slot_%out_ok+0 as u64
1662
+ [END_MACRO]
1663
+
1664
+ [MACRO] BTREE_MAP_CONTAINS_KEY %out_flag, %map_reg, %key_reg
1665
+ %out_flag = call @sa_btree_map_contains_key(&%map_reg, &%key_reg)
1666
+ [END_MACRO]
1667
+
1668
+ [MACRO] BTREE_MAP_CLEAR %map_reg
1669
+ call @sa_btree_map_clear(&%map_reg)
1670
+ [END_MACRO]
1671
+
1672
+ [MACRO] DEFAULT_HASHER_WRITE_BTREE_MAP_STR_U64 %hasher, %map_reg
1673
+ call @btree_map_write_hash_str_u64(&%hasher, &%map_reg)
1674
+ [END_MACRO]
1675
+
1676
+ // Rust method-name alias over DEFAULT_HASHER_WRITE_BTREE_MAP_STR_U64.
1677
+ [MACRO] DEFAULT_HASHER_WRITE_BTREE_MAP_STR %hasher, %map_reg
1678
+ EXPAND DEFAULT_HASHER_WRITE_BTREE_MAP_STR_U64 %hasher, %map_reg
1679
+ [END_MACRO]
1680
+
1681
+ [MACRO] BTREE_MAP_HASH_STR_U64 %out_hash, %map_reg
1682
+ __btree_map_hash_hasher_%out_hash = stack_alloc DefaultHasher_SIZE
1683
+ EXPAND DEFAULT_HASHER_NEW __btree_map_hash_hasher_%out_hash
1684
+ EXPAND DEFAULT_HASHER_WRITE_BTREE_MAP_STR_U64 __btree_map_hash_hasher_%out_hash, %map_reg
1685
+ EXPAND DEFAULT_HASHER_FINISH %out_hash, __btree_map_hash_hasher_%out_hash
1686
+ [END_MACRO]
1687
+
1688
+ // Rust method-name alias over BTREE_MAP_HASH_STR_U64.
1689
+ [MACRO] BTREE_MAP_HASH_STR %out_hash, %map_reg
1690
+ EXPAND BTREE_MAP_HASH_STR_U64 %out_hash, %map_reg
1691
+ [END_MACRO]
1692
+
1693
+ // Rust method-name bare alias over the concrete str-key/u64-value hash helper.
1694
+ [MACRO] BTREE_MAP_HASH %out_hash, %map_reg
1695
+ EXPAND BTREE_MAP_HASH_STR_U64 %out_hash, %map_reg
1696
+ [END_MACRO]
1697
+
1698
+ [MACRO] BUILD_HASHER_DEFAULT_HASH_ONE_BTREE_MAP_STR_U64 %out_hash, %builder, %map_reg
1699
+ __build_hash_one_btree_map_hasher_%out_hash = stack_alloc DefaultHasher_SIZE
1700
+ EXPAND BUILD_HASHER_DEFAULT_BUILD __build_hash_one_btree_map_hasher_%out_hash, %builder
1701
+ EXPAND DEFAULT_HASHER_WRITE_BTREE_MAP_STR_U64 __build_hash_one_btree_map_hasher_%out_hash, %map_reg
1702
+ EXPAND DEFAULT_HASHER_FINISH %out_hash, __build_hash_one_btree_map_hasher_%out_hash
1703
+ [END_MACRO]
1704
+
1705
+ // Rust method-name alias over BUILD_HASHER_DEFAULT_HASH_ONE_BTREE_MAP_STR_U64.
1706
+ [MACRO] BUILD_HASHER_DEFAULT_HASH_ONE_BTREE_MAP_STR %out_hash, %builder, %map_reg
1707
+ EXPAND BUILD_HASHER_DEFAULT_HASH_ONE_BTREE_MAP_STR_U64 %out_hash, %builder, %map_reg
1708
+ [END_MACRO]
1709
+
1710
+ // Rust method-name bare alias over BUILD_HASHER_DEFAULT_HASH_ONE_BTREE_MAP_STR_U64.
1711
+ [MACRO] BUILD_HASHER_DEFAULT_HASH_ONE_BTREE_MAP %out_hash, %builder, %map_reg
1712
+ EXPAND BUILD_HASHER_DEFAULT_HASH_ONE_BTREE_MAP_STR_U64 %out_hash, %builder, %map_reg
1713
+ [END_MACRO]
1714
+
1715
+ [MACRO] RANDOM_STATE_HASH_ONE_BTREE_MAP_STR_U64 %out_hash, %state, %map_reg
1716
+ __random_state_hash_one_btree_map_hasher_%out_hash = stack_alloc DefaultHasher_SIZE
1717
+ EXPAND RANDOM_STATE_BUILD __random_state_hash_one_btree_map_hasher_%out_hash, %state
1718
+ EXPAND DEFAULT_HASHER_WRITE_BTREE_MAP_STR_U64 __random_state_hash_one_btree_map_hasher_%out_hash, %map_reg
1719
+ EXPAND DEFAULT_HASHER_FINISH %out_hash, __random_state_hash_one_btree_map_hasher_%out_hash
1720
+ [END_MACRO]
1721
+
1722
+ // Rust method-name alias over RANDOM_STATE_HASH_ONE_BTREE_MAP_STR_U64.
1723
+ [MACRO] RANDOM_STATE_HASH_ONE_BTREE_MAP_STR %out_hash, %state, %map_reg
1724
+ EXPAND RANDOM_STATE_HASH_ONE_BTREE_MAP_STR_U64 %out_hash, %state, %map_reg
1725
+ [END_MACRO]
1726
+
1727
+ // Rust method-name bare alias over RANDOM_STATE_HASH_ONE_BTREE_MAP_STR_U64.
1728
+ [MACRO] RANDOM_STATE_HASH_ONE_BTREE_MAP %out_hash, %state, %map_reg
1729
+ EXPAND RANDOM_STATE_HASH_ONE_BTREE_MAP_STR_U64 %out_hash, %state, %map_reg
1730
+ [END_MACRO]
1731
+
1732
+ [MACRO] BTREE_MAP_RETAIN %out_len, %map_reg, %pred_fn
1733
+ __btree_map_retain_entries_%out_len = load %map_reg+BTreeMap_entries as ptr
1734
+ __btree_map_retain_len_%out_len = load %map_reg+BTreeMap_len as u64
1735
+ __btree_map_retain_read_slot_%out_len = stack_alloc 8
1736
+ __btree_map_retain_write_slot_%out_len = stack_alloc 8
1737
+ store __btree_map_retain_read_slot_%out_len+0, 0 as u64
1738
+ store __btree_map_retain_write_slot_%out_len+0, 0 as u64
1739
+ jmp L_BTREE_MAP_RETAIN_HEAD_%out_len
1740
+
1741
+ L_BTREE_MAP_RETAIN_HEAD_%out_len:
1742
+ __btree_map_retain_read_%out_len = load __btree_map_retain_read_slot_%out_len+0 as u64
1743
+ __btree_map_retain_done_%out_len = eq __btree_map_retain_read_%out_len, __btree_map_retain_len_%out_len
1744
+ br __btree_map_retain_done_%out_len -> L_BTREE_MAP_RETAIN_CLEAR_HEAD_%out_len, L_BTREE_MAP_RETAIN_BODY_%out_len
1745
+
1746
+ L_BTREE_MAP_RETAIN_BODY_%out_len:
1747
+ __btree_map_retain_read_off_%out_len = mul __btree_map_retain_read_%out_len, BTreeMapEntry_SIZE
1748
+ __btree_map_retain_read_entry_%out_len = ptr_add __btree_map_retain_entries_%out_len, __btree_map_retain_read_off_%out_len
1749
+ __btree_map_retain_value_%out_len = load __btree_map_retain_read_entry_%out_len+BTreeMapEntry_value as u64
1750
+ __btree_map_retain_pred_%out_len = call %pred_fn(&__btree_map_retain_read_entry_%out_len, __btree_map_retain_value_%out_len)
1751
+ __btree_map_retain_keep_%out_len = ne __btree_map_retain_pred_%out_len, 0
1752
+ br __btree_map_retain_keep_%out_len -> L_BTREE_MAP_RETAIN_KEEP_%out_len, L_BTREE_MAP_RETAIN_SKIP_%out_len
1753
+
1754
+ L_BTREE_MAP_RETAIN_KEEP_%out_len:
1755
+ __btree_map_retain_write_%out_len = load __btree_map_retain_write_slot_%out_len+0 as u64
1756
+ __btree_map_retain_same_slot_%out_len = eq __btree_map_retain_write_%out_len, __btree_map_retain_read_%out_len
1757
+ br __btree_map_retain_same_slot_%out_len -> L_BTREE_MAP_RETAIN_KEEP_ADVANCE_%out_len, L_BTREE_MAP_RETAIN_COPY_%out_len
1758
+
1759
+ L_BTREE_MAP_RETAIN_COPY_%out_len:
1760
+ __btree_map_retain_write_off_%out_len = mul __btree_map_retain_write_%out_len, BTreeMapEntry_SIZE
1761
+ __btree_map_retain_write_entry_%out_len = ptr_add __btree_map_retain_entries_%out_len, __btree_map_retain_write_off_%out_len
1762
+ __btree_map_retain_key_ptr_%out_len = load __btree_map_retain_read_entry_%out_len+BTreeMapEntry_key_ptr as ptr
1763
+ __btree_map_retain_key_len_%out_len = load __btree_map_retain_read_entry_%out_len+BTreeMapEntry_key_len as u64
1764
+ store __btree_map_retain_write_entry_%out_len+BTreeMapEntry_key_ptr, __btree_map_retain_key_ptr_%out_len as ptr
1765
+ store __btree_map_retain_write_entry_%out_len+BTreeMapEntry_key_len, __btree_map_retain_key_len_%out_len as u64
1766
+ store __btree_map_retain_write_entry_%out_len+BTreeMapEntry_value, __btree_map_retain_value_%out_len as u64
1767
+ !__btree_map_retain_key_len_%out_len
1768
+ !__btree_map_retain_key_ptr_%out_len
1769
+ !__btree_map_retain_write_entry_%out_len
1770
+ !__btree_map_retain_write_off_%out_len
1771
+ jmp L_BTREE_MAP_RETAIN_KEEP_ADVANCE_%out_len
1772
+
1773
+ L_BTREE_MAP_RETAIN_KEEP_ADVANCE_%out_len:
1774
+ __btree_map_retain_next_write_%out_len = add __btree_map_retain_write_%out_len, 1
1775
+ store __btree_map_retain_write_slot_%out_len+0, __btree_map_retain_next_write_%out_len as u64
1776
+ !__btree_map_retain_next_write_%out_len
1777
+ !__btree_map_retain_same_slot_%out_len
1778
+ !__btree_map_retain_write_%out_len
1779
+ jmp L_BTREE_MAP_RETAIN_NEXT_%out_len
1780
+
1781
+ L_BTREE_MAP_RETAIN_SKIP_%out_len:
1782
+ jmp L_BTREE_MAP_RETAIN_NEXT_%out_len
1783
+
1784
+ L_BTREE_MAP_RETAIN_NEXT_%out_len:
1785
+ __btree_map_retain_next_read_%out_len = add __btree_map_retain_read_%out_len, 1
1786
+ store __btree_map_retain_read_slot_%out_len+0, __btree_map_retain_next_read_%out_len as u64
1787
+ !__btree_map_retain_next_read_%out_len
1788
+ !__btree_map_retain_keep_%out_len
1789
+ !__btree_map_retain_pred_%out_len
1790
+ !__btree_map_retain_value_%out_len
1791
+ !__btree_map_retain_read_entry_%out_len
1792
+ !__btree_map_retain_read_off_%out_len
1793
+ !__btree_map_retain_done_%out_len
1794
+ !__btree_map_retain_read_%out_len
1795
+ jmp L_BTREE_MAP_RETAIN_HEAD_%out_len
1796
+
1797
+ L_BTREE_MAP_RETAIN_CLEAR_HEAD_%out_len:
1798
+ __btree_map_retain_clear_slot_%out_len = stack_alloc 8
1799
+ __btree_map_retain_kept_len_%out_len = load __btree_map_retain_write_slot_%out_len+0 as u64
1800
+ store __btree_map_retain_clear_slot_%out_len+0, __btree_map_retain_kept_len_%out_len as u64
1801
+ jmp L_BTREE_MAP_RETAIN_CLEAR_LOOP_%out_len
1802
+
1803
+ L_BTREE_MAP_RETAIN_CLEAR_LOOP_%out_len:
1804
+ __btree_map_retain_clear_idx_%out_len = load __btree_map_retain_clear_slot_%out_len+0 as u64
1805
+ __btree_map_retain_clear_done_%out_len = eq __btree_map_retain_clear_idx_%out_len, __btree_map_retain_len_%out_len
1806
+ br __btree_map_retain_clear_done_%out_len -> L_BTREE_MAP_RETAIN_DONE_%out_len, L_BTREE_MAP_RETAIN_CLEAR_BODY_%out_len
1807
+
1808
+ L_BTREE_MAP_RETAIN_CLEAR_BODY_%out_len:
1809
+ __btree_map_retain_clear_off_%out_len = mul __btree_map_retain_clear_idx_%out_len, BTreeMapEntry_SIZE
1810
+ __btree_map_retain_clear_entry_%out_len = ptr_add __btree_map_retain_entries_%out_len, __btree_map_retain_clear_off_%out_len
1811
+ store __btree_map_retain_clear_entry_%out_len+BTreeMapEntry_key_ptr, 0 as ptr
1812
+ store __btree_map_retain_clear_entry_%out_len+BTreeMapEntry_key_len, 0 as u64
1813
+ store __btree_map_retain_clear_entry_%out_len+BTreeMapEntry_value, 0 as u64
1814
+ __btree_map_retain_next_clear_%out_len = add __btree_map_retain_clear_idx_%out_len, 1
1815
+ store __btree_map_retain_clear_slot_%out_len+0, __btree_map_retain_next_clear_%out_len as u64
1816
+ !__btree_map_retain_next_clear_%out_len
1817
+ !__btree_map_retain_clear_entry_%out_len
1818
+ !__btree_map_retain_clear_off_%out_len
1819
+ !__btree_map_retain_clear_done_%out_len
1820
+ !__btree_map_retain_clear_idx_%out_len
1821
+ jmp L_BTREE_MAP_RETAIN_CLEAR_LOOP_%out_len
1822
+
1823
+ L_BTREE_MAP_RETAIN_DONE_%out_len:
1824
+ %out_len = load __btree_map_retain_write_slot_%out_len+0 as u64
1825
+ store %map_reg+BTreeMap_len, %out_len as u64
1826
+ !__btree_map_retain_clear_done_%out_len
1827
+ !__btree_map_retain_clear_idx_%out_len
1828
+ !__btree_map_retain_kept_len_%out_len
1829
+ !__btree_map_retain_done_%out_len
1830
+ !__btree_map_retain_read_%out_len
1831
+ !__btree_map_retain_len_%out_len
1832
+ !__btree_map_retain_entries_%out_len
1833
+ [END_MACRO]
1834
+
1835
+ [MACRO] BTREE_MAP_EXTRACT_IF %out_len, %out_map, %map_reg, %pred_fn
1836
+ EXPAND BTREE_MAP_NEW %out_map
1837
+ __btree_map_extract_entries_%out_len = load %map_reg+BTreeMap_entries as ptr
1838
+ __btree_map_extract_len_%out_len = load %map_reg+BTreeMap_len as u64
1839
+ __btree_map_extract_read_slot_%out_len = stack_alloc 8
1840
+ __btree_map_extract_write_slot_%out_len = stack_alloc 8
1841
+ store __btree_map_extract_read_slot_%out_len+0, 0 as u64
1842
+ store __btree_map_extract_write_slot_%out_len+0, 0 as u64
1843
+ jmp L_BTREE_MAP_EXTRACT_HEAD_%out_len
1844
+
1845
+ L_BTREE_MAP_EXTRACT_HEAD_%out_len:
1846
+ __btree_map_extract_read_%out_len = load __btree_map_extract_read_slot_%out_len+0 as u64
1847
+ __btree_map_extract_done_%out_len = eq __btree_map_extract_read_%out_len, __btree_map_extract_len_%out_len
1848
+ br __btree_map_extract_done_%out_len -> L_BTREE_MAP_EXTRACT_CLEAR_HEAD_%out_len, L_BTREE_MAP_EXTRACT_BODY_%out_len
1849
+
1850
+ L_BTREE_MAP_EXTRACT_BODY_%out_len:
1851
+ __btree_map_extract_read_off_%out_len = mul __btree_map_extract_read_%out_len, BTreeMapEntry_SIZE
1852
+ __btree_map_extract_read_entry_%out_len = ptr_add __btree_map_extract_entries_%out_len, __btree_map_extract_read_off_%out_len
1853
+ __btree_map_extract_value_ptr_%out_len = ptr_add __btree_map_extract_read_entry_%out_len, BTreeMapEntry_value
1854
+ __btree_map_extract_pred_%out_len = call %pred_fn(&__btree_map_extract_read_entry_%out_len, __btree_map_extract_value_ptr_%out_len)
1855
+ __btree_map_extract_value_%out_len = load __btree_map_extract_read_entry_%out_len+BTreeMapEntry_value as u64
1856
+ __btree_map_extract_take_%out_len = ne __btree_map_extract_pred_%out_len, 0
1857
+ br __btree_map_extract_take_%out_len -> L_BTREE_MAP_EXTRACT_TAKE_%out_len, L_BTREE_MAP_EXTRACT_KEEP_%out_len
1858
+
1859
+ L_BTREE_MAP_EXTRACT_TAKE_%out_len:
1860
+ call @sa_btree_map_insert(&%out_map, &__btree_map_extract_read_entry_%out_len, __btree_map_extract_value_%out_len)
1861
+ jmp L_BTREE_MAP_EXTRACT_NEXT_%out_len
1862
+
1863
+ L_BTREE_MAP_EXTRACT_KEEP_%out_len:
1864
+ __btree_map_extract_write_%out_len = load __btree_map_extract_write_slot_%out_len+0 as u64
1865
+ __btree_map_extract_same_slot_%out_len = eq __btree_map_extract_write_%out_len, __btree_map_extract_read_%out_len
1866
+ br __btree_map_extract_same_slot_%out_len -> L_BTREE_MAP_EXTRACT_KEEP_ADVANCE_%out_len, L_BTREE_MAP_EXTRACT_COPY_%out_len
1867
+
1868
+ L_BTREE_MAP_EXTRACT_COPY_%out_len:
1869
+ __btree_map_extract_write_off_%out_len = mul __btree_map_extract_write_%out_len, BTreeMapEntry_SIZE
1870
+ __btree_map_extract_write_entry_%out_len = ptr_add __btree_map_extract_entries_%out_len, __btree_map_extract_write_off_%out_len
1871
+ __btree_map_extract_key_ptr_%out_len = load __btree_map_extract_read_entry_%out_len+BTreeMapEntry_key_ptr as ptr
1872
+ __btree_map_extract_key_len_%out_len = load __btree_map_extract_read_entry_%out_len+BTreeMapEntry_key_len as u64
1873
+ store __btree_map_extract_write_entry_%out_len+BTreeMapEntry_key_ptr, __btree_map_extract_key_ptr_%out_len as ptr
1874
+ store __btree_map_extract_write_entry_%out_len+BTreeMapEntry_key_len, __btree_map_extract_key_len_%out_len as u64
1875
+ store __btree_map_extract_write_entry_%out_len+BTreeMapEntry_value, __btree_map_extract_value_%out_len as u64
1876
+ !__btree_map_extract_key_len_%out_len
1877
+ !__btree_map_extract_key_ptr_%out_len
1878
+ !__btree_map_extract_write_entry_%out_len
1879
+ !__btree_map_extract_write_off_%out_len
1880
+ jmp L_BTREE_MAP_EXTRACT_KEEP_ADVANCE_%out_len
1881
+
1882
+ L_BTREE_MAP_EXTRACT_KEEP_ADVANCE_%out_len:
1883
+ __btree_map_extract_next_write_%out_len = add __btree_map_extract_write_%out_len, 1
1884
+ store __btree_map_extract_write_slot_%out_len+0, __btree_map_extract_next_write_%out_len as u64
1885
+ !__btree_map_extract_next_write_%out_len
1886
+ !__btree_map_extract_same_slot_%out_len
1887
+ !__btree_map_extract_write_%out_len
1888
+ jmp L_BTREE_MAP_EXTRACT_NEXT_%out_len
1889
+
1890
+ L_BTREE_MAP_EXTRACT_NEXT_%out_len:
1891
+ __btree_map_extract_next_read_%out_len = add __btree_map_extract_read_%out_len, 1
1892
+ store __btree_map_extract_read_slot_%out_len+0, __btree_map_extract_next_read_%out_len as u64
1893
+ !__btree_map_extract_next_read_%out_len
1894
+ !__btree_map_extract_take_%out_len
1895
+ !__btree_map_extract_value_%out_len
1896
+ !__btree_map_extract_pred_%out_len
1897
+ !__btree_map_extract_value_ptr_%out_len
1898
+ !__btree_map_extract_read_entry_%out_len
1899
+ !__btree_map_extract_read_off_%out_len
1900
+ !__btree_map_extract_done_%out_len
1901
+ !__btree_map_extract_read_%out_len
1902
+ jmp L_BTREE_MAP_EXTRACT_HEAD_%out_len
1903
+
1904
+ L_BTREE_MAP_EXTRACT_CLEAR_HEAD_%out_len:
1905
+ __btree_map_extract_clear_slot_%out_len = stack_alloc 8
1906
+ __btree_map_extract_kept_len_%out_len = load __btree_map_extract_write_slot_%out_len+0 as u64
1907
+ store __btree_map_extract_clear_slot_%out_len+0, __btree_map_extract_kept_len_%out_len as u64
1908
+ jmp L_BTREE_MAP_EXTRACT_CLEAR_LOOP_%out_len
1909
+
1910
+ L_BTREE_MAP_EXTRACT_CLEAR_LOOP_%out_len:
1911
+ __btree_map_extract_clear_idx_%out_len = load __btree_map_extract_clear_slot_%out_len+0 as u64
1912
+ __btree_map_extract_clear_done_%out_len = eq __btree_map_extract_clear_idx_%out_len, __btree_map_extract_len_%out_len
1913
+ br __btree_map_extract_clear_done_%out_len -> L_BTREE_MAP_EXTRACT_DONE_%out_len, L_BTREE_MAP_EXTRACT_CLEAR_BODY_%out_len
1914
+
1915
+ L_BTREE_MAP_EXTRACT_CLEAR_BODY_%out_len:
1916
+ __btree_map_extract_clear_off_%out_len = mul __btree_map_extract_clear_idx_%out_len, BTreeMapEntry_SIZE
1917
+ __btree_map_extract_clear_entry_%out_len = ptr_add __btree_map_extract_entries_%out_len, __btree_map_extract_clear_off_%out_len
1918
+ store __btree_map_extract_clear_entry_%out_len+BTreeMapEntry_key_ptr, 0 as ptr
1919
+ store __btree_map_extract_clear_entry_%out_len+BTreeMapEntry_key_len, 0 as u64
1920
+ store __btree_map_extract_clear_entry_%out_len+BTreeMapEntry_value, 0 as u64
1921
+ __btree_map_extract_next_clear_%out_len = add __btree_map_extract_clear_idx_%out_len, 1
1922
+ store __btree_map_extract_clear_slot_%out_len+0, __btree_map_extract_next_clear_%out_len as u64
1923
+ !__btree_map_extract_next_clear_%out_len
1924
+ !__btree_map_extract_clear_entry_%out_len
1925
+ !__btree_map_extract_clear_off_%out_len
1926
+ !__btree_map_extract_clear_done_%out_len
1927
+ !__btree_map_extract_clear_idx_%out_len
1928
+ jmp L_BTREE_MAP_EXTRACT_CLEAR_LOOP_%out_len
1929
+
1930
+ L_BTREE_MAP_EXTRACT_DONE_%out_len:
1931
+ %out_len = load __btree_map_extract_write_slot_%out_len+0 as u64
1932
+ store %map_reg+BTreeMap_len, %out_len as u64
1933
+ !__btree_map_extract_clear_done_%out_len
1934
+ !__btree_map_extract_clear_idx_%out_len
1935
+ !__btree_map_extract_kept_len_%out_len
1936
+ !__btree_map_extract_done_%out_len
1937
+ !__btree_map_extract_read_%out_len
1938
+ !__btree_map_extract_len_%out_len
1939
+ !__btree_map_extract_entries_%out_len
1940
+ [END_MACRO]
1941
+
1942
+ [MACRO] BTREE_MAP_EXTRACT_IF_RANGE %out_len, %out_map, %map_reg, %start_key, %end_key, %pred_fn
1943
+ EXPAND BTREE_MAP_NEW %out_map
1944
+ EXPAND BTREE_MAP_RANGE_MUT_PTRS __btree_map_extract_range_vec_%out_len, %map_reg, %start_key, %end_key
1945
+ __btree_map_extract_range_len_%out_len = call @sa_vec_len(&__btree_map_extract_range_vec_%out_len)
1946
+ __btree_map_extract_range_ptr_%out_len = load __btree_map_extract_range_vec_%out_len+Vec_ptr as ptr
1947
+ __btree_map_extract_range_key_%out_len = stack_alloc Slice_SIZE
1948
+ __btree_map_extract_range_idx_slot_%out_len = stack_alloc 8
1949
+ store __btree_map_extract_range_idx_slot_%out_len+0, 0 as u64
1950
+ jmp L_BTREE_MAP_EXTRACT_RANGE_HEAD_%out_len
1951
+
1952
+ L_BTREE_MAP_EXTRACT_RANGE_HEAD_%out_len:
1953
+ __btree_map_extract_range_idx_%out_len = load __btree_map_extract_range_idx_slot_%out_len+0 as u64
1954
+ __btree_map_extract_range_done_%out_len = eq __btree_map_extract_range_idx_%out_len, __btree_map_extract_range_len_%out_len
1955
+ br __btree_map_extract_range_done_%out_len -> L_BTREE_MAP_EXTRACT_RANGE_REMOVE_INIT_%out_len, L_BTREE_MAP_EXTRACT_RANGE_BODY_%out_len
1956
+
1957
+ L_BTREE_MAP_EXTRACT_RANGE_BODY_%out_len:
1958
+ __btree_map_extract_range_key_idx_%out_len = mul __btree_map_extract_range_idx_%out_len, 8
1959
+ __btree_map_extract_range_key_lane_%out_len = ptr_add __btree_map_extract_range_ptr_%out_len, __btree_map_extract_range_key_idx_%out_len
1960
+ __btree_map_extract_range_key_bits_%out_len = load __btree_map_extract_range_key_lane_%out_len+0 as u64
1961
+ __btree_map_extract_range_key_len_lane_%out_len = ptr_add __btree_map_extract_range_key_lane_%out_len, 8
1962
+ __btree_map_extract_range_key_len_%out_len = load __btree_map_extract_range_key_len_lane_%out_len+0 as u64
1963
+ __btree_map_extract_range_value_lane_%out_len = ptr_add __btree_map_extract_range_key_lane_%out_len, 16
1964
+ __btree_map_extract_range_value_bits_%out_len = load __btree_map_extract_range_value_lane_%out_len+0 as u64
1965
+ __btree_map_extract_range_key_ptr_%out_len = bitcast __btree_map_extract_range_key_bits_%out_len as ptr
1966
+ __btree_map_extract_range_value_ptr_%out_len = bitcast __btree_map_extract_range_value_bits_%out_len as ptr
1967
+ store __btree_map_extract_range_key_%out_len+Slice_ptr, __btree_map_extract_range_key_ptr_%out_len as ptr
1968
+ store __btree_map_extract_range_key_%out_len+Slice_len, __btree_map_extract_range_key_len_%out_len as u64
1969
+ __btree_map_extract_range_pred_%out_len = call %pred_fn(&__btree_map_extract_range_key_%out_len, __btree_map_extract_range_value_ptr_%out_len)
1970
+ __btree_map_extract_range_take_%out_len = ne __btree_map_extract_range_pred_%out_len, 0
1971
+ br __btree_map_extract_range_take_%out_len -> L_BTREE_MAP_EXTRACT_RANGE_TAKE_%out_len, L_BTREE_MAP_EXTRACT_RANGE_NEXT_%out_len
1972
+
1973
+ L_BTREE_MAP_EXTRACT_RANGE_TAKE_%out_len:
1974
+ __btree_map_extract_range_value_%out_len = load __btree_map_extract_range_value_ptr_%out_len+0 as u64
1975
+ call @sa_btree_map_insert(&%out_map, &__btree_map_extract_range_key_%out_len, __btree_map_extract_range_value_%out_len)
1976
+ !__btree_map_extract_range_value_%out_len
1977
+ jmp L_BTREE_MAP_EXTRACT_RANGE_NEXT_%out_len
1978
+
1979
+ L_BTREE_MAP_EXTRACT_RANGE_NEXT_%out_len:
1980
+ __btree_map_extract_range_next_idx_%out_len = add __btree_map_extract_range_idx_%out_len, 3
1981
+ store __btree_map_extract_range_idx_slot_%out_len+0, __btree_map_extract_range_next_idx_%out_len as u64
1982
+ !__btree_map_extract_range_next_idx_%out_len
1983
+ !__btree_map_extract_range_take_%out_len
1984
+ !__btree_map_extract_range_pred_%out_len
1985
+ !__btree_map_extract_range_value_ptr_%out_len
1986
+ !__btree_map_extract_range_key_ptr_%out_len
1987
+ !__btree_map_extract_range_value_bits_%out_len
1988
+ !__btree_map_extract_range_value_lane_%out_len
1989
+ !__btree_map_extract_range_key_len_%out_len
1990
+ !__btree_map_extract_range_key_len_lane_%out_len
1991
+ !__btree_map_extract_range_key_bits_%out_len
1992
+ !__btree_map_extract_range_key_lane_%out_len
1993
+ !__btree_map_extract_range_key_idx_%out_len
1994
+ !__btree_map_extract_range_done_%out_len
1995
+ !__btree_map_extract_range_idx_%out_len
1996
+ jmp L_BTREE_MAP_EXTRACT_RANGE_HEAD_%out_len
1997
+
1998
+ L_BTREE_MAP_EXTRACT_RANGE_REMOVE_INIT_%out_len:
1999
+ call @sa_vec_free(^__btree_map_extract_range_vec_%out_len)
2000
+ __btree_map_extract_range_remove_entries_%out_len = load %out_map+BTreeMap_entries as ptr
2001
+ __btree_map_extract_range_remove_len_%out_len = load %out_map+BTreeMap_len as u64
2002
+ __btree_map_extract_range_remove_slot_%out_len = stack_alloc 8
2003
+ store __btree_map_extract_range_remove_slot_%out_len+0, 0 as u64
2004
+ jmp L_BTREE_MAP_EXTRACT_RANGE_REMOVE_HEAD_%out_len
2005
+
2006
+ L_BTREE_MAP_EXTRACT_RANGE_REMOVE_HEAD_%out_len:
2007
+ __btree_map_extract_range_remove_idx_%out_len = load __btree_map_extract_range_remove_slot_%out_len+0 as u64
2008
+ __btree_map_extract_range_remove_done_%out_len = eq __btree_map_extract_range_remove_idx_%out_len, __btree_map_extract_range_remove_len_%out_len
2009
+ br __btree_map_extract_range_remove_done_%out_len -> L_BTREE_MAP_EXTRACT_RANGE_DONE_%out_len, L_BTREE_MAP_EXTRACT_RANGE_REMOVE_BODY_%out_len
2010
+
2011
+ L_BTREE_MAP_EXTRACT_RANGE_REMOVE_BODY_%out_len:
2012
+ __btree_map_extract_range_remove_off_%out_len = mul __btree_map_extract_range_remove_idx_%out_len, BTreeMapEntry_SIZE
2013
+ __btree_map_extract_range_remove_entry_%out_len = ptr_add __btree_map_extract_range_remove_entries_%out_len, __btree_map_extract_range_remove_off_%out_len
2014
+ __btree_map_extract_range_removed_value_%out_len = call @sa_btree_map_remove(&%map_reg, &__btree_map_extract_range_remove_entry_%out_len)
2015
+ __btree_map_extract_range_remove_next_%out_len = add __btree_map_extract_range_remove_idx_%out_len, 1
2016
+ store __btree_map_extract_range_remove_slot_%out_len+0, __btree_map_extract_range_remove_next_%out_len as u64
2017
+ !__btree_map_extract_range_remove_next_%out_len
2018
+ !__btree_map_extract_range_removed_value_%out_len
2019
+ !__btree_map_extract_range_remove_entry_%out_len
2020
+ !__btree_map_extract_range_remove_off_%out_len
2021
+ !__btree_map_extract_range_remove_done_%out_len
2022
+ !__btree_map_extract_range_remove_idx_%out_len
2023
+ jmp L_BTREE_MAP_EXTRACT_RANGE_REMOVE_HEAD_%out_len
2024
+
2025
+ L_BTREE_MAP_EXTRACT_RANGE_DONE_%out_len:
2026
+ %out_len = load %map_reg+BTreeMap_len as u64
2027
+ !__btree_map_extract_range_remove_done_%out_len
2028
+ !__btree_map_extract_range_remove_idx_%out_len
2029
+ !__btree_map_extract_range_remove_len_%out_len
2030
+ !__btree_map_extract_range_remove_entries_%out_len
2031
+ !__btree_map_extract_range_done_%out_len
2032
+ !__btree_map_extract_range_idx_%out_len
2033
+ !__btree_map_extract_range_ptr_%out_len
2034
+ !__btree_map_extract_range_len_%out_len
2035
+ [END_MACRO]
2036
+
2037
+ [MACRO] BTREE_MAP_REMOVE %out_value, %map_reg, %key_reg
2038
+ %out_value = call @sa_btree_map_remove(&%map_reg, &%key_reg)
2039
+ [END_MACRO]
2040
+
2041
+ [MACRO] BTREE_MAP_REMOVE_ENTRY %out_ok, %out_key, %out_value, %map_reg, %key_reg
2042
+ %out_key = alloc Slice_SIZE
2043
+ __btree_map_remove_value_slot_%out_ok = stack_alloc 8
2044
+ %out_ok = call @sa_btree_map_remove_entry(&%map_reg, &%key_reg, &%out_key, &__btree_map_remove_value_slot_%out_ok)
2045
+ %out_value = load __btree_map_remove_value_slot_%out_ok+0 as u64
2046
+ [END_MACRO]
2047
+
2048
+ [MACRO] BTREE_MAP_INSERT %map_reg, %key_reg, %value
2049
+ call @sa_btree_map_insert(&%map_reg, &%key_reg, %value)
2050
+ [END_MACRO]
2051
+
2052
+ [MACRO] BTREE_MAP_INSERT_OLD %out_replaced, %out_old_value, %map_reg, %key_reg, %value
2053
+ __btree_map_insert_old_slot_%out_replaced = stack_alloc 8
2054
+ %out_replaced = call @sa_btree_map_insert_old(&%map_reg, &%key_reg, %value, &__btree_map_insert_old_slot_%out_replaced)
2055
+ %out_old_value = load __btree_map_insert_old_slot_%out_replaced+0 as u64
2056
+ [END_MACRO]
2057
+
2058
+ [MACRO] BTREE_MAP_TRY_INSERT %out_inserted, %out_value_ptr, %map_reg, %key_reg, %value
2059
+ __btree_map_try_insert_ptr_slot_%out_inserted = stack_alloc 8
2060
+ %out_inserted = call @sa_btree_map_try_insert(&%map_reg, &%key_reg, %value, &__btree_map_try_insert_ptr_slot_%out_inserted)
2061
+ %out_value_ptr = load __btree_map_try_insert_ptr_slot_%out_inserted+0 as ptr
2062
+ [END_MACRO]
2063
+
2064
+ [MACRO] BTREE_MAP_ENTRY_OR_INSERT %out_inserted, %out_value_ptr, %map_reg, %key_reg, %value
2065
+ EXPAND BTREE_MAP_TRY_INSERT %out_inserted, %out_value_ptr, %map_reg, %key_reg, %value
2066
+ [END_MACRO]
2067
+
2068
+ // Rust method-name bare alias for the common entry path (or_insert).
2069
+ [MACRO] BTREE_MAP_ENTRY %out_inserted, %out_value_ptr, %map_reg, %key_reg, %value
2070
+ EXPAND BTREE_MAP_ENTRY_OR_INSERT %out_inserted, %out_value_ptr, %map_reg, %key_reg, %value
2071
+ [END_MACRO]
2072
+
2073
+ [MACRO] BTREE_MAP_OR_INSERT %out_inserted, %out_value_ptr, %map_reg, %key_reg, %value
2074
+ EXPAND BTREE_MAP_ENTRY_OR_INSERT %out_inserted, %out_value_ptr, %map_reg, %key_reg, %value
2075
+ [END_MACRO]
2076
+
2077
+ // Concrete entry-style helpers. Default inserted value is 0 for the u64 map.
2078
+
2079
+ [MACRO] BTREE_MAP_ENTRY_OR_DEFAULT %out_inserted, %out_value_ptr, %map_reg, %key_reg
2080
+ EXPAND BTREE_MAP_ENTRY_OR_INSERT %out_inserted, %out_value_ptr, %map_reg, %key_reg, 0
2081
+ [END_MACRO]
2082
+
2083
+ [MACRO] BTREE_MAP_ENTRY_AND_MODIFY %out_ok, %map_reg, %key_reg, %value
2084
+ __btree_and_mod_ptr_slot_%out_ok = stack_alloc 8
2085
+ %out_ok = call @sa_btree_map_get_mut_ptr(&%map_reg, &%key_reg, &__btree_and_mod_ptr_slot_%out_ok)
2086
+ __btree_and_mod_ptr_%out_ok = load __btree_and_mod_ptr_slot_%out_ok+0 as ptr
2087
+ __btree_and_mod_has_%out_ok = eq %out_ok, 1
2088
+ br __btree_and_mod_has_%out_ok -> L_BTREE_MAP_ENTRY_AND_MODIFY_SET_%out_ok, L_BTREE_MAP_ENTRY_AND_MODIFY_SKIP_%out_ok
2089
+ L_BTREE_MAP_ENTRY_AND_MODIFY_SET_%out_ok:
2090
+ store __btree_and_mod_ptr_%out_ok+0, %value as u64
2091
+ !__btree_and_mod_has_%out_ok
2092
+ !__btree_and_mod_ptr_%out_ok
2093
+ jmp L_BTREE_MAP_ENTRY_AND_MODIFY_END_%out_ok
2094
+ L_BTREE_MAP_ENTRY_AND_MODIFY_SKIP_%out_ok:
2095
+ !__btree_and_mod_has_%out_ok
2096
+ !__btree_and_mod_ptr_%out_ok
2097
+ jmp L_BTREE_MAP_ENTRY_AND_MODIFY_END_%out_ok
2098
+ L_BTREE_MAP_ENTRY_AND_MODIFY_END_%out_ok:
2099
+ [END_MACRO]
2100
+
2101
+ [MACRO] BTREE_MAP_KEYS %out_set, %map_reg
2102
+ %out_set = call @sa_btree_map_keys_set(&%map_reg)
2103
+ [END_MACRO]
2104
+
2105
+ [MACRO] BTREE_MAP_VALUES %out_vec, %map_reg
2106
+ %out_vec = call @sa_btree_map_values_vec(&%map_reg)
2107
+ [END_MACRO]
2108
+
2109
+ [MACRO] BTREE_MAP_INTO_KEYS %out_set, %map_reg
2110
+ EXPAND BTREE_MAP_KEYS %out_set, %map_reg
2111
+ EXPAND BTREE_MAP_CLEAR %map_reg
2112
+ [END_MACRO]
2113
+
2114
+ [MACRO] BTREE_MAP_INTO_VALUES %out_vec, %map_reg
2115
+ EXPAND BTREE_MAP_VALUES %out_vec, %map_reg
2116
+ EXPAND BTREE_MAP_CLEAR %map_reg
2117
+ [END_MACRO]
2118
+
2119
+ [MACRO] BTREE_MAP_VALUES_MUT_PTRS %out_vec, %map_reg
2120
+ %out_vec = call @sa_btree_map_value_mut_ptrs_vec(&%map_reg)
2121
+ [END_MACRO]
2122
+
2123
+ [MACRO] BTREE_MAP_VALUES_MUT %out_vec, %map_reg
2124
+ EXPAND BTREE_MAP_VALUES_MUT_PTRS %out_vec, %map_reg
2125
+ [END_MACRO]
2126
+
2127
+ [MACRO] BTREE_MAP_ITER %out_vec, %map_reg
2128
+ %out_vec = call @sa_btree_map_iter_vec(&%map_reg)
2129
+ [END_MACRO]
2130
+
2131
+ [MACRO] BTREE_MAP_ITER_MUT_PTRS %out_vec, %map_reg
2132
+ %out_vec = call @sa_btree_map_iter_mut_ptrs_vec(&%map_reg)
2133
+ [END_MACRO]
2134
+
2135
+ // Rust method-name alias: BTreeMap::iter_mut (eager raw value-slot pointer materialization).
2136
+ [MACRO] BTREE_MAP_ITER_MUT %out_vec, %map_reg
2137
+ EXPAND BTREE_MAP_ITER_MUT_PTRS %out_vec, %map_reg
2138
+ [END_MACRO]
2139
+
2140
+ [MACRO] BTREE_MAP_REF_INTO_ITER %out_vec, %map_reg
2141
+ EXPAND BTREE_MAP_ITER %out_vec, %map_reg
2142
+ [END_MACRO]
2143
+
2144
+ [MACRO] BTREE_MAP_MUT_REF_INTO_ITER %out_vec, %map_reg
2145
+ EXPAND BTREE_MAP_ITER_MUT_PTRS %out_vec, %map_reg
2146
+ [END_MACRO]
2147
+
2148
+ [MACRO] BTREE_MAP_INTO_ITER %out_vec, %map_reg
2149
+ EXPAND BTREE_MAP_ITER %out_vec, %map_reg
2150
+ EXPAND BTREE_MAP_CLEAR %map_reg
2151
+ [END_MACRO]
2152
+
2153
+ [MACRO] BTREE_MAP_POP_FIRST %out_ok, %out_key, %out_value, %map_reg
2154
+ %out_key = alloc Slice_SIZE
2155
+ __btree_map_pop_first_value_slot_%out_ok = stack_alloc 8
2156
+ %out_ok = call @sa_btree_map_pop_first(&%map_reg, &%out_key, &__btree_map_pop_first_value_slot_%out_ok)
2157
+ %out_value = load __btree_map_pop_first_value_slot_%out_ok+0 as u64
2158
+ [END_MACRO]
2159
+
2160
+ [MACRO] BTREE_MAP_POP_LAST %out_ok, %out_key, %out_value, %map_reg
2161
+ %out_key = alloc Slice_SIZE
2162
+ __btree_map_pop_last_value_slot_%out_ok = stack_alloc 8
2163
+ %out_ok = call @sa_btree_map_pop_last(&%map_reg, &%out_key, &__btree_map_pop_last_value_slot_%out_ok)
2164
+ %out_value = load __btree_map_pop_last_value_slot_%out_ok+0 as u64
2165
+ [END_MACRO]
2166
+
2167
+ [MACRO] BTREE_MAP_APPEND %map_reg, %other_map
2168
+ call @sa_btree_map_append(&%map_reg, &%other_map)
2169
+ [END_MACRO]
2170
+
2171
+ [MACRO] BTREE_MAP_SPLIT_OFF %out_map, %map_reg, %key_reg
2172
+ %out_map = call @sa_btree_map_split_off(&%map_reg, &%key_reg)
2173
+ [END_MACRO]
2174
+
2175
+ [MACRO] BTREE_MAP_RANGE %out_map, %map_reg, %start_key, %end_key
2176
+ %out_map = call @sa_btree_map_range(&%map_reg, &%start_key, &%end_key)
2177
+ [END_MACRO]
2178
+
2179
+ [MACRO] BTREE_MAP_RANGE_MUT_PTRS %out_vec, %map_reg, %start_key, %end_key
2180
+ %out_vec = call @sa_btree_map_range_mut_ptrs_vec(&%map_reg, &%start_key, &%end_key)
2181
+ [END_MACRO]
2182
+
2183
+ // Rust method-name alias: BTreeMap::range_mut (eager raw-pointer materialization).
2184
+ [MACRO] BTREE_MAP_RANGE_MUT %out_vec, %map_reg, %start_key, %end_key
2185
+ EXPAND BTREE_MAP_RANGE_MUT_PTRS %out_vec, %map_reg, %start_key, %end_key
2186
+ [END_MACRO]
2187
+
2188
+ [MACRO] BTREE_MAP_LIT1 %out_map, %key1, %value1
2189
+ EXPAND BTREE_MAP_NEW %out_map
2190
+ EXPAND BTREE_MAP_INSERT %out_map, %key1, %value1
2191
+ [END_MACRO]
2192
+
2193
+ [MACRO] BTREE_MAP_LIT2 %out_map, %key1, %value1, %key2, %value2
2194
+ EXPAND BTREE_MAP_NEW %out_map
2195
+ EXPAND BTREE_MAP_INSERT %out_map, %key1, %value1
2196
+ EXPAND BTREE_MAP_INSERT %out_map, %key2, %value2
2197
+ [END_MACRO]
2198
+
2199
+ [MACRO] BTREE_MAP_LIT3 %out_map, %key1, %value1, %key2, %value2, %key3, %value3
2200
+ EXPAND BTREE_MAP_NEW %out_map
2201
+ EXPAND BTREE_MAP_INSERT %out_map, %key1, %value1
2202
+ EXPAND BTREE_MAP_INSERT %out_map, %key2, %value2
2203
+ EXPAND BTREE_MAP_INSERT %out_map, %key3, %value3
2204
+ [END_MACRO]
2205
+
2206
+ // Rust Default-style empty BTreeMap constructor alias.
2207
+
2208
+ [MACRO] BTREE_MAP_DEFAULT %out_map
2209
+ EXPAND BTREE_MAP_NEW %out_map
2210
+ [END_MACRO]