#![allow(clippy::useless_vec, clippy::manual_repeat_n)]

use std::iter::repeat;
fn main() {
    resize_vector();
    extend_vector();
    mixed_extend_resize_vector();
    from_empty_vec();
}

fn extend_vector() {
    // Extend with constant expression
    let len = 300;
    let mut vec1 = vec![0; len];

    // Extend with len expression
    let mut vec2 = vec![0; len - 10];

    // Extend with mismatching expression should not be warned
    let mut vec3 = Vec::with_capacity(24322);
    vec3.extend(repeat(0).take(2));

    let mut vec4 = vec![0; len];
}

fn mixed_extend_resize_vector() {
    // Mismatching len
    let mut mismatching_len = Vec::with_capacity(30);
    mismatching_len.extend(repeat(0).take(40));

    // Slow initialization
    let mut resized_vec = vec![0; 30];

    let mut extend_vec = vec![0; 30];
}

fn resize_vector() {
    // Resize with constant expression
    let len = 300;
    let mut vec1 = vec![0; len];

    // Resize mismatch len
    let mut vec2 = Vec::with_capacity(200);
    vec2.resize(10, 0);

    // Resize with len expression
    let mut vec3 = vec![0; len - 10];

    let mut vec4 = vec![0; len];

    // Reinitialization should be warned
    vec1 = vec![0; 10];
}

fn from_empty_vec() {
    // Resize with constant expression
    let len = 300;
    let mut vec1 = vec![0; len];

    // Resize with len expression
    let mut vec3 = vec![0; len - 10];

    // Reinitialization should be warned
    vec1 = vec![0; 10];

    vec1 = vec![0; 10];

    macro_rules! x {
        () => {
            vec![]
        };
    }

    // `vec![]` comes from another macro, don't warn
    vec1 = x!();
    vec1.resize(10, 0);
}

fn do_stuff(vec: &mut [u8]) {}

fn extend_vector_with_manipulations_between() {
    let len = 300;
    let mut vec1: Vec<u8> = Vec::with_capacity(len);
    do_stuff(&mut vec1);
    vec1.extend(repeat(0).take(len));
}
