v2 / vlib / v / tests / generics / generics_with_pointer_index_test.v
60 lines · 51 sloc · 876 bytes · 6488041a749df9762348d019c4223908c476f2e2
Raw
1pub struct Vec[T] {
2mut:
3 data &T
4 cap int
5 len int
6}
7
8pub struct Iter[T] {
9mut:
10 v &Vec[T]
11 pos int
12}
13
14pub fn with_cap[T](cap int) Vec[T] {
15 new_data := unsafe { malloc(cap * int(sizeof(T))) }
16 unsafe { vmemset(new_data, 0, cap * int(sizeof(T))) }
17
18 return Vec[T]{
19 data: new_data
20 cap: cap
21 len: 0
22 }
23}
24
25pub fn (ar &Vec[T]) iter() Iter[T] {
26 return Iter[T]{
27 v: unsafe { ar }
28 }
29}
30
31pub fn (mut iter Iter[T]) next() ?&T {
32 if iter.pos >= iter.v.len {
33 return none
34 }
35 res := unsafe { &iter.v.data[iter.pos] }
36 iter.pos++
37 return res
38}
39
40pub fn (mut ar Vec[T]) push(elm T) {
41 unsafe {
42 ar.data[ar.len - 1] = elm
43 }
44}
45
46struct Product {
47 price f64
48}
49
50fn test_generic_with_pointer_index() {
51 vec1 := with_cap[Product](5)
52 println(vec1)
53 assert vec1.len == 0
54 assert vec1.cap == 5
55
56 vec2 := with_cap[int](5)
57 println(vec2)
58 assert vec2.len == 0
59 assert vec2.cap == 5
60}
61