use std::ops::{Deref, DerefMut, Index, IndexMut};
#[derive(Debug)]
struct MyVec<T>(Vec<T>);
impl<T> Deref for MyVec<T> {
type Target = Vec<T>;
fn deref(&self) -> &Vec<T> {
&self.0
}
}
impl<T> DerefMut for MyVec<T> {
fn deref_mut(&mut self) -> &mut Vec<T> {
&mut self.0
}
}
impl<T> Index<i32> for MyVec<T> {
type Output = T;
fn index(&self, index: i32) -> &T {
&self.0[index as usize]
}
}
impl<T> IndexMut<i32> for MyVec<T> {
fn index_mut(&mut self, index: i32) -> &mut T {
&mut self.0[index as usize]
}
}
fn main() {
let mut v = MyVec(Vec::<i32>::new());
v.push(10);
v.push(20);
println!("{:?}", v);
for i in v.iter() {
println!("{}", i);
}
v.pop();
println!("{:?}", v);
for i in v.iter() {
println!("{}", i);
}
v.push(30);
let mut i :i32 = 0;
v[i] = -78;
println!("{:?}", v);
while i < v.len() as i32 {
println!("{}", v[i]);
i += 1;
}
}
dXNlIHN0ZDo6b3BzOjp7RGVyZWYsIERlcmVmTXV0LCBJbmRleCwgSW5kZXhNdXR9OwoKI1tkZXJpdmUoRGVidWcpXQpzdHJ1Y3QgTXlWZWM8VD4oVmVjPFQ+KTsKCmltcGw8VD4gRGVyZWYgZm9yIE15VmVjPFQ+IHsKICAgIHR5cGUgVGFyZ2V0ID0gVmVjPFQ+OwogICAgZm4gZGVyZWYoJnNlbGYpIC0+ICZWZWM8VD4gewogICAgICAgICZzZWxmLjAKICAgIH0KfQoKaW1wbDxUPiBEZXJlZk11dCBmb3IgTXlWZWM8VD4gewogICAgZm4gZGVyZWZfbXV0KCZtdXQgc2VsZikgLT4gJm11dCBWZWM8VD4gewogICAgICAgICZtdXQgc2VsZi4wCiAgICB9Cn0KCmltcGw8VD4gSW5kZXg8aTMyPiBmb3IgTXlWZWM8VD4gewogICAgdHlwZSBPdXRwdXQgPSBUOwogICAgZm4gaW5kZXgoJnNlbGYsIGluZGV4OiBpMzIpIC0+ICZUIHsKICAgICAgICAmc2VsZi4wW2luZGV4IGFzIHVzaXplXQogICAgfQp9CgppbXBsPFQ+IEluZGV4TXV0PGkzMj4gZm9yIE15VmVjPFQ+IHsKICAgIGZuIGluZGV4X211dCgmbXV0IHNlbGYsIGluZGV4OiBpMzIpIC0+ICZtdXQgVCB7CiAgICAgICAgJm11dCBzZWxmLjBbaW5kZXggYXMgdXNpemVdCiAgICB9Cn0KCmZuIG1haW4oKSB7CiAgICBsZXQgbXV0IHYgPSBNeVZlYyhWZWM6OjxpMzI+OjpuZXcoKSk7CiAgICAKICAgIHYucHVzaCgxMCk7CiAgICB2LnB1c2goMjApOwogICAgcHJpbnRsbiEoIns6P30iLCB2KTsKICAgIGZvciBpIGluIHYuaXRlcigpIHsKICAgICAgICBwcmludGxuISgie30iLCBpKTsKICAgIH0KICAgIAogICAgdi5wb3AoKTsKICAgIHByaW50bG4hKCJ7Oj99Iiwgdik7CiAgICBmb3IgaSBpbiB2Lml0ZXIoKSB7CiAgICAgICAgcHJpbnRsbiEoInt9IiwgaSk7CiAgICB9CiAgICAKICAgIHYucHVzaCgzMCk7CiAgICBsZXQgbXV0IGkgOmkzMiA9IDA7CiAgICB2W2ldID0gLTc4OwogICAgcHJpbnRsbiEoIns6P30iLCB2KTsKICAgIHdoaWxlIGkgPCB2LmxlbigpIGFzIGkzMiB7CiAgICAgICAgcHJpbnRsbiEoInt9IiwgdltpXSk7CiAgICAgICAgaSArPSAxOwogICAgfQp9