v2 / vlib / v / tests / options / option_ptr_unwrap_test.v
89 lines · 75 sloc · 1.5 KB · b98ca31e263a4319839543088accd45915290866
Raw
1import time
2// 41s.
3
4struct Node[T] {
5mut:
6 data T
7 prev ?&Node[T]
8 next ?&Node[T]
9}
10
11struct LinkedList[T] {
12mut:
13 size usize
14 head ?&Node[T]
15}
16
17fn new_linked_list[T]() &LinkedList[T] {
18 return &LinkedList[T]{}
19}
20
21fn (mut li LinkedList[T]) add[T](data T) ? {
22 mut node := &Node[T]{data, none, none}
23
24 if li.head == none {
25 li.head = node
26 node.next = node
27 node.prev = node
28 } else {
29 node.next = li.head
30 node.prev = li.head.prev
31 node.prev?.next = node
32 li.head.prev = node
33 }
34
35 li.size += 1
36}
37
38fn (mut li LinkedList[T]) pop[T]() ?T {
39 if li.head == none {
40 return none
41 }
42 if li.size == 1 {
43 data := li.head?.data
44 li.head?.next = none
45 li.head?.prev = none
46 li.head = none
47 li.size -= 1
48 return data
49 }
50
51 mut tail := li.head?.prev?
52 mut curr := tail.prev?
53 curr.next = li.head
54 li.head?.prev = curr
55
56 tail.next = none
57 tail.prev = none
58 li.size -= 1
59
60 return tail.data
61}
62
63@[heap]
64struct Integer {
65 value int
66}
67
68fn test_main() {
69 max_itr := 2
70 t := time.now()
71 for itr in 0 .. max_itr {
72 mut list := new_linked_list[&Integer]()
73 println('Itr#${itr} list size: ${list.size}')
74
75 list.add(&Integer{10})
76 println('Itr#${itr} list size: ${list.size}')
77 list.add(&Integer{20})
78 println('Itr#${itr} list size: ${list.size}')
79
80 mut n := list.pop()
81 println('Itr#${itr} list size: ${list.size}, data: ${n?}')
82 n = list.pop()
83 println('Itr#${itr} list size: ${list.size}, data: ${n?}')
84 n = list.pop()
85 println('Itr#${itr} list size: ${list.size}, data: ${n}')
86 }
87 d := time.since(t)
88 println('Bye(time ${d})!')
89}
90