Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Relax Sized bound #2

Open
jalil-salame opened this issue Sep 11, 2024 · 2 comments
Open

Relax Sized bound #2

jalil-salame opened this issue Sep 11, 2024 · 2 comments

Comments

@jalil-salame
Copy link

Currently there is a sized bound on T for all structs, I don't think it is necessary and it prevents me from defining a MaybeBoxed type based on this crate:

enum MaybeBoxed<'a, T> { // is actually a struct that provides this kind of interface
    Boxed { Ox<T> },
    Ref { &'a T },
}

This is great for zero copy deserialization where Cow<'a, T> is unnecessary because the structure itself does not provide &mut T or similar access (thus Cow<'a, T> is 24-bytes instead of 16-bytes on 64-buit systems).

I specifically want to be able to use ointers::NonNull<[T]> and ointers::NonNull<str> c:

@jalil-salame
Copy link
Author

Looking at the implementation of this, we either need ptr_metadata or strict_provenance to make this work:

//! simplified for brevity

/// Doesn't compile T-T
fn pack_stable(ptr: *mut [T], data: usize) -> Ointer<[T]> {
    //  ------------------------------------------ we drop the metadata (length information)
    //  vvvvvvvvvv                  vvvvvvvvvvv--- we don't have the required metadata
   (ptr as *mut () as usize | data) as *mut [T]
}

#![feature(ptr_metadata)]
fn pack_ptr_metadata(ptr: *mut [T], data: usize) -> *mut [T] {
   // extract metadata
   let (ptr, metadata) = ptr.to_raw_parts();
   // we can now restore the metadata ------------vvvvvvvv
   core::ptr::from_raw_parts(ptr as usize | data, metadata) as *mut [T]
}

#![feature(strict_provenance)]
fn pack_ptr_metadata(ptr: *mut [T], data: usize) -> *mut [T] {
    // manipulate the addr directly 😍
    ptr.map_addr(|addr| (addr | data))
}

As always, nightly is where all the cool stuff lies 😢

@jalil-salame
Copy link
Author

sptr puts a Sized bound too so we can't really use it...

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant