Skip to content

Commit 4fa0db4

Browse files
authored
CopyLocalVec introduced, Eq and Clone (#12)
* Clone and Eq implemented * CopyLocalVec added
1 parent 606c74b commit 4fa0db4

File tree

6 files changed

+162
-30
lines changed

6 files changed

+162
-30
lines changed

Cargo.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
[package]
22
name = "local_vec"
3-
version = "0.4.0"
4-
edition = "2018"
3+
version = "0.5.0"
4+
edition = "2021"
55
authors = ["Jorge Rinaldi <jrg.rinaldi@gmail.com>"]
66
license = "MIT"
77
repository = "https://github.com/m-rinaldi/local_vec"

src/clone.rs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
use crate::LocalVecImpl;
2+
3+
impl<T: Clone, const N: usize> Clone for LocalVecImpl<T, N> {
4+
fn clone(&self) -> Self {
5+
let mut cloned = Self::new();
6+
for i in 0..self.len() {
7+
cloned.push(self[i].clone());
8+
}
9+
debug_assert_eq!(cloned.len(), self.len());
10+
cloned
11+
}
12+
}
13+
14+
#[cfg(test)]
15+
mod tests {
16+
use super::*;
17+
18+
#[test]
19+
fn test_clone() {
20+
let vec = LocalVecImpl::<_, 3>::from_array([1, 2, 3]);
21+
let cloned = vec.clone();
22+
assert_eq!(vec, cloned);
23+
}
24+
}

src/deref.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
use crate::LocalVec;
1+
use crate::LocalVecImpl;
22
use std::ops::{Deref, DerefMut};
33

4-
impl<T, const N: usize> Deref for LocalVec<T, N> {
4+
impl<T, const N: usize> Deref for LocalVecImpl<T, N> {
55
type Target = [T];
66

77
fn deref(&self) -> &[T] {
@@ -11,7 +11,7 @@ impl<T, const N: usize> Deref for LocalVec<T, N> {
1111
}
1212
}
1313

14-
impl<T, const N: usize> DerefMut for LocalVec<T, N> {
14+
impl<T, const N: usize> DerefMut for LocalVecImpl<T, N> {
1515
fn deref_mut(&mut self) -> &mut [T] {
1616
unsafe {
1717
std::slice::from_raw_parts_mut(self.as_mut_ptr(), self.len)
@@ -26,7 +26,7 @@ mod tests {
2626
#[test]
2727
fn test_deref() {
2828
let arr = [33; 3];
29-
let vec = LocalVec::<_, 8>::from_array(arr);
29+
let vec = LocalVecImpl::<_, 8>::from_array(arr);
3030
let slc = vec.deref();
3131
assert_eq!(slc.len(), 3);
3232
assert_eq!(slc, arr);
@@ -35,22 +35,22 @@ mod tests {
3535
#[test]
3636
fn test_deref_mut() {
3737
let arr = [33; 3];
38-
let mut vec = LocalVec::<_, 8>::from_array(arr);
38+
let mut vec = LocalVecImpl::<_, 8>::from_array(arr);
3939
let slc = vec.deref_mut();
4040
assert_eq!(slc.len(), 3);
4141
assert_eq!(slc, arr);
4242
}
4343

4444
#[test]
4545
fn test_deref_zero_size() {
46-
let vec = LocalVec::<u8, 0>::new();
46+
let vec = LocalVecImpl::<u8, 0>::new();
4747
let slc = vec.deref();
4848
assert_eq!(slc.len(), 0);
4949
}
5050

5151
#[test]
5252
fn test_deref_mut_zero_size() {
53-
let mut vec = LocalVec::<u8, 0>::new();
53+
let mut vec = LocalVecImpl::<u8, 0>::new();
5454
let slc = vec.deref_mut();
5555
assert_eq!(slc.len(), 0);
5656
}

src/drop.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ use crate::LocalVec;
22

33
impl <T, const N: usize> Drop for LocalVec<T, N> {
44
fn drop(&mut self) {
5+
// TODO check the dropping order
6+
// it should be the same as in a built-in array
57
self.clear();
68
}
79
}

src/eq.rs

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
use crate::{LocalVecImpl, LenType};
2+
3+
// TODO generalize further for comparing LocalVec values of different capacities
4+
impl<T: PartialEq, const N: LenType> PartialEq for LocalVecImpl<T, N> {
5+
fn eq(&self, other: &Self) -> bool {
6+
if self.len != other.len {
7+
return false;
8+
}
9+
10+
for i in 0..self.len() {
11+
if self[i] != other[i] {
12+
return false;
13+
}
14+
}
15+
16+
true
17+
}
18+
}
19+
20+
impl<T: Eq, const N: LenType> Eq for LocalVecImpl<T, N> {}
21+
22+
#[cfg(test)]
23+
mod tests {
24+
use super::*;
25+
26+
#[test]
27+
fn test_eq_equal() {
28+
let vec = LocalVecImpl::<_, 3>::from_array([1, 2, 3]);
29+
let cloned = vec.clone();
30+
assert!(vec == cloned);
31+
}
32+
33+
#[test]
34+
fn test_eq_not_equal() {
35+
let a = LocalVecImpl::<_, 3>::from_array([1, 2, 3]);
36+
let b = LocalVecImpl::<_, 3>::from_array([1, 2, 5]);
37+
assert!(a != b);
38+
}
39+
40+
#[test]
41+
fn test_eq_diff_len() {
42+
let a = LocalVecImpl::<_, 4>::from_array([1, 2, 3]);
43+
let b = LocalVecImpl::<_, 4>::from_array([1, 2, 3, 4]);
44+
assert!(a != b);
45+
}
46+
}

src/lib.rs

Lines changed: 81 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,65 @@
11
use std::mem::MaybeUninit;
22

3+
mod clone;
34
mod drop;
45
mod index;
56
mod from;
67
mod deref;
78
mod iter;
89
mod extend;
10+
mod eq;
911

10-
#[derive(Debug)]
1112
/// A fixed-capacity vector that directly stores its elements
12-
pub struct LocalVec<T, const N: usize> {
13+
#[derive(Eq, PartialEq, Clone, Debug)]
14+
pub struct LocalVec<T, const N: usize>(LocalVecImpl<T, N>);
15+
16+
/// /// A fixed-capacity vector, for Copy types, that directly stores its elements
17+
#[derive(Eq, PartialEq, Copy, Clone, Debug)]
18+
pub struct CopyLocalVec<T: Copy, const N: usize>(LocalVecImpl<T, N>);
19+
20+
#[derive(Copy, Debug)]
21+
pub struct LocalVecImpl<T, const N: usize> {
1322
buf: [MaybeUninit<T>; N],
14-
len: usize,
23+
len: LenType,
1524
}
1625

26+
// TODO use instead of usize
27+
type LenType = usize;
28+
1729
impl<T, const N: usize> LocalVec<T, N> {
1830
pub fn new() -> Self {
31+
Self(LocalVecImpl::new())
32+
}
33+
34+
pub fn from_array<const M: usize>(arr: [T; M]) -> Self {
35+
Self(LocalVecImpl::from_array(arr))
36+
}
37+
}
38+
39+
impl<T: Copy, const N: usize> CopyLocalVec<T, N> {
40+
pub fn new() -> Self {
41+
Self(LocalVecImpl::new())
42+
}
43+
44+
pub fn from_array<const M: usize>(arr: [T; M]) -> Self {
45+
Self(LocalVecImpl::from_array(arr))
46+
}
47+
}
48+
49+
impl<T, const N: usize> LocalVecImpl<T, N> {
50+
fn new() -> Self {
1951
let buf: [MaybeUninit<T>; N] = unsafe {
2052
MaybeUninit::uninit().assume_init()
2153
};
2254

23-
LocalVec {
55+
LocalVecImpl {
2456
buf,
2557
len: 0,
2658
}
2759
}
2860

2961
// TODO implement From<[T; N]> on top of this?
30-
pub fn from_array<const M: usize>(arr: [T; M]) -> Self {
62+
fn from_array<const M: usize>(arr: [T; M]) -> Self {
3163
// TODO check at compile time
3264
assert!(M <= N, "can't store {} elements with a capacity of {}", M, N);
3365

@@ -122,21 +154,49 @@ impl<T, const N: usize> LocalVec<T, N> {
122154
}
123155
}
124156

157+
impl<T, const N: usize> std::ops::Deref for LocalVec<T, N> {
158+
type Target = LocalVecImpl<T, N>;
159+
160+
fn deref(&self) -> &Self::Target {
161+
&self.0
162+
}
163+
}
164+
165+
impl<T: Copy, const N: usize> std::ops::Deref for CopyLocalVec<T, N> {
166+
type Target = LocalVecImpl<T, N>;
167+
168+
fn deref(&self) -> &Self::Target {
169+
&self.0
170+
}
171+
}
172+
173+
impl<T, const N: usize> std::ops::DerefMut for LocalVec<T, N> {
174+
fn deref_mut(&mut self) -> &mut Self::Target {
175+
&mut self.0
176+
}
177+
}
178+
179+
impl<T: Copy, const N: usize> std::ops::DerefMut for CopyLocalVec<T, N> {
180+
fn deref_mut(&mut self) -> &mut Self::Target {
181+
&mut self.0
182+
}
183+
}
184+
125185
#[cfg(test)]
126186
mod tests {
127-
use super::LocalVec;
187+
use super::LocalVecImpl;
128188

129189
#[test]
130190
fn test_new() {
131-
let vec = LocalVec::<u32, 4>::new();
191+
let vec = LocalVecImpl::<u32, 4>::new();
132192
assert_eq!(vec.len(), 0);
133193
assert_eq!(vec.capacity(), 4);
134194
}
135195

136196
#[test]
137197
#[should_panic]
138198
fn test_push_on_full() {
139-
let mut vec = LocalVec::<_, 1>::new();
199+
let mut vec = LocalVecImpl::<_, 1>::new();
140200
vec.push(0);
141201

142202
assert!(vec.is_full());
@@ -146,7 +206,7 @@ mod tests {
146206

147207
#[test]
148208
fn test_push() {
149-
let mut vec = LocalVec::<_, 3>::new();
209+
let mut vec = LocalVecImpl::<_, 3>::new();
150210

151211
assert!(vec.is_empty());
152212
assert_eq!(vec.len(), 0);
@@ -164,7 +224,7 @@ mod tests {
164224

165225
#[test]
166226
fn test_pop_on_empty() {
167-
let mut vec = LocalVec::<_, 1>::new();
227+
let mut vec = LocalVecImpl::<_, 1>::new();
168228
assert!(vec.is_empty());
169229
matches!(vec.pop(), None);
170230

@@ -178,7 +238,7 @@ mod tests {
178238

179239
#[test]
180240
fn test_push_and_pop() {
181-
let mut vec = LocalVec::<_, 4>::new();
241+
let mut vec = LocalVecImpl::<_, 4>::new();
182242
assert!(vec.is_empty());
183243
matches!(vec.pop(), None);
184244

@@ -195,7 +255,7 @@ mod tests {
195255

196256
#[test]
197257
fn test_clear() {
198-
let mut vec = LocalVec::<_,3>::new();
258+
let mut vec = LocalVecImpl::<_,3>::new();
199259
vec.clear();
200260
assert!(vec.is_empty());
201261

@@ -214,29 +274,29 @@ mod tests {
214274
#[should_panic]
215275
fn test_from_capacity_exceeding_array() {
216276
let arr = [0; 4];
217-
let _ = LocalVec::<_,3>::from_array(arr);
277+
let _ = LocalVecImpl::<_,3>::from_array(arr);
218278
}
219279

220280
#[test]
221281
fn test_from_array() {
222282
let arr = [0; 4];
223-
let vec = LocalVec::<_, 4>::from_array(arr);
283+
let vec = LocalVecImpl::<_, 4>::from_array(arr);
224284

225285
assert_eq!(vec.len(), 4);
226286
}
227287

228288
#[test]
229289
fn test_from_smaller_array() {
230290
let arr = [0; 4];
231-
let vec = LocalVec::<_, 6>::from_array(arr);
291+
let vec = LocalVecImpl::<_, 6>::from_array(arr);
232292

233293
assert_eq!(vec.len(), 4);
234294
}
235295

236296
#[test]
237297
fn test_set_len() {
238298
let arr = [7; 4];
239-
let mut vec = LocalVec::<_, 6>::from_array(arr);
299+
let mut vec = LocalVecImpl::<_, 6>::from_array(arr);
240300

241301
assert_eq!(vec.len(), 4);
242302
unsafe {
@@ -248,7 +308,7 @@ mod tests {
248308
#[test]
249309
fn test_take_array() {
250310
let arr = [7; 4];
251-
let mut vec = LocalVec::<_, 6>::from_array(arr);
311+
let mut vec = LocalVecImpl::<_, 6>::from_array(arr);
252312
assert_eq!(vec.len(), 4);
253313
let _ = vec.take_array();
254314
assert_eq!(vec.len(), 0);
@@ -257,29 +317,29 @@ mod tests {
257317
#[test]
258318
fn test_as_ptr() {
259319
let arr = [0xff; 3];
260-
let vec = LocalVec::<_, 8>::from_array(arr);
320+
let vec = LocalVecImpl::<_, 8>::from_array(arr);
261321
let ptr = vec.as_ptr();
262322
assert_eq!(ptr, &vec[0] as *const i32);
263323
}
264324

265325
#[test]
266326
fn test_as_mut_ptr() {
267327
let arr = [0xff; 3];
268-
let mut vec = LocalVec::<_, 8>::from_array(arr);
328+
let mut vec = LocalVecImpl::<_, 8>::from_array(arr);
269329
let ptr = vec.as_mut_ptr();
270330
assert_eq!(ptr, &mut vec[0] as *mut i32);
271331
}
272332

273333
#[test]
274334
fn test_as_ptr_zero_size() {
275-
let vec = LocalVec::<u8, 0>::new();
335+
let vec = LocalVecImpl::<u8, 0>::new();
276336
let ptr = vec.as_ptr();
277337
assert!(ptr.is_null());
278338
}
279339

280340
#[test]
281341
fn test_as_mut_ptr_zero_size() {
282-
let mut vec = LocalVec::<u8, 0>::new();
342+
let mut vec = LocalVecImpl::<u8, 0>::new();
283343
let ptr = vec.as_mut_ptr();
284344
assert!(ptr.is_null());
285345
}

0 commit comments

Comments
 (0)