| // Copyright 2015 The Go 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 ssa | |
| // from https://research.swtch.com/sparse | |
| // in turn, from Briggs and Torczon | |
| type sparseSet struct { | |
| dense []ID | |
| sparse []int32 | |
| } | |
| // newSparseSet returns a sparseSet that can represent | |
| // integers between 0 and n-1 | |
| func newSparseSet(n int) *sparseSet { | |
| return &sparseSet{dense: nil, sparse: make([]int32, n)} | |
| } | |
| func (s *sparseSet) cap() int { | |
| return len(s.sparse) | |
| } | |
| func (s *sparseSet) size() int { | |
| return len(s.dense) | |
| } | |
| func (s *sparseSet) contains(x ID) bool { | |
| i := s.sparse[x] | |
| return i < int32(len(s.dense)) && s.dense[i] == x | |
| } | |
| func (s *sparseSet) add(x ID) { | |
| i := s.sparse[x] | |
| if i < int32(len(s.dense)) && s.dense[i] == x { | |
| return | |
| } | |
| s.dense = append(s.dense, x) | |
| s.sparse[x] = int32(len(s.dense)) - 1 | |
| } | |
| func (s *sparseSet) addAll(a []ID) { | |
| for _, x := range a { | |
| s.add(x) | |
| } | |
| } | |
| func (s *sparseSet) addAllValues(a []*Value) { | |
| for _, v := range a { | |
| s.add(v.ID) | |
| } | |
| } | |
| func (s *sparseSet) remove(x ID) { | |
| i := s.sparse[x] | |
| if i < int32(len(s.dense)) && s.dense[i] == x { | |
| y := s.dense[len(s.dense)-1] | |
| s.dense[i] = y | |
| s.sparse[y] = i | |
| s.dense = s.dense[:len(s.dense)-1] | |
| } | |
| } | |
| // pop removes an arbitrary element from the set. | |
| // The set must be nonempty. | |
| func (s *sparseSet) pop() ID { | |
| x := s.dense[len(s.dense)-1] | |
| s.dense = s.dense[:len(s.dense)-1] | |
| return x | |
| } | |
| func (s *sparseSet) clear() { | |
| s.dense = s.dense[:0] | |
| } | |
| func (s *sparseSet) contents() []ID { | |
| return s.dense | |
| } |