// Copyright 2013 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 gc

import "fmt"

const (
	WORDSIZE  = 4
	WORDBITS  = 32
	WORDMASK  = WORDBITS - 1
	WORDSHIFT = 5
)

func bvsize(n uint32) uint32 {
	return ((n + WORDBITS - 1) / WORDBITS) * WORDSIZE
}

func bvbits(bv *Bvec) int32 {
	return bv.n
}

func bvwords(bv *Bvec) int32 {
	return (bv.n + WORDBITS - 1) / WORDBITS
}

func bvalloc(n int32) *Bvec {
	return &Bvec{n, make([]uint32, bvsize(uint32(n))/4)}
}

/* difference */
func bvandnot(dst *Bvec, src1 *Bvec, src2 *Bvec) {
	var i int32
	var w int32

	if dst.n != src1.n || dst.n != src2.n {
		Fatal("bvand: lengths %d, %d, and %d are not equal", dst.n, src1.n, src2.n)
	}
	i = 0
	w = 0
	for ; i < dst.n; (func() { i += WORDBITS; w++ })() {
		dst.b[w] = src1.b[w] &^ src2.b[w]
	}
}

func bvcmp(bv1 *Bvec, bv2 *Bvec) int {
	if bv1.n != bv2.n {
		Fatal("bvequal: lengths %d and %d are not equal", bv1.n, bv2.n)
	}
	for i, x := range bv1.b {
		if x != bv2.b[i] {
			return 1
		}
	}
	return 0
}

func bvcopy(dst *Bvec, src *Bvec) {
	for i, x := range src.b {
		dst.b[i] = x
	}
}

func bvconcat(src1 *Bvec, src2 *Bvec) *Bvec {
	var dst *Bvec
	var i int32

	dst = bvalloc(src1.n + src2.n)
	for i = 0; i < src1.n; i++ {
		if bvget(src1, i) != 0 {
			bvset(dst, i)
		}
	}
	for i = 0; i < src2.n; i++ {
		if bvget(src2, i) != 0 {
			bvset(dst, i+src1.n)
		}
	}
	return dst
}

func bvget(bv *Bvec, i int32) int {
	if i < 0 || i >= bv.n {
		Fatal("bvget: index %d is out of bounds with length %d\n", i, bv.n)
	}
	return int((bv.b[i>>WORDSHIFT] >> uint(i&WORDMASK)) & 1)
}

// bvnext returns the smallest index >= i for which bvget(bv, i) == 1.
// If there is no such index, bvnext returns -1.
func bvnext(bv *Bvec, i int32) int {
	var w uint32

	if i >= bv.n {
		return -1
	}

	// Jump i ahead to next word with bits.
	if bv.b[i>>WORDSHIFT]>>uint(i&WORDMASK) == 0 {
		i &^= WORDMASK
		i += WORDBITS
		for i < bv.n && bv.b[i>>WORDSHIFT] == 0 {
			i += WORDBITS
		}
	}

	if i >= bv.n {
		return -1
	}

	// Find 1 bit.
	w = bv.b[i>>WORDSHIFT] >> uint(i&WORDMASK)

	for w&1 == 0 {
		w >>= 1
		i++
	}

	return int(i)
}

func bvisempty(bv *Bvec) bool {
	var i int32

	for i = 0; i < bv.n; i += WORDBITS {
		if bv.b[i>>WORDSHIFT] != 0 {
			return false
		}
	}
	return true
}

func bvnot(bv *Bvec) {
	var i int32
	var w int32

	i = 0
	w = 0
	for ; i < bv.n; (func() { i += WORDBITS; w++ })() {
		bv.b[w] = ^bv.b[w]
	}
}

/* union */
func bvor(dst *Bvec, src1 *Bvec, src2 *Bvec) {
	var i int32
	var w int32

	if dst.n != src1.n || dst.n != src2.n {
		Fatal("bvor: lengths %d, %d, and %d are not equal", dst.n, src1.n, src2.n)
	}
	i = 0
	w = 0
	for ; i < dst.n; (func() { i += WORDBITS; w++ })() {
		dst.b[w] = src1.b[w] | src2.b[w]
	}
}

/* intersection */
func bvand(dst *Bvec, src1 *Bvec, src2 *Bvec) {
	var i int32
	var w int32

	if dst.n != src1.n || dst.n != src2.n {
		Fatal("bvor: lengths %d, %d, and %d are not equal", dst.n, src1.n, src2.n)
	}
	i = 0
	w = 0
	for ; i < dst.n; (func() { i += WORDBITS; w++ })() {
		dst.b[w] = src1.b[w] & src2.b[w]
	}
}

func bvprint(bv *Bvec) {
	var i int32

	fmt.Printf("#*")
	for i = 0; i < bv.n; i++ {
		fmt.Printf("%d", bvget(bv, i))
	}
}

func bvreset(bv *Bvec, i int32) {
	var mask uint32

	if i < 0 || i >= bv.n {
		Fatal("bvreset: index %d is out of bounds with length %d\n", i, bv.n)
	}
	mask = ^(1 << uint(i%WORDBITS))
	bv.b[i/WORDBITS] &= mask
}

func bvresetall(bv *Bvec) {
	for i := range bv.b {
		bv.b[i] = 0
	}
}

func bvset(bv *Bvec, i int32) {
	var mask uint32

	if i < 0 || i >= bv.n {
		Fatal("bvset: index %d is out of bounds with length %d\n", i, bv.n)
	}
	mask = 1 << uint(i%WORDBITS)
	bv.b[i/WORDBITS] |= mask
}
