From 1c4cd7d51a87b754b318619dda1356b7bcc8fa59 Mon Sep 17 00:00:00 2001 From: famfo Date: Sun, 13 Feb 2022 23:53:20 +0100 Subject: [PATCH] Fixed compile issue on rustc 1.60 UNTESTED --- src/main.rs | 5 ++++- src/unsafe_std/bufreader.rs | 28 ++++++++++++++++++++++------ 2 files changed, 26 insertions(+), 7 deletions(-) diff --git a/src/main.rs b/src/main.rs index 9b4be00..4de18f9 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,4 +1,7 @@ -#![feature(slice_internals, read_initializer, new_uninit)] +#![feature(slice_internals)] +#![feature(read_buf)] +#![feature(new_uninit)] +#![feature(maybe_uninit_slice)] use unsafe_std::bufread::{UnsafeBufRead, UnsafeLines}; use unsafe_std::bufreader::UnsafeBufReader; diff --git a/src/unsafe_std/bufreader.rs b/src/unsafe_std/bufreader.rs index a0fc66f..1ce07a4 100644 --- a/src/unsafe_std/bufreader.rs +++ b/src/unsafe_std/bufreader.rs @@ -2,12 +2,15 @@ use crate::unsafe_std::bufread::UnsafeBufRead; use std::io::Read; +use std::io::ReadBuf; +use std::mem::MaybeUninit; pub struct UnsafeBufReader { inner: R, - buf: Box<[u8]>, + buf: Box<[MaybeUninit]>, pos: usize, cap: usize, + init: usize, } impl UnsafeBufReader { @@ -17,11 +20,14 @@ impl UnsafeBufReader { pub fn with_capacity(capacity: usize, inner: R) -> UnsafeBufReader { unsafe { - let mut buf = Box::new_uninit_slice(capacity).assume_init(); - inner.initializer().initialize(&mut buf); - UnsafeBufReader { inner, buf, pos: 0, cap: 0 } + let buf = Box::new_uninit_slice(capacity); + UnsafeBufReader { inner, buf, pos: 0, cap: 0, init: 0 } } } + + pub fn buffer(&self) -> &[u8] { + unsafe { MaybeUninit::slice_assume_init_ref(&self.buf[self.pos..self.cap]) } + } } impl UnsafeBufReader { @@ -51,10 +57,20 @@ impl UnsafeBufRead for UnsafeBufReader { fn fill_buf(&mut self) -> std::io::Result<&[u8]> { if self.pos >= self.cap { //debug_assert!(self.pos == self.cap); // Debug assertions? Only slow us down! - self.cap = self.inner.read(&mut self.buf)?; + let mut readbuf = ReadBuf::uninit(&mut self.buf); + unsafe { + readbuf.assume_init(self.init); + } + + self.inner.read_buf(&mut readbuf)?; + + self.cap = readbuf.filled_len(); + self.init = readbuf.initialized_len(); + self.pos = 0; } - Ok(&self.buf[self.pos..self.cap]) + + Ok(self.buffer()) } fn consume(&mut self, amt: usize) {