diff options
Diffstat (limited to 'vendor/github.com/soniakeys/graph/bits.go')
| -rw-r--r-- | vendor/github.com/soniakeys/graph/bits.go | 207 | 
1 files changed, 0 insertions, 207 deletions
| diff --git a/vendor/github.com/soniakeys/graph/bits.go b/vendor/github.com/soniakeys/graph/bits.go deleted file mode 100644 index b86703c..0000000 --- a/vendor/github.com/soniakeys/graph/bits.go +++ /dev/null @@ -1,207 +0,0 @@ -// Copyright 2014 Sonia Keys -// License MIT: http://opensource.org/licenses/MIT - -package graph - -import ( -	"fmt" -	"math/big" -) - -// Bits is bitmap, or bitset, intended to store a single bit of information -// per node of a graph. -// -// The current implementation is backed by a big.Int and so is a reference -// type in the same way a big.Int is. -type Bits struct { -	i big.Int -} - -// NewBits constructs a Bits value with the bits ns set to 1. -func NewBits(ns ...NI) (b Bits) { -	for _, n := range ns { -		b.SetBit(n, 1) -	} -	return -} - -// AllNot sets n bits of z to the complement of x. -// -// It is a convenience method for SetAll followed by AndNot. -func (z *Bits) AllNot(n int, x Bits) { -	var y Bits -	y.SetAll(n) -	z.AndNot(y, x) -} - -// And sets z = x & y. -func (z *Bits) And(x, y Bits) { -	z.i.And(&x.i, &y.i) -} - -// AndNot sets z = x &^ y. -func (z *Bits) AndNot(x, y Bits) { -	z.i.AndNot(&x.i, &y.i) -} - -// Bit returns the value of the n'th bit of x. -func (b Bits) Bit(n NI) uint { -	return b.i.Bit(int(n)) -} - -// Clear sets all bits to 0. -func (z *Bits) Clear() { -	*z = Bits{} -} - -// Format satisfies fmt.Formatter for fmt.Printf and related methods. -// -// graph.Bits format exactly like big.Ints. -func (b Bits) Format(s fmt.State, ch rune) { -	b.i.Format(s, ch) -} - -// From returns the position of the first 1 bit at or after (from) position n. -// -// It returns -1 if there is no one bit at or after position n. -// -// This provides one way to iterate over one bits. -// To iterate over the one bits, call with n = 0 to get the the first -// one bit, then call with the result + 1 to get successive one bits. -// Unlike the Iterate method, this technique is stateless and so allows -// bits to be changed between successive calls. -// -// See also Iterate. -// -// (From is just a short word that means "at or after" here; -// it has nothing to do with arc direction.) -func (b Bits) From(n NI) NI { -	words := b.i.Bits() -	i := int(n) -	x := i >> wordExp // x now index of word containing bit i. -	if x >= len(words) { -		return -1 -	} -	// test for 1 in this word at or after n -	if wx := words[x] >> (uint(i) & (wordSize - 1)); wx != 0 { -		return n + NI(trailingZeros(wx)) -	} -	x++ -	for y, wy := range words[x:] { -		if wy != 0 { -			return NI((x+y)<<wordExp | trailingZeros(wy)) -		} -	} -	return -1 -} - -// Iterate calls Visitor v for each bit with a value of 1, in order -// from lowest bit to highest bit. -// -// Iteration continues to the highest bit as long as v returns true. -// It stops if v returns false. -// -// Iterate returns true normally.  It returns false if v returns false. -// -// Bit values should not be modified during iteration, by the visitor function -// for example.  See From for an iteration method that allows modification. -func (b Bits) Iterate(v OkNodeVisitor) bool { -	for x, w := range b.i.Bits() { -		if w != 0 { -			t := trailingZeros(w) -			i := t // index in w of next 1 bit -			for { -				if !v(NI(x<<wordExp | i)) { -					return false -				} -				w >>= uint(t + 1) -				if w == 0 { -					break -				} -				t = trailingZeros(w) -				i += 1 + t -			} -		} -	} -	return true -} - -// Or sets z = x | y. -func (z *Bits) Or(x, y Bits) { -	z.i.Or(&x.i, &y.i) -} - -// PopCount returns the number of 1 bits. -func (b Bits) PopCount() (c int) { -	// algorithm selected to be efficient for sparse bit sets. -	for _, w := range b.i.Bits() { -		for w != 0 { -			w &= w - 1 -			c++ -		} -	} -	return -} - -// Set sets the bits of z to the bits of x. -func (z *Bits) Set(x Bits) { -	z.i.Set(&x.i) -} - -var one = big.NewInt(1) - -// SetAll sets z to have n 1 bits. -// -// It's useful for initializing z to have a 1 for each node of a graph. -func (z *Bits) SetAll(n int) { -	z.i.Sub(z.i.Lsh(one, uint(n)), one) -} - -// SetBit sets the n'th bit to b, where be is a 0 or 1. -func (z *Bits) SetBit(n NI, b uint) { -	z.i.SetBit(&z.i, int(n), b) -} - -// Single returns true if b has exactly one 1 bit. -func (b Bits) Single() bool { -	// like PopCount, but stop as soon as two are found -	c := 0 -	for _, w := range b.i.Bits() { -		for w != 0 { -			w &= w - 1 -			c++ -			if c == 2 { -				return false -			} -		} -	} -	return c == 1 -} - -// Slice returns a slice with the positions of each 1 bit. -func (b Bits) Slice() (s []NI) { -	// (alternative implementation might use Popcount and make to get the -	// exact cap slice up front.  unclear if that would be better.) -	b.Iterate(func(n NI) bool { -		s = append(s, n) -		return true -	}) -	return -} - -// Xor sets z = x ^ y. -func (z *Bits) Xor(x, y Bits) { -	z.i.Xor(&x.i, &y.i) -} - -// Zero returns true if there are no 1 bits. -func (b Bits) Zero() bool { -	return len(b.i.Bits()) == 0 -} - -// trailingZeros returns the number of trailing 0 bits in v. -// -// If v is 0, it returns 0. -func trailingZeros(v big.Word) int { -	return deBruijnBits[v&-v*deBruijnMultiple>>deBruijnShift] -} | 
