libgo: update to Go 1.8 release candidate 1
Compiler changes: * Change map assignment to use mapassign and assign value directly. * Change string iteration to use decoderune, faster for ASCII strings. * Change makeslice to take int, and use makeslice64 for larger values. * Add new noverflow field to hmap struct used for maps. Unresolved problems, to be fixed later: * Commented out test in go/types/sizes_test.go that doesn't compile. * Commented out reflect.TestStructOf test for padding after zero-sized field. Reviewed-on: https://go-review.googlesource.com/35231 gotools/: Updates for Go 1.8rc1. * Makefile.am (go_cmd_go_files): Add bug.go. (s-zdefaultcc): Write defaultPkgConfig. * Makefile.in: Rebuild. From-SVN: r244456
This commit is contained in:
parent
829afb8f05
commit
c2047754c3
983 changed files with 69318 additions and 17662 deletions
|
@ -2,10 +2,14 @@
|
|||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
//go:generate go run genzfunc.go
|
||||
|
||||
// Package sort provides primitives for sorting slices and user-defined
|
||||
// collections.
|
||||
package sort
|
||||
|
||||
import "reflect"
|
||||
|
||||
// A type, typically a collection, that satisfies sort.Interface can be
|
||||
// sorted by the routines in this package. The methods require that the
|
||||
// elements of the collection be enumerated by an integer index.
|
||||
|
@ -212,14 +216,63 @@ func quickSort(data Interface, a, b, maxDepth int) {
|
|||
// It makes one call to data.Len to determine n, and O(n*log(n)) calls to
|
||||
// data.Less and data.Swap. The sort is not guaranteed to be stable.
|
||||
func Sort(data Interface) {
|
||||
// Switch to heapsort if depth of 2*ceil(lg(n+1)) is reached.
|
||||
n := data.Len()
|
||||
maxDepth := 0
|
||||
quickSort(data, 0, n, maxDepth(n))
|
||||
}
|
||||
|
||||
// maxDepth returns a threshold at which quicksort should switch
|
||||
// to heapsort. It returns 2*ceil(lg(n+1)).
|
||||
func maxDepth(n int) int {
|
||||
var depth int
|
||||
for i := n; i > 0; i >>= 1 {
|
||||
maxDepth++
|
||||
depth++
|
||||
}
|
||||
maxDepth *= 2
|
||||
quickSort(data, 0, n, maxDepth)
|
||||
return depth * 2
|
||||
}
|
||||
|
||||
// lessSwap is a pair of Less and Swap function for use with the
|
||||
// auto-generated func-optimized variant of sort.go in
|
||||
// zfuncversion.go.
|
||||
type lessSwap struct {
|
||||
Less func(i, j int) bool
|
||||
Swap func(i, j int)
|
||||
}
|
||||
|
||||
// Slice sorts the provided slice given the provided less function.
|
||||
//
|
||||
// The sort is not guaranteed to be stable. For a stable sort, use
|
||||
// SliceStable.
|
||||
//
|
||||
// The function panics if the provided interface is not a slice.
|
||||
func Slice(slice interface{}, less func(i, j int) bool) {
|
||||
rv := reflect.ValueOf(slice)
|
||||
swap := reflect.Swapper(slice)
|
||||
length := rv.Len()
|
||||
quickSort_func(lessSwap{less, swap}, 0, length, maxDepth(length))
|
||||
}
|
||||
|
||||
// SliceStable sorts the provided slice given the provided less
|
||||
// function while keeping the original order of equal elements.
|
||||
//
|
||||
// The function panics if the provided interface is not a slice.
|
||||
func SliceStable(slice interface{}, less func(i, j int) bool) {
|
||||
rv := reflect.ValueOf(slice)
|
||||
swap := reflect.Swapper(slice)
|
||||
stable_func(lessSwap{less, swap}, rv.Len())
|
||||
}
|
||||
|
||||
// SliceIsSorted tests whether a slice is sorted.
|
||||
//
|
||||
// The function panics if the provided interface is not a slice.
|
||||
func SliceIsSorted(slice interface{}, less func(i, j int) bool) bool {
|
||||
rv := reflect.ValueOf(slice)
|
||||
n := rv.Len()
|
||||
for i := n - 1; i > 0; i-- {
|
||||
if less(i, i-1) {
|
||||
return false
|
||||
}
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
type reverse struct {
|
||||
|
@ -337,7 +390,10 @@ func StringsAreSorted(a []string) bool { return IsSorted(StringSlice(a)) }
|
|||
// It makes one call to data.Len to determine n, O(n*log(n)) calls to
|
||||
// data.Less and O(n*log(n)*log(n)) calls to data.Swap.
|
||||
func Stable(data Interface) {
|
||||
n := data.Len()
|
||||
stable(data, data.Len())
|
||||
}
|
||||
|
||||
func stable(data Interface, n int) {
|
||||
blockSize := 20 // must be > 0
|
||||
a, b := 0, blockSize
|
||||
for b <= n {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue