Sha256: 1a246e08a63c06cd8ad934bd7da229421bf804f991ae93cd7e242da27ca6c601

Contents?: true

Size: 1.33 KB

Versions: 59

Compression:

Stored size: 1.33 KB

Contents

// Extracted from the scopeguard crate
use core::{
    mem::ManuallyDrop,
    ops::{Deref, DerefMut},
    ptr,
};

pub struct ScopeGuard<T, F>
where
    F: FnMut(&mut T),
{
    dropfn: F,
    value: T,
}

#[inline]
pub fn guard<T, F>(value: T, dropfn: F) -> ScopeGuard<T, F>
where
    F: FnMut(&mut T),
{
    ScopeGuard { dropfn, value }
}

impl<T, F> ScopeGuard<T, F>
where
    F: FnMut(&mut T),
{
    #[inline]
    pub fn into_inner(guard: Self) -> T {
        // Cannot move out of Drop-implementing types, so
        // ptr::read the value out of a ManuallyDrop<Self>
        // Don't use mem::forget as that might invalidate value
        let guard = ManuallyDrop::new(guard);
        unsafe {
            let value = ptr::read(&guard.value);
            // read the closure so that it is dropped
            let _ = ptr::read(&guard.dropfn);
            value
        }
    }
}

impl<T, F> Deref for ScopeGuard<T, F>
where
    F: FnMut(&mut T),
{
    type Target = T;
    #[inline]
    fn deref(&self) -> &T {
        &self.value
    }
}

impl<T, F> DerefMut for ScopeGuard<T, F>
where
    F: FnMut(&mut T),
{
    #[inline]
    fn deref_mut(&mut self) -> &mut T {
        &mut self.value
    }
}

impl<T, F> Drop for ScopeGuard<T, F>
where
    F: FnMut(&mut T),
{
    #[inline]
    fn drop(&mut self) {
        (self.dropfn)(&mut self.value);
    }
}

Version data entries

59 entries across 33 versions & 1 rubygems

Version Path
wasmtime-29.0.0 ./ext/cargo-vendor/hashbrown-0.15.2/src/scopeguard.rs
wasmtime-29.0.0 ./ext/cargo-vendor/hashbrown-0.14.5/src/scopeguard.rs
wasmtime-28.0.0 ./ext/cargo-vendor/hashbrown-0.14.5/src/scopeguard.rs
wasmtime-28.0.0 ./ext/cargo-vendor/hashbrown-0.15.2/src/scopeguard.rs
wasmtime-27.0.0 ./ext/cargo-vendor/hashbrown-0.15.1/src/scopeguard.rs
wasmtime-27.0.0 ./ext/cargo-vendor/hashbrown-0.14.5/src/scopeguard.rs
wasmtime-26.0.0 ./ext/cargo-vendor/hashbrown-0.15.0/src/scopeguard.rs
wasmtime-26.0.0 ./ext/cargo-vendor/hashbrown-0.14.5/src/scopeguard.rs
wasmtime-25.0.2 ./ext/cargo-vendor/hashbrown-0.14.5/src/scopeguard.rs
wasmtime-25.0.1 ./ext/cargo-vendor/hashbrown-0.14.5/src/scopeguard.rs
wasmtime-25.0.0 ./ext/cargo-vendor/hashbrown-0.14.5/src/scopeguard.rs
wasmtime-24.0.0 ./ext/cargo-vendor/hashbrown-0.14.5/src/scopeguard.rs
wasmtime-24.0.0 ./ext/cargo-vendor/hashbrown-0.13.2/src/scopeguard.rs
wasmtime-23.0.2 ./ext/cargo-vendor/hashbrown-0.13.2/src/scopeguard.rs
wasmtime-23.0.2 ./ext/cargo-vendor/hashbrown-0.14.3/src/scopeguard.rs
wasmtime-22.0.0 ./ext/cargo-vendor/hashbrown-0.13.2/src/scopeguard.rs
wasmtime-22.0.0 ./ext/cargo-vendor/hashbrown-0.14.3/src/scopeguard.rs
wasmtime-21.0.1 ./ext/cargo-vendor/hashbrown-0.14.3/src/scopeguard.rs
wasmtime-21.0.1 ./ext/cargo-vendor/hashbrown-0.13.2/src/scopeguard.rs
wasmtime-20.0.2 ./ext/cargo-vendor/hashbrown-0.14.3/src/scopeguard.rs