Crate unsafe_binders

Crate unsafe_binders 

Source
Expand description

§::unsafe-binders

Stable rust polyfill of unsafe<'lt> … binders.

Repository Latest version Documentation MSRV License CI no_std compatible


Conceptually, unsafe binders are the way to express the 'unsafe/'never/'expired/'dangling lifetime used in certain unsafe constructs (e.g., self-referential data), in a way less unsoundness-prone way as using 'static instead would be:

  • by virtue of requiring unsafe to access the data,

  • and it not performing liveness or (lack-of-)aliasing assertions (courtesy of ::maybe-dangling, like 'static-infected types may accidentally do.

§Example

use ::unsafe_binders::{DropMarker, Unsafe};

pub struct SelfReferential {
    full_name: String,
    first_name: Unsafe![DropMarker::NoDropGlue, <'this> &'this str],
                                           // using lifetime-elision shorthand syntax:
    last_name: Unsafe![DropMarker::NoDropGlue, &str],
}

impl SelfReferential {
    pub fn new(full_name: String) -> Option<Self> {
        let (first_name, last_name) = full_name.split_once(" ")?;
        // erase the `&'full_name` lifetime:
        let first_name: Unsafe![_, &str] = Unsafe::wrap_binder_copy(first_name);
                               // shorthand syntax
        let last_name: Unsafe![&str] = Unsafe::wrap_binder_copy(last_name);
        Some(Self {
            full_name,
            first_name,
            last_name,
        })
    }

    pub fn first_name<'r>(&'r self) -> &'r str {
        unsafe {
            self.first_name.unwrap_binder_ref::<'_, 'r>()
        }
    }

    pub fn last_name<'r>(&'r self) -> &'r str {
        unsafe {
            self.last_name.unwrap_binder_ref::<'_, 'r>()
        }
    }
}

Modules§

DropMarker
Type-level enum { MayDrop, NoDropGlue }.
prelude
The crate’s prelude.

Macros§

Unsafe
Convenience macro to name/express an unsafe<'lt> … type:

Structs§

Unsafe
Stable rust polyfill of unsafe<'lt> … binders, with a fixed arity of 1.

Traits§

ForLifetime
The main trait of the crate. The one expressing : <'_>-genericity.