github.com/jujuyuki/gospal@v1.0.1-0.20210215170718-af79fae13b20/loop/stack.go (about)

     1  package loop
     2  
     3  import (
     4  	"errors"
     5  	"sync"
     6  )
     7  
     8  var ErrEmptyStack = errors.New("error: empty stack")
     9  
    10  // Stack is a stack of ssa.BasicBlock
    11  type Stack struct {
    12  	sync.Mutex
    13  	s []*Info
    14  }
    15  
    16  // NewStack creates a new LoopStack.
    17  func NewStack() *Stack {
    18  	return &Stack{s: []*Info{}}
    19  }
    20  
    21  // Push adds a new Info to the top of stack.
    22  func (s *Stack) Push(i *Info) {
    23  	s.Lock()
    24  	defer s.Unlock()
    25  	s.s = append(s.s, i)
    26  }
    27  
    28  // Pop removes a Loop from top of stack.
    29  func (s *Stack) Pop() (*Info, error) {
    30  	s.Lock()
    31  	defer s.Unlock()
    32  
    33  	size := len(s.s)
    34  	if size == 0 {
    35  		return nil, ErrEmptyStack
    36  	}
    37  	l := s.s[size-1]
    38  	s.s = s.s[:size-1]
    39  	return l, nil
    40  }
    41  
    42  // IsEmpty returns true if stack is empty.
    43  func (s *Stack) IsEmpty() bool {
    44  	return len(s.s) == 0
    45  }