| 1 | module html |
| 2 | |
| 3 | const null_element = int(-1) |
| 4 | |
| 5 | struct Stack { |
| 6 | mut: |
| 7 | elements []int |
| 8 | size int |
| 9 | } |
| 10 | |
| 11 | @[inline] |
| 12 | fn is_null(data int) bool { |
| 13 | return data == null_element |
| 14 | } |
| 15 | |
| 16 | @[inline] |
| 17 | fn (stack Stack) is_empty() bool { |
| 18 | return stack.size <= 0 |
| 19 | } |
| 20 | |
| 21 | fn (stack Stack) peek() int { |
| 22 | return if !stack.is_empty() { stack.elements[stack.size - 1] } else { null_element } |
| 23 | } |
| 24 | |
| 25 | fn (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 | |
| 34 | fn (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 | |
| 43 | struct BTree { |
| 44 | mut: |
| 45 | all_tags []Tag |
| 46 | node_pointer int |
| 47 | childrens [][]int |
| 48 | parents []int |
| 49 | } |
| 50 | |
| 51 | fn (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] |
| 71 | fn (btree BTree) get_children() []int { |
| 72 | return btree.childrens[btree.node_pointer] |
| 73 | } |
| 74 | |
| 75 | @[inline] |
| 76 | fn (btree BTree) get_parent() int { |
| 77 | return btree.parents[btree.node_pointer] |
| 78 | } |
| 79 | |
| 80 | @[inline] |
| 81 | fn (btree BTree) get_stored() Tag { |
| 82 | return btree.all_tags[btree.node_pointer] |
| 83 | } |
| 84 | |
| 85 | fn (mut btree BTree) move_pointer(to int) { |
| 86 | if to < btree.all_tags.len { |
| 87 | btree.node_pointer = to |
| 88 | } |
| 89 | } |
| 90 | |