Make some std::io functions const

Includes:
- io::Cursor::new
- io::Cursor::get_ref
- io::Cursor::position
- io::empty
- io::repeat
- io::sink
This commit is contained in:
Benoît du Garreau 2020-11-06 17:46:56 +01:00
parent dc06a36074
commit ae059b532f
5 changed files with 28 additions and 7 deletions

View file

@ -94,7 +94,8 @@ impl<T> Cursor<T> {
/// # force_inference(&buff);
/// ```
#[stable(feature = "rust1", since = "1.0.0")]
pub fn new(inner: T) -> Cursor<T> {
#[rustc_const_unstable(feature = "const_io_structs", issue = "none")]
pub const fn new(inner: T) -> Cursor<T> {
Cursor { pos: 0, inner }
}
@ -130,7 +131,8 @@ impl<T> Cursor<T> {
/// let reference = buff.get_ref();
/// ```
#[stable(feature = "rust1", since = "1.0.0")]
pub fn get_ref(&self) -> &T {
#[rustc_const_unstable(feature = "const_io_structs", issue = "none")]
pub const fn get_ref(&self) -> &T {
&self.inner
}
@ -175,7 +177,8 @@ impl<T> Cursor<T> {
/// assert_eq!(buff.position(), 1);
/// ```
#[stable(feature = "rust1", since = "1.0.0")]
pub fn position(&self) -> u64 {
#[rustc_const_unstable(feature = "const_io_structs", issue = "none")]
pub const fn position(&self) -> u64 {
self.pos
}

View file

@ -514,3 +514,10 @@ fn test_eq() {
let _: AssertEq<Cursor<Vec<u8>>> = AssertEq(Cursor::new(Vec::new()));
}
#[allow(dead_code)]
fn const_cursor() {
const CURSOR: Cursor<&[u8]> = Cursor::new(&[0]);
const _: &&[u8] = CURSOR.get_ref();
const _: u64 = CURSOR.position();
}

View file

@ -102,7 +102,8 @@ pub struct Empty {
/// assert!(buffer.is_empty());
/// ```
#[stable(feature = "rust1", since = "1.0.0")]
pub fn empty() -> Empty {
#[rustc_const_unstable(feature = "const_io_structs", issue = "none")]
pub const fn empty() -> Empty {
Empty { _priv: () }
}
@ -159,7 +160,8 @@ pub struct Repeat {
/// assert_eq!(buffer, [0b101, 0b101, 0b101]);
/// ```
#[stable(feature = "rust1", since = "1.0.0")]
pub fn repeat(byte: u8) -> Repeat {
#[rustc_const_unstable(feature = "const_io_structs", issue = "none")]
pub const fn repeat(byte: u8) -> Repeat {
Repeat { byte }
}
@ -226,7 +228,8 @@ pub struct Sink {
/// assert_eq!(num_bytes, 5);
/// ```
#[stable(feature = "rust1", since = "1.0.0")]
pub fn sink() -> Sink {
#[rustc_const_unstable(feature = "const_io_structs", issue = "none")]
pub const fn sink() -> Sink {
Sink { _priv: () }
}

View file

@ -1,5 +1,5 @@
use crate::io::prelude::*;
use crate::io::{copy, empty, repeat, sink};
use crate::io::{copy, empty, repeat, sink, Empty, Repeat, Sink};
#[test]
fn copy_copies() {
@ -43,3 +43,10 @@ fn take_some_bytes() {
assert_eq!(repeat(4).take(100).bytes().next().unwrap().unwrap(), 4);
assert_eq!(repeat(1).take(10).chain(repeat(2).take(10)).bytes().count(), 20);
}
#[allow(dead_code)]
fn const_utils() {
const _: Empty = empty();
const _: Repeat = repeat(b'c');
const _: Sink = sink();
}

View file

@ -242,6 +242,7 @@
#![feature(const_fn_transmute)]
#![feature(const_fn)]
#![feature(const_fn_fn_ptr_basics)]
#![feature(const_io_structs)]
#![feature(const_ip)]
#![feature(const_ipv6)]
#![feature(const_raw_ptr_deref)]