@shd101wyy/yo 0.1.30 → 0.1.32

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 (36) hide show
  1. package/.github/skills/yo-syntax/syntax-cheatsheet.md +38 -0
  2. package/out/cjs/index.cjs +800 -633
  3. package/out/cjs/yo-cli.cjs +1007 -840
  4. package/out/cjs/yo-lsp.cjs +890 -723
  5. package/out/esm/index.mjs +804 -637
  6. package/out/types/src/codegen/index.d.ts +1 -1
  7. package/out/types/src/compiler-utils.d.ts +1 -1
  8. package/out/types/src/evaluator/builtins/contracts.d.ts +35 -0
  9. package/out/types/src/evaluator/memory-safety.d.ts +1 -1
  10. package/out/types/src/evaluator/types/function.d.ts +2 -0
  11. package/out/types/src/evaluator/utils/closure.d.ts +2 -1
  12. package/out/types/src/evaluator/utils.d.ts +3 -0
  13. package/out/types/src/evaluator/values/impl.d.ts +14 -0
  14. package/out/types/src/expr.d.ts +6 -0
  15. package/out/types/src/tests/contracts-comptime-violation.test.d.ts +1 -0
  16. package/out/types/src/tests/contracts-runtime-violation.test.d.ts +1 -0
  17. package/out/types/src/tests/thread-safety-codegen.test.d.ts +1 -0
  18. package/out/types/src/types/creators.d.ts +3 -1
  19. package/out/types/src/types/definitions.d.ts +2 -0
  20. package/out/types/tsconfig.tsbuildinfo +1 -1
  21. package/package.json +1 -1
  22. package/std/build.yo +5 -2
  23. package/std/imm/list.yo +1 -1
  24. package/std/imm/sorted_map.yo +1 -1
  25. package/std/libc/stdatomic.yo +285 -1
  26. package/std/prelude.yo +56 -3
  27. package/std/spec/numeric.yo +30 -0
  28. package/std/spec/refine.yo +43 -0
  29. package/std/string/rune.yo +4 -0
  30. package/std/sync/atomic.yo +557 -0
  31. package/std/sync/channel.yo +57 -42
  32. package/std/sync/cond.yo +7 -3
  33. package/std/sync/mutex.yo +75 -15
  34. package/std/sync/once.yo +25 -19
  35. package/std/sync/rwlock.yo +18 -15
  36. package/std/sync/waitgroup.yo +25 -16
@@ -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
+ );