}
// Returns the piece with the lowest key.
-func (me Instance) First() Element {
+func (me *Instance) First() Element {
i := me.sl.SeekToFirst()
if i == nil {
return nil
return &element{i, i.Value().([]int)}
}
+func (me *Instance) Empty() bool {
+ return me.sl.Len() == 0
+}
+
type Element interface {
Piece() int
Next() Element
return e
}
-func (e element) Piece() int {
+func (e *element) Piece() int {
return e.sl[0]
}
import (
"sort"
"testing"
+
+ "github.com/bradfitz/iter"
+ "github.com/stretchr/testify/assert"
)
func instanceSlice(i *Instance) (sl []int) {
return true
}
-func checkOrder(t *testing.T, i *Instance, ppp ...[]int) {
+func checkOrder(t testing.TB, i *Instance, ppp ...[]int) {
fatal := func() {
t.Fatalf("have %v, expected %v", instanceSlice(i), ppp)
}
}
}
-func TestPieceOrdering(t *testing.T) {
+func testPieceOrdering(t testing.TB) {
i := New()
+ assert.True(t, i.Empty())
i.SetPiece(0, 1)
+ assert.False(t, i.Empty())
i.SetPiece(1, 0)
checkOrder(t, i, []int{1, 0})
i.SetPiece(1, 2)
i.DeletePiece(1)
checkOrder(t, i, []int{0})
i.DeletePiece(0)
+ assert.True(t, i.Empty())
checkOrder(t, i, nil)
i.SetPiece(2, 1)
+ assert.False(t, i.Empty())
i.SetPiece(1, 1)
i.SetPiece(3, 1)
checkOrder(t, i, []int{3, 1, 2})
i.DeletePiece(2)
i.DeletePiece(3)
i.DeletePiece(1)
+ assert.True(t, i.Empty())
checkOrder(t, i, nil)
+ // Deleting pieces that aren't present.
i.DeletePiece(2)
i.DeletePiece(3)
i.DeletePiece(1)
+ assert.True(t, i.Empty())
checkOrder(t, i, nil)
}
+
+func TestPieceOrdering(t *testing.T) {
+ testPieceOrdering(t)
+}
+
+func BenchmarkPieceOrdering(b *testing.B) {
+ for range iter.N(b.N) {
+ testPieceOrdering(b)
+ }
+}
+
+func BenchmarkIteration(b *testing.B) {
+ for range iter.N(b.N) {
+ i := New()
+ for p := range iter.N(500) {
+ i.SetPiece(p, p)
+ }
+ for e := i.First(); e != nil; e = e.Next() {
+ }
+ }
+}