@shd101wyy/yo 0.1.29 → 0.1.31

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 (186) hide show
  1. package/.github/skills/yo-async-effects/SKILL.md +3 -3
  2. package/.github/skills/yo-async-effects/async-effects-recipes.md +19 -11
  3. package/.github/skills/yo-core-patterns/core-patterns-cheatsheet.md +33 -13
  4. package/.github/skills/yo-project-workflow/workflow-cheatsheet.md +1 -1
  5. package/.github/skills/yo-syntax/syntax-cheatsheet.md +59 -21
  6. package/README.md +4 -3
  7. package/out/cjs/index.cjs +964 -710
  8. package/out/cjs/yo-cli.cjs +1119 -855
  9. package/out/cjs/yo-lsp.cjs +1003 -749
  10. package/out/esm/index.mjs +964 -710
  11. package/out/types/src/codegen/exprs/async.d.ts +2 -0
  12. package/out/types/src/codegen/exprs/await.d.ts +1 -0
  13. package/out/types/src/codegen/exprs/closures.d.ts +4 -0
  14. package/out/types/src/codegen/functions/context.d.ts +6 -0
  15. package/out/types/src/codegen/index.d.ts +1 -1
  16. package/out/types/src/compiler-utils.d.ts +1 -1
  17. package/out/types/src/env.d.ts +2 -0
  18. package/out/types/src/evaluator/builtins/pragma.d.ts +9 -0
  19. package/out/types/src/evaluator/builtins/unsafe.d.ts +8 -0
  20. package/out/types/src/evaluator/context.d.ts +2 -0
  21. package/out/types/src/evaluator/index.d.ts +1 -1
  22. package/out/types/src/evaluator/memory-safety.d.ts +14 -0
  23. package/out/types/src/evaluator/types/flowability.d.ts +6 -0
  24. package/out/types/src/evaluator/utils/closure.d.ts +2 -1
  25. package/out/types/src/evaluator/utils.d.ts +3 -0
  26. package/out/types/src/evaluator/values/impl.d.ts +14 -0
  27. package/out/types/src/expr-traversal.d.ts +1 -0
  28. package/out/types/src/expr.d.ts +4 -1
  29. package/out/types/src/public-safe-report.d.ts +19 -0
  30. package/out/types/src/tests/comptime-ref-gate.test.d.ts +1 -0
  31. package/out/types/src/tests/pragma-validation.test.d.ts +1 -0
  32. package/out/types/src/tests/public-safe-report.test.d.ts +1 -0
  33. package/out/types/src/tests/thread-safety-codegen.test.d.ts +1 -0
  34. package/out/types/src/tests/type-representation-pointer.test.d.ts +1 -0
  35. package/out/types/src/tests/unsafe-gate.test.d.ts +1 -0
  36. package/out/types/src/tests/unsafe-report-classify.test.d.ts +1 -0
  37. package/out/types/src/types/definitions.d.ts +2 -0
  38. package/out/types/src/types/utils.d.ts +4 -0
  39. package/out/types/src/unsafe-report.d.ts +29 -0
  40. package/out/types/src/value.d.ts +1 -0
  41. package/out/types/tsconfig.tsbuildinfo +1 -1
  42. package/package.json +1 -1
  43. package/scripts/add-pragma-for-pointer-decls.ts +134 -0
  44. package/scripts/add-pragma.ts +58 -0
  45. package/scripts/migrate-amp-method-calls.ts +186 -0
  46. package/scripts/migrate-clone-calls.ts +93 -0
  47. package/scripts/migrate-get-unwrap.ts +166 -0
  48. package/scripts/migrate-index-patterns.ts +210 -0
  49. package/scripts/migrate-index-trait.ts +142 -0
  50. package/scripts/migrate-iterator.ts +150 -0
  51. package/scripts/migrate-self-ptr.ts +220 -0
  52. package/scripts/migrate-skip-pragmas.ts +109 -0
  53. package/scripts/migrate-tostring.ts +134 -0
  54. package/scripts/trim-pragma.ts +130 -0
  55. package/scripts/wrap-extern-calls.ts +161 -0
  56. package/std/alg/hash.yo +3 -2
  57. package/std/allocator.yo +6 -5
  58. package/std/async.yo +2 -2
  59. package/std/build.yo +5 -2
  60. package/std/collections/array_list.yo +59 -40
  61. package/std/collections/btree_map.yo +19 -18
  62. package/std/collections/deque.yo +9 -8
  63. package/std/collections/hash_map.yo +101 -13
  64. package/std/collections/hash_set.yo +5 -4
  65. package/std/collections/linked_list.yo +39 -4
  66. package/std/collections/ordered_map.yo +3 -3
  67. package/std/collections/priority_queue.yo +14 -13
  68. package/std/crypto/md5.yo +2 -1
  69. package/std/crypto/random.yo +16 -15
  70. package/std/crypto/sha256.yo +2 -1
  71. package/std/encoding/base64.yo +14 -14
  72. package/std/encoding/hex.yo +3 -3
  73. package/std/encoding/json.yo +59 -10
  74. package/std/encoding/punycode.yo +24 -23
  75. package/std/encoding/toml.yo +4 -3
  76. package/std/encoding/utf16.yo +2 -2
  77. package/std/env.yo +43 -28
  78. package/std/error.yo +6 -6
  79. package/std/fmt/display.yo +2 -2
  80. package/std/fmt/index.yo +6 -5
  81. package/std/fmt/to_string.yo +39 -38
  82. package/std/fmt/writer.yo +9 -8
  83. package/std/fs/dir.yo +34 -33
  84. package/std/fs/file.yo +52 -51
  85. package/std/fs/metadata.yo +10 -9
  86. package/std/fs/temp.yo +24 -13
  87. package/std/fs/walker.yo +10 -9
  88. package/std/gc.yo +1 -0
  89. package/std/glob.yo +7 -7
  90. package/std/http/client.yo +15 -14
  91. package/std/http/http.yo +6 -6
  92. package/std/http/index.yo +1 -1
  93. package/std/imm/list.yo +34 -1
  94. package/std/imm/map.yo +2 -1
  95. package/std/imm/set.yo +1 -0
  96. package/std/imm/sorted_map.yo +2 -1
  97. package/std/imm/sorted_set.yo +1 -0
  98. package/std/imm/string.yo +27 -23
  99. package/std/imm/vec.yo +18 -2
  100. package/std/io/reader.yo +2 -1
  101. package/std/io/writer.yo +3 -2
  102. package/std/libc/assert.yo +1 -0
  103. package/std/libc/ctype.yo +1 -0
  104. package/std/libc/dirent.yo +1 -0
  105. package/std/libc/errno.yo +1 -0
  106. package/std/libc/fcntl.yo +1 -0
  107. package/std/libc/float.yo +1 -0
  108. package/std/libc/limits.yo +1 -0
  109. package/std/libc/math.yo +1 -0
  110. package/std/libc/signal.yo +1 -0
  111. package/std/libc/stdatomic.yo +251 -1
  112. package/std/libc/stdint.yo +1 -0
  113. package/std/libc/stdio.yo +1 -0
  114. package/std/libc/stdlib.yo +1 -0
  115. package/std/libc/string.yo +1 -0
  116. package/std/libc/sys/stat.yo +1 -0
  117. package/std/libc/time.yo +1 -0
  118. package/std/libc/unistd.yo +1 -0
  119. package/std/libc/wctype.yo +1 -0
  120. package/std/libc/windows.yo +2 -0
  121. package/std/log.yo +7 -6
  122. package/std/net/addr.yo +5 -4
  123. package/std/net/dns.yo +7 -6
  124. package/std/net/errors.yo +8 -8
  125. package/std/net/tcp.yo +19 -18
  126. package/std/net/udp.yo +13 -12
  127. package/std/os/signal.yo +3 -3
  128. package/std/path.yo +1 -0
  129. package/std/prelude.yo +398 -184
  130. package/std/process/command.yo +40 -23
  131. package/std/process/index.yo +2 -1
  132. package/std/regex/compiler.yo +10 -9
  133. package/std/regex/index.yo +41 -41
  134. package/std/regex/match.yo +2 -2
  135. package/std/regex/parser.yo +21 -21
  136. package/std/regex/vm.yo +42 -41
  137. package/std/string/rune.yo +4 -0
  138. package/std/string/string.yo +95 -40
  139. package/std/string/string_builder.yo +9 -9
  140. package/std/string/unicode.yo +50 -49
  141. package/std/sync/atomic.yo +557 -0
  142. package/std/sync/channel.yo +59 -43
  143. package/std/sync/cond.yo +12 -7
  144. package/std/sync/mutex.yo +79 -18
  145. package/std/sync/once.yo +25 -19
  146. package/std/sync/rwlock.yo +18 -15
  147. package/std/sync/waitgroup.yo +25 -16
  148. package/std/sys/advise.yo +1 -0
  149. package/std/sys/bufio/buf_reader.yo +17 -16
  150. package/std/sys/bufio/buf_writer.yo +10 -9
  151. package/std/sys/clock.yo +1 -0
  152. package/std/sys/copy.yo +1 -0
  153. package/std/sys/dir.yo +10 -9
  154. package/std/sys/dns.yo +6 -5
  155. package/std/sys/errors.yo +11 -11
  156. package/std/sys/events.yo +1 -0
  157. package/std/sys/externs.yo +38 -37
  158. package/std/sys/file.yo +17 -16
  159. package/std/sys/future.yo +4 -3
  160. package/std/sys/iov.yo +1 -0
  161. package/std/sys/mmap.yo +1 -0
  162. package/std/sys/path.yo +1 -0
  163. package/std/sys/perm.yo +2 -1
  164. package/std/sys/pipe.yo +1 -0
  165. package/std/sys/process.yo +5 -4
  166. package/std/sys/signal.yo +1 -0
  167. package/std/sys/socketpair.yo +1 -0
  168. package/std/sys/sockinfo.yo +1 -0
  169. package/std/sys/statfs.yo +2 -1
  170. package/std/sys/statx.yo +1 -0
  171. package/std/sys/sysinfo.yo +1 -0
  172. package/std/sys/tcp.yo +15 -14
  173. package/std/sys/temp.yo +1 -0
  174. package/std/sys/time.yo +2 -1
  175. package/std/sys/timer.yo +6 -6
  176. package/std/sys/tty.yo +2 -1
  177. package/std/sys/udp.yo +13 -12
  178. package/std/sys/unix.yo +12 -11
  179. package/std/testing/bench.yo +4 -3
  180. package/std/thread.yo +7 -6
  181. package/std/time/datetime.yo +18 -15
  182. package/std/time/duration.yo +11 -10
  183. package/std/time/instant.yo +4 -4
  184. package/std/time/sleep.yo +1 -0
  185. package/std/url/index.yo +3 -3
  186. package/std/worker.yo +4 -3
@@ -0,0 +1,557 @@
1
+ //! High-level `Atomic*` wrappers for thread-safe shared mutable values.
2
+ pragma(Pragma.AllowUnsafe);
3
+
4
+ {
5
+ atomic_bool,
6
+ atomic_int,
7
+ atomic_size_t,
8
+ atomic_llong,
9
+ atomic_schar,
10
+ atomic_short,
11
+ atomic_uchar,
12
+ atomic_ushort,
13
+ atomic_uint,
14
+ atomic_ullong,
15
+ atomic_ptrdiff_t,
16
+ atomic_load_explicit,
17
+ atomic_store_explicit,
18
+ atomic_exchange_explicit,
19
+ atomic_compare_exchange_strong_explicit,
20
+ atomic_fetch_add_explicit,
21
+ atomic_fetch_sub_explicit,
22
+ __yo_atomic_load_int,
23
+ __yo_atomic_store_int,
24
+ __yo_atomic_exchange_int,
25
+ __yo_atomic_compare_exchange_int,
26
+ __yo_atomic_load_size_t,
27
+ __yo_atomic_store_size_t,
28
+ __yo_atomic_exchange_size_t,
29
+ __yo_atomic_compare_exchange_size_t,
30
+ __yo_atomic_load_llong,
31
+ __yo_atomic_store_llong,
32
+ __yo_atomic_exchange_llong,
33
+ __yo_atomic_compare_exchange_llong,
34
+ __yo_atomic_load_schar,
35
+ __yo_atomic_store_schar,
36
+ __yo_atomic_exchange_schar,
37
+ __yo_atomic_compare_exchange_schar,
38
+ __yo_atomic_load_short,
39
+ __yo_atomic_store_short,
40
+ __yo_atomic_exchange_short,
41
+ __yo_atomic_compare_exchange_short,
42
+ __yo_atomic_load_uchar,
43
+ __yo_atomic_store_uchar,
44
+ __yo_atomic_exchange_uchar,
45
+ __yo_atomic_compare_exchange_uchar,
46
+ __yo_atomic_load_ushort,
47
+ __yo_atomic_store_ushort,
48
+ __yo_atomic_exchange_ushort,
49
+ __yo_atomic_compare_exchange_ushort,
50
+ __yo_atomic_load_uint,
51
+ __yo_atomic_store_uint,
52
+ __yo_atomic_exchange_uint,
53
+ __yo_atomic_compare_exchange_uint,
54
+ __yo_atomic_load_ullong,
55
+ __yo_atomic_store_ullong,
56
+ __yo_atomic_exchange_ullong,
57
+ __yo_atomic_compare_exchange_ullong,
58
+ __yo_atomic_load_ptrdiff,
59
+ __yo_atomic_store_ptrdiff,
60
+ __yo_atomic_exchange_ptrdiff,
61
+ __yo_atomic_compare_exchange_ptrdiff,
62
+ memory_order,
63
+ memory_order_relaxed,
64
+ memory_order_consume,
65
+ memory_order_acquire,
66
+ memory_order_release,
67
+ memory_order_acq_rel,
68
+ memory_order_seq_cst
69
+ } :: import("std/libc/stdatomic");
70
+
71
+ MemoryOrder :: enum(Relaxed, Consume, Acquire, Release, AcqRel, SeqCst);
72
+ impl(
73
+ MemoryOrder,
74
+ to_c_order : (fn(self : Self) -> memory_order)(
75
+ match(
76
+ self,
77
+ (.Relaxed) => memory_order_relaxed,
78
+ (.Consume) => memory_order_consume,
79
+ (.Acquire) => memory_order_acquire,
80
+ (.Release) => memory_order_release,
81
+ (.AcqRel) => memory_order_acq_rel,
82
+ (.SeqCst) => memory_order_seq_cst
83
+ )
84
+ )
85
+ );
86
+
87
+ // ============================================================================
88
+ // AtomicBool
89
+ // ============================================================================
90
+ AtomicBool :: atomic(object((*) : atomic_bool));
91
+ impl(
92
+ AtomicBool,
93
+ new : (fn(value : bool) -> Self)({
94
+ v := Self(false);
95
+ cond(value => unsafe(atomic_store_explicit(&(v.*), true, memory_order_release)), true => ());
96
+ v
97
+ }),
98
+ load : (fn(ref(self) : Self, order : MemoryOrder) -> bool)(
99
+ unsafe(atomic_load_explicit(&(self.*), order.to_c_order())) == true
100
+ ),
101
+ store : (fn(ref(self) : Self, value : bool, order : MemoryOrder) -> unit)(
102
+ unsafe(atomic_store_explicit(&(self.*), value, order.to_c_order()))
103
+ ),
104
+ swap : (fn(ref(self) : Self, value : bool, order : MemoryOrder) -> bool)(
105
+ unsafe(atomic_exchange_explicit(&(self.*), value, order.to_c_order())) == true
106
+ ),
107
+ compare_exchange : (
108
+ fn(
109
+ ref(self) : Self,
110
+ ref(expected) : bool,
111
+ new_value : bool,
112
+ success : MemoryOrder,
113
+ failure : MemoryOrder
114
+ ) -> bool
115
+ )(
116
+ unsafe(
117
+ atomic_compare_exchange_strong_explicit(
118
+ &(self.*),
119
+ &(expected),
120
+ new_value,
121
+ success.to_c_order(),
122
+ failure.to_c_order()
123
+ )
124
+ )
125
+ )
126
+ );
127
+
128
+ // ============================================================================
129
+ // AtomicI8
130
+ // ============================================================================
131
+ AtomicI8 :: atomic(object((*) : atomic_schar));
132
+ impl(
133
+ AtomicI8,
134
+ new : (fn(value : i8) -> Self)({
135
+ v := Self(i8(0));
136
+ unsafe(__yo_atomic_store_schar(&(v.*), value, memory_order_release));
137
+ v
138
+ }),
139
+ load : (fn(ref(self) : Self, order : MemoryOrder) -> i8)(
140
+ unsafe(i8(__yo_atomic_load_schar(&(self.*), order.to_c_order())))
141
+ ),
142
+ store : (fn(ref(self) : Self, value : i8, order : MemoryOrder) -> unit)(
143
+ unsafe(__yo_atomic_store_schar(&(self.*), value, order.to_c_order()))
144
+ ),
145
+ swap : (fn(ref(self) : Self, value : i8, order : MemoryOrder) -> i8)(
146
+ unsafe(i8(__yo_atomic_exchange_schar(&(self.*), value, order.to_c_order())))
147
+ ),
148
+ compare_exchange : (
149
+ fn(
150
+ ref(self) : Self,
151
+ ref(expected) : i8,
152
+ new_value : i8,
153
+ success : MemoryOrder,
154
+ failure : MemoryOrder
155
+ ) -> bool
156
+ )(
157
+ unsafe(
158
+ __yo_atomic_compare_exchange_schar(
159
+ &(self.*),
160
+ &(expected),
161
+ new_value,
162
+ success.to_c_order(),
163
+ failure.to_c_order()
164
+ )
165
+ )
166
+ )
167
+ );
168
+
169
+ // ============================================================================
170
+ // AtomicI16
171
+ // ============================================================================
172
+ AtomicI16 :: atomic(object((*) : atomic_short));
173
+ impl(
174
+ AtomicI16,
175
+ new : (fn(value : i16) -> Self)({
176
+ v := Self(i16(0));
177
+ unsafe(__yo_atomic_store_short(&(v.*), value, memory_order_release));
178
+ v
179
+ }),
180
+ load : (fn(ref(self) : Self, order : MemoryOrder) -> i16)(
181
+ unsafe(i16(__yo_atomic_load_short(&(self.*), order.to_c_order())))
182
+ ),
183
+ store : (fn(ref(self) : Self, value : i16, order : MemoryOrder) -> unit)(
184
+ unsafe(__yo_atomic_store_short(&(self.*), value, order.to_c_order()))
185
+ ),
186
+ swap : (fn(ref(self) : Self, value : i16, order : MemoryOrder) -> i16)(
187
+ unsafe(i16(__yo_atomic_exchange_short(&(self.*), value, order.to_c_order())))
188
+ ),
189
+ compare_exchange : (
190
+ fn(
191
+ ref(self) : Self,
192
+ ref(expected) : i16,
193
+ new_value : i16,
194
+ success : MemoryOrder,
195
+ failure : MemoryOrder
196
+ ) -> bool
197
+ )(
198
+ unsafe(
199
+ __yo_atomic_compare_exchange_short(
200
+ &(self.*),
201
+ &(expected),
202
+ new_value,
203
+ success.to_c_order(),
204
+ failure.to_c_order()
205
+ )
206
+ )
207
+ )
208
+ );
209
+
210
+ // ============================================================================
211
+ // AtomicI32
212
+ // ============================================================================
213
+ AtomicI32 :: atomic(object((*) : atomic_int));
214
+ impl(
215
+ AtomicI32,
216
+ new : (fn(value : i32) -> Self)({
217
+ v := Self(i32(0));
218
+ unsafe(__yo_atomic_store_int(&(v.*), value, memory_order_release));
219
+ v
220
+ }),
221
+ load : (fn(ref(self) : Self, order : MemoryOrder) -> i32)(
222
+ unsafe(i32(__yo_atomic_load_int(&(self.*), order.to_c_order())))
223
+ ),
224
+ store : (fn(ref(self) : Self, value : i32, order : MemoryOrder) -> unit)(
225
+ unsafe(__yo_atomic_store_int(&(self.*), value, order.to_c_order()))
226
+ ),
227
+ fetch_add : (fn(ref(self) : Self, value : i32, order : MemoryOrder) -> i32)(
228
+ unsafe(i32(atomic_fetch_add_explicit(&(self.*), int(value), order.to_c_order())))
229
+ ),
230
+ fetch_sub : (fn(ref(self) : Self, value : i32, order : MemoryOrder) -> i32)(
231
+ unsafe(i32(atomic_fetch_sub_explicit(&(self.*), int(value), order.to_c_order())))
232
+ ),
233
+ swap : (fn(ref(self) : Self, value : i32, order : MemoryOrder) -> i32)(
234
+ unsafe(i32(__yo_atomic_exchange_int(&(self.*), value, order.to_c_order())))
235
+ ),
236
+ compare_exchange : (
237
+ fn(
238
+ ref(self) : Self,
239
+ ref(expected) : i32,
240
+ new_value : i32,
241
+ success : MemoryOrder,
242
+ failure : MemoryOrder
243
+ ) -> bool
244
+ )(
245
+ unsafe(
246
+ __yo_atomic_compare_exchange_int(
247
+ &(self.*),
248
+ &(expected),
249
+ new_value,
250
+ success.to_c_order(),
251
+ failure.to_c_order()
252
+ )
253
+ )
254
+ )
255
+ );
256
+
257
+ // ============================================================================
258
+ // AtomicI64
259
+ // ============================================================================
260
+ AtomicI64 :: atomic(object((*) : atomic_llong));
261
+ impl(
262
+ AtomicI64,
263
+ new : (fn(value : i64) -> Self)({
264
+ v := Self(i64(0));
265
+ unsafe(__yo_atomic_store_llong(&(v.*), value, memory_order_release));
266
+ v
267
+ }),
268
+ load : (fn(ref(self) : Self, order : MemoryOrder) -> i64)(
269
+ unsafe(i64(__yo_atomic_load_llong(&(self.*), order.to_c_order())))
270
+ ),
271
+ store : (fn(ref(self) : Self, value : i64, order : MemoryOrder) -> unit)(
272
+ unsafe(__yo_atomic_store_llong(&(self.*), value, order.to_c_order()))
273
+ ),
274
+ swap : (fn(ref(self) : Self, value : i64, order : MemoryOrder) -> i64)(
275
+ unsafe(i64(__yo_atomic_exchange_llong(&(self.*), value, order.to_c_order())))
276
+ ),
277
+ compare_exchange : (
278
+ fn(
279
+ ref(self) : Self,
280
+ ref(expected) : i64,
281
+ new_value : i64,
282
+ success : MemoryOrder,
283
+ failure : MemoryOrder
284
+ ) -> bool
285
+ )(
286
+ unsafe(
287
+ __yo_atomic_compare_exchange_llong(
288
+ &(self.*),
289
+ &(expected),
290
+ new_value,
291
+ success.to_c_order(),
292
+ failure.to_c_order()
293
+ )
294
+ )
295
+ )
296
+ );
297
+
298
+ // ============================================================================
299
+ // AtomicU8
300
+ // ============================================================================
301
+ AtomicU8 :: atomic(object((*) : atomic_uchar));
302
+ impl(
303
+ AtomicU8,
304
+ new : (fn(value : u8) -> Self)({
305
+ v := Self(u8(0));
306
+ unsafe(__yo_atomic_store_uchar(&(v.*), value, memory_order_release));
307
+ v
308
+ }),
309
+ load : (fn(ref(self) : Self, order : MemoryOrder) -> u8)(
310
+ unsafe(u8(__yo_atomic_load_uchar(&(self.*), order.to_c_order())))
311
+ ),
312
+ store : (fn(ref(self) : Self, value : u8, order : MemoryOrder) -> unit)(
313
+ unsafe(__yo_atomic_store_uchar(&(self.*), value, order.to_c_order()))
314
+ ),
315
+ swap : (fn(ref(self) : Self, value : u8, order : MemoryOrder) -> u8)(
316
+ unsafe(u8(__yo_atomic_exchange_uchar(&(self.*), value, order.to_c_order())))
317
+ ),
318
+ compare_exchange : (
319
+ fn(
320
+ ref(self) : Self,
321
+ ref(expected) : u8,
322
+ new_value : u8,
323
+ success : MemoryOrder,
324
+ failure : MemoryOrder
325
+ ) -> bool
326
+ )(
327
+ unsafe(
328
+ __yo_atomic_compare_exchange_uchar(
329
+ &(self.*),
330
+ &(expected),
331
+ new_value,
332
+ success.to_c_order(),
333
+ failure.to_c_order()
334
+ )
335
+ )
336
+ )
337
+ );
338
+
339
+ // ============================================================================
340
+ // AtomicU16
341
+ // ============================================================================
342
+ AtomicU16 :: atomic(object((*) : atomic_ushort));
343
+ impl(
344
+ AtomicU16,
345
+ new : (fn(value : u16) -> Self)({
346
+ v := Self(u16(0));
347
+ unsafe(__yo_atomic_store_ushort(&(v.*), value, memory_order_release));
348
+ v
349
+ }),
350
+ load : (fn(ref(self) : Self, order : MemoryOrder) -> u16)(
351
+ unsafe(u16(__yo_atomic_load_ushort(&(self.*), order.to_c_order())))
352
+ ),
353
+ store : (fn(ref(self) : Self, value : u16, order : MemoryOrder) -> unit)(
354
+ unsafe(__yo_atomic_store_ushort(&(self.*), value, order.to_c_order()))
355
+ ),
356
+ swap : (fn(ref(self) : Self, value : u16, order : MemoryOrder) -> u16)(
357
+ unsafe(u16(__yo_atomic_exchange_ushort(&(self.*), value, order.to_c_order())))
358
+ ),
359
+ compare_exchange : (
360
+ fn(
361
+ ref(self) : Self,
362
+ ref(expected) : u16,
363
+ new_value : u16,
364
+ success : MemoryOrder,
365
+ failure : MemoryOrder
366
+ ) -> bool
367
+ )(
368
+ unsafe(
369
+ __yo_atomic_compare_exchange_ushort(
370
+ &(self.*),
371
+ &(expected),
372
+ new_value,
373
+ success.to_c_order(),
374
+ failure.to_c_order()
375
+ )
376
+ )
377
+ )
378
+ );
379
+
380
+ // ============================================================================
381
+ // AtomicU32
382
+ // ============================================================================
383
+ AtomicU32 :: atomic(object((*) : atomic_uint));
384
+ impl(
385
+ AtomicU32,
386
+ new : (fn(value : u32) -> Self)({
387
+ v := Self(u32(0));
388
+ unsafe(__yo_atomic_store_uint(&(v.*), value, memory_order_release));
389
+ v
390
+ }),
391
+ load : (fn(ref(self) : Self, order : MemoryOrder) -> u32)(
392
+ unsafe(u32(__yo_atomic_load_uint(&(self.*), order.to_c_order())))
393
+ ),
394
+ store : (fn(ref(self) : Self, value : u32, order : MemoryOrder) -> unit)(
395
+ unsafe(__yo_atomic_store_uint(&(self.*), value, order.to_c_order()))
396
+ ),
397
+ swap : (fn(ref(self) : Self, value : u32, order : MemoryOrder) -> u32)(
398
+ unsafe(u32(__yo_atomic_exchange_uint(&(self.*), value, order.to_c_order())))
399
+ ),
400
+ compare_exchange : (
401
+ fn(
402
+ ref(self) : Self,
403
+ ref(expected) : u32,
404
+ new_value : u32,
405
+ success : MemoryOrder,
406
+ failure : MemoryOrder
407
+ ) -> bool
408
+ )(
409
+ unsafe(
410
+ __yo_atomic_compare_exchange_uint(
411
+ &(self.*),
412
+ &(expected),
413
+ new_value,
414
+ success.to_c_order(),
415
+ failure.to_c_order()
416
+ )
417
+ )
418
+ )
419
+ );
420
+
421
+ // ============================================================================
422
+ // AtomicU64
423
+ // ============================================================================
424
+ AtomicU64 :: atomic(object((*) : atomic_ullong));
425
+ impl(
426
+ AtomicU64,
427
+ new : (fn(value : u64) -> Self)({
428
+ v := Self(u64(0));
429
+ unsafe(__yo_atomic_store_ullong(&(v.*), value, memory_order_release));
430
+ v
431
+ }),
432
+ load : (fn(ref(self) : Self, order : MemoryOrder) -> u64)(
433
+ unsafe(u64(__yo_atomic_load_ullong(&(self.*), order.to_c_order())))
434
+ ),
435
+ store : (fn(ref(self) : Self, value : u64, order : MemoryOrder) -> unit)(
436
+ unsafe(__yo_atomic_store_ullong(&(self.*), value, order.to_c_order()))
437
+ ),
438
+ swap : (fn(ref(self) : Self, value : u64, order : MemoryOrder) -> u64)(
439
+ unsafe(u64(__yo_atomic_exchange_ullong(&(self.*), value, order.to_c_order())))
440
+ ),
441
+ compare_exchange : (
442
+ fn(
443
+ ref(self) : Self,
444
+ ref(expected) : u64,
445
+ new_value : u64,
446
+ success : MemoryOrder,
447
+ failure : MemoryOrder
448
+ ) -> bool
449
+ )(
450
+ unsafe(
451
+ __yo_atomic_compare_exchange_ullong(
452
+ &(self.*),
453
+ &(expected),
454
+ new_value,
455
+ success.to_c_order(),
456
+ failure.to_c_order()
457
+ )
458
+ )
459
+ )
460
+ );
461
+
462
+ // ============================================================================
463
+ // AtomicUsize
464
+ // ============================================================================
465
+ AtomicUsize :: atomic(object((*) : atomic_size_t));
466
+ impl(
467
+ AtomicUsize,
468
+ new : (fn(value : usize) -> Self)({
469
+ v := Self(usize(0));
470
+ unsafe(__yo_atomic_store_size_t(&(v.*), value, memory_order_release));
471
+ v
472
+ }),
473
+ load : (fn(ref(self) : Self, order : MemoryOrder) -> usize)(
474
+ unsafe(usize(__yo_atomic_load_size_t(&(self.*), order.to_c_order())))
475
+ ),
476
+ store : (fn(ref(self) : Self, value : usize, order : MemoryOrder) -> unit)(
477
+ unsafe(__yo_atomic_store_size_t(&(self.*), value, order.to_c_order()))
478
+ ),
479
+ swap : (fn(ref(self) : Self, value : usize, order : MemoryOrder) -> usize)(
480
+ unsafe(usize(__yo_atomic_exchange_size_t(&(self.*), value, order.to_c_order())))
481
+ ),
482
+ compare_exchange : (
483
+ fn(
484
+ ref(self) : Self,
485
+ ref(expected) : usize,
486
+ new_value : usize,
487
+ success : MemoryOrder,
488
+ failure : MemoryOrder
489
+ ) -> bool
490
+ )(
491
+ unsafe(
492
+ __yo_atomic_compare_exchange_size_t(
493
+ &(self.*),
494
+ &(expected),
495
+ new_value,
496
+ success.to_c_order(),
497
+ failure.to_c_order()
498
+ )
499
+ )
500
+ )
501
+ );
502
+
503
+ // ============================================================================
504
+ // AtomicIsize
505
+ // ============================================================================
506
+ AtomicIsize :: atomic(object((*) : atomic_ptrdiff_t));
507
+ impl(
508
+ AtomicIsize,
509
+ new : (fn(value : isize) -> Self)({
510
+ v := Self(isize(0));
511
+ unsafe(__yo_atomic_store_ptrdiff(&(v.*), value, memory_order_release));
512
+ v
513
+ }),
514
+ load : (fn(ref(self) : Self, order : MemoryOrder) -> isize)(
515
+ unsafe(isize(__yo_atomic_load_ptrdiff(&(self.*), order.to_c_order())))
516
+ ),
517
+ store : (fn(ref(self) : Self, value : isize, order : MemoryOrder) -> unit)(
518
+ unsafe(__yo_atomic_store_ptrdiff(&(self.*), value, order.to_c_order()))
519
+ ),
520
+ swap : (fn(ref(self) : Self, value : isize, order : MemoryOrder) -> isize)(
521
+ unsafe(isize(__yo_atomic_exchange_ptrdiff(&(self.*), value, order.to_c_order())))
522
+ ),
523
+ compare_exchange : (
524
+ fn(
525
+ ref(self) : Self,
526
+ ref(expected) : isize,
527
+ new_value : isize,
528
+ success : MemoryOrder,
529
+ failure : MemoryOrder
530
+ ) -> bool
531
+ )(
532
+ unsafe(
533
+ __yo_atomic_compare_exchange_ptrdiff(
534
+ &(self.*),
535
+ &(expected),
536
+ new_value,
537
+ success.to_c_order(),
538
+ failure.to_c_order()
539
+ )
540
+ )
541
+ )
542
+ );
543
+
544
+ export(
545
+ AtomicBool,
546
+ AtomicI8,
547
+ AtomicI16,
548
+ AtomicI32,
549
+ AtomicI64,
550
+ AtomicU8,
551
+ AtomicU16,
552
+ AtomicU32,
553
+ AtomicU64,
554
+ AtomicUsize,
555
+ AtomicIsize,
556
+ MemoryOrder
557
+ );