]> Cypherpunks repositories - gostls13.git/commitdiff
Implemented ExtendFront/Back functions to insert a list of elements into a list.
authorJan H. Hosang <jan.hosang@gmail.com>
Fri, 15 Jan 2010 21:26:13 +0000 (13:26 -0800)
committerRuss Cox <rsc@golang.org>
Fri, 15 Jan 2010 21:26:13 +0000 (13:26 -0800)
R=golang-dev, rsc
CC=golang-dev
https://golang.org/cl/181151

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

index 9429c90a7281d1e8180615ad99818bc08127c56a..40c9680999abf37671a8d3b7a850ecd5eda2f0d3 100644 (file)
@@ -191,3 +191,25 @@ func (l *List) Iter() <-chan interface{} {
        go l.iterate(c)
        return c
 }
+
+// PushBackList inserts each element of ol at the back of the list.
+func (l *List) PushBackList(ol *List) {
+       last := ol.Back()
+       for e := ol.Front(); e != nil; e = e.Next() {
+               l.PushBack(e.Value)
+               if e == last {
+                       break
+               }
+       }
+}
+
+// PushFrontList inserts each element of ol at the front of the list. The ordering of the passed list is preserved.
+func (l *List) PushFrontList(ol *List) {
+       first := ol.Front()
+       for e := ol.Back(); e != nil; e = e.Prev() {
+               l.PushFront(e.Value)
+               if e == first {
+                       break
+               }
+       }
+}
index 846937a38362cb39d3c94aa4a16081402c036225..bf35c9dd9a777b5d991adc279fbe299558cf3ef5 100644 (file)
@@ -134,3 +134,62 @@ func TestList(t *testing.T) {
        checkListPointers(t, l, []*Element{})
        checkListLen(t, l, 0)
 }
+
+func checkList(t *testing.T, l *List, es []interface{}) {
+       if l.Len() != len(es) {
+               t.Errorf("list has len=%v, want %v", l.Len(), len(es))
+               return
+       }
+       i := 0
+       for le := range l.Iter() {
+               if le != es[i] {
+                       t.Errorf("elt #%d has value=%v, want %v", i, le, es[i])
+               }
+               i++
+       }
+}
+
+func TestExtending(t *testing.T) {
+       l1 := New()
+       l2 := New()
+
+       l1.PushBack(1)
+       l1.PushBack(2)
+       l1.PushBack(3)
+
+       l2.PushBack(4)
+       l2.PushBack(5)
+
+       l3 := New()
+       l3.PushBackList(l1)
+       checkList(t, l3, []interface{}{1, 2, 3})
+       l3.PushBackList(l2)
+       checkList(t, l3, []interface{}{1, 2, 3, 4, 5})
+
+       l3 = New()
+       l3.PushFrontList(l2)
+       checkList(t, l3, []interface{}{4, 5})
+       l3.PushFrontList(l1)
+       checkList(t, l3, []interface{}{1, 2, 3, 4, 5})
+
+       checkList(t, l1, []interface{}{1, 2, 3})
+       checkList(t, l2, []interface{}{4, 5})
+
+       l3 = New()
+       l3.PushBackList(l1)
+       checkList(t, l3, []interface{}{1, 2, 3})
+       l3.PushBackList(l3)
+       checkList(t, l3, []interface{}{1, 2, 3, 1, 2, 3})
+
+       l3 = New()
+       l3.PushFrontList(l1)
+       checkList(t, l3, []interface{}{1, 2, 3})
+       l3.PushFrontList(l3)
+       checkList(t, l3, []interface{}{1, 2, 3, 1, 2, 3})
+
+       l3 = New()
+       l1.PushBackList(l3)
+       checkList(t, l1, []interface{}{1, 2, 3})
+       l1.PushFrontList(l3)
+       checkList(t, l1, []interface{}{1, 2, 3})
+}