// 要实现迭代的数据
#[derive(Debug)]
struct MyData<T> {
    data: Vec<T>,
}

// 引用的迭代器创建
impl<'a, T> IntoIterator for &'a MyData<T> {
    // 返回的是引用
    type Item = &'a T;
    // 实际的迭代器对象
    type IntoIter = MyDataIter<'a, T>;
    fn into_iter(self) -> Self::IntoIter {
        MyDataIter { index: self.data.len(), data: self }
    }
}

/// 引用迭代器
/// 保存的是数据的引用
struct MyDataIter<'a, T: 'a> {
    index: usize,
    data: &'a MyData<T>,
}

/// 实现迭代器
impl<'a, T> Iterator for MyDataIter<'a, T> {
    type Item = &'a T;
    fn next(&mut self) -> Option<Self::Item> {
        if self.index == 0 {
            return None;
        }
        self.index -= 1;

        self.data.data.get(self.index)
    }
}


impl<'a, T> IntoIterator for &'a mut MyData<T> {
    type Item = &'a mut T;
    type IntoIter = MyDataIterMut<'a, T>;
    fn into_iter(self) -> Self::IntoIter {
        MyDataIterMut { index: self.data.len(), data: self }
    }

}

struct MyDataIterMut<'a, T: 'a> {
    index: usize,
    data: &'a mut MyData<T>,
}

impl<'a, T> Iterator for MyDataIterMut<'a, T> {
    type Item = &'a mut T;
    fn next(&mut self) -> Option<Self::Item> {
        if self.index == 0 {
            return None;
        }
        self.index -= 1;

        // 这儿必须用指标实现.
        unsafe {
            let ptr = self.data.data.as_mut_ptr().add(self.index);
            Some(&mut *ptr)
        }
    }
}


fn main() {
    let v1 = vec![11, 12, 13];
    let mut item = MyData { data: v1 };
    for x in &mut item {
        *x += 10;
        println!("{}", x);
    }

    println!("item is {:?}", item);

}