Commit a225706e authored by David Symonds's avatar David Symonds

container/list: Add Len() method to List.

R=r
APPROVED=gri
DELTA=23  (23 added, 0 deleted, 0 changed)
OCL=32106
CL=32189
parent b64b75da
...@@ -18,12 +18,14 @@ type Element struct { ...@@ -18,12 +18,14 @@ type Element struct {
// List represents a doubly linked list. // List represents a doubly linked list.
type List struct { type List struct {
front, back *Element; front, back *Element;
len int;
} }
// Init initializes or clears a List. // Init initializes or clears a List.
func (l *List) Init() *List { func (l *List) Init() *List {
l.front = nil; l.front = nil;
l.back = nil; l.back = nil;
l.len = 0;
return l return l
} }
...@@ -57,6 +59,7 @@ func (l *List) Remove(e *Element) { ...@@ -57,6 +59,7 @@ func (l *List) Remove(e *Element) {
e.prev = nil; e.prev = nil;
e.next = nil; e.next = nil;
l.len--;
} }
func (l *List) insertFront(e *Element) { func (l *List) insertFront(e *Element) {
...@@ -68,6 +71,7 @@ func (l *List) insertFront(e *Element) { ...@@ -68,6 +71,7 @@ func (l *List) insertFront(e *Element) {
} else { } else {
l.back = e; l.back = e;
} }
l.len++;
} }
func (l *List) insertBack(e *Element) { func (l *List) insertBack(e *Element) {
...@@ -79,6 +83,7 @@ func (l *List) insertBack(e *Element) { ...@@ -79,6 +83,7 @@ func (l *List) insertBack(e *Element) {
} else { } else {
l.front = e; l.front = e;
} }
l.len++;
} }
// PushFront inserts the value at the front of the list, and returns a new Element containing it. // PushFront inserts the value at the front of the list, and returns a new Element containing it.
...@@ -113,6 +118,11 @@ func (l *List) MoveToBack(e *Element) { ...@@ -113,6 +118,11 @@ func (l *List) MoveToBack(e *Element) {
l.insertBack(e); l.insertBack(e);
} }
// Len returns the number of elements in the list.
func (l *List) Len() int {
return l.len
}
func (l *List) iterate(c chan <- *Element) { func (l *List) iterate(c chan <- *Element) {
var next *Element; var next *Element;
for e := l.front; e != nil; e = next { for e := l.front; e != nil; e = next {
......
...@@ -42,19 +42,29 @@ func checkListPointers(t *testing.T, l *List, es []*Element) { ...@@ -42,19 +42,29 @@ func checkListPointers(t *testing.T, l *List, es []*Element) {
} }
} }
func checkListLen(t *testing.T, l *List, n int) {
if an := l.Len(); an != n {
t.Errorf("l.Len() = %d, want %d", an, n);
}
}
func TestList(t *testing.T) { func TestList(t *testing.T) {
l := New(); l := New();
checkListPointers(t, l, []*Element{}); checkListPointers(t, l, []*Element{});
checkListLen(t, l, 0);
// Single element list // Single element list
e := l.PushFront("a"); e := l.PushFront("a");
checkListLen(t, l, 1);
checkListPointers(t, l, []*Element{ e }); checkListPointers(t, l, []*Element{ e });
l.MoveToFront(e); l.MoveToFront(e);
checkListPointers(t, l, []*Element{ e }); checkListPointers(t, l, []*Element{ e });
l.MoveToBack(e); l.MoveToBack(e);
checkListPointers(t, l, []*Element{ e }); checkListPointers(t, l, []*Element{ e });
checkListLen(t, l, 1);
l.Remove(e); l.Remove(e);
checkListPointers(t, l, []*Element{}); checkListPointers(t, l, []*Element{});
checkListLen(t, l, 0);
// Bigger list // Bigger list
e2 := l.PushFront(2); e2 := l.PushFront(2);
...@@ -62,9 +72,11 @@ func TestList(t *testing.T) { ...@@ -62,9 +72,11 @@ func TestList(t *testing.T) {
e3 := l.PushBack(3); e3 := l.PushBack(3);
e4 := l.PushBack("banana"); e4 := l.PushBack("banana");
checkListPointers(t, l, []*Element{ e1, e2, e3, e4 }); checkListPointers(t, l, []*Element{ e1, e2, e3, e4 });
checkListLen(t, l, 4);
l.Remove(e2); l.Remove(e2);
checkListPointers(t, l, []*Element{ e1, e3, e4 }); checkListPointers(t, l, []*Element{ e1, e3, e4 });
checkListLen(t, l, 3);
l.MoveToFront(e3); // move from middle l.MoveToFront(e3); // move from middle
checkListPointers(t, l, []*Element{ e3, e1, e4 }); checkListPointers(t, l, []*Element{ e3, e1, e4 });
...@@ -88,4 +100,5 @@ func TestList(t *testing.T) { ...@@ -88,4 +100,5 @@ func TestList(t *testing.T) {
l.Remove(e); l.Remove(e);
} }
checkListPointers(t, l, []*Element{}); checkListPointers(t, l, []*Element{});
checkListLen(t, l, 0);
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment