diff --git a/src/bench.rs b/src/bench.rs new file mode 100644 index 0000000..21462bd --- /dev/null +++ b/src/bench.rs @@ -0,0 +1,70 @@ +//! `-Zmiri-disable-isolation` needed to run these under miri + +use test::{Bencher, black_box}; + +extern crate test; + +use super::Vec; +use std::{vec::Vec as StdVec, fmt::Debug}; + +#[bench] +#[ignore = "ignored for miri compat"] +fn std_push(b: &mut Bencher) { + let mut vec = StdVec::new(); + + b.iter(|| vec.push(black_box(5))); + + black_box(vec); +} + +#[bench] +#[ignore = "ignored for miri compat"] +fn dyn_push(b: &mut Bencher) { + let mut vec = Vec::new(); + + b.iter(|| vec.push(black_box(5))); + + black_box(vec); +} + +#[bench] +#[ignore = "ignored for miri compat"] +fn std_push_box(b: &mut Bencher) { + let mut vec = StdVec::new(); + + b.iter(|| vec.push(black_box(Box::new(5) as Box))); + + black_box(vec); +} + +#[bench] +#[ignore = "ignored for miri compat"] +fn dyn_push_unsize(b: &mut Bencher) { + let mut vec = Vec::new(); + + b.iter(|| vec.push_unsize_stable(black_box(5), |v| v as &dyn Debug)); + + black_box(vec); +} + +#[bench] +#[ignore = "ignored for miri compat"] +fn dyn_push_box(b: &mut Bencher) { + let mut vec = Vec::new(); + + b.iter(|| vec.push_box(black_box(Box::new(5) as Box))); + + black_box(vec); +} + +#[bench] +#[ignore = "ignored for miri compat"] +fn dyn_push_then_unsize(b: &mut Bencher) { + let mut vec = Vec::new(); + + b.iter(|| vec.push(black_box(5))); + + let vec = black_box(vec).unsize_stable(|v| v as &dyn Debug); + + black_box(vec); +} \ No newline at end of file diff --git a/src/impls.rs b/src/impls.rs index 6e77888..8fd7b8e 100644 --- a/src/impls.rs +++ b/src/impls.rs @@ -4,6 +4,9 @@ use crate::{Vec, Extra}; use std::{fmt::Debug, ops::{Deref, DerefMut}, vec::Vec as StdVec, slice, mem::size_of}; +#[cfg(feature = "unstable")] +use std::ops::CoerceUnsized; + impl Default for Vec { fn default() -> Self { Self::new() diff --git a/src/lib.rs b/src/lib.rs index 15220d7..f0b32df 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -122,8 +122,11 @@ #![warn(clippy::pedantic)] #![allow(clippy::must_use_candidate)] +#![cfg_attr(test, feature(test))] #[cfg(test)] mod test; +#[cfg(test)] +mod bench; // TODO: maybe remove this? Its not that many imports /// Prelude, suitable for glob imports.