@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,1004 @@
1
+ @import "hashset.sal"
2
+ @import "hashmap.sa"
3
+ @import "core/slice.sal"
4
+ @import "alloc/vec.sal"
5
+ @import "vec.sa"
6
+ @import "num.sa"
7
+
8
+ @const HASHSET_SENTINEL = utf8:"hashset"
9
+
10
+ @set_insert_all(&dst: ptr, &src: ptr) -> void:
11
+ L_ENTRY:
12
+ slots = load src+HashSet_slots as ptr
13
+ cap = load src+HashSet_cap as u64
14
+ idx_slot = stack_alloc 8
15
+ store idx_slot+0, 0 as u64
16
+ jmp L_INSERT_ALL_HEAD
17
+
18
+ L_INSERT_ALL_HEAD:
19
+ idx = load idx_slot+0 as u64
20
+ done = eq idx, cap
21
+ br done -> L_INSERT_ALL_DONE, L_INSERT_ALL_BODY
22
+
23
+ L_INSERT_ALL_BODY:
24
+ slot_off = mul idx, HashSetSlot_SIZE
25
+ slot = ptr_add slots, slot_off
26
+ state = load slot+HashSetSlot_state as u8
27
+ filled = eq state, HashSet_STATE_FILLED
28
+ br filled -> L_INSERT_ALL_KEY, L_INSERT_ALL_NEXT
29
+
30
+ L_INSERT_ALL_KEY:
31
+ key = load slot+HashSetSlot_key as ptr
32
+ inserted = call @sa_set_insert(&dst, &key)
33
+ !inserted
34
+ !key
35
+ jmp L_INSERT_ALL_NEXT
36
+
37
+ L_INSERT_ALL_NEXT:
38
+ next_idx = add idx, 1
39
+ store idx_slot+0, next_idx as u64
40
+ !next_idx
41
+ !filled
42
+ !state
43
+ !slot
44
+ !slot_off
45
+ !done
46
+ !idx
47
+ jmp L_INSERT_ALL_HEAD
48
+
49
+ L_INSERT_ALL_DONE:
50
+ !done
51
+ !idx
52
+ !cap
53
+ !slots
54
+ !src
55
+ !dst
56
+ return
57
+
58
+ @set_insert_intersection(&dst: ptr, &src: ptr, &other: ptr) -> void:
59
+ L_ENTRY:
60
+ slots = load src+HashSet_slots as ptr
61
+ cap = load src+HashSet_cap as u64
62
+ idx_slot = stack_alloc 8
63
+ store idx_slot+0, 0 as u64
64
+ jmp L_INSERT_INTERSECTION_HEAD
65
+
66
+ L_INSERT_INTERSECTION_HEAD:
67
+ idx = load idx_slot+0 as u64
68
+ done = eq idx, cap
69
+ br done -> L_INSERT_INTERSECTION_DONE, L_INSERT_INTERSECTION_BODY
70
+
71
+ L_INSERT_INTERSECTION_BODY:
72
+ slot_off = mul idx, HashSetSlot_SIZE
73
+ slot = ptr_add slots, slot_off
74
+ state = load slot+HashSetSlot_state as u8
75
+ filled = eq state, HashSet_STATE_FILLED
76
+ br filled -> L_INSERT_INTERSECTION_KEY, L_INSERT_INTERSECTION_NEXT
77
+
78
+ L_INSERT_INTERSECTION_KEY:
79
+ key = load slot+HashSetSlot_key as ptr
80
+ contains = call @sa_set_contains(&other, &key)
81
+ keep = ne contains, 0
82
+ br keep -> L_INSERT_INTERSECTION_KEEP, L_INSERT_INTERSECTION_SKIP
83
+
84
+ L_INSERT_INTERSECTION_KEEP:
85
+ inserted = call @sa_set_insert(&dst, &key)
86
+ !inserted
87
+ !keep
88
+ !contains
89
+ !key
90
+ jmp L_INSERT_INTERSECTION_NEXT
91
+
92
+ L_INSERT_INTERSECTION_SKIP:
93
+ !keep
94
+ !contains
95
+ !key
96
+ jmp L_INSERT_INTERSECTION_NEXT
97
+
98
+ L_INSERT_INTERSECTION_NEXT:
99
+ next_idx = add idx, 1
100
+ store idx_slot+0, next_idx as u64
101
+ !next_idx
102
+ !filled
103
+ !state
104
+ !slot
105
+ !slot_off
106
+ !done
107
+ !idx
108
+ jmp L_INSERT_INTERSECTION_HEAD
109
+
110
+ L_INSERT_INTERSECTION_DONE:
111
+ !done
112
+ !idx
113
+ !cap
114
+ !slots
115
+ !other
116
+ !src
117
+ !dst
118
+ return
119
+
120
+ @set_insert_difference(&dst: ptr, &src: ptr, &other: ptr) -> void:
121
+ L_ENTRY:
122
+ slots = load src+HashSet_slots as ptr
123
+ cap = load src+HashSet_cap as u64
124
+ idx_slot = stack_alloc 8
125
+ store idx_slot+0, 0 as u64
126
+ jmp L_INSERT_DIFFERENCE_HEAD
127
+
128
+ L_INSERT_DIFFERENCE_HEAD:
129
+ idx = load idx_slot+0 as u64
130
+ done = eq idx, cap
131
+ br done -> L_INSERT_DIFFERENCE_DONE, L_INSERT_DIFFERENCE_BODY
132
+
133
+ L_INSERT_DIFFERENCE_BODY:
134
+ slot_off = mul idx, HashSetSlot_SIZE
135
+ slot = ptr_add slots, slot_off
136
+ state = load slot+HashSetSlot_state as u8
137
+ filled = eq state, HashSet_STATE_FILLED
138
+ br filled -> L_INSERT_DIFFERENCE_KEY, L_INSERT_DIFFERENCE_NEXT
139
+
140
+ L_INSERT_DIFFERENCE_KEY:
141
+ key = load slot+HashSetSlot_key as ptr
142
+ contains = call @sa_set_contains(&other, &key)
143
+ keep = eq contains, 0
144
+ br keep -> L_INSERT_DIFFERENCE_KEEP, L_INSERT_DIFFERENCE_SKIP
145
+
146
+ L_INSERT_DIFFERENCE_KEEP:
147
+ inserted = call @sa_set_insert(&dst, &key)
148
+ !inserted
149
+ !keep
150
+ !contains
151
+ !key
152
+ jmp L_INSERT_DIFFERENCE_NEXT
153
+
154
+ L_INSERT_DIFFERENCE_SKIP:
155
+ !keep
156
+ !contains
157
+ !key
158
+ jmp L_INSERT_DIFFERENCE_NEXT
159
+
160
+ L_INSERT_DIFFERENCE_NEXT:
161
+ next_idx = add idx, 1
162
+ store idx_slot+0, next_idx as u64
163
+ !next_idx
164
+ !filled
165
+ !state
166
+ !slot
167
+ !slot_off
168
+ !done
169
+ !idx
170
+ jmp L_INSERT_DIFFERENCE_HEAD
171
+
172
+ L_INSERT_DIFFERENCE_DONE:
173
+ !done
174
+ !idx
175
+ !cap
176
+ !slots
177
+ !other
178
+ !src
179
+ !dst
180
+ return
181
+
182
+ @export sa_set_new() -> ^ptr:
183
+ L_ENTRY:
184
+ set = call @sa_map_new()
185
+ return set
186
+
187
+ @export sa_set_with_capacity(cap: u64) -> ^ptr:
188
+ L_ENTRY:
189
+ set = call @sa_map_with_capacity(cap)
190
+ !cap
191
+ return set
192
+
193
+ @export sa_set_try_with_capacity(cap: u64, &out_set_slot: ptr) -> i32:
194
+ L_ENTRY:
195
+ set = call @sa_set_with_capacity(cap)
196
+ store out_set_slot+0, set as ptr
197
+ !set
198
+ !out_set_slot
199
+ !cap
200
+ return 1
201
+
202
+ @export sa_set_len(&set: ptr) -> u64:
203
+ L_ENTRY:
204
+ len = load set+HashSet_len as u64
205
+ !set
206
+ return len
207
+
208
+ @export sa_set_capacity(&set: ptr) -> u64:
209
+ L_ENTRY:
210
+ cap = load set+HashSet_cap as u64
211
+ !set
212
+ return cap
213
+
214
+ @export sa_set_reserve(&set: ptr, additional: u64) -> void:
215
+ L_ENTRY:
216
+ call @sa_map_reserve(&set, additional)
217
+ !additional
218
+ !set
219
+ return
220
+
221
+ @export sa_set_try_reserve(&set: ptr, additional: u64) -> i32:
222
+ L_ENTRY:
223
+ ok = call @sa_map_try_reserve(&set, additional)
224
+ !additional
225
+ !set
226
+ return ok
227
+
228
+ @export sa_set_shrink_to(&set: ptr, min_capacity: u64) -> void:
229
+ L_ENTRY:
230
+ call @sa_map_shrink_to(&set, min_capacity)
231
+ !min_capacity
232
+ !set
233
+ return
234
+
235
+ @export sa_set_shrink_to_fit(&set: ptr) -> void:
236
+ L_ENTRY:
237
+ call @sa_map_shrink_to_fit(&set)
238
+ !set
239
+ return
240
+
241
+ @export sa_set_is_empty(&set: ptr) -> i32:
242
+ L_ENTRY:
243
+ len = load set+HashSet_len as u64
244
+ empty = eq len, 0
245
+ result = empty as i32
246
+ !len
247
+ !set
248
+ return result
249
+
250
+ @export sa_set_clear(&set: ptr) -> void:
251
+ L_ENTRY:
252
+ call @sa_map_clear(&set)
253
+ !set
254
+ return
255
+
256
+ @export sa_set_free(^set: ptr) -> void:
257
+ L_ENTRY:
258
+ call @sa_map_free(^set)
259
+ return
260
+
261
+ @export sa_set_insert(&set: ptr, &key: ptr) -> i32:
262
+ L_ENTRY:
263
+ len_before = load set+HashSet_len as u64
264
+ sentinel = &HASHSET_SENTINEL
265
+ call @sa_map_put(&set, &key, &sentinel)
266
+ len_after = load set+HashSet_len as u64
267
+ is_new = ne len_after, len_before
268
+ result = is_new as i32
269
+ !sentinel
270
+ !len_after
271
+ !len_before
272
+ !key
273
+ !set
274
+ return result
275
+
276
+ @export sa_set_contains(&set: ptr, &key: ptr) -> i32:
277
+ L_ENTRY:
278
+ existing = call @sa_map_get(&set, &key)
279
+ found = ne existing, 0
280
+ result = found as i32
281
+ !existing
282
+ !key
283
+ !set
284
+ return result
285
+
286
+ @export sa_set_get(&set: ptr, &key: ptr, &out_key_slot: ptr) -> i32:
287
+ L_ENTRY:
288
+ value_slot = stack_alloc 8
289
+ found = call @sa_map_try_get_key_value(&set, &key, &out_key_slot, &value_slot)
290
+ !out_key_slot
291
+ !key
292
+ !set
293
+ return found
294
+
295
+
296
+ @export sa_set_take(&set: ptr, &key: ptr, &out_key_slot: ptr) -> i32:
297
+ L_ENTRY:
298
+ value_slot = stack_alloc 8
299
+ found = call @sa_map_remove_entry(&set, &key, &out_key_slot, &value_slot)
300
+ !out_key_slot
301
+ !key
302
+ !set
303
+ return found
304
+
305
+ @export sa_set_replace(&set: ptr, &key: ptr, &out_old_key_slot: ptr) -> i32:
306
+ L_ENTRY:
307
+ removed = call @sa_set_take(&set, &key, &out_old_key_slot)
308
+ sentinel = &HASHSET_SENTINEL
309
+ call @sa_map_put(&set, &key, &sentinel)
310
+ !sentinel
311
+ !out_old_key_slot
312
+ !key
313
+ !set
314
+ return removed
315
+
316
+ @export sa_set_is_subset(&set: ptr, &other: ptr) -> i32:
317
+ L_ENTRY:
318
+ len = load set+HashSet_len as u64
319
+ other_len = load other+HashSet_len as u64
320
+ too_large = ugt len, other_len
321
+ br too_large -> L_SUBSET_FALSE_FAST, L_SUBSET_SCAN_INIT
322
+
323
+ L_SUBSET_SCAN_INIT:
324
+ slots = load set+HashSet_slots as ptr
325
+ cap = load set+HashSet_cap as u64
326
+ idx_slot = stack_alloc 8
327
+ store idx_slot+0, 0 as u64
328
+ jmp L_SUBSET_SCAN_HEAD
329
+
330
+ L_SUBSET_SCAN_HEAD:
331
+ idx = load idx_slot+0 as u64
332
+ done = eq idx, cap
333
+ br done -> L_SUBSET_TRUE, L_SUBSET_SCAN_BODY
334
+
335
+ L_SUBSET_SCAN_BODY:
336
+ slot_off = mul idx, HashSetSlot_SIZE
337
+ slot = ptr_add slots, slot_off
338
+ state = load slot+HashSetSlot_state as u8
339
+ filled = eq state, HashSet_STATE_FILLED
340
+ br filled -> L_SUBSET_CHECK_KEY, L_SUBSET_NEXT
341
+
342
+ L_SUBSET_CHECK_KEY:
343
+ key = load slot+HashSetSlot_key as ptr
344
+ contains = call @sa_set_contains(&other, &key)
345
+ has_key = ne contains, 0
346
+ br has_key -> L_SUBSET_KEY_OK, L_SUBSET_FALSE
347
+
348
+ L_SUBSET_KEY_OK:
349
+ !has_key
350
+ !contains
351
+ !key
352
+ jmp L_SUBSET_NEXT
353
+
354
+ L_SUBSET_NEXT:
355
+ next_idx = add idx, 1
356
+ store idx_slot+0, next_idx as u64
357
+ !next_idx
358
+ !filled
359
+ !state
360
+ !slot
361
+ !slot_off
362
+ !done
363
+ !idx
364
+ jmp L_SUBSET_SCAN_HEAD
365
+
366
+ L_SUBSET_TRUE:
367
+ !done
368
+ !idx
369
+ !cap
370
+ !slots
371
+ !too_large
372
+ !other_len
373
+ !len
374
+ !other
375
+ !set
376
+ return 1
377
+
378
+ L_SUBSET_FALSE:
379
+ !has_key
380
+ !contains
381
+ !key
382
+ !filled
383
+ !state
384
+ !slot
385
+ !slot_off
386
+ !done
387
+ !idx
388
+ !cap
389
+ !slots
390
+ !too_large
391
+ !other_len
392
+ !len
393
+ !other
394
+ !set
395
+ return 0
396
+
397
+ L_SUBSET_FALSE_FAST:
398
+ !too_large
399
+ !other_len
400
+ !len
401
+ !other
402
+ !set
403
+ return 0
404
+
405
+ @export sa_set_is_superset(&set: ptr, &other: ptr) -> i32:
406
+ L_ENTRY:
407
+ result = call @sa_set_is_subset(&other, &set)
408
+ !other
409
+ !set
410
+ return result
411
+
412
+ @export sa_set_is_disjoint(&set: ptr, &other: ptr) -> i32:
413
+ L_ENTRY:
414
+ slots = load set+HashSet_slots as ptr
415
+ cap = load set+HashSet_cap as u64
416
+ idx_slot = stack_alloc 8
417
+ store idx_slot+0, 0 as u64
418
+ jmp L_DISJOINT_SCAN_HEAD
419
+
420
+ L_DISJOINT_SCAN_HEAD:
421
+ idx = load idx_slot+0 as u64
422
+ done = eq idx, cap
423
+ br done -> L_DISJOINT_TRUE, L_DISJOINT_SCAN_BODY
424
+
425
+ L_DISJOINT_SCAN_BODY:
426
+ slot_off = mul idx, HashSetSlot_SIZE
427
+ slot = ptr_add slots, slot_off
428
+ state = load slot+HashSetSlot_state as u8
429
+ filled = eq state, HashSet_STATE_FILLED
430
+ br filled -> L_DISJOINT_CHECK_KEY, L_DISJOINT_NEXT
431
+
432
+ L_DISJOINT_CHECK_KEY:
433
+ key = load slot+HashSetSlot_key as ptr
434
+ contains = call @sa_set_contains(&other, &key)
435
+ overlaps = ne contains, 0
436
+ br overlaps -> L_DISJOINT_FALSE, L_DISJOINT_KEY_OK
437
+
438
+ L_DISJOINT_KEY_OK:
439
+ !overlaps
440
+ !contains
441
+ !key
442
+ jmp L_DISJOINT_NEXT
443
+
444
+ L_DISJOINT_NEXT:
445
+ next_idx = add idx, 1
446
+ store idx_slot+0, next_idx as u64
447
+ !next_idx
448
+ !filled
449
+ !state
450
+ !slot
451
+ !slot_off
452
+ !done
453
+ !idx
454
+ jmp L_DISJOINT_SCAN_HEAD
455
+
456
+ L_DISJOINT_TRUE:
457
+ !done
458
+ !idx
459
+ !cap
460
+ !slots
461
+ !other
462
+ !set
463
+ return 1
464
+
465
+ L_DISJOINT_FALSE:
466
+ !overlaps
467
+ !contains
468
+ !key
469
+ !filled
470
+ !state
471
+ !slot
472
+ !slot_off
473
+ !done
474
+ !idx
475
+ !cap
476
+ !slots
477
+ !other
478
+ !set
479
+ return 0
480
+
481
+ @export sa_set_remove(&set: ptr, &key: ptr) -> i32:
482
+ L_ENTRY:
483
+ len_before = load set+HashSet_len as u64
484
+ removed = call @sa_map_del(&set, &key)
485
+ len_after = load set+HashSet_len as u64
486
+ is_found = ne len_after, len_before
487
+ result = is_found as i32
488
+ !removed
489
+ !len_after
490
+ !len_before
491
+ !key
492
+ !set
493
+ return result
494
+
495
+ @export sa_set_union(&set: ptr, &other: ptr) -> ^ptr:
496
+ L_ENTRY:
497
+ len = load set+HashSet_len as u64
498
+ other_len = load other+HashSet_len as u64
499
+ cap_hint = add len, other_len
500
+ out_set = call @sa_set_with_capacity(cap_hint)
501
+ call @set_insert_all(&out_set, &set)
502
+ call @set_insert_all(&out_set, &other)
503
+ !cap_hint
504
+ !other_len
505
+ !len
506
+ !other
507
+ !set
508
+ return out_set
509
+
510
+ @export sa_set_intersection(&set: ptr, &other: ptr) -> ^ptr:
511
+ L_ENTRY:
512
+ len = load set+HashSet_len as u64
513
+ other_len = load other+HashSet_len as u64
514
+ left_smaller = ule len, other_len
515
+ br left_smaller -> L_INTERSECTION_LEFT, L_INTERSECTION_RIGHT
516
+
517
+ L_INTERSECTION_LEFT:
518
+ out_set = call @sa_set_with_capacity(len)
519
+ call @set_insert_intersection(&out_set, &set, &other)
520
+ !left_smaller
521
+ !other_len
522
+ !len
523
+ !other
524
+ !set
525
+ return out_set
526
+
527
+ L_INTERSECTION_RIGHT:
528
+ out_set = call @sa_set_with_capacity(other_len)
529
+ call @set_insert_intersection(&out_set, &other, &set)
530
+ !left_smaller
531
+ !other_len
532
+ !len
533
+ !other
534
+ !set
535
+ return out_set
536
+
537
+ @export sa_set_difference(&set: ptr, &other: ptr) -> ^ptr:
538
+ L_ENTRY:
539
+ len = load set+HashSet_len as u64
540
+ out_set = call @sa_set_with_capacity(len)
541
+ call @set_insert_difference(&out_set, &set, &other)
542
+ !len
543
+ !other
544
+ !set
545
+ return out_set
546
+
547
+ @export sa_set_symmetric_difference(&set: ptr, &other: ptr) -> ^ptr:
548
+ L_ENTRY:
549
+ len = load set+HashSet_len as u64
550
+ other_len = load other+HashSet_len as u64
551
+ cap_hint = add len, other_len
552
+ out_set = call @sa_set_with_capacity(cap_hint)
553
+ call @set_insert_difference(&out_set, &set, &other)
554
+ call @set_insert_difference(&out_set, &other, &set)
555
+ !cap_hint
556
+ !other_len
557
+ !len
558
+ !other
559
+ !set
560
+ return out_set
561
+
562
+ [MACRO] SET_NEW %out_set
563
+ %out_set = call @sa_set_new()
564
+ [END_MACRO]
565
+
566
+ [MACRO] SET_WITH_CAPACITY %out_set, %cap
567
+ %out_set = call @sa_set_with_capacity(%cap)
568
+ [END_MACRO]
569
+
570
+ [MACRO] SET_TRY_WITH_CAPACITY %out_ok, %out_set, %cap
571
+ __set_try_new_slot_%out_ok = stack_alloc 8
572
+ %out_ok = call @sa_set_try_with_capacity(%cap, &__set_try_new_slot_%out_ok)
573
+ %out_set = load __set_try_new_slot_%out_ok+0 as ptr
574
+ [END_MACRO]
575
+
576
+ [MACRO] SET_LEN %out_len, %set_reg
577
+ %out_len = call @sa_set_len(&%set_reg)
578
+ [END_MACRO]
579
+
580
+ [MACRO] SET_CAPACITY %out_cap, %set_reg
581
+ %out_cap = call @sa_set_capacity(&%set_reg)
582
+ [END_MACRO]
583
+
584
+ [MACRO] SET_RESERVE %set_reg, %additional
585
+ call @sa_set_reserve(&%set_reg, %additional)
586
+ [END_MACRO]
587
+
588
+ [MACRO] SET_TRY_RESERVE %out_ok, %set_reg, %additional
589
+ %out_ok = call @sa_set_try_reserve(&%set_reg, %additional)
590
+ [END_MACRO]
591
+
592
+ [MACRO] SET_SHRINK_TO %set_reg, %min_capacity
593
+ call @sa_set_shrink_to(&%set_reg, %min_capacity)
594
+ [END_MACRO]
595
+
596
+ [MACRO] SET_SHRINK_TO_FIT %set_reg
597
+ call @sa_set_shrink_to_fit(&%set_reg)
598
+ [END_MACRO]
599
+
600
+ [MACRO] SET_IS_EMPTY %out_flag, %set_reg
601
+ %out_flag = call @sa_set_is_empty(&%set_reg)
602
+ [END_MACRO]
603
+
604
+ [MACRO] SET_CLEAR %set_reg
605
+ call @sa_set_clear(&%set_reg)
606
+ [END_MACRO]
607
+
608
+ [MACRO] SET_RETAIN %out_len, %set_reg, %pred_fn
609
+ __set_retain_slots_%out_len = load %set_reg+HashSet_slots as ptr
610
+ __set_retain_cap_%out_len = load %set_reg+HashSet_cap as u64
611
+ __set_retain_len_%out_len = load %set_reg+HashSet_len as u64
612
+ __set_retain_tombs_start_%out_len = load %set_reg+HashSet_tombs as u64
613
+ __set_retain_len_slot_%out_len = stack_alloc 8
614
+ __set_retain_tombs_slot_%out_len = stack_alloc 8
615
+ store __set_retain_len_slot_%out_len+0, __set_retain_len_%out_len as u64
616
+ store __set_retain_tombs_slot_%out_len+0, __set_retain_tombs_start_%out_len as u64
617
+ __set_retain_idx_slot_%out_len = stack_alloc 8
618
+ store __set_retain_idx_slot_%out_len+0, 0 as u64
619
+ jmp L_SET_RETAIN_HEAD_%out_len
620
+
621
+ L_SET_RETAIN_HEAD_%out_len:
622
+ __set_retain_idx_%out_len = load __set_retain_idx_slot_%out_len+0 as u64
623
+ __set_retain_done_%out_len = eq __set_retain_idx_%out_len, __set_retain_cap_%out_len
624
+ br __set_retain_done_%out_len -> L_SET_RETAIN_DONE_%out_len, L_SET_RETAIN_BODY_%out_len
625
+
626
+ L_SET_RETAIN_BODY_%out_len:
627
+ __set_retain_slot_off_%out_len = mul __set_retain_idx_%out_len, HashSetSlot_SIZE
628
+ __set_retain_slot_%out_len = ptr_add __set_retain_slots_%out_len, __set_retain_slot_off_%out_len
629
+ __set_retain_state_%out_len = load __set_retain_slot_%out_len+HashSetSlot_state as u8
630
+ __set_retain_filled_%out_len = eq __set_retain_state_%out_len, HashSet_STATE_FILLED
631
+ br __set_retain_filled_%out_len -> L_SET_RETAIN_CHECK_%out_len, L_SET_RETAIN_NEXT_%out_len
632
+
633
+ L_SET_RETAIN_CHECK_%out_len:
634
+ __set_retain_key_%out_len = load __set_retain_slot_%out_len+HashSetSlot_key as ptr
635
+ __set_retain_pred_%out_len = call %pred_fn(__set_retain_key_%out_len)
636
+ __set_retain_keep_%out_len = ne __set_retain_pred_%out_len, 0
637
+ br __set_retain_keep_%out_len -> L_SET_RETAIN_KEEP_%out_len, L_SET_RETAIN_DROP_%out_len
638
+
639
+ L_SET_RETAIN_KEEP_%out_len:
640
+ !__set_retain_keep_%out_len
641
+ !__set_retain_pred_%out_len
642
+ !__set_retain_key_%out_len
643
+ jmp L_SET_RETAIN_NEXT_%out_len
644
+
645
+ L_SET_RETAIN_DROP_%out_len:
646
+ __set_retain_cur_len_%out_len = load __set_retain_len_slot_%out_len+0 as u64
647
+ __set_retain_cur_tombs_%out_len = load __set_retain_tombs_slot_%out_len+0 as u64
648
+ __set_retain_next_len_%out_len = sub __set_retain_cur_len_%out_len, 1
649
+ __set_retain_next_tombs_%out_len = add __set_retain_cur_tombs_%out_len, 1
650
+ store __set_retain_len_slot_%out_len+0, __set_retain_next_len_%out_len as u64
651
+ store __set_retain_tombs_slot_%out_len+0, __set_retain_next_tombs_%out_len as u64
652
+ store __set_retain_slot_%out_len+HashSetSlot_hash, 0 as u64
653
+ store __set_retain_slot_%out_len+HashSetSlot_key, 0 as ptr
654
+ store __set_retain_slot_%out_len+HashSetSlot_value, 0 as ptr
655
+ store __set_retain_slot_%out_len+HashSetSlot_state, HashSet_STATE_TOMB as u8
656
+ !__set_retain_next_tombs_%out_len
657
+ !__set_retain_next_len_%out_len
658
+ !__set_retain_cur_tombs_%out_len
659
+ !__set_retain_cur_len_%out_len
660
+ !__set_retain_keep_%out_len
661
+ !__set_retain_pred_%out_len
662
+ !__set_retain_key_%out_len
663
+ jmp L_SET_RETAIN_NEXT_%out_len
664
+
665
+ L_SET_RETAIN_NEXT_%out_len:
666
+ __set_retain_next_idx_%out_len = add __set_retain_idx_%out_len, 1
667
+ store __set_retain_idx_slot_%out_len+0, __set_retain_next_idx_%out_len as u64
668
+ !__set_retain_next_idx_%out_len
669
+ !__set_retain_filled_%out_len
670
+ !__set_retain_state_%out_len
671
+ !__set_retain_slot_%out_len
672
+ !__set_retain_slot_off_%out_len
673
+ !__set_retain_done_%out_len
674
+ !__set_retain_idx_%out_len
675
+ jmp L_SET_RETAIN_HEAD_%out_len
676
+
677
+ L_SET_RETAIN_DONE_%out_len:
678
+ %out_len = load __set_retain_len_slot_%out_len+0 as u64
679
+ __set_retain_tombs_%out_len = load __set_retain_tombs_slot_%out_len+0 as u64
680
+ store %set_reg+HashSet_len, %out_len as u64
681
+ store %set_reg+HashSet_tombs, __set_retain_tombs_%out_len as u64
682
+ !__set_retain_done_%out_len
683
+ !__set_retain_idx_%out_len
684
+ !__set_retain_tombs_%out_len
685
+ !__set_retain_tombs_start_%out_len
686
+ !__set_retain_len_%out_len
687
+ !__set_retain_cap_%out_len
688
+ !__set_retain_slots_%out_len
689
+ [END_MACRO]
690
+
691
+ [MACRO] SET_DRAIN %out_vec, %set_reg
692
+ __set_drain_len_%out_vec = load %set_reg+HashSet_len as u64
693
+ EXPAND VEC_WITH_CAPACITY_U64 %out_vec, __set_drain_len_%out_vec
694
+ __set_drain_slots_%out_vec = load %set_reg+HashSet_slots as ptr
695
+ __set_drain_cap_%out_vec = load %set_reg+HashSet_cap as u64
696
+ __set_drain_idx_slot_%out_vec = stack_alloc 8
697
+ store __set_drain_idx_slot_%out_vec+0, 0 as u64
698
+ jmp L_SET_DRAIN_HEAD_%out_vec
699
+
700
+ L_SET_DRAIN_HEAD_%out_vec:
701
+ __set_drain_idx_%out_vec = load __set_drain_idx_slot_%out_vec+0 as u64
702
+ __set_drain_done_%out_vec = eq __set_drain_idx_%out_vec, __set_drain_cap_%out_vec
703
+ br __set_drain_done_%out_vec -> L_SET_DRAIN_DONE_%out_vec, L_SET_DRAIN_BODY_%out_vec
704
+
705
+ L_SET_DRAIN_BODY_%out_vec:
706
+ __set_drain_slot_off_%out_vec = mul __set_drain_idx_%out_vec, HashSetSlot_SIZE
707
+ __set_drain_slot_%out_vec = ptr_add __set_drain_slots_%out_vec, __set_drain_slot_off_%out_vec
708
+ __set_drain_state_%out_vec = load __set_drain_slot_%out_vec+HashSetSlot_state as u8
709
+ __set_drain_filled_%out_vec = eq __set_drain_state_%out_vec, HashSet_STATE_FILLED
710
+ br __set_drain_filled_%out_vec -> L_SET_DRAIN_PUSH_%out_vec, L_SET_DRAIN_NEXT_%out_vec
711
+
712
+ L_SET_DRAIN_PUSH_%out_vec:
713
+ __set_drain_key_%out_vec = load __set_drain_slot_%out_vec+HashSetSlot_key as ptr
714
+ __set_drain_key_bits_%out_vec = bitcast __set_drain_key_%out_vec as u64
715
+ EXPAND VEC_PUSH_U64 %out_vec, __set_drain_key_bits_%out_vec
716
+ store __set_drain_slot_%out_vec+HashSetSlot_hash, 0 as u64
717
+ store __set_drain_slot_%out_vec+HashSetSlot_key, 0 as ptr
718
+ store __set_drain_slot_%out_vec+HashSetSlot_value, 0 as ptr
719
+ store __set_drain_slot_%out_vec+HashSetSlot_state, HashSet_STATE_EMPTY as u8
720
+ !__set_drain_key_bits_%out_vec
721
+ !__set_drain_key_%out_vec
722
+ jmp L_SET_DRAIN_NEXT_%out_vec
723
+
724
+ L_SET_DRAIN_NEXT_%out_vec:
725
+ __set_drain_next_idx_%out_vec = add __set_drain_idx_%out_vec, 1
726
+ store __set_drain_idx_slot_%out_vec+0, __set_drain_next_idx_%out_vec as u64
727
+ !__set_drain_next_idx_%out_vec
728
+ !__set_drain_filled_%out_vec
729
+ !__set_drain_state_%out_vec
730
+ !__set_drain_slot_%out_vec
731
+ !__set_drain_slot_off_%out_vec
732
+ !__set_drain_done_%out_vec
733
+ !__set_drain_idx_%out_vec
734
+ jmp L_SET_DRAIN_HEAD_%out_vec
735
+
736
+ L_SET_DRAIN_DONE_%out_vec:
737
+ EXPAND NUM_U64_CHECKED_MUL __set_drain_bytes_ok_%out_vec, __set_drain_bytes_%out_vec, __set_drain_cap_%out_vec, HashSetSlot_SIZE
738
+ br __set_drain_bytes_ok_%out_vec -> L_SET_DRAIN_BYTES_OK_%out_vec, L_SET_DRAIN_BYTES_OVERFLOW_%out_vec
739
+ L_SET_DRAIN_BYTES_OVERFLOW_%out_vec:
740
+ panic(2101)
741
+ L_SET_DRAIN_BYTES_OK_%out_vec:
742
+ __set_drain_has_slots_%out_vec = ne __set_drain_slots_%out_vec, 0
743
+ br __set_drain_has_slots_%out_vec -> L_SET_DRAIN_CLEAR_SLOTS_%out_vec, L_SET_DRAIN_FINISH_%out_vec
744
+
745
+ L_SET_DRAIN_CLEAR_SLOTS_%out_vec:
746
+ call @sa_mem_set(&__set_drain_slots_%out_vec, 0, __set_drain_bytes_%out_vec)
747
+ jmp L_SET_DRAIN_FINISH_%out_vec
748
+
749
+ L_SET_DRAIN_FINISH_%out_vec:
750
+ store %set_reg+HashSet_len, 0 as u64
751
+ store %set_reg+HashSet_tombs, 0 as u64
752
+ !__set_drain_has_slots_%out_vec
753
+ !__set_drain_bytes_ok_%out_vec
754
+ !__set_drain_bytes_%out_vec
755
+ !__set_drain_done_%out_vec
756
+ !__set_drain_idx_%out_vec
757
+ !__set_drain_cap_%out_vec
758
+ !__set_drain_slots_%out_vec
759
+ !__set_drain_len_%out_vec
760
+ [END_MACRO]
761
+
762
+ [MACRO] SET_KEYS %out_vec, %set_reg
763
+ EXPAND MAP_KEYS %out_vec, %set_reg
764
+ [END_MACRO]
765
+
766
+ [MACRO] SET_ITER %out_vec, %set_reg
767
+ EXPAND SET_KEYS %out_vec, %set_reg
768
+ [END_MACRO]
769
+
770
+ [MACRO] SET_REF_INTO_ITER %out_vec, %set_reg
771
+ EXPAND SET_ITER %out_vec, %set_reg
772
+ [END_MACRO]
773
+
774
+ [MACRO] SET_INTO_KEYS %out_vec, %set_reg
775
+ EXPAND SET_DRAIN %out_vec, %set_reg
776
+ [END_MACRO]
777
+
778
+ [MACRO] SET_INTO_ITER %out_vec, %set_reg
779
+ EXPAND SET_DRAIN %out_vec, %set_reg
780
+ [END_MACRO]
781
+
782
+ [MACRO] SET_EXTRACT_IF %out_len, %out_vec, %set_reg, %pred_fn
783
+ __set_extract_slots_%out_len = load %set_reg+HashSet_slots as ptr
784
+ __set_extract_cap_%out_len = load %set_reg+HashSet_cap as u64
785
+ __set_extract_len_%out_len = load %set_reg+HashSet_len as u64
786
+ __set_extract_tombs_start_%out_len = load %set_reg+HashSet_tombs as u64
787
+ EXPAND VEC_WITH_CAPACITY_U64 %out_vec, __set_extract_len_%out_len
788
+ __set_extract_len_slot_%out_len = stack_alloc 8
789
+ __set_extract_tombs_slot_%out_len = stack_alloc 8
790
+ store __set_extract_len_slot_%out_len+0, __set_extract_len_%out_len as u64
791
+ store __set_extract_tombs_slot_%out_len+0, __set_extract_tombs_start_%out_len as u64
792
+ __set_extract_idx_slot_%out_len = stack_alloc 8
793
+ store __set_extract_idx_slot_%out_len+0, 0 as u64
794
+ jmp L_SET_EXTRACT_HEAD_%out_len
795
+
796
+ L_SET_EXTRACT_HEAD_%out_len:
797
+ __set_extract_idx_%out_len = load __set_extract_idx_slot_%out_len+0 as u64
798
+ __set_extract_done_%out_len = eq __set_extract_idx_%out_len, __set_extract_cap_%out_len
799
+ br __set_extract_done_%out_len -> L_SET_EXTRACT_DONE_%out_len, L_SET_EXTRACT_BODY_%out_len
800
+
801
+ L_SET_EXTRACT_BODY_%out_len:
802
+ __set_extract_slot_off_%out_len = mul __set_extract_idx_%out_len, HashSetSlot_SIZE
803
+ __set_extract_slot_%out_len = ptr_add __set_extract_slots_%out_len, __set_extract_slot_off_%out_len
804
+ __set_extract_state_%out_len = load __set_extract_slot_%out_len+HashSetSlot_state as u8
805
+ __set_extract_filled_%out_len = eq __set_extract_state_%out_len, HashSet_STATE_FILLED
806
+ br __set_extract_filled_%out_len -> L_SET_EXTRACT_CHECK_%out_len, L_SET_EXTRACT_NEXT_%out_len
807
+
808
+ L_SET_EXTRACT_CHECK_%out_len:
809
+ __set_extract_key_%out_len = load __set_extract_slot_%out_len+HashSetSlot_key as ptr
810
+ __set_extract_pred_%out_len = call %pred_fn(__set_extract_key_%out_len)
811
+ __set_extract_take_%out_len = ne __set_extract_pred_%out_len, 0
812
+ br __set_extract_take_%out_len -> L_SET_EXTRACT_TAKE_%out_len, L_SET_EXTRACT_KEEP_%out_len
813
+
814
+ L_SET_EXTRACT_KEEP_%out_len:
815
+ !__set_extract_take_%out_len
816
+ !__set_extract_pred_%out_len
817
+ !__set_extract_key_%out_len
818
+ jmp L_SET_EXTRACT_NEXT_%out_len
819
+
820
+ L_SET_EXTRACT_TAKE_%out_len:
821
+ __set_extract_key_bits_%out_len = bitcast __set_extract_key_%out_len as u64
822
+ EXPAND VEC_PUSH_U64 %out_vec, __set_extract_key_bits_%out_len
823
+ __set_extract_cur_len_%out_len = load __set_extract_len_slot_%out_len+0 as u64
824
+ __set_extract_cur_tombs_%out_len = load __set_extract_tombs_slot_%out_len+0 as u64
825
+ __set_extract_next_len_%out_len = sub __set_extract_cur_len_%out_len, 1
826
+ __set_extract_next_tombs_%out_len = add __set_extract_cur_tombs_%out_len, 1
827
+ store __set_extract_len_slot_%out_len+0, __set_extract_next_len_%out_len as u64
828
+ store __set_extract_tombs_slot_%out_len+0, __set_extract_next_tombs_%out_len as u64
829
+ store __set_extract_slot_%out_len+HashSetSlot_hash, 0 as u64
830
+ store __set_extract_slot_%out_len+HashSetSlot_key, 0 as ptr
831
+ store __set_extract_slot_%out_len+HashSetSlot_value, 0 as ptr
832
+ store __set_extract_slot_%out_len+HashSetSlot_state, HashSet_STATE_TOMB as u8
833
+ !__set_extract_next_tombs_%out_len
834
+ !__set_extract_next_len_%out_len
835
+ !__set_extract_cur_tombs_%out_len
836
+ !__set_extract_cur_len_%out_len
837
+ !__set_extract_key_bits_%out_len
838
+ !__set_extract_take_%out_len
839
+ !__set_extract_pred_%out_len
840
+ !__set_extract_key_%out_len
841
+ jmp L_SET_EXTRACT_NEXT_%out_len
842
+
843
+ L_SET_EXTRACT_NEXT_%out_len:
844
+ __set_extract_next_idx_%out_len = add __set_extract_idx_%out_len, 1
845
+ store __set_extract_idx_slot_%out_len+0, __set_extract_next_idx_%out_len as u64
846
+ !__set_extract_next_idx_%out_len
847
+ !__set_extract_filled_%out_len
848
+ !__set_extract_state_%out_len
849
+ !__set_extract_slot_%out_len
850
+ !__set_extract_slot_off_%out_len
851
+ !__set_extract_done_%out_len
852
+ !__set_extract_idx_%out_len
853
+ jmp L_SET_EXTRACT_HEAD_%out_len
854
+
855
+ L_SET_EXTRACT_DONE_%out_len:
856
+ %out_len = load __set_extract_len_slot_%out_len+0 as u64
857
+ __set_extract_tombs_%out_len = load __set_extract_tombs_slot_%out_len+0 as u64
858
+ store %set_reg+HashSet_len, %out_len as u64
859
+ store %set_reg+HashSet_tombs, __set_extract_tombs_%out_len as u64
860
+ !__set_extract_done_%out_len
861
+ !__set_extract_idx_%out_len
862
+ !__set_extract_tombs_%out_len
863
+ !__set_extract_tombs_start_%out_len
864
+ !__set_extract_len_%out_len
865
+ !__set_extract_cap_%out_len
866
+ !__set_extract_slots_%out_len
867
+ [END_MACRO]
868
+
869
+ [MACRO] SET_INSERT %out_ok, %set_reg, %key
870
+ %out_ok = call @sa_set_insert(&%set_reg, &%key)
871
+ [END_MACRO]
872
+
873
+ [MACRO] SET_CONTAINS %out_ok, %set_reg, %key
874
+ %out_ok = call @sa_set_contains(&%set_reg, &%key)
875
+ [END_MACRO]
876
+
877
+ [MACRO] SET_GET %out_ok, %out_key, %set_reg, %key
878
+ __set_get_slot_%out_ok = stack_alloc 8
879
+ %out_ok = call @sa_set_get(&%set_reg, &%key, &__set_get_slot_%out_ok)
880
+ %out_key = load __set_get_slot_%out_ok+0 as ptr
881
+ [END_MACRO]
882
+
883
+ [MACRO] SET_GET_OR_INSERT %out_inserted, %out_key, %set_reg, %key
884
+ %out_inserted = call @sa_set_insert(&%set_reg, &%key)
885
+ __set_get_or_insert_slot_%out_inserted = stack_alloc 8
886
+ __set_get_or_insert_ok_%out_inserted = call @sa_set_get(&%set_reg, &%key, &__set_get_or_insert_slot_%out_inserted)
887
+ %out_key = load __set_get_or_insert_slot_%out_inserted+0 as ptr
888
+ !__set_get_or_insert_ok_%out_inserted
889
+ [END_MACRO]
890
+
891
+ [MACRO] SET_ENTRY_GET_OR_INSERT %out_inserted, %out_key, %set_reg, %key
892
+ EXPAND SET_GET_OR_INSERT %out_inserted, %out_key, %set_reg, %key
893
+ [END_MACRO]
894
+
895
+ // Rust method-name bare alias for the common set entry path (get_or_insert).
896
+ [MACRO] SET_ENTRY %out_inserted, %out_key, %set_reg, %key
897
+ EXPAND SET_ENTRY_GET_OR_INSERT %out_inserted, %out_key, %set_reg, %key
898
+ [END_MACRO]
899
+
900
+ [MACRO] SET_OR_INSERT %out_inserted, %out_key, %set_reg, %key
901
+ EXPAND SET_GET_OR_INSERT %out_inserted, %out_key, %set_reg, %key
902
+ [END_MACRO]
903
+
904
+ [MACRO] SET_EXTRA_CAPACITY %out_extra, %set_reg
905
+ __set_ec_cap_%out_extra = call @sa_set_capacity(&%set_reg)
906
+ __set_ec_len_%out_extra = call @sa_set_len(&%set_reg)
907
+ %out_extra = sub __set_ec_cap_%out_extra, __set_ec_len_%out_extra
908
+ !__set_ec_len_%out_extra
909
+ !__set_ec_cap_%out_extra
910
+ [END_MACRO]
911
+
912
+ [MACRO] SET_TAKE %out_ok, %out_key, %set_reg, %key
913
+ __set_take_slot_%out_ok = stack_alloc 8
914
+ %out_ok = call @sa_set_take(&%set_reg, &%key, &__set_take_slot_%out_ok)
915
+ %out_key = load __set_take_slot_%out_ok+0 as ptr
916
+ [END_MACRO]
917
+
918
+ [MACRO] SET_REPLACE %out_replaced, %out_old_key, %set_reg, %key
919
+ __set_replace_slot_%out_replaced = stack_alloc 8
920
+ %out_replaced = call @sa_set_replace(&%set_reg, &%key, &__set_replace_slot_%out_replaced)
921
+ %out_old_key = load __set_replace_slot_%out_replaced+0 as ptr
922
+ [END_MACRO]
923
+
924
+ [MACRO] SET_IS_DISJOINT %out_ok, %set_reg, %other_set
925
+ %out_ok = call @sa_set_is_disjoint(&%set_reg, &%other_set)
926
+ [END_MACRO]
927
+
928
+ [MACRO] SET_IS_SUBSET %out_ok, %set_reg, %other_set
929
+ %out_ok = call @sa_set_is_subset(&%set_reg, &%other_set)
930
+ [END_MACRO]
931
+
932
+ [MACRO] SET_IS_SUPERSET %out_ok, %set_reg, %other_set
933
+ %out_ok = call @sa_set_is_superset(&%set_reg, &%other_set)
934
+ [END_MACRO]
935
+
936
+ [MACRO] SET_REMOVE %out_ok, %set_reg, %key
937
+ %out_ok = call @sa_set_remove(&%set_reg, &%key)
938
+ [END_MACRO]
939
+
940
+ [MACRO] SET_UNION %out_set, %set_reg, %other_set
941
+ %out_set = call @sa_set_union(&%set_reg, &%other_set)
942
+ [END_MACRO]
943
+
944
+ [MACRO] SET_INTERSECTION %out_set, %set_reg, %other_set
945
+ %out_set = call @sa_set_intersection(&%set_reg, &%other_set)
946
+ [END_MACRO]
947
+
948
+ [MACRO] SET_DIFFERENCE %out_set, %set_reg, %other_set
949
+ %out_set = call @sa_set_difference(&%set_reg, &%other_set)
950
+ [END_MACRO]
951
+
952
+ [MACRO] SET_SYMMETRIC_DIFFERENCE %out_set, %set_reg, %other_set
953
+ %out_set = call @sa_set_symmetric_difference(&%set_reg, &%other_set)
954
+ [END_MACRO]
955
+
956
+ [MACRO] SET_BITOR %out_set, %set_reg, %other_set
957
+ EXPAND SET_UNION %out_set, %set_reg, %other_set
958
+ [END_MACRO]
959
+
960
+ [MACRO] SET_BITAND %out_set, %set_reg, %other_set
961
+ EXPAND SET_INTERSECTION %out_set, %set_reg, %other_set
962
+ [END_MACRO]
963
+
964
+ [MACRO] SET_SUB %out_set, %set_reg, %other_set
965
+ EXPAND SET_DIFFERENCE %out_set, %set_reg, %other_set
966
+ [END_MACRO]
967
+
968
+ [MACRO] SET_BITXOR %out_set, %set_reg, %other_set
969
+ EXPAND SET_SYMMETRIC_DIFFERENCE %out_set, %set_reg, %other_set
970
+ [END_MACRO]
971
+
972
+ [MACRO] SET_FREE %set_reg
973
+ call @sa_set_free(^%set_reg)
974
+ [END_MACRO]
975
+
976
+ [MACRO] SET_LIT1 %out_set, %key1
977
+ EXPAND SET_NEW %out_set
978
+ EXPAND SET_INSERT __set_lit1_ok_1_%out_set, %out_set, %key1
979
+ !__set_lit1_ok_1_%out_set
980
+ [END_MACRO]
981
+
982
+ [MACRO] SET_LIT2 %out_set, %key1, %key2
983
+ EXPAND SET_NEW %out_set
984
+ EXPAND SET_INSERT __set_lit2_ok_1_%out_set, %out_set, %key1
985
+ EXPAND SET_INSERT __set_lit2_ok_2_%out_set, %out_set, %key2
986
+ !__set_lit2_ok_1_%out_set
987
+ !__set_lit2_ok_2_%out_set
988
+ [END_MACRO]
989
+
990
+ [MACRO] SET_LIT3 %out_set, %key1, %key2, %key3
991
+ EXPAND SET_NEW %out_set
992
+ EXPAND SET_INSERT __set_lit3_ok_1_%out_set, %out_set, %key1
993
+ EXPAND SET_INSERT __set_lit3_ok_2_%out_set, %out_set, %key2
994
+ EXPAND SET_INSERT __set_lit3_ok_3_%out_set, %out_set, %key3
995
+ !__set_lit3_ok_1_%out_set
996
+ !__set_lit3_ok_2_%out_set
997
+ !__set_lit3_ok_3_%out_set
998
+ [END_MACRO]
999
+
1000
+ // Rust Default-style empty set constructor alias.
1001
+
1002
+ [MACRO] SET_DEFAULT %out_set
1003
+ EXPAND SET_NEW %out_set
1004
+ [END_MACRO]