mirror of
https://github.com/golang/go
synced 2024-11-22 21:00:04 -07:00
container/list: Add Len() method to List.
R=r APPROVED=gri DELTA=23 (23 added, 0 deleted, 0 changed) OCL=32106 CL=32189
This commit is contained in:
parent
b64b75daa7
commit
a225706e5f
@ -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) {
|
|||||||
|
|
||||||
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) {
|
|||||||
} 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) {
|
|||||||
} 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) {
|
|||||||
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) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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) {
|
|||||||
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) {
|
|||||||
l.Remove(e);
|
l.Remove(e);
|
||||||
}
|
}
|
||||||
checkListPointers(t, l, []*Element{});
|
checkListPointers(t, l, []*Element{});
|
||||||
|
checkListLen(t, l, 0);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user