pessimize 3.0.2

More efficient Rust compiler optimization barriers
Documentation
//! Implementations of Pessimize for std::process

use crate::{assume_accessed, pessimize_cast, pessimize_copy, BorrowPessimize};
use std::{
    os::unix::process::ExitStatusExt,
    process::{ExitStatus, Output},
};

pessimize_copy!(
    doc(cfg(all(any(feature = "std", test), unix)))
    {
        i32 : (
            ExitStatus : (Self::into_raw, Self::from_raw)
        )
    }
);

pessimize_cast!(
    doc(cfg(all(any(feature = "std", test), unix)))
    {
        (ExitStatus, Vec<u8>, Vec<u8>) : (
            Output : (
                |Self { status, stdout, stderr }| (status, stdout, stderr),
                |(status, stdout, stderr)| Self { status, stdout, stderr }
            )
        )
    }
);
//
#[cfg_attr(feature = "nightly", doc(cfg(all(any(feature = "std", test), unix))))]
impl BorrowPessimize for Output {
    type BorrowedPessimize = (ExitStatus, *const u8, usize, usize, *const u8, usize, usize);

    #[inline]
    fn with_pessimize(&self, f: impl FnOnce(&Self::BorrowedPessimize)) {
        f(&(
            self.status,
            self.stdout.as_ptr(),
            self.stdout.len(),
            self.stdout.capacity(),
            self.stderr.as_ptr(),
            self.stderr.len(),
            self.stderr.capacity(),
        ))
    }

    #[inline]
    fn assume_accessed_impl(&mut self) {
        assume_accessed(&mut self.status);
        assume_accessed(&mut self.stdout);
        assume_accessed(&mut self.stderr);
    }
}

#[cfg(test)]
mod tests {
    use super::*;
    use crate::tests::{test_unoptimized_value, test_value};

    #[test]
    fn exit_status() {
        test_value(ExitStatus::from_raw(i32::MIN));
        test_value(ExitStatus::from_raw(0));
        test_value(ExitStatus::from_raw(i32::MAX));
    }

    #[test]
    #[ignore]
    fn exit_status_optim() {
        test_unoptimized_value(ExitStatus::from_raw(0));
    }

    #[test]
    fn output() {
        test_value(Output {
            status: ExitStatus::from_raw(i32::MIN),
            stdout: vec![1],
            stderr: vec![2],
        });
        test_value(Output {
            status: ExitStatus::from_raw(0),
            stdout: vec![12],
            stderr: vec![34],
        });
        test_value(Output {
            status: ExitStatus::from_raw(i32::MAX),
            stdout: vec![],
            stderr: vec![u8::MAX],
        });
    }

    #[test]
    #[ignore]
    fn output_optim() {
        test_unoptimized_value(Output {
            status: ExitStatus::from_raw(0),
            stdout: vec![],
            stderr: vec![],
        });
    }
}