// skip-filecheck
//@ compile-flags: -O -C debuginfo=0 -Zmir-opt-level=2
//@ only-64bit (constants for `None::<&T>` show in the output)
//@ ignore-debug: precondition checks on ptr::add are under cfg(debug_assertions)
// EMIT_MIR_FOR_EACH_PANIC_STRATEGY

#![crate_type = "lib"]
#![feature(exact_size_is_empty)]

// When this test was added, the MIR for `next` was 174 lines just for the basic
// blocks -- far more if you counted the scopes.  The goal of having this here
// is to hopefully keep it a reasonable size, ideally eventually small enough
// that the mir inliner would actually be willing to inline it, since it's an
// important building block and usually very few *backend* instructions.

// As such, feel free to `--bless` whatever changes you get here, so long as
// doing so doesn't add substantially more MIR.

// EMIT_MIR slice_iter.slice_iter_generic_is_empty.PreCodegen.after.mir
pub fn slice_iter_generic_is_empty<T>(it: &std::slice::Iter<'_, T>) -> bool {
    it.is_empty()
}

// EMIT_MIR slice_iter.slice_iter_next.PreCodegen.after.mir
pub fn slice_iter_next<'a, T>(it: &mut std::slice::Iter<'a, T>) -> Option<&'a T> {
    it.next()
}

// EMIT_MIR slice_iter.slice_iter_mut_next_back.PreCodegen.after.mir
pub fn slice_iter_mut_next_back<'a, T>(it: &mut std::slice::IterMut<'a, T>) -> Option<&'a mut T> {
    it.next_back()
}

// EMIT_MIR slice_iter.forward_loop.PreCodegen.after.mir
pub fn forward_loop<'a, T>(slice: &'a [T], f: impl Fn(&T)) {
    for x in slice.iter() {
        f(x)
    }
}

// EMIT_MIR slice_iter.reverse_loop.PreCodegen.after.mir
pub fn reverse_loop<'a, T>(slice: &'a [T], f: impl Fn(&T)) {
    for x in slice.iter().rev() {
        f(x)
    }
}

// EMIT_MIR slice_iter.enumerated_loop.PreCodegen.after.mir
pub fn enumerated_loop<'a, T>(slice: &'a [T], f: impl Fn(usize, &T)) {
    for (i, x) in slice.iter().enumerate() {
        f(i, x)
    }
}

// EMIT_MIR slice_iter.range_loop.PreCodegen.after.mir
pub fn range_loop<'a, T>(slice: &'a [T], f: impl Fn(usize, &T)) {
    for i in 0..slice.len() {
        let x = &slice[i];
        f(i, x)
    }
}
