Rollup merge of #109174 - soerenmeier:cursor_fns, r=dtolnay · model-checking/verify-rust-std@f9befad (original) (raw)
`@@ -209,55 +209,60 @@ impl Cursor
`
209
209
`where
`
210
210
`T: AsRef<[u8]>,
`
211
211
`{
`
212
``
`-
/// Returns the remaining slice.
`
``
212
`+
/// Splits the underlying slice at the cursor position and returns them.
`
213
213
`///
`
214
214
`/// # Examples
`
215
215
`///
`
216
216
```` /// ```
`217`
``
`-
/// #![feature(cursor_remaining)]
`
``
`217`
`+
/// #![feature(cursor_split)]
`
`218`
`218`
`/// use std::io::Cursor;
`
`219`
`219`
`///
`
`220`
`220`
`/// let mut buff = Cursor::new(vec![1, 2, 3, 4, 5]);
`
`221`
`221`
`///
`
`222`
``
`-
/// assert_eq!(buff.remaining_slice(), &[1, 2, 3, 4, 5]);
`
``
`222`
`+
/// assert_eq!(buff.split(), ([].as_slice(), [1, 2, 3, 4, 5].as_slice()));
`
`223`
`223`
`///
`
`224`
`224`
`/// buff.set_position(2);
`
`225`
``
`-
/// assert_eq!(buff.remaining_slice(), &[3, 4, 5]);
`
`226`
``
`-
///
`
`227`
``
`-
/// buff.set_position(4);
`
`228`
``
`-
/// assert_eq!(buff.remaining_slice(), &[5]);
`
``
`225`
`+
/// assert_eq!(buff.split(), ([1, 2].as_slice(), [3, 4, 5].as_slice()));
`
`229`
`226`
`///
`
`230`
`227`
`/// buff.set_position(6);
`
`231`
``
`-
/// assert_eq!(buff.remaining_slice(), &[]);
`
``
`228`
`+
/// assert_eq!(buff.split(), ([1, 2, 3, 4, 5].as_slice(), [].as_slice()));
`
`232`
`229`
```` /// ```
233
``
`-
#[unstable(feature = "cursor_remaining", issue = "86369")]
`
234
``
`-
pub fn remaining_slice(&self) -> &[u8] {
`
235
``
`-
let len = self.pos.min(self.inner.as_ref().len() as u64);
`
236
``
`-
&self.inner.as_ref()[(len as usize)..]
`
``
230
`+
#[unstable(feature = "cursor_split", issue = "86369")]
`
``
231
`+
pub fn split(&self) -> (&[u8], &[u8]) {
`
``
232
`+
let slice = self.inner.as_ref();
`
``
233
`+
let pos = self.pos.min(slice.len() as u64);
`
``
234
`+
slice.split_at(pos as usize)
`
237
235
`}
`
``
236
`+
}
`
238
237
``
239
``
`` -
/// Returns true
if the remaining slice is empty.
``
``
238
`+
impl Cursor
`
``
239
`+
where
`
``
240
`+
T: AsMut<[u8]>,
`
``
241
`+
{
`
``
242
`+
/// Splits the underlying slice at the cursor position and returns them
`
``
243
`+
/// mutably.
`
240
244
`///
`
241
245
`/// # Examples
`
242
246
`///
`
243
247
```` /// ```
`244`
``
`-
/// #![feature(cursor_remaining)]
`
``
`248`
`+
/// #![feature(cursor_split)]
`
`245`
`249`
`/// use std::io::Cursor;
`
`246`
`250`
`///
`
`247`
`251`
`/// let mut buff = Cursor::new(vec![1, 2, 3, 4, 5]);
`
`248`
`252`
`///
`
`249`
``
`-
/// buff.set_position(2);
`
`250`
``
`-
/// assert!(!buff.is_empty());
`
``
`253`
`+
/// assert_eq!(buff.split_mut(), ([].as_mut_slice(), [1, 2, 3, 4, 5].as_mut_slice()));
`
`251`
`254`
`///
`
`252`
``
`-
/// buff.set_position(5);
`
`253`
``
`-
/// assert!(buff.is_empty());
`
``
`255`
`+
/// buff.set_position(2);
`
``
`256`
`+
/// assert_eq!(buff.split_mut(), ([1, 2].as_mut_slice(), [3, 4, 5].as_mut_slice()));
`
`254`
`257`
`///
`
`255`
``
`-
/// buff.set_position(10);
`
`256`
``
`-
/// assert!(buff.is_empty());
`
``
`258`
`+
/// buff.set_position(6);
`
``
`259`
`+
/// assert_eq!(buff.split_mut(), ([1, 2, 3, 4, 5].as_mut_slice(), [].as_mut_slice()));
`
`257`
`260`
```` /// ```
258
``
`-
#[unstable(feature = "cursor_remaining", issue = "86369")]
`
259
``
`-
pub fn is_empty(&self) -> bool {
`
260
``
`-
self.pos >= self.inner.as_ref().len() as u64
`
``
261
`+
#[unstable(feature = "cursor_split", issue = "86369")]
`
``
262
`+
pub fn split_mut(&mut self) -> (&mut [u8], &mut [u8]) {
`
``
263
`+
let slice = self.inner.as_mut();
`
``
264
`+
let pos = self.pos.min(slice.len() as u64);
`
``
265
`+
slice.split_at_mut(pos as usize)
`
261
266
`}
`
262
267
`}
`
263
268
``
`@@ -319,15 +324,15 @@ where
`
319
324
`T: AsRef<[u8]>,
`
320
325
`{
`
321
326
`fn read(&mut self, buf: &mut [u8]) -> io::Result {
`
322
``
`-
let n = Read::read(&mut self.remaining_slice(), buf)?;
`
``
327
`+
let n = Read::read(&mut Cursor::split(self).1, buf)?;
`
323
328
`self.pos += n as u64;
`
324
329
`Ok(n)
`
325
330
`}
`
326
331
``
327
332
`fn read_buf(&mut self, mut cursor: BorrowedCursor<'_>) -> io::Result<()> {
`
328
333
`let prev_written = cursor.written();
`
329
334
``
330
``
`-
Read::read_buf(&mut self.remaining_slice(), cursor.reborrow())?;
`
``
335
`+
Read::read_buf(&mut Cursor::split(self).1, cursor.reborrow())?;
`
331
336
``
332
337
`self.pos += (cursor.written() - prev_written) as u64;
`
333
338
``
`@@ -351,7 +356,7 @@ where
`
351
356
`}
`
352
357
``
353
358
`fn read_exact(&mut self, buf: &mut [u8]) -> io::Result<()> {
`
354
``
`-
let result = Read::read_exact(&mut self.remaining_slice(), buf);
`
``
359
`+
let result = Read::read_exact(&mut Cursor::split(self).1, buf);
`
355
360
``
356
361
`match result {
`
357
362
`Ok(_) => self.pos += buf.len() as u64,
`
`@@ -365,14 +370,14 @@ where
`
365
370
`fn read_buf_exact(&mut self, mut cursor: BorrowedCursor<'_>) -> io::Result<()> {
`
366
371
`let prev_written = cursor.written();
`
367
372
``
368
``
`-
let result = Read::read_buf_exact(&mut self.remaining_slice(), cursor.reborrow());
`
``
373
`+
let result = Read::read_buf_exact(&mut Cursor::split(self).1, cursor.reborrow());
`
369
374
`self.pos += (cursor.written() - prev_written) as u64;
`
370
375
``
371
376
` result
`
372
377
`}
`
373
378
``
374
379
`fn read_to_end(&mut self, buf: &mut Vec) -> io::Result {
`
375
``
`-
let content = self.remaining_slice();
`
``
380
`+
let content = Cursor::split(self).1;
`
376
381
`let len = content.len();
`
377
382
` buf.try_reserve(len)?;
`
378
383
` buf.extend_from_slice(content);
`
`@@ -383,7 +388,7 @@ where
`
383
388
``
384
389
`fn read_to_string(&mut self, buf: &mut String) -> io::Result {
`
385
390
`let content =
`
386
``
`-
crate::str::from_utf8(self.remaining_slice()).map_err(|_| io::Error::INVALID_UTF8)?;
`
``
391
`+
crate::str::from_utf8(Cursor::split(self).1).map_err(|_| io::Error::INVALID_UTF8)?;
`
387
392
`let len = content.len();
`
388
393
` buf.try_reserve(len)?;
`
389
394
` buf.push_str(content);
`
`@@ -399,7 +404,7 @@ where
`
399
404
`T: AsRef<[u8]>,
`
400
405
`{
`
401
406
`fn fill_buf(&mut self) -> io::Result<&[u8]> {
`
402
``
`-
Ok(self.remaining_slice())
`
``
407
`+
Ok(Cursor::split(self).1)
`
403
408
`}
`
404
409
`fn consume(&mut self, amt: usize) {
`
405
410
`self.pos += amt as u64;
`