v2 / vlib / net / html / data_structures.v
89 lines · 76 sloc · 1.71 KB · 008aaad99981918c51194d7aaaaaccb4c258f244
Raw
1module html
2
3const null_element = int(-1)
4
5struct Stack {
6mut:
7 elements []int
8 size int
9}
10
11@[inline]
12fn is_null(data int) bool {
13 return data == null_element
14}
15
16@[inline]
17fn (stack Stack) is_empty() bool {
18 return stack.size <= 0
19}
20
21fn (stack Stack) peek() int {
22 return if !stack.is_empty() { stack.elements[stack.size - 1] } else { null_element }
23}
24
25fn (mut stack Stack) pop() int {
26 mut to_return := null_element
27 if !stack.is_empty() {
28 to_return = stack.elements[stack.size - 1]
29 stack.size--
30 }
31 return to_return
32}
33
34fn (mut stack Stack) push(item int) {
35 if stack.elements.len > stack.size {
36 stack.elements[stack.size] = item
37 } else {
38 stack.elements << item
39 }
40 stack.size++
41}
42
43struct BTree {
44mut:
45 all_tags []Tag
46 node_pointer int
47 childrens [][]int
48 parents []int
49}
50
51fn (mut btree BTree) add_children(tag Tag) int {
52 btree.all_tags << tag
53 if btree.all_tags.len > 1 {
54 for btree.childrens.len <= btree.node_pointer {
55 mut temp_array := btree.childrens.clone()
56 temp_array << []int{}
57 btree.childrens = temp_array
58 }
59 btree.childrens[btree.node_pointer] << btree.all_tags.len - 1
60 for btree.parents.len < btree.all_tags.len {
61 mut temp_array := btree.parents.clone()
62 temp_array << 0
63 btree.parents = temp_array
64 }
65 btree.parents[btree.all_tags.len - 1] = btree.node_pointer
66 }
67 return btree.all_tags.len - 1
68}
69
70@[inline]
71fn (btree BTree) get_children() []int {
72 return btree.childrens[btree.node_pointer]
73}
74
75@[inline]
76fn (btree BTree) get_parent() int {
77 return btree.parents[btree.node_pointer]
78}
79
80@[inline]
81fn (btree BTree) get_stored() Tag {
82 return btree.all_tags[btree.node_pointer]
83}
84
85fn (mut btree BTree) move_pointer(to int) {
86 if to < btree.all_tags.len {
87 btree.node_pointer = to
88 }
89}
90