| // Copyright 2015 The Vanadium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| package concurrency |
| |
| import ( |
| "errors" |
| "sort" |
| ) |
| |
| // stack is an implementation of the stack data structure. |
| type stack struct { |
| contents []*state |
| } |
| |
| // IncreasingDepth is used to sort states in the increasing order of |
| // their depth. |
| type IncreasingDepth []*state |
| |
| // SORT INTERFACE IMPLEMENTATION |
| |
| func (states IncreasingDepth) Len() int { |
| return len(states) |
| } |
| func (states IncreasingDepth) Less(i, j int) bool { |
| return states[i].depth < states[j].depth |
| } |
| func (states IncreasingDepth) Swap(i, j int) { |
| states[i], states[j] = states[j], states[i] |
| } |
| |
| // Empty checks if the stack is empty. |
| func (s *stack) Empty() bool { |
| return len(s.contents) == 0 |
| } |
| |
| // Length returns the length of the stack. |
| func (s *stack) Length() int { |
| return len(s.contents) |
| } |
| |
| // Pop removes and returns the top element of the stack. If the stack |
| // is empty, an error is returned. |
| func (s *stack) Pop() (*state, error) { |
| l := len(s.contents) |
| if l > 0 { |
| x := s.contents[l-1] |
| s.contents = s.contents[:l-1] |
| return x, nil |
| } |
| return nil, errors.New("Stack is empty.") |
| } |
| |
| // Push adds a new element to the top of the stack. |
| func (s *stack) Push(value *state) { |
| s.contents = append(s.contents, value) |
| } |
| |
| // Sort sorts the elements of the stack in the decreasing order of |
| // their depth. |
| func (s *stack) Sort() { |
| sort.Sort(IncreasingDepth(s.contents)) |
| } |