struct_scalpel/impls/std/
sync.rs

1use std::{sync::{OnceLock, Once, Arc, atomic}, cell::UnsafeCell, mem::MaybeUninit, marker::PhantomData, ptr::NonNull};
2
3use crate::{Dissectible, impl_mirror_mock};
4
5
6#[derive(Dissectible)]
7struct MockOnceLock<T> {
8    once: Once,
9    value: UnsafeCell<MaybeUninit<T>>,
10    _marker: PhantomData<T>,
11}
12impl_mirror_mock!(with <T>: MockOnceLock<T> => OnceLock<T>);
13
14#[repr(C)]
15/// This is a dummy copy of the internal type ArcInner<T>, used as a field in Arc<T>, which is shadowed by the public dummy::ArcInner<T> and can be unsized
16struct ArcInner<T> where T: ?Sized {
17    strong: atomic::AtomicUsize,
18    weak: atomic::AtomicUsize,
19    data: T,
20}
21
22#[derive(Dissectible)]
23pub struct MockArc<T> {
24    ptr: NonNull<ArcInner<T>>,
25    phantom: PhantomData<ArcInner<T>>,
26}
27impl_mirror_mock!(with <T>: MockArc<T> => Arc<T>);
28
29pub mod dummy {
30    use std::sync::atomic;
31
32    use struct_scalpel_proc_macro::Dissectible;
33
34    #[derive(Dissectible)]
35    #[repr(C)]
36    /// This is a dummy copy of the internal type ArcInner<T>, used as a field in Arc<T>
37    pub struct ArcInner<T> {
38        strong: atomic::AtomicUsize,
39        weak: atomic::AtomicUsize,
40        data: T,
41    }
42}