Skip to content

Support extracting underlying filled buffer from BorrowedBuf #473

Closed
@SUPERCILEX

Description

@SUPERCILEX

Proposal

Problem statement

I'd like to be able to modify a MaybeUninit buffer and return the contents to the caller.

Motivating examples or use cases

Currently, if a function wishes to safely modified a MaybeUninit buffer passed in by reference by the caller, they cannot return the filled buffer to the caller.

Fixing this would let the following code compile:

pub fn direct_file_name(
    buf: &mut [MaybeUninit<u8>; DIRECT_FILE_NAME_LEN + 1],
    to: RingKind,
    index: u32,
) -> DirectFileNameToken<()> {
    let mut buf = BorrowedBuf::from(buf.as_mut_slice());
    write!(buf.unfilled(), "{:0>13}\0", composite_id(to, index)).unwrap();
    DirectFileNameToken(buf.filled_mut(), PhantomData) // Doesn't compile!
}

Solution sketch

Add two methods:

fn into_filled(self) -> &'data [u8]
fn into_filled_mut(self) -> &'data mut [u8]

Alternatives

Transmute to get lifetime extension or manually convert the MaybeUninits to u8s by using the filled length. Both of these solutions are very error prone and annoying to write.

Metadata

Metadata

Assignees

No one assigned

    Labels

    ACP-acceptedAPI Change Proposal is accepted (seconded with no objections)T-libs-apiapi-change-proposalA proposal to add or alter unstable APIs in the standard libraries

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions