github.com/urso/go-structform@v0.0.2/cborl/stack.go (about)

     1  package cborl
     2  
     3  type stateStack struct {
     4  	stack   []state // state stack for nested arrays/objects
     5  	stack0  [64]state
     6  	current state
     7  }
     8  
     9  type lengthStack struct {
    10  	stack   []int64
    11  	stack0  [32]int64
    12  	current int64
    13  }
    14  
    15  func (s *stateStack) init(s0 state) {
    16  	s.current = s0
    17  	s.stack = s.stack0[:0]
    18  }
    19  
    20  func (s *stateStack) push(next state) {
    21  	if s.current.major != stFail {
    22  		s.stack = append(s.stack, s.current)
    23  	}
    24  	s.current = next
    25  }
    26  
    27  func (s *stateStack) pop() {
    28  	if len(s.stack) == 0 {
    29  		s.current = state{stFail, stStart}
    30  	} else {
    31  		last := len(s.stack) - 1
    32  		s.current = s.stack[last]
    33  		s.stack = s.stack[:last]
    34  	}
    35  }
    36  
    37  func (s *lengthStack) init() {
    38  	s.stack = s.stack0[:0]
    39  }
    40  
    41  func (s *lengthStack) push(l int64) {
    42  	s.stack = append(s.stack, s.current)
    43  	s.current = l
    44  }
    45  
    46  func (s *lengthStack) pop() int64 {
    47  	if len(s.stack) == 0 {
    48  		s.current = -1
    49  		return -1
    50  	} else {
    51  		last := len(s.stack) - 1
    52  		old := s.current
    53  		s.current = s.stack[last]
    54  		s.stack = s.stack[:last]
    55  		return old
    56  	}
    57  }