@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,1120 @@
1
+ // Concrete LinkedList<u64> facade over heap nodes.
2
+ // Models supportable Rust LinkedList push/pop/front/back/len/clear/append/contains.
3
+ @import "linked_list.sal"
4
+ @import "../vec.sa"
5
+ @import "../core/slice.sal"
6
+
7
+ @sa_linked_list_new() -> ^ptr:
8
+ L_ENTRY:
9
+ list = alloc LinkedList_SIZE
10
+ null_ptr = 0 as ptr
11
+ store list+LinkedList_head, null_ptr as ptr
12
+ store list+LinkedList_tail, null_ptr as ptr
13
+ store list+LinkedList_len, 0 as u64
14
+ !null_ptr
15
+ return list
16
+
17
+ @sa_linked_list_clear(&list: ptr) -> void:
18
+ L_CLEAR_HEAD:
19
+ head = load list+LinkedList_head as ptr
20
+ null_ptr = 0 as ptr
21
+ done = eq head, null_ptr
22
+ br done -> L_CLEAR_DONE, L_CLEAR_BODY
23
+ L_CLEAR_BODY:
24
+ next = load head+LinkedListNode_next as ptr
25
+ !head
26
+ store list+LinkedList_head, next as ptr
27
+ !next
28
+ !done
29
+ !null_ptr
30
+ jmp L_CLEAR_HEAD
31
+ L_CLEAR_DONE:
32
+ null2 = 0 as ptr
33
+ store list+LinkedList_head, null2 as ptr
34
+ store list+LinkedList_tail, null2 as ptr
35
+ store list+LinkedList_len, 0 as u64
36
+ !null2
37
+ !done
38
+ !null_ptr
39
+ !head
40
+ return
41
+
42
+ @sa_linked_list_free(^list: ptr) -> void:
43
+ L_ENTRY:
44
+ call @sa_linked_list_clear(&list)
45
+ !list
46
+ return
47
+
48
+ @sa_linked_list_push_front(&list: ptr, value: u64) -> void:
49
+ L_ENTRY:
50
+ node = alloc LinkedListNode_SIZE
51
+ null_ptr = 0 as ptr
52
+ store node+LinkedListNode_prev, null_ptr as ptr
53
+ store node+LinkedListNode_value, value as u64
54
+ old_head = load list+LinkedList_head as ptr
55
+ store node+LinkedListNode_next, old_head as ptr
56
+ empty = eq old_head, null_ptr
57
+ br empty -> L_PF_EMPTY, L_PF_LINK
58
+ L_PF_LINK:
59
+ store old_head+LinkedListNode_prev, node as ptr
60
+ jmp L_PF_STORE
61
+ L_PF_EMPTY:
62
+ store list+LinkedList_tail, node as ptr
63
+ jmp L_PF_STORE
64
+ L_PF_STORE:
65
+ store list+LinkedList_head, node as ptr
66
+ len = load list+LinkedList_len as u64
67
+ next_len = add len, 1
68
+ store list+LinkedList_len, next_len as u64
69
+ !next_len
70
+ !len
71
+ !empty
72
+ !old_head
73
+ !null_ptr
74
+ !node
75
+ !value
76
+ return
77
+
78
+ @sa_linked_list_push_back(&list: ptr, value: u64) -> void:
79
+ L_ENTRY:
80
+ node = alloc LinkedListNode_SIZE
81
+ null_ptr = 0 as ptr
82
+ store node+LinkedListNode_next, null_ptr as ptr
83
+ store node+LinkedListNode_value, value as u64
84
+ old_tail = load list+LinkedList_tail as ptr
85
+ store node+LinkedListNode_prev, old_tail as ptr
86
+ empty = eq old_tail, null_ptr
87
+ br empty -> L_PB_EMPTY, L_PB_LINK
88
+ L_PB_LINK:
89
+ store old_tail+LinkedListNode_next, node as ptr
90
+ jmp L_PB_STORE
91
+ L_PB_EMPTY:
92
+ store list+LinkedList_head, node as ptr
93
+ jmp L_PB_STORE
94
+ L_PB_STORE:
95
+ store list+LinkedList_tail, node as ptr
96
+ len = load list+LinkedList_len as u64
97
+ next_len = add len, 1
98
+ store list+LinkedList_len, next_len as u64
99
+ !next_len
100
+ !len
101
+ !empty
102
+ !old_tail
103
+ !null_ptr
104
+ !node
105
+ !value
106
+ return
107
+
108
+ @sa_linked_list_try_pop_front(&list: ptr, &out_value: ptr) -> i32:
109
+ L_ENTRY:
110
+ head = load list+LinkedList_head as ptr
111
+ null_ptr = 0 as ptr
112
+ empty = eq head, null_ptr
113
+ br empty -> L_POPF_EMPTY, L_POPF_BODY
114
+ L_POPF_BODY:
115
+ value = load head+LinkedListNode_value as u64
116
+ store out_value+0, value as u64
117
+ next = load head+LinkedListNode_next as ptr
118
+ store list+LinkedList_head, next as ptr
119
+ was_last = eq next, null_ptr
120
+ br was_last -> L_POPF_LAST, L_POPF_RELINK
121
+ L_POPF_RELINK:
122
+ store next+LinkedListNode_prev, null_ptr as ptr
123
+ jmp L_POPF_LEN
124
+ L_POPF_LAST:
125
+ store list+LinkedList_tail, null_ptr as ptr
126
+ jmp L_POPF_LEN
127
+ L_POPF_LEN:
128
+ !head
129
+ len = load list+LinkedList_len as u64
130
+ next_len = sub len, 1
131
+ store list+LinkedList_len, next_len as u64
132
+ !next_len
133
+ !len
134
+ !was_last
135
+ !next
136
+ !value
137
+ !empty
138
+ !null_ptr
139
+ !out_value
140
+ return 1
141
+ L_POPF_EMPTY:
142
+ store out_value+0, 0 as u64
143
+ !empty
144
+ !null_ptr
145
+ !head
146
+ !out_value
147
+ return 0
148
+
149
+ @sa_linked_list_try_pop_back(&list: ptr, &out_value: ptr) -> i32:
150
+ L_ENTRY:
151
+ tail = load list+LinkedList_tail as ptr
152
+ null_ptr = 0 as ptr
153
+ empty = eq tail, null_ptr
154
+ br empty -> L_POPB_EMPTY, L_POPB_BODY
155
+ L_POPB_BODY:
156
+ value = load tail+LinkedListNode_value as u64
157
+ store out_value+0, value as u64
158
+ prev = load tail+LinkedListNode_prev as ptr
159
+ store list+LinkedList_tail, prev as ptr
160
+ was_last = eq prev, null_ptr
161
+ br was_last -> L_POPB_LAST, L_POPB_RELINK
162
+ L_POPB_RELINK:
163
+ store prev+LinkedListNode_next, null_ptr as ptr
164
+ jmp L_POPB_LEN
165
+ L_POPB_LAST:
166
+ store list+LinkedList_head, null_ptr as ptr
167
+ jmp L_POPB_LEN
168
+ L_POPB_LEN:
169
+ !tail
170
+ len = load list+LinkedList_len as u64
171
+ next_len = sub len, 1
172
+ store list+LinkedList_len, next_len as u64
173
+ !next_len
174
+ !len
175
+ !was_last
176
+ !prev
177
+ !value
178
+ !empty
179
+ !null_ptr
180
+ !out_value
181
+ return 1
182
+ L_POPB_EMPTY:
183
+ store out_value+0, 0 as u64
184
+ !empty
185
+ !null_ptr
186
+ !tail
187
+ !out_value
188
+ return 0
189
+
190
+ @sa_linked_list_try_front(&list: ptr, &out_value: ptr) -> i32:
191
+ L_ENTRY:
192
+ head = load list+LinkedList_head as ptr
193
+ null_ptr = 0 as ptr
194
+ empty = eq head, null_ptr
195
+ br empty -> L_FRONT_EMPTY, L_FRONT_OK
196
+ L_FRONT_OK:
197
+ value = load head+LinkedListNode_value as u64
198
+ store out_value+0, value as u64
199
+ !value
200
+ !empty
201
+ !null_ptr
202
+ !head
203
+ !out_value
204
+ return 1
205
+ L_FRONT_EMPTY:
206
+ store out_value+0, 0 as u64
207
+ !empty
208
+ !null_ptr
209
+ !head
210
+ !out_value
211
+ return 0
212
+
213
+ @sa_linked_list_try_back(&list: ptr, &out_value: ptr) -> i32:
214
+ L_ENTRY:
215
+ tail = load list+LinkedList_tail as ptr
216
+ null_ptr = 0 as ptr
217
+ empty = eq tail, null_ptr
218
+ br empty -> L_BACK_EMPTY, L_BACK_OK
219
+ L_BACK_OK:
220
+ value = load tail+LinkedListNode_value as u64
221
+ store out_value+0, value as u64
222
+ !value
223
+ !empty
224
+ !null_ptr
225
+ !tail
226
+ !out_value
227
+ return 1
228
+ L_BACK_EMPTY:
229
+ store out_value+0, 0 as u64
230
+ !empty
231
+ !null_ptr
232
+ !tail
233
+ !out_value
234
+ return 0
235
+
236
+ @sa_linked_list_contains(&list: ptr, needle: u64) -> i32:
237
+ L_ENTRY:
238
+ node_slot = stack_alloc 8
239
+ head = load list+LinkedList_head as ptr
240
+ store node_slot+0, head as ptr
241
+ !head
242
+ jmp L_CONTAINS_HEAD
243
+ L_CONTAINS_HEAD:
244
+ node = load node_slot+0 as ptr
245
+ null_ptr = 0 as ptr
246
+ done = eq node, null_ptr
247
+ br done -> L_CONTAINS_MISS, L_CONTAINS_BODY
248
+ L_CONTAINS_BODY:
249
+ val = load node+LinkedListNode_value as u64
250
+ hit = eq val, needle
251
+ br hit -> L_CONTAINS_HIT, L_CONTAINS_NEXT
252
+ L_CONTAINS_HIT:
253
+ !hit
254
+ !val
255
+ !null_ptr
256
+ !done
257
+ !node
258
+ !needle
259
+ return 1
260
+ L_CONTAINS_NEXT:
261
+ next = load node+LinkedListNode_next as ptr
262
+ store node_slot+0, next as ptr
263
+ !next
264
+ !hit
265
+ !val
266
+ !null_ptr
267
+ !done
268
+ !node
269
+ jmp L_CONTAINS_HEAD
270
+ L_CONTAINS_MISS:
271
+ !done
272
+ !null_ptr
273
+ !node
274
+ !needle
275
+ return 0
276
+
277
+ @sa_linked_list_append(&list: ptr, &other: ptr) -> void:
278
+ L_APPEND_HEAD:
279
+ value_slot = stack_alloc 8
280
+ ok = call @sa_linked_list_try_pop_front(&other, &value_slot)
281
+ br ok -> L_APPEND_BODY, L_APPEND_DONE
282
+ L_APPEND_BODY:
283
+ value = load value_slot+0 as u64
284
+ call @sa_linked_list_push_back(&list, value)
285
+ !value
286
+ !ok
287
+ jmp L_APPEND_HEAD
288
+ L_APPEND_DONE:
289
+ !ok
290
+ return
291
+
292
+
293
+ @sa_linked_list_try_remove(&list: ptr, index: u64, &out_value: ptr) -> i32:
294
+ L_ENTRY:
295
+ len = load list+LinkedList_len as u64
296
+ oob = uge index, len
297
+ br oob -> L_REM_OOB, L_REM_SCAN
298
+ L_REM_OOB:
299
+ store out_value+0, 0 as u64
300
+ !oob
301
+ !len
302
+ !out_value
303
+ !index
304
+ return 0
305
+ L_REM_SCAN:
306
+ node_slot = stack_alloc 8
307
+ idx_slot = stack_alloc 8
308
+ head = load list+LinkedList_head as ptr
309
+ store node_slot+0, head as ptr
310
+ store idx_slot+0, 0 as u64
311
+ !head
312
+ jmp L_REM_HEAD
313
+ L_REM_HEAD:
314
+ node = load node_slot+0 as ptr
315
+ i = load idx_slot+0 as u64
316
+ hit = eq i, index
317
+ br hit -> L_REM_HIT, L_REM_NEXT
318
+ L_REM_NEXT:
319
+ next = load node+LinkedListNode_next as ptr
320
+ store node_slot+0, next as ptr
321
+ ni = add i, 1
322
+ store idx_slot+0, ni as u64
323
+ !ni
324
+ !next
325
+ !hit
326
+ !i
327
+ !node
328
+ jmp L_REM_HEAD
329
+ L_REM_HIT:
330
+ value = load node+LinkedListNode_value as u64
331
+ store out_value+0, value as u64
332
+ prev = load node+LinkedListNode_prev as ptr
333
+ next2 = load node+LinkedListNode_next as ptr
334
+ null_ptr = 0 as ptr
335
+ prev_null = eq prev, null_ptr
336
+ br prev_null -> L_REM_NO_PREV, L_REM_HAS_PREV
337
+ L_REM_HAS_PREV:
338
+ store prev+LinkedListNode_next, next2 as ptr
339
+ jmp L_REM_NEXT_LINK
340
+ L_REM_NO_PREV:
341
+ store list+LinkedList_head, next2 as ptr
342
+ jmp L_REM_NEXT_LINK
343
+ L_REM_NEXT_LINK:
344
+ next_null = eq next2, null_ptr
345
+ br next_null -> L_REM_NO_NEXT, L_REM_HAS_NEXT
346
+ L_REM_HAS_NEXT:
347
+ store next2+LinkedListNode_prev, prev as ptr
348
+ jmp L_REM_LEN
349
+ L_REM_NO_NEXT:
350
+ store list+LinkedList_tail, prev as ptr
351
+ jmp L_REM_LEN
352
+ L_REM_LEN:
353
+ !node
354
+ len2 = load list+LinkedList_len as u64
355
+ nlen = sub len2, 1
356
+ store list+LinkedList_len, nlen as u64
357
+ !nlen
358
+ !len2
359
+ !next_null
360
+ !prev_null
361
+ !null_ptr
362
+ !next2
363
+ !prev
364
+ !value
365
+ !hit
366
+ !i
367
+ !oob
368
+ !len
369
+ !out_value
370
+ !index
371
+ return 1
372
+
373
+ @sa_linked_list_split_off(&list: ptr, at: u64) -> ^ptr:
374
+ L_ENTRY:
375
+ out = call @sa_linked_list_new()
376
+ len = load list+LinkedList_len as u64
377
+ // if at >= len, return empty out
378
+ ge = uge at, len
379
+ br ge -> L_SPLIT_DONE, L_SPLIT_LOOP_INIT
380
+ L_SPLIT_LOOP_INIT:
381
+ // pop from `at` to end into out by first advancing to at via pops into temp then re-push?
382
+ // Simpler: while len > at: pop_back from list, push_front to out (preserves order)
383
+ jmp L_SPLIT_LOOP
384
+ L_SPLIT_LOOP:
385
+ cur_len = load list+LinkedList_len as u64
386
+ done = ule cur_len, at
387
+ br done -> L_SPLIT_DONE, L_SPLIT_BODY
388
+ L_SPLIT_BODY:
389
+ slot = stack_alloc 8
390
+ ok = call @sa_linked_list_try_pop_back(&list, &slot)
391
+ val = load slot+0 as u64
392
+ call @sa_linked_list_push_front(&out, val)
393
+ !val
394
+ !ok
395
+ !done
396
+ !cur_len
397
+ jmp L_SPLIT_LOOP
398
+ L_SPLIT_DONE:
399
+ !ge
400
+ !len
401
+ !at
402
+ return out
403
+
404
+
405
+ @sa_linked_list_to_vec(&list: ptr) -> ^ptr:
406
+ L_ENTRY:
407
+ len = load list+LinkedList_len as u64
408
+ out = call @sa_vec_with_capacity(len, 8)
409
+ node_slot = stack_alloc 8
410
+ head = load list+LinkedList_head as ptr
411
+ store node_slot+0, head as ptr
412
+ !head
413
+ !len
414
+ jmp L_TO_VEC_HEAD
415
+ L_TO_VEC_HEAD:
416
+ node = load node_slot+0 as ptr
417
+ null_ptr = 0 as ptr
418
+ done = eq node, null_ptr
419
+ br done -> L_TO_VEC_DONE, L_TO_VEC_BODY
420
+ L_TO_VEC_BODY:
421
+ val = load node+LinkedListNode_value as u64
422
+ out = call @sa_vec_push(^out, val, 8)
423
+ next = load node+LinkedListNode_next as ptr
424
+ store node_slot+0, next as ptr
425
+ !next
426
+ !val
427
+ !null_ptr
428
+ !done
429
+ !node
430
+ jmp L_TO_VEC_HEAD
431
+ L_TO_VEC_DONE:
432
+ !done
433
+ !null_ptr
434
+ !node
435
+ return out
436
+
437
+ @sa_linked_list_from_slice(&slice: ptr) -> ^ptr:
438
+ L_ENTRY:
439
+ list = call @sa_linked_list_new()
440
+ len = load slice+Slice_len as u64
441
+ ptr = load slice+Slice_ptr as ptr
442
+ idx_slot = stack_alloc 8
443
+ store idx_slot+0, 0 as u64
444
+ jmp L_FROM_HEAD
445
+ L_FROM_HEAD:
446
+ i = load idx_slot+0 as u64
447
+ done = eq i, len
448
+ br done -> L_FROM_DONE, L_FROM_BODY
449
+ L_FROM_BODY:
450
+ off = mul i, 8
451
+ p = ptr_add ptr, off
452
+ val = load p+0 as u64
453
+ call @sa_linked_list_push_back(&list, val)
454
+ ni = add i, 1
455
+ store idx_slot+0, ni as u64
456
+ !ni
457
+ !val
458
+ !p
459
+ !off
460
+ !done
461
+ !i
462
+ jmp L_FROM_HEAD
463
+ L_FROM_DONE:
464
+ !done
465
+ !i
466
+ !ptr
467
+ !len
468
+ !slice
469
+ return list
470
+
471
+
472
+
473
+ @sa_linked_list_try_get(&list: ptr, index: u64, &out_value: ptr) -> i32:
474
+ L_ENTRY:
475
+ len = load list+LinkedList_len as u64
476
+ oob = uge index, len
477
+ br oob -> L_GET_OOB, L_GET_SCAN
478
+ L_GET_OOB:
479
+ store out_value+0, 0 as u64
480
+ !oob
481
+ !len
482
+ !out_value
483
+ !index
484
+ return 0
485
+ L_GET_SCAN:
486
+ node_slot = stack_alloc 8
487
+ idx_slot = stack_alloc 8
488
+ head = load list+LinkedList_head as ptr
489
+ store node_slot+0, head as ptr
490
+ store idx_slot+0, 0 as u64
491
+ !head
492
+ jmp L_GET_HEAD
493
+ L_GET_HEAD:
494
+ node = load node_slot+0 as ptr
495
+ i = load idx_slot+0 as u64
496
+ hit = eq i, index
497
+ br hit -> L_GET_HIT, L_GET_NEXT
498
+ L_GET_NEXT:
499
+ next = load node+LinkedListNode_next as ptr
500
+ store node_slot+0, next as ptr
501
+ ni = add i, 1
502
+ store idx_slot+0, ni as u64
503
+ !ni
504
+ !next
505
+ !hit
506
+ !i
507
+ !node
508
+ jmp L_GET_HEAD
509
+ L_GET_HIT:
510
+ value = load node+LinkedListNode_value as u64
511
+ store out_value+0, value as u64
512
+ !value
513
+ !hit
514
+ !i
515
+ !node
516
+ !oob
517
+ !len
518
+ !out_value
519
+ !index
520
+ return 1
521
+
522
+
523
+ @sa_linked_list_try_set(&list: ptr, index: u64, value: u64) -> i32:
524
+ L_ENTRY:
525
+ len = load list+LinkedList_len as u64
526
+ oob = uge index, len
527
+ br oob -> L_SET_OOB, L_SET_SCAN
528
+ L_SET_OOB:
529
+ !oob
530
+ !len
531
+ !value
532
+ !index
533
+ return 0
534
+ L_SET_SCAN:
535
+ node_slot = stack_alloc 8
536
+ idx_slot = stack_alloc 8
537
+ head = load list+LinkedList_head as ptr
538
+ store node_slot+0, head as ptr
539
+ store idx_slot+0, 0 as u64
540
+ !head
541
+ jmp L_SET_HEAD
542
+ L_SET_HEAD:
543
+ node = load node_slot+0 as ptr
544
+ i = load idx_slot+0 as u64
545
+ hit = eq i, index
546
+ br hit -> L_SET_HIT, L_SET_NEXT
547
+ L_SET_NEXT:
548
+ next = load node+LinkedListNode_next as ptr
549
+ store node_slot+0, next as ptr
550
+ ni = add i, 1
551
+ store idx_slot+0, ni as u64
552
+ !ni
553
+ !next
554
+ !hit
555
+ !i
556
+ !node
557
+ jmp L_SET_HEAD
558
+ L_SET_HIT:
559
+ store node+LinkedListNode_value, value as u64
560
+ !hit
561
+ !i
562
+ !node
563
+ !oob
564
+ !len
565
+ !value
566
+ !index
567
+ return 1
568
+
569
+
570
+ @sa_linked_list_reverse(&list: ptr) -> void:
571
+ L_ENTRY:
572
+ // swap head/tail and swap each node prev/next
573
+ head = load list+LinkedList_head as ptr
574
+ tail = load list+LinkedList_tail as ptr
575
+ store list+LinkedList_head, tail as ptr
576
+ store list+LinkedList_tail, head as ptr
577
+ node_slot = stack_alloc 8
578
+ store node_slot+0, head as ptr
579
+ !head
580
+ !tail
581
+ jmp L_REV_HEAD
582
+ L_REV_HEAD:
583
+ node = load node_slot+0 as ptr
584
+ null_ptr = 0 as ptr
585
+ done = eq node, null_ptr
586
+ br done -> L_REV_DONE, L_REV_BODY
587
+ L_REV_BODY:
588
+ prev = load node+LinkedListNode_prev as ptr
589
+ next = load node+LinkedListNode_next as ptr
590
+ store node+LinkedListNode_prev, next as ptr
591
+ store node+LinkedListNode_next, prev as ptr
592
+ // continue along original next (now in prev)
593
+ store node_slot+0, next as ptr
594
+ !prev
595
+ !next
596
+ !null_ptr
597
+ !done
598
+ !node
599
+ jmp L_REV_HEAD
600
+ L_REV_DONE:
601
+ !done
602
+ !null_ptr
603
+ !node
604
+ return
605
+
606
+
607
+ @sa_linked_list_insert_after(&list: ptr, node: ptr, value: u64) -> void:
608
+ L_ENTRY:
609
+ new_node = alloc LinkedListNode_SIZE
610
+ next = load node+LinkedListNode_next as ptr
611
+ store new_node+LinkedListNode_value, value as u64
612
+ store new_node+LinkedListNode_prev, node as ptr
613
+ store new_node+LinkedListNode_next, next as ptr
614
+ store node+LinkedListNode_next, new_node as ptr
615
+ null_ptr = 0 as ptr
616
+ next_null = eq next, null_ptr
617
+ br next_null -> L_INS_TAIL, L_INS_MID
618
+ L_INS_MID:
619
+ store next+LinkedListNode_prev, new_node as ptr
620
+ jmp L_INS_LEN
621
+ L_INS_TAIL:
622
+ store list+LinkedList_tail, new_node as ptr
623
+ jmp L_INS_LEN
624
+ L_INS_LEN:
625
+ len = load list+LinkedList_len as u64
626
+ nlen = add len, 1
627
+ store list+LinkedList_len, nlen as u64
628
+ !nlen
629
+ !len
630
+ !next_null
631
+ !null_ptr
632
+ !next
633
+ !new_node
634
+ !value
635
+ !node
636
+ return
637
+
638
+ @sa_linked_list_insert_before(&list: ptr, node: ptr, value: u64) -> void:
639
+ L_ENTRY:
640
+ new_node = alloc LinkedListNode_SIZE
641
+ prev = load node+LinkedListNode_prev as ptr
642
+ store new_node+LinkedListNode_value, value as u64
643
+ store new_node+LinkedListNode_next, node as ptr
644
+ store new_node+LinkedListNode_prev, prev as ptr
645
+ store node+LinkedListNode_prev, new_node as ptr
646
+ null_ptr = 0 as ptr
647
+ prev_null = eq prev, null_ptr
648
+ br prev_null -> L_INB_HEAD, L_INB_MID
649
+ L_INB_MID:
650
+ store prev+LinkedListNode_next, new_node as ptr
651
+ jmp L_INB_LEN
652
+ L_INB_HEAD:
653
+ store list+LinkedList_head, new_node as ptr
654
+ jmp L_INB_LEN
655
+ L_INB_LEN:
656
+ len = load list+LinkedList_len as u64
657
+ nlen = add len, 1
658
+ store list+LinkedList_len, nlen as u64
659
+ !nlen
660
+ !len
661
+ !prev_null
662
+ !null_ptr
663
+ !prev
664
+ !new_node
665
+ !value
666
+ !node
667
+ return
668
+
669
+
670
+ @sa_linked_list_clone(&list: ptr) -> ^ptr:
671
+ L_ENTRY:
672
+ out = call @sa_linked_list_new()
673
+ node_slot = stack_alloc 8
674
+ head = load list+LinkedList_head as ptr
675
+ store node_slot+0, head as ptr
676
+ !head
677
+ jmp L_CL_HEAD
678
+ L_CL_HEAD:
679
+ node = load node_slot+0 as ptr
680
+ null_ptr = 0 as ptr
681
+ done = eq node, null_ptr
682
+ br done -> L_CL_DONE, L_CL_BODY
683
+ L_CL_BODY:
684
+ val = load node+LinkedListNode_value as u64
685
+ call @sa_linked_list_push_back(&out, val)
686
+ next = load node+LinkedListNode_next as ptr
687
+ store node_slot+0, next as ptr
688
+ !next
689
+ !val
690
+ !null_ptr
691
+ !done
692
+ !node
693
+ jmp L_CL_HEAD
694
+ L_CL_DONE:
695
+ !done
696
+ !null_ptr
697
+ !node
698
+ !list
699
+ return out
700
+
701
+ @sa_linked_list_eq(&left: ptr, &right: ptr) -> i32:
702
+ L_ENTRY:
703
+ llen = load left+LinkedList_len as u64
704
+ rlen = load right+LinkedList_len as u64
705
+ same_len = eq llen, rlen
706
+ br same_len -> L_EQ_SCAN, L_EQ_NO
707
+ L_EQ_NO:
708
+ !left
709
+ !right
710
+ !same_len
711
+ !rlen
712
+ !llen
713
+ return 0
714
+ L_EQ_SCAN:
715
+ ln_slot = stack_alloc 8
716
+ rn_slot = stack_alloc 8
717
+ lh = load left+LinkedList_head as ptr
718
+ rh = load right+LinkedList_head as ptr
719
+ store ln_slot+0, lh as ptr
720
+ store rn_slot+0, rh as ptr
721
+ !lh
722
+ !rh
723
+ !same_len
724
+ !rlen
725
+ !llen
726
+ jmp L_EQ_HEAD
727
+ L_EQ_HEAD:
728
+ ln = load ln_slot+0 as ptr
729
+ rn = load rn_slot+0 as ptr
730
+ null_ptr = 0 as ptr
731
+ done = eq ln, null_ptr
732
+ br done -> L_EQ_YES, L_EQ_BODY
733
+ L_EQ_BODY:
734
+ lv = load ln+LinkedListNode_value as u64
735
+ rv = load rn+LinkedListNode_value as u64
736
+ same = eq lv, rv
737
+ br same -> L_EQ_NEXT, L_EQ_NO2
738
+ L_EQ_NEXT:
739
+ lnext = load ln+LinkedListNode_next as ptr
740
+ rnext = load rn+LinkedListNode_next as ptr
741
+ store ln_slot+0, lnext as ptr
742
+ store rn_slot+0, rnext as ptr
743
+ !lnext
744
+ !rnext
745
+ !same
746
+ !lv
747
+ !rv
748
+ !null_ptr
749
+ !done
750
+ !ln
751
+ !rn
752
+ jmp L_EQ_HEAD
753
+ L_EQ_NO2:
754
+ !left
755
+ !right
756
+ !same
757
+ !lv
758
+ !rv
759
+ !null_ptr
760
+ !done
761
+ !ln
762
+ !rn
763
+ return 0
764
+ L_EQ_YES:
765
+ !left
766
+ !right
767
+ !null_ptr
768
+ !done
769
+ !ln
770
+ !rn
771
+ return 1
772
+
773
+ [MACRO] LINKED_LIST_NEW %out_list
774
+ %out_list = call @sa_linked_list_new()
775
+ [END_MACRO]
776
+
777
+ [MACRO] LINKED_LIST_DEFAULT %out_list
778
+ EXPAND LINKED_LIST_NEW %out_list
779
+ [END_MACRO]
780
+
781
+ [MACRO] LINKED_LIST_LEN %out_len, %list_reg
782
+ %out_len = load %list_reg+LinkedList_len as u64
783
+ [END_MACRO]
784
+
785
+ [MACRO] LINKED_LIST_IS_EMPTY %out_bool, %list_reg
786
+ __ll_len_%out_bool = load %list_reg+LinkedList_len as u64
787
+ %out_bool = eq __ll_len_%out_bool, 0
788
+ !__ll_len_%out_bool
789
+ [END_MACRO]
790
+
791
+ [MACRO] LINKED_LIST_CLEAR %list_reg
792
+ call @sa_linked_list_clear(&%list_reg)
793
+ [END_MACRO]
794
+
795
+ [MACRO] LINKED_LIST_FREE %list_reg
796
+ call @sa_linked_list_free(^%list_reg)
797
+ [END_MACRO]
798
+
799
+ [MACRO] LINKED_LIST_PUSH_FRONT %list_reg, %value
800
+ call @sa_linked_list_push_front(&%list_reg, %value)
801
+ [END_MACRO]
802
+
803
+ [MACRO] LINKED_LIST_PUSH_BACK %list_reg, %value
804
+ call @sa_linked_list_push_back(&%list_reg, %value)
805
+ [END_MACRO]
806
+
807
+ [MACRO] LINKED_LIST_TRY_POP_FRONT %out_ok, %out_value, %list_reg
808
+ __ll_popf_slot_%out_ok = stack_alloc 8
809
+ %out_ok = call @sa_linked_list_try_pop_front(&%list_reg, &__ll_popf_slot_%out_ok)
810
+ %out_value = load __ll_popf_slot_%out_ok+0 as u64
811
+ [END_MACRO]
812
+
813
+ [MACRO] LINKED_LIST_POP_FRONT %out_ok, %out_value, %list_reg
814
+ EXPAND LINKED_LIST_TRY_POP_FRONT %out_ok, %out_value, %list_reg
815
+ [END_MACRO]
816
+
817
+ [MACRO] LINKED_LIST_TRY_POP_BACK %out_ok, %out_value, %list_reg
818
+ __ll_popb_slot_%out_ok = stack_alloc 8
819
+ %out_ok = call @sa_linked_list_try_pop_back(&%list_reg, &__ll_popb_slot_%out_ok)
820
+ %out_value = load __ll_popb_slot_%out_ok+0 as u64
821
+ [END_MACRO]
822
+
823
+ [MACRO] LINKED_LIST_POP_BACK %out_ok, %out_value, %list_reg
824
+ EXPAND LINKED_LIST_TRY_POP_BACK %out_ok, %out_value, %list_reg
825
+ [END_MACRO]
826
+
827
+ [MACRO] LINKED_LIST_TRY_FRONT %out_ok, %out_value, %list_reg
828
+ __ll_front_slot_%out_ok = stack_alloc 8
829
+ %out_ok = call @sa_linked_list_try_front(&%list_reg, &__ll_front_slot_%out_ok)
830
+ %out_value = load __ll_front_slot_%out_ok+0 as u64
831
+ [END_MACRO]
832
+
833
+ [MACRO] LINKED_LIST_FRONT %out_ok, %out_value, %list_reg
834
+ EXPAND LINKED_LIST_TRY_FRONT %out_ok, %out_value, %list_reg
835
+ [END_MACRO]
836
+
837
+ [MACRO] LINKED_LIST_TRY_BACK %out_ok, %out_value, %list_reg
838
+ __ll_back_slot_%out_ok = stack_alloc 8
839
+ %out_ok = call @sa_linked_list_try_back(&%list_reg, &__ll_back_slot_%out_ok)
840
+ %out_value = load __ll_back_slot_%out_ok+0 as u64
841
+ [END_MACRO]
842
+
843
+ [MACRO] LINKED_LIST_BACK %out_ok, %out_value, %list_reg
844
+ EXPAND LINKED_LIST_TRY_BACK %out_ok, %out_value, %list_reg
845
+ [END_MACRO]
846
+
847
+ [MACRO] LINKED_LIST_CONTAINS_U64 %out_bool, %list_reg, %needle
848
+ %out_bool = call @sa_linked_list_contains(&%list_reg, %needle)
849
+ [END_MACRO]
850
+
851
+ [MACRO] LINKED_LIST_CONTAINS %out_bool, %list_reg, %needle
852
+ EXPAND LINKED_LIST_CONTAINS_U64 %out_bool, %list_reg, %needle
853
+ [END_MACRO]
854
+
855
+ [MACRO] LINKED_LIST_APPEND %list_reg, %other_list
856
+ call @sa_linked_list_append(&%list_reg, &%other_list)
857
+ [END_MACRO]
858
+
859
+ [MACRO] LINKED_LIST_TRY_REMOVE %out_ok, %out_value, %list_reg, %index
860
+ __ll_rem_slot_%out_ok = stack_alloc 8
861
+ %out_ok = call @sa_linked_list_try_remove(&%list_reg, %index, &__ll_rem_slot_%out_ok)
862
+ %out_value = load __ll_rem_slot_%out_ok+0 as u64
863
+ [END_MACRO]
864
+
865
+ [MACRO] LINKED_LIST_REMOVE %out_ok, %out_value, %list_reg, %index
866
+ EXPAND LINKED_LIST_TRY_REMOVE %out_ok, %out_value, %list_reg, %index
867
+ [END_MACRO]
868
+
869
+ [MACRO] LINKED_LIST_SPLIT_OFF %out_list, %list_reg, %at
870
+ %out_list = call @sa_linked_list_split_off(&%list_reg, %at)
871
+ [END_MACRO]
872
+
873
+ [MACRO] LINKED_LIST_TO_VEC %out_vec, %list_reg
874
+ %out_vec = call @sa_linked_list_to_vec(&%list_reg)
875
+ [END_MACRO]
876
+
877
+ [MACRO] LINKED_LIST_FROM_SLICE %out_list, %slice_reg
878
+ %out_list = call @sa_linked_list_from_slice(&%slice_reg)
879
+ [END_MACRO]
880
+
881
+ [MACRO] LINKED_LIST_FROM_VEC %out_list, %vec_reg
882
+ EXPAND VEC_AS_SLICE __ll_fv_slice_%out_list, %vec_reg
883
+ EXPAND LINKED_LIST_FROM_SLICE %out_list, __ll_fv_slice_%out_list
884
+ !__ll_fv_slice_%out_list
885
+ [END_MACRO]
886
+
887
+
888
+ [MACRO] LINKED_LIST_RETAIN %out_len, %list_reg, %pred_fn
889
+ EXPAND LINKED_LIST_NEW __ll_ret_keep_%out_len
890
+ jmp L_LL_RET_HEAD_%out_len
891
+ L_LL_RET_HEAD_%out_len:
892
+ EXPAND LINKED_LIST_TRY_POP_FRONT __ll_ret_ok_%out_len, __ll_ret_val_%out_len, %list_reg
893
+ br __ll_ret_ok_%out_len -> L_LL_RET_BODY_%out_len, L_LL_RET_DONE_%out_len
894
+ L_LL_RET_BODY_%out_len:
895
+ __ll_ret_keep_flag_%out_len = call %pred_fn(__ll_ret_val_%out_len)
896
+ __ll_ret_keep_it_%out_len = ne __ll_ret_keep_flag_%out_len, 0
897
+ br __ll_ret_keep_it_%out_len -> L_LL_RET_KEEP_%out_len, L_LL_RET_DROP_%out_len
898
+ L_LL_RET_KEEP_%out_len:
899
+ EXPAND LINKED_LIST_PUSH_BACK __ll_ret_keep_%out_len, __ll_ret_val_%out_len
900
+ jmp L_LL_RET_NEXT_%out_len
901
+ L_LL_RET_DROP_%out_len:
902
+ jmp L_LL_RET_NEXT_%out_len
903
+ L_LL_RET_NEXT_%out_len:
904
+ !__ll_ret_keep_it_%out_len
905
+ !__ll_ret_keep_flag_%out_len
906
+ !__ll_ret_val_%out_len
907
+ !__ll_ret_ok_%out_len
908
+ jmp L_LL_RET_HEAD_%out_len
909
+ L_LL_RET_DONE_%out_len:
910
+ EXPAND LINKED_LIST_APPEND %list_reg, __ll_ret_keep_%out_len
911
+ EXPAND LINKED_LIST_LEN %out_len, %list_reg
912
+ !__ll_ret_val_%out_len
913
+ !__ll_ret_ok_%out_len
914
+ !__ll_ret_keep_%out_len
915
+ [END_MACRO]
916
+
917
+ [MACRO] LINKED_LIST_TRY_GET %out_ok, %out_value, %list_reg, %index
918
+ __ll_get_slot_%out_ok = stack_alloc 8
919
+ %out_ok = call @sa_linked_list_try_get(&%list_reg, %index, &__ll_get_slot_%out_ok)
920
+ %out_value = load __ll_get_slot_%out_ok+0 as u64
921
+ [END_MACRO]
922
+
923
+ [MACRO] LINKED_LIST_GET %out_ok, %out_value, %list_reg, %index
924
+ EXPAND LINKED_LIST_TRY_GET %out_ok, %out_value, %list_reg, %index
925
+ [END_MACRO]
926
+
927
+ [MACRO] LINKED_LIST_TRY_SET %out_ok, %list_reg, %index, %value
928
+ %out_ok = call @sa_linked_list_try_set(&%list_reg, %index, %value)
929
+ [END_MACRO]
930
+
931
+ [MACRO] LINKED_LIST_SET %out_ok, %list_reg, %index, %value
932
+ EXPAND LINKED_LIST_TRY_SET %out_ok, %list_reg, %index, %value
933
+ [END_MACRO]
934
+
935
+ [MACRO] LINKED_LIST_REVERSE %list_reg
936
+ call @sa_linked_list_reverse(&%list_reg)
937
+ [END_MACRO]
938
+
939
+ [MACRO] LINKED_LIST_DRAIN %out_vec, %list_reg
940
+ EXPAND LINKED_LIST_TO_VEC %out_vec, %list_reg
941
+ EXPAND LINKED_LIST_CLEAR %list_reg
942
+ [END_MACRO]
943
+
944
+ [MACRO] LINKED_LIST_POP_FRONT_IF %out_ok, %out_value, %list_reg, %pred_fn
945
+ EXPAND LINKED_LIST_TRY_FRONT __ll_pfi_fok_%out_ok, __ll_pfi_fval_%out_ok, %list_reg
946
+ br __ll_pfi_fok_%out_ok -> L_LL_PFI_CHECK_%out_ok, L_LL_PFI_EMPTY_%out_ok
947
+ L_LL_PFI_CHECK_%out_ok:
948
+ __ll_pfi_pred_%out_ok = call %pred_fn(__ll_pfi_fval_%out_ok)
949
+ __ll_pfi_take_%out_ok = ne __ll_pfi_pred_%out_ok, 0
950
+ br __ll_pfi_take_%out_ok -> L_LL_PFI_TAKE_%out_ok, L_LL_PFI_KEEP_%out_ok
951
+ L_LL_PFI_TAKE_%out_ok:
952
+ EXPAND LINKED_LIST_TRY_POP_FRONT %out_ok, %out_value, %list_reg
953
+ !__ll_pfi_take_%out_ok
954
+ !__ll_pfi_pred_%out_ok
955
+ !__ll_pfi_fval_%out_ok
956
+ !__ll_pfi_fok_%out_ok
957
+ jmp L_LL_PFI_END_%out_ok
958
+ L_LL_PFI_KEEP_%out_ok:
959
+ %out_ok = 0
960
+ %out_value = 0
961
+ !__ll_pfi_take_%out_ok
962
+ !__ll_pfi_pred_%out_ok
963
+ !__ll_pfi_fval_%out_ok
964
+ !__ll_pfi_fok_%out_ok
965
+ jmp L_LL_PFI_END_%out_ok
966
+ L_LL_PFI_EMPTY_%out_ok:
967
+ %out_ok = 0
968
+ %out_value = 0
969
+ !__ll_pfi_fval_%out_ok
970
+ !__ll_pfi_fok_%out_ok
971
+ L_LL_PFI_END_%out_ok:
972
+ [END_MACRO]
973
+
974
+ [MACRO] LINKED_LIST_POP_BACK_IF %out_ok, %out_value, %list_reg, %pred_fn
975
+ EXPAND LINKED_LIST_TRY_BACK __ll_pbi_bok_%out_ok, __ll_pbi_bval_%out_ok, %list_reg
976
+ br __ll_pbi_bok_%out_ok -> L_LL_PBI_CHECK_%out_ok, L_LL_PBI_EMPTY_%out_ok
977
+ L_LL_PBI_CHECK_%out_ok:
978
+ __ll_pbi_pred_%out_ok = call %pred_fn(__ll_pbi_bval_%out_ok)
979
+ __ll_pbi_take_%out_ok = ne __ll_pbi_pred_%out_ok, 0
980
+ br __ll_pbi_take_%out_ok -> L_LL_PBI_TAKE_%out_ok, L_LL_PBI_KEEP_%out_ok
981
+ L_LL_PBI_TAKE_%out_ok:
982
+ EXPAND LINKED_LIST_TRY_POP_BACK %out_ok, %out_value, %list_reg
983
+ !__ll_pbi_take_%out_ok
984
+ !__ll_pbi_pred_%out_ok
985
+ !__ll_pbi_bval_%out_ok
986
+ !__ll_pbi_bok_%out_ok
987
+ jmp L_LL_PBI_END_%out_ok
988
+ L_LL_PBI_KEEP_%out_ok:
989
+ %out_ok = 0
990
+ %out_value = 0
991
+ !__ll_pbi_take_%out_ok
992
+ !__ll_pbi_pred_%out_ok
993
+ !__ll_pbi_bval_%out_ok
994
+ !__ll_pbi_bok_%out_ok
995
+ jmp L_LL_PBI_END_%out_ok
996
+ L_LL_PBI_EMPTY_%out_ok:
997
+ %out_ok = 0
998
+ %out_value = 0
999
+ !__ll_pbi_bval_%out_ok
1000
+ !__ll_pbi_bok_%out_ok
1001
+ L_LL_PBI_END_%out_ok:
1002
+ [END_MACRO]
1003
+
1004
+ // Cursor-style raw node pointers (not Rust Cursor safety).
1005
+ [MACRO] LINKED_LIST_CURSOR_FRONT %out_ok, %out_node, %list_reg
1006
+ %out_node = load %list_reg+LinkedList_head as ptr
1007
+ __ll_cf_null_%out_ok = 0 as ptr
1008
+ %out_ok = ne %out_node, __ll_cf_null_%out_ok
1009
+ !__ll_cf_null_%out_ok
1010
+ [END_MACRO]
1011
+
1012
+ [MACRO] LINKED_LIST_CURSOR_BACK %out_ok, %out_node, %list_reg
1013
+ %out_node = load %list_reg+LinkedList_tail as ptr
1014
+ __ll_cb_null_%out_ok = 0 as ptr
1015
+ %out_ok = ne %out_node, __ll_cb_null_%out_ok
1016
+ !__ll_cb_null_%out_ok
1017
+ [END_MACRO]
1018
+
1019
+ [MACRO] LINKED_LIST_CURSOR_NEXT %out_ok, %out_node, %node_reg
1020
+ %out_node = load %node_reg+LinkedListNode_next as ptr
1021
+ __ll_cn_null_%out_ok = 0 as ptr
1022
+ %out_ok = ne %out_node, __ll_cn_null_%out_ok
1023
+ !__ll_cn_null_%out_ok
1024
+ [END_MACRO]
1025
+
1026
+ [MACRO] LINKED_LIST_CURSOR_PREV %out_ok, %out_node, %node_reg
1027
+ %out_node = load %node_reg+LinkedListNode_prev as ptr
1028
+ __ll_cp_null_%out_ok = 0 as ptr
1029
+ %out_ok = ne %out_node, __ll_cp_null_%out_ok
1030
+ !__ll_cp_null_%out_ok
1031
+ [END_MACRO]
1032
+
1033
+ [MACRO] LINKED_LIST_CURSOR_VALUE %out_value, %node_reg
1034
+ %out_value = load %node_reg+LinkedListNode_value as u64
1035
+ [END_MACRO]
1036
+
1037
+ [MACRO] LINKED_LIST_CURSOR_SET_VALUE %node_reg, %value
1038
+ store %node_reg+LinkedListNode_value, %value as u64
1039
+ [END_MACRO]
1040
+
1041
+ [MACRO] LINKED_LIST_EXTRACT_IF %out_len, %out_list, %list_reg, %pred_fn
1042
+ EXPAND LINKED_LIST_NEW %out_list
1043
+ EXPAND LINKED_LIST_NEW __ll_ei_keep_%out_len
1044
+ jmp L_LL_EI_HEAD_%out_len
1045
+ L_LL_EI_HEAD_%out_len:
1046
+ EXPAND LINKED_LIST_TRY_POP_FRONT __ll_ei_ok_%out_len, __ll_ei_val_%out_len, %list_reg
1047
+ br __ll_ei_ok_%out_len -> L_LL_EI_BODY_%out_len, L_LL_EI_DONE_%out_len
1048
+ L_LL_EI_BODY_%out_len:
1049
+ __ll_ei_pred_%out_len = call %pred_fn(__ll_ei_val_%out_len)
1050
+ __ll_ei_take_%out_len = ne __ll_ei_pred_%out_len, 0
1051
+ br __ll_ei_take_%out_len -> L_LL_EI_TAKE_%out_len, L_LL_EI_KEEP_%out_len
1052
+ L_LL_EI_TAKE_%out_len:
1053
+ EXPAND LINKED_LIST_PUSH_BACK %out_list, __ll_ei_val_%out_len
1054
+ jmp L_LL_EI_NEXT_%out_len
1055
+ L_LL_EI_KEEP_%out_len:
1056
+ EXPAND LINKED_LIST_PUSH_BACK __ll_ei_keep_%out_len, __ll_ei_val_%out_len
1057
+ jmp L_LL_EI_NEXT_%out_len
1058
+ L_LL_EI_NEXT_%out_len:
1059
+ !__ll_ei_take_%out_len
1060
+ !__ll_ei_pred_%out_len
1061
+ !__ll_ei_val_%out_len
1062
+ !__ll_ei_ok_%out_len
1063
+ jmp L_LL_EI_HEAD_%out_len
1064
+ L_LL_EI_DONE_%out_len:
1065
+ EXPAND LINKED_LIST_APPEND %list_reg, __ll_ei_keep_%out_len
1066
+ EXPAND LINKED_LIST_LEN %out_len, %out_list
1067
+ !__ll_ei_val_%out_len
1068
+ !__ll_ei_ok_%out_len
1069
+ !__ll_ei_keep_%out_len
1070
+ [END_MACRO]
1071
+
1072
+ [MACRO] LINKED_LIST_FROM_ARRAY %out_list, %array_ptr, %length
1073
+ EXPAND LINKED_LIST_NEW %out_list
1074
+ __ll_fa_i_slot_%out_list = stack_alloc 8
1075
+ store __ll_fa_i_slot_%out_list+0, 0 as u64
1076
+ jmp L_LL_FA_HEAD_%out_list
1077
+ L_LL_FA_HEAD_%out_list:
1078
+ __ll_fa_i_%out_list = load __ll_fa_i_slot_%out_list+0 as u64
1079
+ __ll_fa_done_%out_list = eq __ll_fa_i_%out_list, %length
1080
+ br __ll_fa_done_%out_list -> L_LL_FA_DONE_%out_list, L_LL_FA_BODY_%out_list
1081
+ L_LL_FA_BODY_%out_list:
1082
+ __ll_fa_off_%out_list = mul __ll_fa_i_%out_list, 8
1083
+ __ll_fa_ptr_%out_list = ptr_add %array_ptr, __ll_fa_off_%out_list
1084
+ __ll_fa_val_%out_list = load __ll_fa_ptr_%out_list+0 as u64
1085
+ EXPAND LINKED_LIST_PUSH_BACK %out_list, __ll_fa_val_%out_list
1086
+ __ll_fa_ni_%out_list = add __ll_fa_i_%out_list, 1
1087
+ store __ll_fa_i_slot_%out_list+0, __ll_fa_ni_%out_list as u64
1088
+ !__ll_fa_ni_%out_list
1089
+ !__ll_fa_val_%out_list
1090
+ !__ll_fa_ptr_%out_list
1091
+ !__ll_fa_off_%out_list
1092
+ !__ll_fa_done_%out_list
1093
+ !__ll_fa_i_%out_list
1094
+ jmp L_LL_FA_HEAD_%out_list
1095
+ L_LL_FA_DONE_%out_list:
1096
+ !__ll_fa_done_%out_list
1097
+ !__ll_fa_i_%out_list
1098
+ [END_MACRO]
1099
+
1100
+ [MACRO] LINKED_LIST_INSERT_AFTER %list_reg, %node_reg, %value
1101
+ call @sa_linked_list_insert_after(&%list_reg, %node_reg, %value)
1102
+ [END_MACRO]
1103
+
1104
+ [MACRO] LINKED_LIST_INSERT_BEFORE %list_reg, %node_reg, %value
1105
+ call @sa_linked_list_insert_before(&%list_reg, %node_reg, %value)
1106
+ [END_MACRO]
1107
+
1108
+ [MACRO] LINKED_LIST_CLONE %out_list, %list_reg
1109
+ %out_list = call @sa_linked_list_clone(&%list_reg)
1110
+ [END_MACRO]
1111
+
1112
+ [MACRO] LINKED_LIST_EQ %out_bool, %left_list, %right_list
1113
+ %out_bool = call @sa_linked_list_eq(&%left_list, &%right_list)
1114
+ [END_MACRO]
1115
+
1116
+ [MACRO] LINKED_LIST_NE %out_bool, %left_list, %right_list
1117
+ __ll_ne_eq_%out_bool = call @sa_linked_list_eq(&%left_list, &%right_list)
1118
+ %out_bool = eq __ll_ne_eq_%out_bool, 0
1119
+ !__ll_ne_eq_%out_bool
1120
+ [END_MACRO]