diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 39a5729..7ef4ed2 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -7,7 +7,7 @@ jobs: test: strategy: matrix: - go-version: [1.16.x, 1.17.x, 1.18.x, 1.19.x,1.20.x] + go-version: [1.16.x, 1.17.x, 1.18.x, 1.19.x,1.20.x,1.21.x,1.22.x,1.23.x,1.24.x] os: [ubuntu-latest, macos-latest, windows-latest] runs-on: ${{ matrix.os }} steps: diff --git a/bitset_iter.go b/bitset_iter.go new file mode 100644 index 0000000..79bf8a0 --- /dev/null +++ b/bitset_iter.go @@ -0,0 +1,23 @@ +//go:build go1.23 +// +build go1.23 + +package bitset + +import ( + "iter" + "math/bits" +) + +func (b *BitSet) EachSet() iter.Seq[uint] { + return func(yield func(uint) bool) { + for wordIndex, word := range b.set { + idx := 0 + for trail := bits.TrailingZeros64(word); trail != 64; trail = bits.TrailingZeros64(word >> idx) { + if !yield(uint(wordIndex<= len(got) { + t.Errorf("Missing expected value %d at position %d", want, i) + continue + } + if got[i] != want { + t.Errorf("At position %d: expected %d, got %d", i, want, got[i]) + } + } + + // Test 3: Check no extra values + if len(got) > len(expected) { + t.Errorf("Got extra values: %v", got[len(expected):]) + } +} +func BenchmarkIter(b *testing.B) { + b.StopTimer() + s := New(10000) + for i := 0; i < 10000; i += 3 { + s.Set(uint(i)) + } + + b.StartTimer() + for j := 0; j < b.N; j++ { + c := uint(0) + for range s.EachSet() { + c++ + } + } +} + +func BenchmarkNonInter(b *testing.B) { + b.StopTimer() + s := New(10000) + for i := 0; i < 10000; i += 3 { + s.Set(uint(i)) + } + + b.StartTimer() + for j := 0; j < b.N; j++ { + c := uint(0) + for i, e := s.NextSet(0); e; i, e = s.NextSet(i + 1) { + c++ + } + } +}