1// Copyright 2015 The Go Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style 3// license that can be found in the LICENSE file. 4 5package ssa 6 7// from https://research.swtch.com/sparse 8// in turn, from Briggs and Torczon 9 10type sparseSet struct { 11 dense []ID 12 sparse []int32 13} 14 15// newSparseSet returns a sparseSet that can represent 16// integers between 0 and n-1. 17func newSparseSet(n int) *sparseSet { 18 return &sparseSet{dense: nil, sparse: make([]int32, n)} 19} 20 21func (s *sparseSet) cap() int { 22 return len(s.sparse) 23} 24 25func (s *sparseSet) size() int { 26 return len(s.dense) 27} 28 29func (s *sparseSet) contains(x ID) bool { 30 i := s.sparse[x] 31 return i < int32(len(s.dense)) && s.dense[i] == x 32} 33 34func (s *sparseSet) add(x ID) { 35 i := s.sparse[x] 36 if i < int32(len(s.dense)) && s.dense[i] == x { 37 return 38 } 39 s.dense = append(s.dense, x) 40 s.sparse[x] = int32(len(s.dense)) - 1 41} 42 43func (s *sparseSet) addAll(a []ID) { 44 for _, x := range a { 45 s.add(x) 46 } 47} 48 49func (s *sparseSet) addAllValues(a []*Value) { 50 for _, v := range a { 51 s.add(v.ID) 52 } 53} 54 55func (s *sparseSet) remove(x ID) { 56 i := s.sparse[x] 57 if i < int32(len(s.dense)) && s.dense[i] == x { 58 y := s.dense[len(s.dense)-1] 59 s.dense[i] = y 60 s.sparse[y] = i 61 s.dense = s.dense[:len(s.dense)-1] 62 } 63} 64 65// pop removes an arbitrary element from the set. 66// The set must be nonempty. 67func (s *sparseSet) pop() ID { 68 x := s.dense[len(s.dense)-1] 69 s.dense = s.dense[:len(s.dense)-1] 70 return x 71} 72 73func (s *sparseSet) clear() { 74 s.dense = s.dense[:0] 75} 76 77func (s *sparseSet) contents() []ID { 78 return s.dense 79} 80