1use std::fmt::Display;
2
3pub trait VecLike: Sized + From<Vec<Self::Type>> + Clone {
5 type Type: Copy + Default + Display;
6
7 fn with_capacity(c: usize) -> Self;
9
10 fn new() -> Self {
12 Self::with_capacity(0)
13 }
14
15 fn get(&self, i: usize) -> Self::Type;
17
18 fn set(&mut self, i: usize, val: Self::Type);
20
21 fn len(&self) -> usize;
23
24 fn is_empty(&self) -> bool {
26 self.len() == 0
27 }
28
29 fn push(&mut self, val: Self::Type);
31
32 fn pop(&mut self) -> Option<Self::Type>;
34
35 fn iterate(&self) -> impl Iterator<Item = Self::Type>;
37
38 fn append(&mut self, other: &mut Self) {
40 for v in other.iterate() {
41 self.push(v);
42 }
43 other.clear();
44 }
45
46 fn clear(&mut self);
48
49 fn insert(&mut self, index: usize, element: Self::Type) {
52 let len_old = self.len();
53 if index > len_old {
54 panic!("insertion index (is {index}) should be <= len (is {len_old})");
55 }
56 if len_old == 1 {
57 if index == 1 {
58 self.push(element);
59 } else {
60 let last = self.get(0);
61 self.push(last);
62 self.set(index, element);
63 }
64 } else {
65 let last = self.get(len_old - 1);
67 self.push(last);
68 let mut prev = self.get(index);
70 self.set(index, element);
71 for i in (index + 1)..self.len() {
73 let tmp = prev;
74 prev = self.get(i);
75 self.set(i, tmp);
76 }
77 }
78 }
79
80 fn remove(&mut self, index: usize) -> Self::Type {
83 let len = self.len();
84 if index >= len {
85 panic!("removal index (is {index}) should be < len (is {len})");
86 }
87 let ret = self.get(index);
89 for i in index..(len - 1) {
91 let next = self.get(i + 1);
92 self.set(i, next);
93 }
94 self.resize(len - 1, Self::Type::default());
96 ret
97 }
98
99 fn resize(&mut self, new_len: usize, value: Self::Type);
101
102 fn truncate(&mut self, len: usize) {
104 if len < self.len() {
105 self.resize(len, Self::Type::default());
106 }
107 }
108
109 fn reserve(&mut self, additional: usize);
111}
112
113impl<T: Copy + Default + Display> VecLike for Vec<T> {
115 type Type = T;
116
117 fn with_capacity(c: usize) -> Self {
118 Vec::<T>::with_capacity(c)
119 }
120
121 fn get(&self, i: usize) -> T {
122 self[i]
123 }
124
125 fn set(&mut self, i: usize, val: T) {
126 self[i] = val;
127 }
128
129 fn len(&self) -> usize {
130 self.len()
131 }
132
133 fn push(&mut self, val: T) {
134 self.push(val);
135 }
136
137 fn pop(&mut self) -> Option<T> {
138 self.pop()
139 }
140
141 fn iterate(&self) -> impl Iterator<Item = T> {
142 self.iter().cloned()
143 }
144
145 fn append(&mut self, other: &mut Self) {
147 self.append(other);
148 }
149
150 fn clear(&mut self) {
151 self.clear();
152 }
153
154 fn insert(&mut self, index: usize, element: Self::Type) {
156 self.insert(index, element);
157 }
158
159 fn remove(&mut self, index: usize) -> Self::Type {
161 self.remove(index)
162 }
163
164 fn resize(&mut self, new_len: usize, value: Self::Type) {
165 self.resize(new_len, value);
166 }
167
168 fn reserve(&mut self, additional: usize) {
169 self.reserve(additional);
170 }
171}