Skip to content

add ReadBuf::buf* accessor functions for getting the original buffer #65

Closed as not planned
@programmerjake

Description

@programmerjake

Proposal

Problem statement

There is no way to retrieve the full, originally passed in buffer from ReadBuf

Motivation, use-cases

extern "C" {
    fn expand_in_place(buf: *mut u8, buf_len: usize, buf_used: usize) -> usize;
}
const SZ: usize = 64;
let mut buf = MaybeUninit::<[_; SZ]>::uninit().assume_init();
let mut read_buf = ReadBuf::uninit(&mut buf);
reader.read_buf(&mut read_buf)?;
// can't just use original buffer reference because reader.read_buf might swap it out, causing uninitialized data to be accessed
unsafe {
    let used = read_buf.filled_len();
    let len = read_buf.capacity();
    let ptr = read_buf.buf_mut() as *mut _; // new API here, nothing existing returns the full buffer, just a slice
    let used = expand_in_place(ptr as *mut u8, len, used);
    println!("{}", slice::from_raw_parts_mut(ptr, used));
}

Solution sketches

impl<'a> ReadBuf<'a> {
    /// Returns the buffer
    #[inline]
    pub fn buf(&self) -> &[MaybeUninit<u8>] {
        &*self.buf
    }

    /// Returns the buffer
    ///
    /// # Safety
    /// You must not write unitialized bytes to positions less than `self.initialized_len()`
    #[inline]
    pub unsafe fn buf_mut(&mut self) -> &mut [MaybeUninit<u8>] {
        self.buf
    }

    /// Returns the buffer
    #[inline]
    pub fn into_buf(self) -> &'a mut [MaybeUninit<u8>] {
        self.buf
    }
}

Links and related work

rust-lang/rust#98962
rust-lang/rust#78485

What happens now?

This issue is part of the libs-api team API change proposal process. Once this issue is filed the libs-api team will review open proposals in its weekly meeting. You should receive feedback within a week or two.

Metadata

Metadata

Assignees

No one assigned

    Labels

    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