92 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			V
		
	
	
			
		
		
	
	
			92 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			V
		
	
	
| module html
 | |
| 
 | |
| const (
 | |
| 	null_element = int(0x80000000)
 | |
| )
 | |
| 
 | |
| struct Stack {
 | |
| mut:
 | |
| 	elements []int
 | |
| 	size     int
 | |
| }
 | |
| 
 | |
| [inline]
 | |
| fn is_null(data int) bool {
 | |
| 	return data == html.null_element
 | |
| }
 | |
| 
 | |
| [inline]
 | |
| fn (stack Stack) is_empty() bool {
 | |
| 	return stack.size <= 0
 | |
| }
 | |
| 
 | |
| fn (stack Stack) peek() int {
 | |
| 	return if !stack.is_empty() { stack.elements[stack.size - 1] } else { html.null_element }
 | |
| }
 | |
| 
 | |
| fn (mut stack Stack) pop() int {
 | |
| 	mut to_return := html.null_element
 | |
| 	if !stack.is_empty() {
 | |
| 		to_return = stack.elements[stack.size - 1]
 | |
| 		stack.size--
 | |
| 	}
 | |
| 	return to_return
 | |
| }
 | |
| 
 | |
| fn (mut stack Stack) push(item int) {
 | |
| 	if stack.elements.len > stack.size {
 | |
| 		stack.elements[stack.size] = item
 | |
| 	} else {
 | |
| 		stack.elements << item
 | |
| 	}
 | |
| 	stack.size++
 | |
| }
 | |
| 
 | |
| struct BTree {
 | |
| mut:
 | |
| 	all_tags     []Tag
 | |
| 	node_pointer int
 | |
| 	childrens    [][]int
 | |
| 	parents      []int
 | |
| }
 | |
| 
 | |
| fn (mut btree BTree) add_children(tag Tag) int {
 | |
| 	btree.all_tags << tag
 | |
| 	if btree.all_tags.len > 1 {
 | |
| 		for btree.childrens.len <= btree.node_pointer {
 | |
| 			mut temp_array := btree.childrens
 | |
| 			temp_array << []int{}
 | |
| 			btree.childrens = temp_array
 | |
| 		}
 | |
| 		btree.childrens[btree.node_pointer] << btree.all_tags.len - 1
 | |
| 		for btree.parents.len < btree.all_tags.len {
 | |
| 			mut temp_array := btree.parents
 | |
| 			temp_array << 0
 | |
| 			btree.parents = temp_array
 | |
| 		}
 | |
| 		btree.parents[btree.all_tags.len - 1] = btree.node_pointer
 | |
| 	}
 | |
| 	return btree.all_tags.len - 1
 | |
| }
 | |
| 
 | |
| [inline]
 | |
| fn (btree BTree) get_children() []int {
 | |
| 	return btree.childrens[btree.node_pointer]
 | |
| }
 | |
| 
 | |
| [inline]
 | |
| fn (btree BTree) get_parent() int {
 | |
| 	return btree.parents[btree.node_pointer]
 | |
| }
 | |
| 
 | |
| [inline]
 | |
| fn (btree BTree) get_stored() Tag {
 | |
| 	return btree.all_tags[btree.node_pointer]
 | |
| }
 | |
| 
 | |
| fn (mut btree BTree) move_pointer(to int) {
 | |
| 	if to < btree.all_tags.len {
 | |
| 		btree.node_pointer = to
 | |
| 	}
 | |
| }
 |