diff options
| author | Pieter Droogendijk <pieter@binky.org.uk> | 2013-07-31 14:11:25 -0700 |
|---|---|---|
| committer | Robert Griesemer <gri@golang.org> | 2013-07-31 14:11:25 -0700 |
| commit | fbcc24bb9d20caa7a73cfd12ed0ba9332f274368 (patch) | |
| tree | 742184d9a3191f42c098691e8fbdc1271aec0882 /src/pkg/container | |
| parent | 9f75dd7f25d0171bb0b32522de41b252d6eef111 (diff) | |
| download | go-fbcc24bb9d20caa7a73cfd12ed0ba9332f274368.tar.xz | |
container/list: added MoveBefore and MoveAfter
Fixes #4940.
R=golang-dev, bradfitz, gri
CC=golang-dev
https://golang.org/cl/12021044
Diffstat (limited to 'src/pkg/container')
| -rw-r--r-- | src/pkg/container/list/list.go | 18 | ||||
| -rw-r--r-- | src/pkg/container/list/list_test.go | 34 |
2 files changed, 52 insertions, 0 deletions
diff --git a/src/pkg/container/list/list.go b/src/pkg/container/list/list.go index 20d612ef9a..53e839ed65 100644 --- a/src/pkg/container/list/list.go +++ b/src/pkg/container/list/list.go @@ -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) { diff --git a/src/pkg/container/list/list_test.go b/src/pkg/container/list/list_test.go index b4fc77d140..33f060c7f5 100644 --- a/src/pkg/container/list/list_test.go +++ b/src/pkg/container/list/list_test.go @@ -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 +} |
