]> Cypherpunks repositories - gostls13.git/commitdiff
container/list: added MoveBefore and MoveAfter
authorPieter Droogendijk <pieter@binky.org.uk>
Wed, 31 Jul 2013 21:11:25 +0000 (14:11 -0700)
committerRobert Griesemer <gri@golang.org>
Wed, 31 Jul 2013 21:11:25 +0000 (14:11 -0700)
Fixes #4940.

R=golang-dev, bradfitz, gri
CC=golang-dev
https://golang.org/cl/12021044

src/pkg/container/list/list.go
src/pkg/container/list/list_test.go

index 20d612ef9a4174b2b090f6a09efc25d85666978a..53e839ed6559682b02c8dc0de7a49607213e1573 100644 (file)
@@ -179,6 +179,24 @@ func (l *List) MoveToBack(e *Element) {
        l.insert(l.remove(e), l.root.prev)
 }
 
+// MoveBefore moves element e to its new position before mark.
+// If e is not an element of l, or e == mark, the list is not modified.
+func (l *List) MoveBefore(e, mark *Element) {
+       if e.list != l || e == mark {
+               return
+       }
+       l.insert(l.remove(e), mark.prev)
+}
+
+// MoveAfter moves element e to its new position after mark.
+// If e is not an element of l, or e == mark, the list is not modified.
+func (l *List) MoveAfter(e, mark *Element) {
+       if e.list != l || e == mark {
+               return
+       }
+       l.insert(l.remove(e), mark)
+}
+
 // PushBackList inserts a copy of an other list at the back of list l.
 // The lists l and other may be the same.
 func (l *List) PushBackList(other *List) {
index b4fc77d1403546e732e46ec79062c6e6f8221604..33f060c7f5b510967b138c776a8667f3239efae1 100644 (file)
@@ -233,3 +233,37 @@ func TestIssue4103(t *testing.T) {
                t.Errorf("l1.Len() = %d, want 3", n)
        }
 }
+
+func TestMove(t *testing.T) {
+       l := New()
+       e1 := l.PushBack(1)
+       e2 := l.PushBack(2)
+       e3 := l.PushBack(3)
+       e4 := l.PushBack(4)
+
+       l.MoveAfter(e3, e3)
+       checkListPointers(t, l, []*Element{e1, e2, e3, e4})
+       l.MoveBefore(e2, e2)
+       checkListPointers(t, l, []*Element{e1, e2, e3, e4})
+
+       l.MoveAfter(e3, e2)
+       checkListPointers(t, l, []*Element{e1, e2, e3, e4})
+       l.MoveBefore(e2, e3)
+       checkListPointers(t, l, []*Element{e1, e2, e3, e4})
+
+       l.MoveBefore(e2, e4)
+       checkListPointers(t, l, []*Element{e1, e3, e2, e4})
+       e1, e2, e3, e4 = e1, e3, e2, e4
+
+       l.MoveBefore(e4, e1)
+       checkListPointers(t, l, []*Element{e4, e1, e2, e3})
+       e1, e2, e3, e4 = e4, e1, e2, e3
+
+       l.MoveAfter(e4, e1)
+       checkListPointers(t, l, []*Element{e1, e4, e2, e3})
+       e1, e2, e3, e4 = e1, e4, e2, e3
+
+       l.MoveAfter(e2, e3)
+       checkListPointers(t, l, []*Element{e1, e3, e2, e4})
+       e1, e2, e3, e4 = e1, e3, e2, e4
+}