mirror of
https://github.com/golang/go
synced 2024-09-30 12:18:33 -06:00
cmd/compile: remove listsort
The listsort function is no longer used, except in a test. Change the test to use sort.Sort instead. Change-Id: Ib634705cc1bc3b1d8fc3795bd4ed2894e6abc284 Reviewed-on: https://go-review.googlesource.com/19964 Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
This commit is contained in:
parent
686fbdb3b0
commit
7e92c86df2
@ -6,6 +6,7 @@ package gc
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"reflect"
|
"reflect"
|
||||||
|
"sort"
|
||||||
"testing"
|
"testing"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -134,7 +135,7 @@ func nodelist2slice(nl *NodeList) []*Node {
|
|||||||
return s
|
return s
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestListsort(t *testing.T) {
|
func TestStackvarSort(t *testing.T) {
|
||||||
inp := []*Node{
|
inp := []*Node{
|
||||||
{Class: PFUNC, Type: &Type{}, Name: &Name{}, Sym: &Sym{}},
|
{Class: PFUNC, Type: &Type{}, Name: &Name{}, Sym: &Sym{}},
|
||||||
{Class: PAUTO, Type: &Type{}, Name: &Name{}, Sym: &Sym{}},
|
{Class: PAUTO, Type: &Type{}, Name: &Name{}, Sym: &Sym{}},
|
||||||
@ -173,13 +174,11 @@ func TestListsort(t *testing.T) {
|
|||||||
haspointers(inp[i].Type)
|
haspointers(inp[i].Type)
|
||||||
}
|
}
|
||||||
|
|
||||||
nl := slice2nodelist(inp)
|
sort.Sort(byStackVar(inp))
|
||||||
listsort(&nl, cmpstackvarlt)
|
if !reflect.DeepEqual(want, inp) {
|
||||||
got := nodelist2slice(nl)
|
t.Error("sort failed")
|
||||||
if !reflect.DeepEqual(want, got) {
|
for i := range inp {
|
||||||
t.Error("listsort failed")
|
g := inp[i]
|
||||||
for i := range got {
|
|
||||||
g := got[i]
|
|
||||||
w := want[i]
|
w := want[i]
|
||||||
eq := reflect.DeepEqual(w, g)
|
eq := reflect.DeepEqual(w, g)
|
||||||
if !eq {
|
if !eq {
|
||||||
|
@ -411,69 +411,6 @@ func list(l *NodeList, n *Node) *NodeList {
|
|||||||
return concat(l, list1(n))
|
return concat(l, list1(n))
|
||||||
}
|
}
|
||||||
|
|
||||||
// listsort sorts *l in place according to the comparison function lt.
|
|
||||||
// The algorithm expects lt(a, b) to be equivalent to a < b.
|
|
||||||
// The algorithm is mergesort, so it is guaranteed to be O(n log n).
|
|
||||||
func listsort(l **NodeList, lt func(*Node, *Node) bool) {
|
|
||||||
if *l == nil || (*l).Next == nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
l1 := *l
|
|
||||||
l2 := *l
|
|
||||||
for {
|
|
||||||
l2 = l2.Next
|
|
||||||
if l2 == nil {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
l2 = l2.Next
|
|
||||||
if l2 == nil {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
l1 = l1.Next
|
|
||||||
}
|
|
||||||
|
|
||||||
l2 = l1.Next
|
|
||||||
l1.Next = nil
|
|
||||||
l2.End = (*l).End
|
|
||||||
(*l).End = l1
|
|
||||||
|
|
||||||
l1 = *l
|
|
||||||
listsort(&l1, lt)
|
|
||||||
listsort(&l2, lt)
|
|
||||||
|
|
||||||
if lt(l1.N, l2.N) {
|
|
||||||
*l = l1
|
|
||||||
} else {
|
|
||||||
*l = l2
|
|
||||||
l2 = l1
|
|
||||||
l1 = *l
|
|
||||||
}
|
|
||||||
|
|
||||||
// now l1 == *l; and l1 < l2
|
|
||||||
|
|
||||||
var le *NodeList
|
|
||||||
for (l1 != nil) && (l2 != nil) {
|
|
||||||
for (l1.Next != nil) && lt(l1.Next.N, l2.N) {
|
|
||||||
l1 = l1.Next
|
|
||||||
}
|
|
||||||
|
|
||||||
// l1 is last one from l1 that is < l2
|
|
||||||
le = l1.Next // le is the rest of l1, first one that is >= l2
|
|
||||||
if le != nil {
|
|
||||||
le.End = (*l).End
|
|
||||||
}
|
|
||||||
|
|
||||||
(*l).End = l1 // cut *l at l1
|
|
||||||
*l = concat(*l, l2) // glue l2 to *l's tail
|
|
||||||
|
|
||||||
l1 = l2 // l1 is the first element of *l that is < the new l2
|
|
||||||
l2 = le // ... because l2 now is the old tail of l1
|
|
||||||
}
|
|
||||||
|
|
||||||
*l = concat(*l, l2) // any remainder
|
|
||||||
}
|
|
||||||
|
|
||||||
// count returns the length of the list l.
|
// count returns the length of the list l.
|
||||||
func count(l *NodeList) int {
|
func count(l *NodeList) int {
|
||||||
n := int64(0)
|
n := int64(0)
|
||||||
|
Loading…
Reference in New Issue
Block a user